Skip to content
CyberRXN
v0.1Research preview · features expand with every release

Graph database of chemical reactions

From structure to reaction, conditions and source

CyberRXN Base helps you find chemical transformations, compare stored observations and explore how substances connect. Query it from Python, the CLI or any MCP client — every answer arrives with its provenance and check status.

  • Self-hosted
  • 7 read-only MCP tools
  • Source fields preserved
  • Unknowns stay unknown
app.cyberrxn.com · mock-up
Exact transformationProduct similarityConditionsSubstanceNatural languageSoon
C=O.CCN1CCNC(=O)C1=O>>CCN1CCN(CO)C(=O)C1=O
01Transformation
H2CO+NHNOONNOOOH
reaction_id
52bab621…bd32
match
exact_original_transformation
agents_used_in_identity
false
observation_id
6d5502d7…7252

SynRBL rebalanced equation

C(N1CCNC(=O)C1=O)C.C=O.Cl>>C(N1CCN(CO)C(=O)C1=O)C.[H+].[Cl-]

imputed by balancing

02Observation
upstream_chemistry_valid = trueconditions_validated = falseexpert_confirmed = false
03Source
evidence.kind
patent_extraction
Patent
US06482818B2 · 2002
Record
row_900654
Report
sh07of10.csv:21511
sha256
3e0d3092…fb45

paragraph_text

To a solution of 1-ethylpiperazine-2,3-dione (2.13 g, 15 mmol) in 30% aqueous (methanol free) formaldehyde (15 mmol) potassium hydroxide (150 mg, 2.7 mmol) was added and the mixture stirred at 50° C. for 7 days. It was neutralized with 5 N aqueous hydrochloric acid (50 μl) to pH=7. The mixture was evaporated at 15 mm and then dried in high vacuo (0.0013 mbar) (0.001 mm) to give 1-ethyl-4-(hydroxymethyl)-piperazine-2,3-dione as a colourless solid (100%).

Temperature · Why it matters

Clearly tied to holding the reaction mixture: “stirred at 50° C. for 7 days”.

lookup_reaction → get_observation(include_raw=true) · exact lookup p50 0.307 ms (local test, 26.10.2026)

Fig. 1 — Interface mock-up on a real corpus record (US06482818B2_57). Each field is traced back to the patent paragraph; extraction errors stay visible instead of being silently fixed.

  • Python 3.11+
  • RDKit
  • SQLite
  • NumPy
  • MCP stdio
  • Streamable HTTP
  • Docker
  • Caddy HTTPS
  • USPTO-derived corpus
  • Linux AMD64 · ARM64

01 — Corpus

1.25M+ observations, counted honestly

A local USPTO-derived snapshot, built on 26.10.2026 and re-checked on 27.10.2026. Observations, transformations, product sets and molecules are different units — so we never add them up.

1,256,084

observations with conditions and source

1,198,868

unique transformations (canonical reactants → products)

1,081,490

product sets in the similarity index

1,389,716

unique structures across all roles

7

read-only MCP tools

94

automated tests passing

Condition coverage

Share of observations with a filled, normalised field.

  • Temperature (point or range)87.653%

    1,100,997 of 1,256,084

  • Agents89.538%

    1,124,673 of 1,256,084

  • Numeric pressure3.589%

    45,075 of 1,256,084

  • All three at once2.272%

    28,540 of 1,256,084

A filled field shows extraction coverage, not that it belongs to the right reaction stage.

Status, not marketing

  • 911,43072.6%

    positive automated chemistry verdict

    Imported upstream check, often on the SynRBL-rebalanced equation. Not an expert review.

  • 5130.041%

    records in quarantine

    Unparseable source chemistry is kept with its raw fields and errors.

  • 0

    expert confirmations

    The service never assigns them programmatically.

SQLite 7.3 GB + similarity index 349 MB · delivered separately from the code

5,678,827 reactant/product participations · 1,868,232 agent participations · 14 source reports with SHA256

02 — Why it matters

Conditions are useful with their context

