Metadata-Version: 2.5
Name: chemdraw-mcp
Version: 0.5.0
Summary: Chemical structures, comparisons and reaction schemes as PNG/SVG via RDKit, with interactive data sheets. MVP by default; full profile optional. Unofficial, not affiliated with Revvity.
Project-URL: Repository, https://github.com/jurimaxam-dotcom/chemdraw-mcp
Project-URL: Issues, https://github.com/jurimaxam-dotcom/chemdraw-mcp/issues
Author: jurimaxam-dotcom
License-Expression: Apache-2.0
License-File: LICENSE
Keywords: chemistry,claude,mcp,rdkit,smiles,structure-drawing
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Science/Research
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Scientific/Engineering :: Chemistry
Requires-Python: >=3.11
Requires-Dist: genanki>=0.13.1
Requires-Dist: lxml
Requires-Dist: matplotlib>=3.10.9
Requires-Dist: mcp<3,>=2.3
Requires-Dist: molmass>=2026.1.8
Requires-Dist: pillow
Requires-Dist: py2opsin>=1.2.0
Requires-Dist: rdkit
Requires-Dist: requests
Description-Content-Type: text/markdown

# chemdraw-mcp

<!-- mcp-name: io.github.jurimaxam-dotcom/chemdraw-mcp -->

