Pay as you go
Hosted MCP access with no commitment.
500 free tool calls every month
Get early accessGraph database of chemical reactions
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.
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
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”.
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.
01 — Corpus
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
Share of observations with a filled, normalised field.
1,100,997 of 1,256,084
1,124,673 of 1,256,084
45,075 of 1,256,084
28,540 of 1,256,084
A filled field shows extraction coverage, not that it belongs to the right reaction stage.
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
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.
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
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
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)
Unknown never matches a numeric filter.
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
Similarity ≠ feasibility, yield or safety.
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.
molecule_reactions(role="agent") · Graph of one observation · up to 1000 nodes
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.
imputed_components → algorithmic_balance
Get normalised conditions and the stored original fields by ID. Tell the original reaction, the rebalanced equation and programmatically added components apart.
JSONL import: model predictions with version, bins and probabilities
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
SMILES, a temperature interval, pressure or the participation of a substance.
Results contain structures, conditions and statuses, with stable pagination up to 100 per page.
Jump to the original fields, provenance, automated checks and the graph of the record.
Connect Python, the CLI or MCP; judge applicability after checking the source.
05 — Integration
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.
The same Service powers every interface — search, cards and graphs as plain dicts.
readOnlyHint = true; SQLite opens in mode=ro with query_only. No imports, edits or deletes over MCP.
Local AI clients over stdio, remote ones over HTTPS /mcp with an Authorization: Bearer header.
CSV reports and JSONL (including model predictions) via the CLI and Python, with atomic publishing.
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.
{
"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
}| Tool | Required | Returns |
|---|---|---|
| stats | — | Corpus size, condition coverage, quarantine, schema version, import state |
| search_reactions | — | A page of observations matching all filters (AND) |
| lookup_reaction | reaction_smiles | Observations of the exact canonical transformation |
| get_observation | observation_id | Full card, source and paragraph; raw fields on request |
| similar_products | smiles | Similar product sets, Tanimoto and example observations |
| molecule_reactions | smiles | Observations where the molecule is reactant, product or agent |
| graph | observation_id | Nodes and directed edges of one observation |
06 — Provenance
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.
Import
10 report shards + 4 repair files
Reconcile
record_id and SHA256 of each report
Canonicalise
RDKit canonical SMILES
Quarantine
Unparseable chemistry kept, not fixed
Store
SQLite with participation tables
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
Report, row of origin and SHA256 of the source file stay attached to every observation.
null and unknown instead of invented precision — no room temperature or ambient pressure by default.
Original structure, SynRBL equation and model data are separated, each with its own evidence kind.
The corpus contains automatically extracted data — check the primary source. Automated checks do not replace expert chemical judgement.
07 — Speed
Exact lookups use B-tree indexes; product similarity scans only popcount-filtered candidates in an mmap index.
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
Find a transformation and compare its observations
→ Structures, conditions and the original record to verify
Explore substance participation and similar products
→ Canonical SMILES, Morgan/Tanimoto and a JSON graph
Give an assistant access to a reaction corpus
→ Seven MCP tools with bounded, structured results
Add sources or results of external models
→ JSONL contract and separate provenance per observation
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
Version 0.1 is the foundation. We’ll keep extending the product and adding information here as each capability is built and verified.
Describe the transformation or constraints in words and get matching stored observations.
Search interface with a structure editor, observation cards and an interactive graph.
SMARTS substructures, IUPAC/CAS names and molecule synonyms.
Managed endpoint with personal keys, roles and SSO.
Time, yield, pH, atmosphere, year and patent number as first-class filters.
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
11 — Pricing
Pay per call, subscribe for predictable volume, or license a self-hosted deployment. Early-access terms — final pricing comes with hosted access.
Hosted MCP access with no commitment.
500 free tool calls every month
Get early accessFor individual chemists and cheminformaticians.
20,000 calls / mo included, then $3 per 1,000
Get early accessShared access for research and data teams.
150,000 calls / mo, then $2 per 1,000 · extra key $39
Get early accessSelf-hosted deployments and corpus licences.
Licence agreed per deployment
Talk to usLet’s discuss your corpus, the filters you need and the integration route — Python, CLI or MCP.