The same transformation can appear in several sources with different conditions. CyberRXN Base keeps every observation separately: you see the concrete values, the original fields and the results of automatic processing — then you check the primary source.

Get the fact, and see where it came from.

Illustrativereaction_id → observation_id × 3

One canonical transformation

C=O.CCN1CCNC(=O)C1=O>>CCN1CCN(CO)C(=O)C1=O

Patent A · 2002

50 °C · pressure unknown · agent Cl

Patent B · 2011

20–25 °C · 1 bar · solvent label: water

Patent C · 2017

temperature unknown · agents not reported

Kept as separate observations — never averaged into one “best” set.

03 — Capabilities

Six things you can do today

Everything below ships in version 0.1 and works the same from Python, the CLI and MCP.

with atom maps

[CH2:1]=[O:2].CCN1CCNC(=O)C1=O>>CCN1CCN([CH2:1][OH:2])C(=O)C1=O

fragments reordered

CCN1CCNC(=O)C1=O.C=O>>CCN1CCN(CO)C(=O)C1=O

canonical key

C=O.CCN1CCNC(=O)C1=O>>CCN1CCN(CO)C(=O)C1=O

SHA256 → 52bab621…bd32

fragment order normalisedatom maps removed from keystereo · charges · salts kept

Find the exact transformation

Search by reaction SMILES, canonical reactants or products. Normalisation ignores fragment order and strips atom maps from the key while keeping stereochemistry, charges and salts.

search_reactions(temperature_min=20, temperature_max=30)

  • 25 °C
  • 10–40 °C
  • 50 °C
  • temperature unknown
query 20–30 °C050100 °C

Unknown never matches a numeric filter.

Filter by conditions

Filter observations by temperature interval, pressure, agent and solvent label. Gaps stay explicitly unknown; numbers come with units and provenance.

Morgan r = 2 · 2048 bit · chirality

query
#10.78
#20.57
#30.42
Tanimoto = |A∩B| / |A∪B|threshold 0.5 · #3 below threshold

Similarity ≠ feasibility, yield or safety.

Compare product structures

Find stored product sets with a similar Morgan fingerprint and Tanimoto score. Use it to explore the corpus — structural similarity alone doesn’t prove a reaction will work.

has_reactanthas_reactanthas_producthas_conditionhas_agentReactionC=OCCN1CCNC(=O)C1=OCCN1CCN(CO)…Condition · 50 °CCl

molecule_reactions(role="agent") · Graph of one observation · up to 1000 nodes

Explore how a substance takes part

Find records where a molecule appears as reactant, product or agent. Get the JSON graph of any observation for analysis or visualisation in your own app.

original
C=O.CCN1CCNC(=O)C1=O>>CCN1CCN(CO)C(=O)C1=O
rebalanced
C(N1CCNC(=O)C1=O)C.C=O.Cl>>C(N1CCN(CO)C(=O)C1=O)C.[H+].[Cl-]
evidence.kind
patent_extraction
expert_confirmed
false
source.sha256
3e0d3092…fb45

imputed_components → algorithmic_balance

Open the source record

Get normalised conditions and the stored original fields by ID. Tell the original reaction, the rebalanced equation and programmatically added components apart.

statssearch_reactionslookup_reactionget_observationsimilar_productsmolecule_reactionsgraph
PythonCLIMCP stdioStreamable HTTP

JSONL import: model predictions with version, bins and probabilities

Connect your research tools

Use one service from Python, the CLI and MCP clients. Import external model results via JSONL as separate observations with version, bins and probabilities.

04 — How it works

Four steps from question to source

    01

    Ask with a structure or conditions

    SMILES, a temperature interval, pressure or the participation of a substance.

    02

    Get matching observations

    Results contain structures, conditions and statuses, with stable pagination up to 100 per page.

    03

    Open the details

    Jump to the original fields, provenance, automated checks and the graph of the record.

    04

    Use it in your process

    Connect Python, the CLI or MCP; judge applicability after checking the source.

05 — Integration

Fits into your research workflow

