{
  "markdown": "# chemdraw-mcp\n\n<!-- mcp-name: io.github.jurimaxam-dotcom/chemdraw-mcp -->\n\n[![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)\n[![Release](https://img.shields.io/github/v/release/jurimaxam-dotcom/chemdraw-mcp)](https://github.com/jurimaxam-dotcom/chemdraw-mcp/releases)\n[![License: Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-blue)](LICENSE)\n\n**Chat → chemical structure.** An MCP server for Claude Desktop: you describe\na molecule, a reaction or a lab result in plain words, and it draws the\nfigure — a print-ready PNG/SVG rendered locally with RDKit, plus an\ninteractive preview inside the chat. *\"Draw aspirin\"* is already a complete\ncommand.\n\nBuilt for pharmacy and chemistry students who spend too much time clicking\nhexagons. 20 tools cover what a report or a slide actually needs:\nstructures, reaction schemes, step-by-step mechanisms, substrate-scope\nfigures, TLC plates, titration curves, schematic spectra, substance data\nsheets, Ph.Eur. assay calculations and Anki decks.\n\nWhat it costs you: one install command. Apache-2.0, no API key, no sign-up\nfor the server, no ChemDraw licence — you need Claude Desktop and\n[uv](https://docs.astral.sh/uv/), everything else is fetched once.\nRendering runs entirely on your machine; only name resolution and the\ndatabase lookups reach the internet. ChemDraw CDXML is an optional extra\nformat for people who want to keep editing there, never a requirement.\n\n<p align=\"center\"><img src=\"https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/demo.gif\" alt=\"Live demo: 'Draw Caffein' renders an interactive structure panel in Claude Desktop\" width=\"560\"></p>\n\n## Example output\n\n*\"Draw caffeine\"* — print-ready PNG, generated by `generate_molecule`:\n\n<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>\n\n*\"Show the Fischer esterification of ethanol with acetic acid\"* —\n`generate_reaction` renders the scheme with conditions above the arrow,\nlive in the chat panel:\n\n<p align=\"center\"><img src=\"https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/reaction-demo.gif\" alt=\"Reaction scheme with conditions appearing live in the chat panel\" width=\"640\"></p>\n\n*\"Show the Fischer esterification mechanism step by step\"* —\n`generate_mechanism` renders curved electron-flow arrows in the interactive\npanel:\n\n<p align=\"center\"><img src=\"https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/mechanism-demo.gif\" alt=\"Step-by-step Fischer esterification mechanism with curved arrows in the chat panel\" width=\"560\"></p>\n\n*\"Make a scope figure of my Suzuki couplings: 3a 92%, 3b 88% after 12 h,\n3c 64% with ee 94% and dr 10:1, 3d 71%\"* — `generate_scope_table` sets the\ngeneral equation with its conditions on top and the products below it, on a\nshared bond length and a shared caption baseline:\n\n<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>\n\n*\"Sketch the IR spectrum of ethyl acetate\"* — `generate_spectrum` (draws the\npeaks it is given, with per-type axis conventions):\n\n<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>\n\n*\"TLC of my esterification: educt at 0.30, product at 0.65, the co-spot shows\nboth, some educt left\"* — `generate_tlc` draws the plate the lab report asks\nfor, with mobile phase and detection as its caption:\n\n<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>\n\n*\"Show caffeine in 3D\"* — `generate_3d` embeds the molecule (ETKDG + force\nfield) and opens a drag-to-rotate ball-and-stick viewer in the chat panel:\n\n<p align=\"center\"><img src=\"https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/3d-demo.gif\" alt=\"Rotating 3D ball-and-stick caffeine model inside the concave viewer\" width=\"560\"></p>\n\n*\"What distinguishes ibuprofen from naproxen and ketoprofen?\"* —\n`compare_molecules` keeps the shared scaffold (MCS) neutral and highlights\neverything that differs:\n\n<p align=\"center\"><img src=\"https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/compare-profens.png\" alt=\"Ibuprofen, naproxen and ketoprofen side by side with differences highlighted\" width=\"680\"></p>\n\n*\"Titration curve of phosphoric acid with NaOH, phenolphthalein as\nindicator\"* — `generate_titration_curve` computes pH from the exact charge\nbalance, with equivalence points, buffer points (pH = pKa) and the indicator\nband; its sibling `generate_species_distribution` shows which protonation\nspecies dominates at every pH:\n\n<p align=\"center\">\n  <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\">\n  <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\">\n</p>\n\n*\"Create an Anki deck with important molecules and open it in Anki\"* —\n`export_anki_deck` builds a ready-to-import `.apkg`\nwith rendered structures embedded; with the optional AnkiConnect add-on the\ncards land straight in the running Anki, no clicks:\n\n<p align=\"center\"><img src=\"https://raw.githubusercontent.com/jurimaxam-dotcom/chemdraw-mcp/main/assets/anki-demo.gif\" alt=\"Split screen: asking Claude for an Anki deck, cards appear in Anki via AnkiConnect\" width=\"760\"></p>\n\n## Features\n\nAll 20 tools the server exposes. Files are written to `~/ChemDraw-Output/`;\nevery drawing tool also returns a live preview for the in-chat panel.\n\n**Structures and schemes**\n\n- **`generate_molecule`** — name/SMILES → 2D structure as PNG + SVG\n  (optionally CDXML), with properties, functional-group detection and a\n  Lipinski rule-of-five check\n- **`batch_generate`** — a whole list of structures in one call\n- **`generate_reaction`** — educts + products + conditions → reaction scheme\n  with the conditions set above the arrow\n- **`generate_mechanism`** — curved-arrow mechanisms (SN1, SN2, Fischer\n  esterification) step by step\n- **`generate_scope_table`** — the substrate-scope figure of the methodology\n  literature: the general equation with its conditions on top, below it a\n  grid of products, each with identifier (\"1a\") and yield (\"78%\") plus\n  optional ee/dr/time. All structures share one bond length, all captions one\n  baseline; an entry that cannot be resolved is reported, not fatal\n- **`compare_molecules`** — 2–4 structures side by side, differences\n  highlighted, shared scaffold (MCS) neutral\n- **`generate_3d`** — rotatable 3D ball-and-stick conformer in the chat\n  panel (ETKDGv3 + force field) plus SDF export\n\n**Lab results and analysis**\n\n- **`generate_spectrum`** — schematic spectra from peak lists (IR, NIR,\n  Raman, UV/Vis, fluorescence, ORD, CD, ¹H/¹³C NMR, MS) with per-type axis\n  conventions — draws given peaks, does not predict spectra\n- **`generate_tlc`** — TLC plate sketch from Rf values: start line at the\n  bottom, solvent front at the top, one captioned lane per application\n  point (educt / reaction / co-spot), Rf annotated at every spot, mobile\n  phase and detection printed as a caption — the sketch a lab report asks for\n- **`generate_titration_curve`** — pH vs. titrant volume from the exact\n  charge balance, with equivalence points, buffer points (pH = pKa) and\n  indicator transition band\n- **`generate_species_distribution`** — protonation species fractions\n  over pH (Henderson–Hasselbalch) with pKa crossovers marked\n- **`generate_calibration_curve`** — least-squares line through your\n  standards, and the unknowns read back off it the way you would with a\n  ruler. A sample outside the calibrated range is labelled as extrapolated\n  rather than quietly reported; limits of detection and quantitation\n  (DIN 32645) come along for the validation question\n\n**Bench maths** (the number *and* the working — a lab report asks for both)\n\n- **`calculate_solution`** — what to weigh (`m = c · V · M`), what you\n  actually got, dilutions (C₁V₁ = C₂V₂ with the solvent volume spelled out),\n  the mixing cross, and molar masses including hydrates like `CuSO₄·5H₂O`.\n  Warns when the calculated portion falls below what an analytical balance\n  resolves — then diluting a larger portion is the right move\n- **`calculate_content`** — a content determination the way the protocol\n  wants it: one content per measurement → Grubbs outlier test → mean, s, RSD\n  → t-test against the declared content. Titration (with titer determination\n  from reference titrations) and photometry, plus the fat characteristics\n  (acid, saponification, ester and iodine value) and Karl Fischer water\n  content as further `method`s\n- **`calculate_ph`** — weak and strong acids and bases, buffers, and buffer\n  recipes down to weighable masses. Solved through the exact charge balance\n  with the textbook approximation printed beside it: where the two disagree,\n  the approximation has lost its assumptions and says so. 10⁻⁸ M HCl comes\n  out at pH 6.98, not 8\n\n**Substance data** (online lookups)\n\n- **`lookup`** — the facts as text, one `topic` per question:\n  `properties` (formula, mass, CAS, InChIKey — the default), `safety` (GHS\n  hazard statements, pictograms, signal word), `physical` (melting/boiling\n  point, solubility, density), `biochem` (ChEBI classification plus related\n  UniProt entries), `pathway` (metabolic pathways from KEGG)\n- **`lookup_molecule_data`** — PubChem + GHS combined into one data sheet\n  for the in-chat panel, structure included\n- **`predict_spectrum`** — which IR bands a structure should show (with\n  intensity and band shape), what a measured wavenumber could belong to, and\n  how many ¹H signals to expect with their integral ratio. Deterministic, so\n  it says what it cannot do: no chemical shifts in ppm, and diastereotopic\n  protons are counted as one signal\n\n**Exam prep**\n\n- **`export_anki_deck`** — flashcards as a ready-to-import Anki `.apkg`:\n  structure↔name drills (optionally reversed: one note, both directions),\n  cloze/fill-in-the-blank cards, identity/detection reactions, spectrum\n  band assignment — with rendered images embedded, per-card tags,\n  `Parent::Child` subdecks; re-exporting a deck updates cards instead of\n  duplicating them. Optional delivery straight into the running Anki via\n  the AnkiConnect add-on. Pass `curated_deck_id` instead of your own cards\n  for a small, formula-verified starter deck (classic analgesics, Ph.Eur.\n  identity reactions)\n\nEvery tool belongs to one of five areas — draw, lab graphics, look up,\ncalculate, Anki — and each says what it is *not* for, in both directions, so\n\"draw aspirin\" cannot end up in a substrate-scope grid and \"what pH is my\nbuffer?\" cannot end up in a plotting tool. One tool sits outside them: `save_png` is the\nserver half of the panel's export button, called when you click it, never\non its own.\n\nTwo optional vault tools (`search_vault`, `read_vault_entry`) appear only\nwhen `CHEMDRAW_VAULT_PATH` is set; without it the server exposes exactly the\n20 tools above.\n\n### Options on the drawing tools\n\n- **`formats`** — `[\"png\",\"svg\"]` by default; `\"cdxml\"` on top of that for\n  `generate_molecule`, `generate_reaction` and `batch_generate`. The figure\n  tools (`generate_scope_table`, `generate_tlc`, `generate_spectrum`) reject\n  CDXML with a clear error instead of writing something meaningless.\n- **`abbreviate_groups=True`** — draws common substituents as the labels\n  chemists actually write: Ph, Bn, OMe, OAc, tBu, CO₂H, Boc, Ts, TBS.\n  Worth it whenever cells get small — a scope figure stays readable because\n  only what differs between the substrates remains spelled out. Available on\n  `generate_molecule`, `generate_reaction`, `generate_scope_table`,\n  `batch_generate`.\n- **`render_style`** — a named look instead of a pile of render parameters,\n  on the same four tools. `\"compact\"` (thin bonds, capped label size, tight\n  margins) for a small figure in a two-column layout, `\"presentation\"`\n  (double bond width, minimum font size, more padding) for a lecture slide,\n  `\"grayscale\"` for black-and-white printing, where red and blue would\n  otherwise become two indistinguishable greys. Empty means the default\n  look, untouched.\n- **`annotate_stereo=True`** — prints CIP descriptors (R/S, E/Z) on the 2D\n  drawing (`generate_molecule`, `batch_generate`).\n\n## Installation\n\nThree ways in; pick one. Options 1 and 2 merge into the config idempotently,\nback it up first and leave every other MCP server you have configured\nuntouched. Afterwards restart Claude Desktop and ask: *\"draw caffeine\"*.\n\n**Option 1 — clone the repo** (recommended if you want to read or change the\ncode; installs uv if missing, syncs dependencies, registers the server):\n\n```bash\ngit clone https://github.com/jurimaxam-dotcom/chemdraw-mcp.git\ncd chemdraw-mcp && ./install.sh\n```\n\n**Option 2 — from PyPI, no clone** (needs [uv](https://docs.astral.sh/uv/)):\n\n```bash\nuv tool install chemdraw-mcp\nchemdraw-install\n```\n\n`chemdraw-install` writes the Claude Desktop entry for you, using the\nabsolute path of the installed launcher, and prints the start command it\nregistered.\n\n**Option 3 — edit the config by hand.** Add this to\n`claude_desktop_config.json` under `mcpServers` (macOS:\n`~/Library/Application Support/Claude/claude_desktop_config.json`):\n\n```json\n\"chemdraw-tool\": {\n  \"command\": \"/opt/homebrew/bin/uvx\",\n  \"args\": [\"chemdraw-mcp\"]\n}\n```\n\n> **The one pitfall that breaks every manual install:** Claude Desktop does\n> not start MCP servers from a login shell — it uses the minimal GUI PATH.\n> A bare `\"uvx\"` or `\"uv\"` cannot be resolved there, and the server fails to\n> start without saying so. Always put the **absolute** path that\n> `which uvx` prints on *your* machine into `command`. Options 1 and 2 do\n> this for you.\n\n### Optional extras\n\n- **A Java runtime** (e.g. `brew install openjdk`) lets\n  [OPSIN](https://github.com/dan2097/opsin) parse systematic IUPAC names\n  offline — including ones no database indexes. Without Java the resolver\n  simply continues with the PubChem/NCI online lookup.\n- **The AnkiConnect add-on** lets `export_anki_deck` push cards straight\n  into a running Anki. Without it you get the `.apkg` file and import it\n  yourself.\n- **ChemDraw** (macOS) is never required: request `formats=[\"cdxml\"]` and\n  open the file yourself if you want to keep editing there.\n\n### Something not working? Run the doctor\n\n```bash\nchemdraw-doctor                            # after \"uv tool install chemdraw-mcp\"\nuv run chemdraw-doctor                     # in the cloned repo\nuvx --from chemdraw-mcp chemdraw-doctor    # without installing anything\n```\n\nThis is the first thing to try — it turns \"the server does nothing\" into a\nnamed cause. It checks the six things that make the server look dead in the\nchat (RDKit rendering, the Java/OPSIN runtime, the `uv` path, the Claude\nDesktop entry, the name databases, the output directory) and prints, for\nevery problem, the exact command that fixes it. Three levels are\ndistinguished: `[OK]`, `[LIMITED]` (works, but restricted) and `[FAIL]`\n(broken); `[NOTE]` marks checks that simply do not apply, such as not having\nClaude Desktop installed. The exit code stays 0 as long as the server is\nusable, so it can run in scripts. (From a PyPI install the `uv` and Claude\nDesktop checks report `[NOTE]` — they relate to the repo installer.)\n\n## Limitations\n\nStated up front, so nothing surprises you in a report:\n\n- **Java is optional, and that has a price.** Without a JRE, OPSIN is\n  skipped and names are resolved online via PubChem/NCI — so name lookups\n  need an internet connection and only work for names those databases index.\n  SMILES input never touches the network.\n- **Spectra are schematic.** `generate_spectrum` draws the peaks it is\n  handed, with the right axis conventions for the spectrum type. It measures\n  nothing and predicts nothing — if the peak values came from the chat rather\n  than from your instrument, verify them before they go into a report.\n- **TLC intensity is a drawing hint.** The optional `intensity` (0…1) makes\n  a spot fainter on the sketch. It is not densitometry and carries no\n  quantitative meaning.\n- **CDXML is a side path.** It is written from the RDKit molecule and\n  round-trip validated, but PNG/SVG are the primary outputs and the ones the\n  pixel tests cover. CDXML is off by default and limited to structures and\n  reaction schemes — TLC plates, scope figures and spectra reject it.\n- **3D is one conformer.** `generate_3d` embeds with ETKDGv3 and optimizes\n  with MMFF (UFF as fallback). That is a plausible geometry for looking at,\n  not a conformational search and not an energy statement.\n- **The ChemDraw bridge is macOS-only** and needs a locally installed\n  ChemDraw. Everything else works without it.\n\n## How it works\n\n```\nname / SMILES\n   │\n   ▼\nresolver ──► OPSIN (systematic IUPAC names, offline) ──► PubChem / NCI (names)  ·  direct parse (SMILES)\n   │\n   ▼\nRDKit 2D coordinates ──► validation (sanity, round-trip)\n   │\n   ├──► image_export   → PNG + SVG files          (primary, offline)\n   ├──► svg_renderer   → interactive chat preview (MCP App resource)\n   └──► cdxml_writer   → ChemDraw CDXML           (optional, on request)\n```\n\n## Development\n\nPython 3.11+, package manager `uv`.\n\n```bash\nuv sync                      # backend deps\ncd chemdraw_tool/ui && npm install && npx playwright install chromium  # frontend, once\n./test.sh                    # the gate: pytest + JS unit + headless-Chromium e2e\n```\n\n600+ tests, written test-first. The e2e test rasters a real RDKit SVG in\nheadless Chromium and compares it against an exact pixel snapshot — the\nexport path and the in-chat preview are held to the same drawing constants.\n\n## License\n\nApache-2.0 — see [LICENSE](LICENSE). Copyright 2026 jurimaxam-dotcom.\n\n> **Disclaimer:** This is an unofficial, independent project, not affiliated\n> with or endorsed by Revvity. *ChemDraw* is a trademark of Revvity Signals\n> Software, Inc. This tool does not include or require ChemDraw; it can\n> optionally export files in the open CDXML format.\n",
  "bytes": 18896,
  "sha": "204e415780673fb42dcac37a77780420a00bea5a8d730435cbbe4cf416e223f0",
  "repo_slug": "jurimaxam-dotcom/chemdraw-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_jurimaxam_dotcom_chemdraw_mcp_f241744c/readme"
}