[![CI](https://github.com/jurimaxam-dotcom/chemdraw-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/jurimaxam-dotcom/chemdraw-mcp/actions/workflows/ci.yml)
[![Release](https://img.shields.io/github/v/release/jurimaxam-dotcom/chemdraw-mcp)](https://github.com/jurimaxam-dotcom/chemdraw-mcp/releases)
[![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue)](LICENSE)
[![PyPI](https://img.shields.io/pypi/v/chemdraw-mcp)](https://pypi.org/project/chemdraw-mcp/)
[![GitHub stars](https://img.shields.io/github/stars/jurimaxam-dotcom/chemdraw-mcp?style=social)](https://github.com/jurimaxam-dotcom/chemdraw-mcp/stargazers)

**Chat → chemical structure.** Say *"draw aspirin"* in Claude Desktop and get a
correct, print-ready structure — rendered locally with RDKit, interactive right in the chat.

<p align="center"><img src="https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/demo-molecule.gif" alt="The chemdraw-mcp panel: aspirin with its functional groups highlighted on hover, then the PubChem data sheet" width="640"></p>

- **The right molecule, not a lookalike.** Names (also German trivial names), IUPAC names and SMILES resolve through OPSIN, PubChem and NCI; a pinned identity test checks 24 inputs against their InChIKey.
- **Ready for your lab report.** PNG and SVG in a consistent publication style, optional ChemDraw CDXML — no ChemDraw licence needed.
- **Understand, not just draw.** Hover a functional group to see where it sits, switch to the PubChem data sheet with GHS safety, compare structures with the differences highlighted.

**Install:** [download the Claude Desktop extension](https://github.com/jurimaxam-dotcom/chemdraw-mcp/releases/latest) (`.mcpb`, double-click) — or `uv tool install chemdraw-mcp && chemdraw-install`.
Free and open source (Apache-2.0), no API key, no sign-up.

| Without | With chemdraw-mcp |
|---|---|
| Claude describes the structure in words or writes SMILES you have to paste somewhere | the structure appears in the chat, ready to export |
| hand-drawn figures in ChemDraw or ChemSketch | one sentence per figure, consistent style across the whole report |
| molar mass, CAS and hazards from three different websites | one data sheet, sourced from PubChem |

## Try it in 30 seconds

1. **[Download the Claude Desktop extension](https://github.com/jurimaxam-dotcom/chemdraw-mcp/releases/latest)**
   (`chemdraw-mcp-<version>.mcpb`) and double-click it. Confirm in Claude Desktop.
2. Open a **new chat** and say *"Use the ChemDraw MCP: draw caffeine"* — a panel with the structure appears.
3. Then try one of these:

| Ask | You get |
|---|---|
| *"Draw ibuprofen and naproxen side by side and mark the differences"* | both structures, differences highlighted |
| *"Draw aspirin, caffeine and paracetamol"* | separate structures and files |
| *"Draw ethanol plus acetic acid reacting to ethyl acetate and water"* | a reaction scheme |
| *"Show the data sheet for caffeine"* | structure, PubChem properties and GHS safety |

No API key, no sign-up, no ChemDraw licence. Rendering runs on your machine.
Details and the other install routes are under [Installation](#installation).
If it saves you time, a ⭐ helps other students find it.

## Example output

*"Draw caffeine"* — print-ready PNG, generated by `generate_molecule`:

<p align="center"><img src="https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/caffeine.png" alt="Caffeine structure, rendered by generate_molecule" width="420"></p>

*"What distinguishes ibuprofen from naproxen and ketoprofen?"* —
`compare_molecules` keeps the shared scaffold neutral and highlights what differs:

<p align="center"><img src="https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/demo-compare.gif" alt="Ibuprofen, naproxen and ketoprofen side by side with differences highlighted in the chat panel" width="640"></p>

*"Show the Fischer esterification of ethanol with acetic acid"* —
`generate_reaction` renders the scheme with conditions above the arrow,
live in the chat panel:

<p align="center"><img src="https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/demo-reaction.gif" alt="Reaction scheme with conditions appearing live in the chat panel" width="640"></p>

<details>
<summary>Additional examples — full profile only</summary>

The following collection includes features paused in the MVP. Use
`CHEMDRAW_PROFILE=full` to enable the complete feature set.

*"Show the Fischer esterification mechanism step by step"* —
`generate_mechanism` renders curved electron-flow arrows in the interactive
panel:

<p align="center"><img src="https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/demo-mechanism.gif" alt="Step-by-step Fischer esterification mechanism with curved arrows in the chat panel" width="560"></p>

The overview lays every step out in one column with the same bond length, so reactants, transition state and products read at a glance:

<p align="center"><img src="https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/mechanism-overview.png" alt="SN2 overview: reactants, transition state with partial bonds and curved arrows, products" width="520"></p>

*"Make a scope figure of my Suzuki couplings: 3a 92%, 3b 88% after 12 h,
3c 64% with ee 94% and dr 10:1, 3d 71%"* — `generate_scope_table` sets the
general equation with its conditions on top and the products below it, on a
shared bond length and a shared caption baseline:

<p align="center"><img src="https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/scope-suzuki.png" alt="Substrate scope figure: Suzuki coupling equation with conditions on top, below it four biphenyl products labeled 3a to 3d with yields and ee/dr notes" width="760"></p>

*"Sketch the IR spectrum of ethyl acetate"* — `generate_spectrum` (draws the
peaks it is given, with per-type axis conventions):

<p align="center"><img src="https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/ethyl-acetate-ir.png" alt="Schematic IR spectrum of ethyl acetate with labeled bands" width="560"></p>

*"TLC of my esterification: educt at 0.30, product at 0.65, the co-spot shows
both, some educt left"* — `generate_tlc` draws the plate the lab report asks
for, with mobile phase and detection as its caption:

<p align="center"><img src="https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/tlc-esterification.png" alt="TLC plate sketch with four lanes: educt at Rf 0.30, reaction lane with a faint educt spot and the ester at 0.65, co-spot lane with both, reference lane at 0.65" width="520"></p>

*"Show caffeine in 3D"* — `generate_3d` embeds the molecule (ETKDG + force
field) and opens a drag-to-rotate ball-and-stick viewer in the chat panel:

<p align="center"><img src="https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/demo-3d.gif" alt="Rotating 3D ball-and-stick caffeine model inside the concave viewer" width="560"></p>

*"Titration curve of phosphoric acid with NaOH, phenolphthalein as
indicator"* — `generate_titration_curve` computes pH from the exact charge
balance, with equivalence points, buffer points (pH = pKa) and the indicator
band; its sibling `generate_species_distribution` shows which protonation
species dominates at every pH:

<p align="center">
  <img src="https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/titration-phosphoric.png" alt="Titration curve of phosphoric acid with three equivalence points and phenolphthalein band" width="420">
  <img src="https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/species-phosphoric.png" alt="Species distribution of phosphoric acid over pH with pKa crossovers" width="420">
</p>

*"Create an Anki deck with important molecules and open it in Anki"* —
`export_anki_deck` builds a ready-to-import `.apkg`
with rendered structures embedded; with the optional AnkiConnect add-on the
cards land straight in the running Anki, no clicks:

## Pharmacology

*Full profile only* (`CHEMDRAW_PROFILE=full`, see [Profiles](#profiles)).

The curves a pharmacology course keeps asking for, drawn from the numbers you give.
Both figures and the maths behind them (`calculate_pharmacokinetics`) share the same
formulas, so the picture and the number never disagree.

*"Plot plasma concentration for 500 mg orally every 8 hours (F 0.8, Vd 70 L, half-life 4.6 h, ka 1.2/h) with a therapeutic window of 2–6 mg/L"* —
`generate_pk_curve` builds up to steady state and prints Cmax, tmax, AUC, accumulation and the time to 90 % of steady state:

<p align="center"><img src="https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/pk-curve.png" alt="Plasma concentration over time for repeated oral doses, building up to steady state inside a therapeutic window" width="640"></p>

*"Draw the dose-response curve of an agonist with EC50 10 nM and show what a competitive antagonist (20 nM, KB 10 nM) does"* —
`generate_dose_response` shifts the curve to the right by the dose ratio and leaves Emax where it is:

<p align="center"><img src="https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/dose-response.png" alt="Hill curve of an agonist and the same curve shifted to the right by a competitive antagonist" width="640"></p>

</details>

## Full-profile feature reference

All 23 tools exposed with `CHEMDRAW_PROFILE=full`. The default MVP registers only
`generate_molecule`, `batch_generate`, `compare_molecules`, `generate_reaction`,
`lookup_molecule_data` and the panel's internal `save_png`.
Files are written to `~/ChemDraw-Output/`;
every drawing tool also returns a live preview for the in-chat panel.

**Structures and schemes**

- **`generate_molecule`** — name/SMILES → 2D structure as PNG + SVG
  (optionally CDXML), with properties, functional-group detection and a
  Lipinski rule-of-five check
- **`batch_generate`** — a whole list of structures in one call
- **`generate_reaction`** — educts + products + conditions → reaction scheme
  with the conditions set above the arrow
- **`generate_mechanism`** — curved-arrow mechanisms (SN1, SN2, Fischer
  esterification) step by step
- **`generate_scope_table`** — the substrate-scope figure of the methodology
  literature: the general equation with its conditions on top, below it a
  grid of products, each with identifier ("1a") and yield ("78%") plus
  optional ee/dr/time. All structures share one bond length, all captions one
  baseline; an entry that cannot be resolved is reported, not fatal
- **`compare_molecules`** — 2–4 structures side by side, differences
  highlighted, shared scaffold (MCS) neutral
- **`generate_3d`** — rotatable 3D ball-and-stick conformer in the chat
  panel (ETKDGv3 + force field) plus SDF export

**Lab results and analysis**

- **`generate_spectrum`** — schematic spectra from peak lists (IR, NIR,
  Raman, UV/Vis, fluorescence, ORD, CD, ¹H/¹³C NMR, MS) with per-type axis
  conventions — draws given peaks, does not predict spectra
- **`generate_tlc`** — TLC plate sketch from Rf values: start line at the
  bottom, solvent front at the top, one captioned lane per application
  point (educt / reaction / co-spot), Rf annotated at every spot, mobile
  phase and detection printed as a caption — the sketch a lab report asks for
- **`generate_titration_curve`** — pH vs. titrant volume from the exact
  charge balance, with equivalence points, buffer points (pH = pKa) and
  indicator transition band
- **`generate_species_distribution`** — protonation species fractions
  over pH (Henderson–Hasselbalch) with pKa crossovers marked
- **`generate_calibration_curve`** — least-squares line through your
  standards, and the unknowns read back off it the way you would with a
  ruler. A sample outside the calibrated range is labelled as extrapolated
  rather than quietly reported; limits of detection and quantitation
  (DIN 32645) come along for the validation question

**Bench maths** (the number *and* the working — a lab report asks for both)

- **`generate_pk_curve`** — plasma concentration over time in the
  one-compartment model: a single dose or repeated doses with the build-up to
  steady state, oral or i.v., with the therapeutic window drawn in
- **`generate_dose_response`** — the Hill curve on a log axis with EC50, and a
  competitive antagonist shifting it parallel to the right (dose ratio
  r = 1 + [B]/KB, Emax unchanged)
- **`calculate_solution`** — what to weigh (`m = c · V · M`), what you
  actually got, dilutions (C₁V₁ = C₂V₂ with the solvent volume spelled out),
  the mixing cross, and molar masses including hydrates like `CuSO₄·5H₂O`.
  Warns when the calculated portion falls below what an analytical balance
  resolves — then diluting a larger portion is the right move
- **`calculate_content`** — a content determination the way the protocol
  wants it: one content per measurement → Grubbs outlier test → mean, s, RSD
  → t-test against the declared content. Titration (with titer determination
  from reference titrations) and photometry, plus the fat characteristics
  (acid, saponification, ester and iodine value) and Karl Fischer water
  content as further `method`s
- **`calculate_ph`** — weak and strong acids and bases, buffers, and buffer
  recipes down to weighable masses. Solved through the exact charge balance
  with the textbook approximation printed beside it: where the two disagree,
  the approximation has lost its assumptions and says so. 10⁻⁸ M HCl comes
  out at pH 6.98, not 8
- **`calculate_pharmacokinetics`** — the one-compartment model with the working:
  half-life, concentration over time, AUC, tmax/Cmax after an oral dose,
  accumulation and steady state, loading and maintenance dose. Give Vd plus any
  one of ke, half-life or clearance; contradicting values are named, not
  silently resolved

**Substance data** (online lookups)

- **`lookup`** — the facts as text, one `topic` per question:
  `properties` (formula, mass, CAS, InChIKey — the default), `safety` (GHS
  hazard statements, pictograms, signal word), `physical` (melting/boiling
  point, solubility, density), `biochem` (ChEBI classification plus related
  UniProt entries), `pathway` (metabolic pathways from KEGG)
- **`lookup_molecule_data`** — PubChem + GHS combined into one data sheet
  for the in-chat panel, structure included
- **`predict_spectrum`** — which IR bands a structure should show (with
  intensity and band shape), what a measured wavenumber could belong to, and
  how many ¹H signals to expect with their integral ratio. Deterministic, so
  it says what it cannot do: no chemical shifts in ppm, and diastereotopic
  protons are counted as one signal

**Exam prep**

- **`export_anki_deck`** — flashcards as a ready-to-import Anki `.apkg`:
  structure↔name drills (optionally reversed: one note, both directions),
  cloze/fill-in-the-blank cards, identity/detection reactions, spectrum
  band assignment — with rendered images embedded, per-card tags,
  `Parent::Child` subdecks; re-exporting a deck updates cards instead of
  duplicating them. Optional delivery straight into the running Anki via
  the AnkiConnect add-on. Pass `curated_deck_id` instead of your own cards
  for a small, formula-verified starter deck (classic analgesics, Ph.Eur.
  identity reactions)

Every tool belongs to one of five areas — draw, lab graphics, look up,
calculate, Anki — and each says what it is *not* for, in both directions, so
"draw aspirin" cannot end up in a substrate-scope grid and "what pH is my
buffer?" cannot end up in a plotting tool. One tool sits outside them: `save_png` is the
server half of the panel's export button, called when you click it, never
on its own.

Two optional vault tools (`search_vault`, `read_vault_entry`) appear only
in the full profile when `CHEMDRAW_VAULT_PATH` is set; without it that profile
exposes exactly the 23 tools above. The MVP never registers vault tools.

### Options on the drawing tools

- **`formats`** — `["png","svg"]` by default; `"cdxml"` on top of that for
  `generate_molecule`, `generate_reaction` and `batch_generate`. The figure
  tools (`generate_scope_table`, `generate_tlc`, `generate_spectrum`) reject
  CDXML with a clear error instead of writing something meaningless.
- **`abbreviate_groups=True`** — draws common substituents as the labels
  chemists actually write: Ph, Bn, OMe, OAc, tBu, CO₂H, Boc, Ts, TBS.
  Worth it whenever cells get small — a scope figure stays readable because
  only what differs between the substrates remains spelled out. Available on
  `generate_molecule`, `generate_reaction`, `generate_scope_table`,
  `batch_generate`.
- **`render_style`** — a named look instead of a pile of render parameters,
  on the same four tools. `"compact"` (thin bonds, capped label size, tight
  margins) for a small figure in a two-column layout, `"presentation"`
  (double bond width, minimum font size, more padding) for a lecture slide,
  `"grayscale"` for black-and-white printing, where red and blue would
  otherwise become two indistinguishable greys. Empty means the default
  look, untouched.
- **`annotate_stereo=True`** — prints CIP descriptors (R/S, E/Z) on the 2D
  drawing (`generate_molecule`, `batch_generate`).

## Profiles

The default **MVP profile** focuses on four jobs: draw a molecule, draw several
individual structures, compare compounds, and draw a reaction scheme. The panel
also supports compound data sheets and PNG export. It registers six tools in total.
This is a general chemistry workflow for study, teaching and lab reports.

Other features remain in the code and in the optional **full profile**, but are
not registered or callable in the MVP. The separate browser practice trainer
is retained and is outside the MCP MVP.

### Switching profiles

Run from the repository root (restart the server after changing the profile):

```bash
uv run chemdraw-tool-server                         # MVP, the default
CHEMDRAW_PROFILE=full uv run chemdraw-tool-server   # restore all 23 tools
```

For a server registered in `claude_desktop_config.json`, set
`"env": {"CHEMDRAW_PROFILE": "full"}` on that server entry, preserving any existing
environment values, then restart Claude Desktop. Remove that variable or set it
to `mvp` to return to the MVP. A shell variable does not automatically configure
an already running Desktop app. Invalid profile names stop startup with an error.

## Installation

Four ways in; pick **one** — installing twice registers the server twice and
the model sees every tool doubled. Options 2 and 3 merge into the config
idempotently, back it up first and leave every other MCP server you have
configured untouched. Afterwards restart Claude Desktop and ask: *"draw
caffeine"*.

**Option 0 — the bundle** (macOS/Linux, no terminal): download
`chemdraw-mcp-<version>.mcpb` from the
[latest release](https://github.com/jurimaxam-dotcom/chemdraw-mcp/releases/latest),
double-click it, confirm in Claude Desktop, restart. The first start fetches
the package from PyPI via [uv](https://docs.astral.sh/uv/) (installed for you
if missing) — about 40 MB, give it a minute; every later start is offline.
If you already installed via option 1 or 2, remove that entry first.

**Option 1 — clone the repo** (recommended if you want to read or change the
code; installs uv if missing, syncs dependencies, registers the server):

```bash
git clone https://github.com/jurimaxam-dotcom/chemdraw-mcp.git
cd chemdraw-mcp && ./install.sh
```

**Option 2 — from PyPI, no clone** (needs [uv](https://docs.astral.sh/uv/)):

```bash
uv tool install chemdraw-mcp
chemdraw-install
```

`chemdraw-install` writes the Claude Desktop entry for you, using the
absolute path of the installed launcher, and prints the start command it
registered.

**Option 3 — edit the config by hand.** Add this to
`claude_desktop_config.json` under `mcpServers` (macOS:
`~/Library/Application Support/Claude/claude_desktop_config.json`):

```json
"chemdraw-tool": {
  "command": "/opt/homebrew/bin/uvx",
  "args": ["chemdraw-mcp"]
}
```

> **The one pitfall that breaks every manual install:** Claude Desktop does
> not start MCP servers from a login shell — it uses the minimal GUI PATH.
> A bare `"uvx"` or `"uv"` cannot be resolved there, and the server fails to
> start without saying so. Always put the **absolute** path that
> `which uvx` prints on *your* machine into `command`. Options 1 and 2 do
> this for you.

### Optional extras

- **A Java runtime** (e.g. `brew install openjdk`) lets
  [OPSIN](https://github.com/dan2097/opsin) parse systematic IUPAC names
  offline — including ones no database indexes. Without Java the resolver
  simply continues with the PubChem/NCI online lookup.
- **The AnkiConnect add-on** lets `export_anki_deck` push cards straight
  into a running Anki. Without it you get the `.apkg` file and import it
  yourself.
- **ChemDraw** (macOS) is never required: request `formats=["cdxml"]` and
  open the file yourself if you want to keep editing there.

### Something not working? Run the doctor

```bash
chemdraw-doctor                            # after "uv tool install chemdraw-mcp"
uv run chemdraw-doctor                     # in the cloned repo
uvx --from chemdraw-mcp chemdraw-doctor    # without installing anything
```

This is the first thing to try — it turns "the server does nothing" into a
named cause. It checks the six things that make the server look dead in the
chat (RDKit rendering, the Java/OPSIN runtime, the `uv` path, the Claude
Desktop entry, the name databases, the output directory) and prints, for
every problem, the exact command that fixes it. Three levels are
distinguished: `[OK]`, `[LIMITED]` (works, but restricted) and `[FAIL]`
(broken); `[NOTE]` marks checks that simply do not apply, such as not having
Claude Desktop installed. The exit code stays 0 as long as the server is
usable, so it can run in scripts. (From a PyPI install the `uv` and Claude
Desktop checks report `[NOTE]` — they relate to the repo installer.)

## Limitations

Stated up front, so nothing surprises you in a report:

- **Java is optional, and that has a price.** Without a JRE, OPSIN is
  skipped and names are resolved online via PubChem/NCI — so name lookups
  need an internet connection and only work for names those databases index.
  SMILES input never touches the network.
- **Spectra are schematic.** `generate_spectrum` draws the peaks it is
  handed, with the right axis conventions for the spectrum type. It measures
  nothing and predicts nothing — if the peak values came from the chat rather
  than from your instrument, verify them before they go into a report.
- **TLC intensity is a drawing hint.** The optional `intensity` (0…1) makes
  a spot fainter on the sketch. It is not densitometry and carries no
  quantitative meaning.
- **CDXML is a side path.** It is written from the RDKit molecule and
  round-trip validated, but PNG/SVG are the primary outputs and the ones the
  pixel tests cover. CDXML is off by default and limited to structures and
  reaction schemes — TLC plates, scope figures and spectra reject it.
- **3D is one conformer.** `generate_3d` embeds with ETKDGv3 and optimizes
  with MMFF (UFF as fallback). That is a plausible geometry for looking at,
  not a conformational search and not an energy statement.
- **The ChemDraw bridge is macOS-only** and needs a locally installed
  ChemDraw. Everything else works without it.

## How it works

```
name / SMILES
   │
   ▼
resolver ──► OPSIN (systematic IUPAC names, offline) ──► PubChem / NCI (names)  ·  direct parse (SMILES)
   │
   ▼
RDKit 2D coordinates ──► validation (sanity, round-trip)
   │
   ├──► image_export   → PNG + SVG files          (primary, offline)
   ├──► svg_renderer   → interactive chat preview (MCP App resource)
   └──► cdxml_writer   → ChemDraw CDXML           (optional, on request)
```

## Development

Python 3.11+, package manager `uv`.

```bash
uv sync                      # backend deps
cd chemdraw_tool/ui && npm install && npx playwright install chromium  # frontend, once
./test.sh                    # the gate: pytest + JS unit + headless-Chromium e2e
```

600+ tests, written test-first. The e2e test rasters a real RDKit SVG in
headless Chromium and compares it against an exact pixel snapshot — the
export path and the in-chat preview are held to the same drawing constants.

## Feedback, bugs and wishes

This is built for students, and what it does next comes from what you run into.

- **Something broke?** [Open a bug report](https://github.com/jurimaxam-dotcom/chemdraw-mcp/issues/new?template=bug_report.yml) —
  the form asks for the output of `chemdraw-doctor`, which answers most questions before they are asked.
- **Missing something in your course?** [Tell us what you would draw or calculate](https://github.com/jurimaxam-dotcom/chemdraw-mcp/issues/new?template=feature_request.yml) —
  say the subject and the exam question; that is worth more than a feature name.
- **Wrong chemistry?** Use the bug form and name the compound and the figure. Wrong structures matter more than anything else here.
- **A question, or something you made with it?** [Discussions](https://github.com/jurimaxam-dotcom/chemdraw-mcp/discussions) — "Show and tell" is the place for what you used it for.
- **It worked well?** A ⭐ on the repository is the only analytics this project has.

## License

Apache-2.0 — see [LICENSE](LICENSE). Copyright 2026 jurimaxam-dotcom.

> **Disclaimer:** This is an unofficial, independent project, not affiliated
> with or endorsed by Revvity. *ChemDraw* is a trademark of Revvity Signals
> Software, Inc. This tool does not include or require ChemDraw; it can
> optionally export files in the open CDXML format.