SQLite stores the data and its links, RDKit handles structures, and one Service exposes Python, the CLI and MCP. Local stdio is for one machine; Streamable HTTP with a Bearer token and the Docker setup are for your own server.

  • Python API

    The same Service powers every interface — search, cards and graphs as plain dicts.

  • 7 read-only MCP tools

    readOnlyHint = true; SQLite opens in mode=ro with query_only. No imports, edits or deletes over MCP.

  • stdio and Streamable HTTP

    Local AI clients over stdio, remote ones over HTTPS /mcp with an Authorization: Bearer header.

  • Imports stay in your hands

    CSV reports and JSONL (including model predictions) via the CLI and Python, with atomic publishing.

Talk to us about access
from reaction_kb.service import Service

with Service("data/reactions.sqlite") as kb:
    result = kb.search_reactions(
        products="CC=O", temperature_min=20, temperature_max=30, limit=5
    )
    for item in result["items"]:
        details = kb.get_observation(item["observation_id"], include_raw=True)
        graph = kb.graph(item["observation_id"])

The example shows the programmatic API; it is not a recommendation of a chemical reaction.

lookup_reaction · structuredContentUS06482818B2_57
{
  "match": "exact_original_transformation",
  "agents_used_in_identity": false,
  "items": [{
    "observation_id": "6d5502d7d4006bdc…",
    "reaction_id": "52bab621ec95bd4f…",
    "reaction_smiles": "C=O.CCN1CCNC(=O)C1=O>>CCN1CCN(CO)C(=O)C1=O",
    "conditions": {
      "temperature": { "value": 50, "min": 50, "max": 50, "unit": "C",
                       "status": "extracted", "raw": "50° C" },
      "pressure": { "value": 0.000001, "unit": "bar", "kind": "unknown",
                    "status": "extracted", "raw": "0.0013 mbar" },
      "agents": { "smiles": "Cl", "solvent_label": "methanol",
                  "catalysts": null, "roles_resolved": false, "status": "reported" }
    },
    "evidence": { "kind": "patent_extraction", "patent": "US06482818B2",
                  "year": 2002, "expert_confirmed": false },
    "validation": { "upstream_chemistry_valid": true, "applies_to": "rebalanced",
                    "conditions_validated": false },
    "balancing": { "solved": true, "method": "rule_based",
                   "confidence": null, "confidence_calibrated": false }
  }],
  "has_more": false
}

The seven MCP tools

ToolRequiredReturns
stats—Corpus size, condition coverage, quarantine, schema version, import state
search_reactions—A page of observations matching all filters (AND)
lookup_reactionreaction_smilesObservations of the exact canonical transformation
get_observationobservation_idFull card, source and paragraph; raw fields on request
similar_productssmilesSimilar product sets, Tanimoto and example observations
molecule_reactionssmilesObservations where the molecule is reactant, product or agent
graphobservation_idNodes and directed edges of one observation

06 — Provenance

Where the data comes from stays visible

Original fields are stored with every record. Unknown conditions never become defaults. Rebalanced equations and external model results are kept apart from source facts, and the check status shows exactly what was checked.

uspto_conditions_dedup_markedUSPTO-derived corpus · full build
published · index built
  1. Import

    10 report shards + 4 repair files

  2. Reconcile

    record_id and SHA256 of each report

  3. Canonicalise

    RDKit canonical SMILES

  4. Quarantine

    Unparseable chemistry kept, not fixed

  5. Store

    SQLite with participation tables

  6. Index

    mmap Morgan fingerprint index

✓import1,338,346 rows read · 82,261 duplicates replaced by record_id

✓reconcile1,256,084 unique records · row_0…row_1256083 continuous

✓canonicaliseatom maps out of the key · stereo, charges, salts kept

✓quarantine513 records kept with raw fields and errors (0.041%)

✓store5,678,827 participations · integrity_check ok

✓index1,081,490 product sets · 349 MB · manifest revision checked

Source kept

Report, row of origin and SHA256 of the source file stay attached to every observation.

Unknown is marked

null and unknown instead of invented precision — no room temperature or ambient pressure by default.

Processing is explained

Original structure, SynRBL equation and model data are separated, each with its own evidence kind.

What was checked on 26.10.2026

  • SQLite integrity_check: ok — no foreign-key errors or malformed fingerprints.
  • 10,000 raw payloads decoded without errors.
  • Deterministic sample of 10,000: identity and strict parsing agree for 9,996; the other 4 are in quarantine.
  • 7,256 sampled records with a positive upstream verdict all passed strict RDKit parsing, heavy-atom balance and total formal charge.
  • Of 2,744 negative ones, 24 also passed — and their flags were not rewritten.

The corpus contains automatically extracted data — check the primary source. Automated checks do not replace expert chemical judgement.

07 — Speed

Indexes built for a million-plus observations

Exact lookups use B-tree indexes; product similarity scans only popcount-filtered candidates in an mmap index.

  • Observation card0.092 ms / 0.159 ms
  • Exact product set0.072 ms / 0.559 ms
  • Exact transformation0.307 ms / 0.714 ms
  • Temperature + pressure filter1.55 ms / 1.63 ms
  • MCP get/search over stdio1.72 ms / 7.63 ms
  • Reverse lookup by substance9.25 ms / 172 ms
  • Product similarity308 ms / 353 ms
p50 p950.05 · 1 · 10 · 100 · 1000 ms (log)

Local measurements, 26.10.2026, no SLA. Python Service without JSON or transport (MCP measured separately), 30 queries each, Windows 10, Python 3.11.2, 7.3 GB SQLite; OS cache not flushed, hardware not standardised.

08 — Who it’s for

Built for people who check the source

Research chemists

Find a transformation and compare its observations

→ Structures, conditions and the original record to verify

Cheminformaticians

Explore substance participation and similar products

→ Canonical SMILES, Morgan/Tanimoto and a JSON graph

AI tool developers

Give an assistant access to a reaction corpus

→ Seven MCP tools with bounded, structured results

Data & ML teams

Add sources or results of external models

→ JSONL contract and separate provenance per observation

Labs & internal R&D

Run search inside your own environment

→ Local mode, containers, HTTPS with a Bearer token

Intended scenarios derived from what the code does today — not a list of existing customers.

09 — What’s next

CyberRXN Base is growing

Version 0.1 is the foundation. We’ll keep extending the product and adding information here as each capability is built and verified.

In development

Natural-language search

Describe the transformation or constraints in words and get matching stored observations.

In development

Web app at app.cyberrxn.com

Search interface with a structure editor, observation cards and an interactive graph.

Planned

Substructure and name search

SMARTS substructures, IUPAC/CAS names and molecule synonyms.

Planned

Hosted MCP and accounts

Managed endpoint with personal keys, roles and SSO.

Planned

More condition filters

Time, yield, pH, atmosphere, year and patent number as first-class filters.

Planned

New corpora and expert review

Additional sources and a workflow for expert confirmation of observations.

Numbers on this page come from the 26–27.10.2026 snapshot and will be updated with each new verified build.

10 — FAQ

Straight answers

11 — Pricing

Start small. Scale when it works.

Pay per call, subscribe for predictable volume, or license a self-hosted deployment. Early-access terms — final pricing comes with hosted access.

Compare plans

Pay as you go

Hosted MCP access with no commitment.

$0+ $4 per 1,000 tool calls

500 free tool calls every month

Get early access

Researcher

For individual chemists and cheminformaticians.

$49per month

20,000 calls / mo included, then $3 per 1,000

Get early access
MOST POPULAR

Team

Shared access for research and data teams.

$249per month · 5 keys

150,000 calls / mo, then $2 per 1,000 · extra key $39

Get early access

Enterprise

Self-hosted deployments and corpus licences.

Custom

Licence agreed per deployment

Talk to us

Connect reactions to your research workflow

Let’s discuss your corpus, the filters you need and the integration route — Python, CLI or MCP.