Skip to main content
Glama

chemdraw-mcp

CI Release License: Apache-2.0

Чат → химическая структура. MCP-сервер для Claude Desktop: вы описываете молекулу, реакцию или результат лабораторной работы простыми словами, а он рисует изображение — готовый к печати PNG/SVG, отрисованный локально с помощью RDKit, плюс интерактивный предпросмотр прямо в чате. «Нарисуй аспирин» — уже полноценная команда.

Создан для студентов фармацевтических и химических специальностей, которые тратят слишком много времени на клики по шестиугольникам. 20 инструментов покрывают то, что реально нужно для отчёта или слайда: структуры, схемы реакций, пошаговые механизмы, рисунки субстратного охвата, пластины ТСХ, кривые титрования, схематические спектры, листы данных о веществах, расчёты по методикам Ph.Eur. и колоды Anki.

Что это вам стоит: одна команда установки. Apache-2.0, без API-ключа, без регистрации для сервера, без лицензии ChemDraw — вам нужны Claude Desktop и uv, всё остальное загружается один раз. Отрисовка полностью выполняется на вашей машине; только разрешение имён и обращения к базам данных выходят в интернет. ChemDraw CDXML — это дополнительный формат для тех, кто хочет продолжать редактирование там, но он никогда не является обязательным.

Пример вывода

«Нарисуй кофеин» — готовый к печати PNG, созданный generate_molecule:

«Покажи этерификацию Фишера этанола с уксусной кислотой» — generate_reaction отображает схему с условиями над стрелкой, прямо в панели чата:

«Покажи механизм этерификации Фишера по шагам» — generate_mechanism отображает изогнутые стрелки движения электронов в интерактивной панели:

«Сделай рисунок субстратного охвата моих реакций Сузуки: 3a 92%, 3b 88% после 12 ч, 3c 64% с ee 94% и dr 10:1, 3d 71%» — generate_scope_table задаёт общее уравнение с условиями сверху и продукты под ним, на общей длине связи и общей базовой линии подписей:

«Нарисуй ИК-спектр этилацетата» — generate_spectrum (рисует заданные пики, с осевыми соглашениями для каждого типа):

«ТСХ моей этерификации: исходное вещество на 0.30, продукт на 0.65, совместная точка показывает оба, немного исходного осталось» — generate_tlc рисует пластину, которую требует лабораторный отчёт, с подвижной фазой и детектированием в подписи:

«Покажи кофеин в 3D» — generate_3d встраивает молекулу (ETKDG + силовое поле) и открывает в панели чата просмотрщик «шарики и палочки» с вращением перетаскиванием:

«Чем ибупрофен отличается от напроксена и кетопрофена?» — compare_molecules сохраняет общий каркас (MCS) нейтральным и выделяет всё, что отличается:

«Кривая титрования фосфорной кислоты NaOH, фенолфталеин в качестве индикатора» — generate_titration_curve вычисляет pH из точного зарядового баланса, с точками эквивалентности, буферными точками (pH = pKa) и полосой индикатора; его родственный инструмент generate_species_distribution показывает, какая протонированная форма доминирует при каждом pH:

«Создай колоду Anki с важными молекулами и открой её в Anki» — export_anki_deck создаёт готовый к импорту .apkg со встроенными отрисованными структурами; с дополнительным аддоном AnkiConnect карточки попадают прямо в запущенный Anki, без кликов:

Related MCP server: ChemMCP

Возможности

Все 20 инструментов, которые предоставляет сервер. Файлы записываются в ~/ChemDraw-Output/; каждый инструмент рисования также возвращает живой предпросмотр для панели в чате.

Структуры и схемы

  • generate_molecule — имя/SMILES → 2D-структура в формате PNG + SVG (опционально CDXML), со свойствами, определением функциональных групп и проверкой правила Липински

  • batch_generate — целый список структур одним вызовом

  • generate_reaction — реагенты + продукты + условия → схема реакции с условиями над стрелкой

  • generate_mechanism — механизмы с изогнутыми стрелками (SN1, SN2, этерификация Фишера) по шагам

  • generate_scope_table — рисунок субстратного охвата из литературы по методологии: общее уравнение с условиями сверху, под ним сетка продуктов, каждый с идентификатором («1a») и выходом («78%»), плюс опционально ee/dr/время. Все структуры используют одну длину связи, все подписи — одну базовую линию; запись, которую не удалось разрешить, сообщается, но не является фатальной

  • compare_molecules — 2–4 структуры рядом, различия выделены, общий каркас (MCS) нейтрален

  • generate_3d — вращаемый 3D-конформер «шарики и палочки» в панели чата (ETKDGv3 + силовое поле) плюс экспорт в SDF

Лабораторные результаты и анализ

  • generate_spectrum — схематические спектры из списков пиков (ИК, БИК, КР, УФ/Вид, флуоресценция, ОРД, КД, ¹H/¹³C ЯМР, МС) с осевыми соглашениями для каждого типа — рисует заданные пики, не предсказывает спектры

  • generate_tlc — эскиз пластины ТСХ по значениям Rf: линия старта внизу, фронт растворителя вверху, по одной подписанной дорожке на точку нанесения (исходное / реакция / совместная точка), Rf указан у каждого пятна, подвижная фаза и детектирование напечатаны в подписи — эскиз, который требует лабораторный отчёт

  • generate_titration_curve — pH в зависимости от объёма титранта из точного зарядового баланса, с точками эквивалентности, буферными точками (pH = pKa) и полосой перехода индикатора

  • generate_species_distribution — доли протонированных форм в зависимости от pH (Хендерсон–Хассельбальх) с отмеченными пересечениями pKa

  • generate_calibration_curve — линия наименьших квадратов через ваши стандарты, и неизвестные считываются с неё так же, как вы бы сделали линейкой. Образец за пределами калибровочного диапазона помечается как экстраполированный, а не тихо сообщается; пределы обнаружения и количественного определения (DIN 32645) прилагаются для вопроса валидации

Расчёты на столе (число и расчёт — лабораторный отчёт требует и того, и другого)

  • calculate_solution — что взвесить (m = c · V · M), что вы фактически получили, разведения (C₁V₁ = C₂V₂ с указанным объёмом растворителя), правило креста и молярные массы, включая гидраты, такие как CuSO₄·5H₂O. Предупреждает, когда рассчитанная навеска ниже того, что разрешает аналитические весы — тогда разведение большей навески — правильный ход

  • calculate_content — определение содержания так, как этого хочет протокол: одно содержание на измерение → тест Граббса на выбросы → среднее, s, RSD → t-тест против заявленного содержания. Титрование (с определением титра по референсным титрованиям) и фотометрия, плюс характеристики жиров (кислотное, омыления, эфирное и йодное числа) и содержание воды по Карлу Фишеру как дополнительные methodы

  • calculate_ph — слабые и сильные кислоты и основания, буферы, и рецепты буферов вплоть до взвешиваемых масс. Решается через точный зарядовый баланс с приближением из учебника рядом: где они расходятся, приближение потеряло свои допущения и говорит об этом. 10⁻⁸ M HCl даёт pH 6.98, а не 8

Данные о веществах (онлайн-запросы)

  • lookup — факты в виде текста, один topic на вопрос: properties (формула, масса, CAS, InChIKey — по умолчанию), safety (GHS формулировки опасности, пиктограммы, сигнальное слово), physical (температура плавления/кипения, растворимость, плотность), biochem (классификация ChEBI плюс связанные записи UniProt), pathway (метаболические пути из KEGG)

  • lookup_molecule_data — PubChem + GHS, объединённые в один лист данных для панели в чате, включая структуру

  • predict_spectrum — какие ИК-полосы должна показывать структура (с интенсивностью и формой полосы), чему может соответствовать измеренное волновое число, и сколько сигналов ¹H ожидать с их интегральным соотношением. Детерминированный, поэтому он говорит, чего не может: нет химических сдвигов в ppm, и диастереотопные протоны считаются одним сигналом

Подготовка к экзаменам

  • export_anki_deck — карточки в виде готового к импорту Anki .apkg: упражнения структура↔название (опционально в обе стороны: одна заметка, оба направления), карточки с пропусками/заполнением, реакции идентификации/обнаружения, назначение полос спектра — со встроенными отрисованными изображениями, тегами на каждую карточку, подколодами Parent::Child; повторный экспорт колоды обновляет карточки вместо их дублирования. Опциональная доставка прямо в запущенный Anki через аддон AnkiConnect. Передайте curated_deck_id вместо своих карточек для небольшой, проверенной по формулам стартовой колоды (классические анальгетики, реакции идентификации Ph.Eur.)

Каждый инструмент относится к одной из пяти областей — рисование, лабораторная графика, поиск, расчёт, Anki — и каждый говорит, для чего он не предназначен, в обе стороны, так что «нарисуй аспирин» не может попасть в сетку субстратного охвата, а «какой pH у моего буфера?» не может попасть в инструмент построения графиков. Один инструмент стоит вне них: save_png — это серверная половина кнопки экспорта панели, вызывается при клике по ней, никогда сам по себе.

Два дополнительных инструмента для хранилища (search_vault, read_vault_entry) появляются только когда задан CHEMDRAW_VAULT_PATH; без него сервер предоставляет ровно 20 инструментов, перечисленных выше.

Опции инструментов рисования

  • formats — по умолчанию ["png","svg"]; для generate_molecule, generate_reaction и batch_generate дополнительно "cdxml". Инструменты для работы с рисунками (generate_scope_table, generate_tlc, generate_spectrum) отклоняют CDXML с понятной ошибкой, вместо того чтобы записать что-то бессмысленное.

  • abbreviate_groups=True — рисует распространённые заместители так, как их записывают химики: Ph, Bn, OMe, OAc, tBu, CO₂H, Boc, Ts, TBS. Это оправдано, когда ячейки становятся маленькими — таблица субстратов остаётся читаемой, потому что полностью прописано только то, чем субстраты различаются. Доступно в generate_molecule, generate_reaction, generate_scope_table, batch_generate.

  • render_style — именованный вид вместо набора параметров отрисовки, в тех же четырёх инструментах. "compact" (тонкие связи, ограниченный размер подписей, узкие поля) для небольшого рисунка в двухколоночной вёрстке, "presentation" (двойная толщина связей, минимальный размер шрифта, больше отступов) для слайда лекции, "grayscale" для чёрно-белой печати, где красный и синий иначе стали бы двумя неразличимыми оттенками серого. Пустое значение — стандартный вид, без изменений.

  • annotate_stereo=True — выводит CIP-дескрипторы (R/S, E/Z) на двумерном рисунке (generate_molecule, batch_generate).

Установка

Три способа; выберите один. Варианты 1 и 2 идемпотентно вливаются в конфиг — сначала сделайте его резервную копию, остальные настроенные MCP-серверы они не трогают. После этого перезапустите Claude Desktop и спросите: «нарисуй кофеин».

Вариант 1 — клонировать репозиторий (рекомендуется, если вы хотите читать или менять код; при необходимости устанавливает uv, синхронизирует зависимости, регистрирует сервер):

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

Вариант 2 — из PyPI, без клонирования (нужен uv):

uv tool install chemdraw-mcp
chemdraw-install

chemdraw-install сам вписывает запись для Claude Desktop, используя абсолютный путь установленного лаунчера, и печатает команду запуска, которую зарегистрировал.

Вариант 3 — править конфиг вручную. Добавьте это в claude_desktop_config.json в раздел mcpServers (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json):

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

Единственная ловушка, из-за которой ломается любая ручная установка: Claude Desktop не запускает MCP-серверы из login-оболочки — он использует минимальный GUI PATH. Голый "uvx" или "uv" там не разрешается, и сервер не запускается, ничем об этом не сообщая. Всегда подставляйте в command абсолютный путь, который which uvx печатает на вашей машине. Варианты 1 и 2 делают это за вас.

Дополнительные возможности

  • Java-рантайм (например, brew install openjdk) позволяет OPSIN разбирать систематические названия IUPAC офлайн — в том числе те, которых нет ни в одной базе. Без Java резолвер просто продолжает онлайн-поиском по PubChem/NCI.

  • Аддон AnkiConnect позволяет export_anki_deck отправлять карточки прямо в запущенный Anki. Без него вы получаете файл .apkg и импортируете его сами.

  • ChemDraw (macOS) никогда не требуется: запросите formats=["cdxml"] и откройте файл сами, если хотите продолжить редактирование там.

Что-то не работает? Запустите доктор

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

Это первое, что стоит попробовать — он превращает «сервер ничего не делает» в названную причину. Он проверяет шесть вещей, из-за которых сервер выглядит мёртвым в чате (рендеринг RDKit, рантайм Java/OPSIN, путь к uv, запись в Claude Desktop, базы названий, выходную директорию) и для каждой проблемы печатает точную команду, которая её исправляет. Различаются три уровня: [OK], [LIMITED] (работает, но с ограничениями) и [FAIL] (сломано); [NOTE] отмечает проверки, которые просто неприменимы, например, если Claude Desktop не установлен. Код выхода остаётся 0, пока сервер пригоден к использованию, так что его можно запускать в скриптах. (При установке из PyPI проверки uv и Claude Desktop сообщают [NOTE] — они относятся к установщику из репозитория.)

Ограничения

Заявлены заранее, чтобы в отчёте вас ничто не удивило:

  • Java необязательна, и у этого есть цена. Без JRE OPSIN пропускается, и названия резолвятся онлайн через PubChem/NCI — значит, поиск по названиям требует интернет-соединения и работает только для названий, которые есть в этих базах. Ввод SMILES никогда не обращается к сети.

  • Спектры схематичны. generate_spectrum рисует те пики, которые ему передали, с правильными осевыми соглашениями для типа спектра. Он ничего не измеряет и ничего не предсказывает — если значения пиков пришли из чата, а не с вашего прибора, проверьте их, прежде чем они попадут в отчёт.

  • Интенсивность на ТСХ — это подсказка для рисунка. Необязательный параметр intensity (0…1) делает пятно бледнее на схеме. Это не денситометрия и не несёт количественного смысла.

  • CDXML — побочный путь. Он записывается из молекулы RDKit и проходит сквозную валидацию, но PNG/SVG — основные выходные форматы, и именно их покрывают пиксельные тесты. CDXML по умолчанию выключен и ограничен структурами и схемами реакций — пластины ТСХ, таблицы субстратов и спектры его отклоняют.

  • 3D — это один конформер. generate_3d встраивает геометрию через ETKDGv3 и оптимизирует MMFF (с запасным вариантом UFF). Это правдоподобная геометрия для просмотра, а не конформационный поиск и не утверждение об энергии.

  • Мост к ChemDraw работает только на macOS и требует локально установленного ChemDraw. Всё остальное работает без него.

Как это работает

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)

Разработка

Python 3.11+, пакетный менеджер uv.

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 тестов, написанных в стиле test-first. E2E-тест растеризует настоящий SVG от RDKit в headless-браузере Chromium и сравнивает его с точным пиксельным снимком — путь экспорта и предпросмотр в чате придерживаются одних и тех же констант отрисовки.

Лицензия

Apache-2.0 — см. LICENSE. Copyright 2026 jurimaxam-dotcom.

Дисклеймер: Это неофициальный независимый проект, не аффилированный с Revvity и не одобренный ею. ChemDraw — товарный знак Revvity Signals Software, Inc. Этот инструмент не включает ChemDraw и не требует его; он может опционально экспортировать файлы в открытом формате CDXML.

Available Tools

16 tools
batch_generateA

Draw several individual compounds as separate PNG/SVG files and panels.

Failed names are reported in failed while successful structures are returned. Pass English or IUPAC names, or SMILES.

Not this tool for: one compound (use generate_molecule), structural differences (use compare_molecules), or a reaction scheme (use generate_reaction).

Args: molecules: List of English/IUPAC compound names or SMILES strings. formats: Output file formats, any of "png", "svg", "cdxml" (default: ["png", "svg"]). Include "cdxml" ONLY when the user wants to edit the structures in ChemDraw. abbreviate_groups: Set True to draw common substituents as short labels (Ph, Bn, OAc, OMe, CO2H, tBu, Boc, Ts …) instead of full skeletons. Applies to every molecule in the batch, so a series of structures stays visually consistent. render_style: Named look applied to every molecule in the batch. Empty = standard style. "compact" for small printed figures, "presentation" for slides, "grayscale" for grayscale printing.

NameRequiredDescriptionDefault
formatsNo
moleculesYes
render_styleNo
annotate_stereoNo
abbreviate_groupsNo

Output Schema

NameRequiredDescription
typeNo
failedNo
moleculesNo
cdxml_pathsNo

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations are provided, the description carries the full burden and performs well. It explicitly details a key behavioral trait: failed names are reported while successful structures are returned. It also explains the conditional use of 'cdxml' for ChemDraw editing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The tool definition is structured logically, starting with the core function, then providing limitations, and finally detailing parameters. Every section is tightly written and efficiently organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of handling batch processing, multiple formats, and custom rendering, the description is remarkably complete. It provides all the necessary context and constraints for an agent to invoke the tool correctly despite the sparse structured data.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite having 0% schema description coverage, the description provides high-value semantic context for every parameter. For instance, it explains the functional difference between 'abbreviate_groups' (consistency) and 'render_style' (use case for printing/slides), adding meaning far beyond the schema data.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The purpose is highly specific: drawing multiple individual compounds as PNG/SVG files and panels. It clearly distinguishes itself from sibling tools by stating it is not suitable for single compounds (use generate_molecule), reaction schemes, or structural comparisons.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The tool explicitly forbids certain use cases, detailing that it should not be used for single molecules, structural differences, or reaction schemes. It provides direct redirection to the correct alternative sibling tool for each specific scenario.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

calculate_phA

Calculate pH, buffer composition and buffer recipes, with the working.

Solves the exact charge balance — the same one that draws the titration curve — and puts the textbook approximation next to it. Where the two disagree, the approximation has lost its assumptions and the answer says so instead of quietly being wrong.

Pick the topic: "weak_acid", "weak_base", "strong_acid", "strong_base", "buffer" (ratio and capacity), "buffer_recipe" (masses to weigh) or "ionisation" (charged and uncharged fraction of a drug at one pH). You supply the pKa values from the monograph or table.

Not this tool for: drawing pH against titrant volume, equivalence points or indicator choice (use generate_titration_curve), or drawing the species fractions across the whole pH range (use generate_species_distribution) — this one computes, those draw.

Args: topic: Which case to solve. concentration: Concentration in mol/L. pka: pKa of the acid, or of the conjugate acid of a base. pkb: pKb of the base. pka_values: All pKa values of a polyprotic acid, in order. acid_concentration: [HA] in mol/L. base_concentration: [A⁻] in mol/L. target_ph: Wanted pH ("buffer_recipe") or medium pH ("ionisation"). total_concentration: [HA] + [A⁻] in mol/L. volume_ml: Buffer volume in mL. acid_molar_mass: Acid component, g/mol. base_molar_mass: Base component, g/mol. drug_type: "acid" or "base" ("ionisation").

NameRequiredDescriptionDefault
pkaNo
pkbNo
topicYes
drug_typeNoacid
target_phNo
volume_mlNo
pka_valuesNo
concentrationNo
acid_molar_massNo
base_molar_massNo
acid_concentrationNo
base_concentrationNo
total_concentrationNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose meaningful behavior beyond the signature: the calculation solves the exact charge balance, reports the textbook approximation alongside it, and explicitly flags when the approximation's assumptions fail rather than returning a silently wrong number. It does not state that the tool is a pure computation with no side effects, nor mention precision/rounding or how the two results are labelled in the response — with an output schema present, the omission of return-format detail is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is front-loaded: purpose first, then the disambiguation block, then a clean per-argument list. Every sentence carries information, though the metaphor-laden second paragraph ('the approximation has lost its assumptions') is slightly longer than needed to convey the same behavioral point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter computational tool with no annotations, the description covers purpose, alternatives, the meaning of every parameter and the tool's output semantics, and an output schema exists so return values need not be explained. The only gap — which parameters apply to which topic — is partly addressed by the per-argument topic hints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description does real work: it defines every one of the 13 parameters, including physical units (mol/L, mL, g/mol) and the distinction between pka ('of the acid, or of the conjugate acid of a base') and pkb. It also scopes two parameters to specific topics — target_ph applies to buffer_recipe/ionisation, drug_type to ionisation. It does not say which parameters are required per topic, and it never warns that all numeric parameters default to 0, which is the main risk with 12 optional numerics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening states a specific verb and resource — 'Calculate pH, buffer composition and buffer recipes' — and the topic enumeration names the exact cases solved. It explicitly distinguishes itself from generate_titration_curve and generate_species_distribution ('this one computes, those draw'), so an agent can route without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit 'Not this tool for' block naming the two sibling alternatives and the condition that selects each (drawing pH vs titrant volume, drawing species fractions over the whole pH range). It also tells the agent to 'Pick the topic' and what data to supply ('You supply the pKa values from the monograph or table'), giving both selection and prerequisite guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_moleculesA

Compare 2-4 molecules side by side with their DIFFERENCES highlighted.

Computes the maximum common substructure (MCS): the shared scaffold stays neutral, everything outside it is highlighted — ideal for teaching drug classes ("what distinguishes ibuprofen from naproxen?"), homologous series or derivatives.

Use this when the user wants to compare structures, see differences between compounds, or study a drug class.

Reach for it in conversation too, not only on request: the word "difference" in a question about two substances is the trigger. Answering "what distinguishes ibuprofen from naproxen?" in prose leaves the reader to find the difference in two separate pictures — this figure marks it.

Not this tool for: a single structure (generate_molecule), or several structures that are merely to be drawn rather than contrasted (batch_generate).

Args: structures: 2-4 English/IUPAC names or SMILES strings. labels: Optional display names under each panel (localizable). title: Optional heading for the comparison (localizable).

NameRequiredDescriptionDefault
titleNo
labelsNo
structuresYes

Output Schema

NameRequiredDescription
svgNo
nameYes
typeNo
filesNo
notesNo
subtitleNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full load — it discloses the algorithmic behavior (MCS computed, shared scaffold kept neutral for contrast) and that the result is a figure rather than prose, which is meaningful behavioral context. It stops short of stating failure behavior for unresolvable names or whether a file is written, which are the remaining gaps for an annotation-free tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core definition, then usage, then exclusions, then args — a rational order with clear sectioning. The conversational-trigger paragraph is slightly padded and repeats the ibuprofen/naproxen example already used earlier, costing a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description covers scope, exclusions, and all three parameters. The only thin spot is edge-case behavior — what happens with fewer than 2 structures, more than 4, or an unresolvable name.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: structures accepts 2-4 English/IUPAC names or SMILES, labels are per-panel display names that are localizable, and title is an optional localizable heading. This adds real meaning beyond the bare schema types and closes the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Compare 2-4 molecules side by side') and explains the mechanism (maximum common substructure with non-shared parts highlighted), which tells the agent exactly what the output depicts. It also names the siblings it is not (generate_molecule, batch_generate), so it is distinguishable without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use triggers ('user wants to compare structures', 'study a drug class'), an explicit not-for clause with named alternatives for both exclusions, and even a conversational trigger word ('difference'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_anki_deckA

Export an Anki flashcard deck (.apkg) with rendered chemistry images.

Use this whenever the user wants flashcards, Anki cards or a study deck for molecules, reactions (e.g. pharmacopoeia identity tests) or spectra. A stated intention to learn or an exam coming up is the same request: offer a deck and write the cards yourself.

Two ways to fill the deck. Either pass cards you wrote yourself, or pass curated_deck_id for a ready-made, formula-verified starter deck:

  • "analgesics-structures": structure → name drills for 8 classic analgesics (NSAIDs, paracetamol, morphine, celecoxib).

  • "pheur-identity-basics": classic Ph.Eur. identity tests — reagent, observation and reaction scheme where it helps.

The tool renders the images — YOU supply the card content from your knowledge. Each card side carries text plus at most ONE visual: structure (name or SMILES), reaction ({reactants, products, conditions}) or spectrum ({spectrum_type, peaks, title}). Proven types: structure↔name, identity reactions (question front, scheme back), functional-group recognition, band assignment, name drills.

Re-exporting under the SAME deck name updates existing cards instead of duplicating them — the front identifies the card.

Options: reversed=true drills both directions (one note, two cards); cloze=true makes fill-in-the-blank cards (front.text carries {{c1::...}}, back.text becomes the extra note). "Parent::Child" nests subdecks.

IMPORTANT: structures take English/IUPAC names or SMILES; card TEXTS may be localized. Never deliver via AnkiConnect unless asked.

Args: deck_name: Deck name, also the filename; re-use it to update a deck. Ignored when curated_deck_id is set. cards: The flashcards. Fronts unambiguous, explanations on the back. default_tags: Tags added to every card. deliver: "apkg" (file only), "open" (also opens it in Anki, macOS) or "ankiconnect" (imports via the AnkiConnect add-on). curated_deck_id: "analgesics-structures" or "pheur-identity-basics".

NameRequiredDescriptionDefault
cardsNo
deliverNoapkg
deck_nameNo
default_tagsNo
curated_deck_idNo

Output Schema

NameRequiredDescription
fileNo
nameYes
typeNo
cardsYes
mediaYes
frontsNo
deliveryNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does it well: same deck name updates rather than duplicates (front is the key), `deck_name` is ignored when `curated_deck_id` is set, `deliver` has three concrete modes, `reversed` produces one note/two cards, `cloze` changes what front/back mean, and 'Parent::Child' nests subdecks. These are non-obvious side effects an agent could not infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long but front-loaded and segmented: purpose first, then triggers, then the two fill paths, then card anatomy, then options, then per-argument notes. Every paragraph answers a distinct question an agent would otherwise have to guess at.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex nested-card export tool with 5 params, the description covers card construction, proven card types, update semantics and delivery modes; the output schema relieves it of explaining return values. Minor gap: it doesn't say what happens if neither `cards` nor `curated_deck_id` is supplied, nor where the .apkg file is written.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% at the top level, but the Args block documents all five parameters, including the enum-like values for `deliver` and `curated_deck_id` that the schema does not constrain. The card-side constraint (text plus at most ONE visual, with the shapes of structure/reaction/spectrum) supplies the nesting semantics the schema leaves implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and artifact: 'Export an Anki flashcard deck (.apkg) with rendered chemistry images.' It also clarifies the division of labour (tool renders images, the agent supplies card content), which no sibling tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the triggering situations (flashcards, study deck, exam coming up, intent to learn) and routes between the two fill modes: own `cards` vs `curated_deck_id`. It also states an exclusion ('Never deliver via AnkiConnect unless asked') and names both curated deck IDs with their contents.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_3dA

Generate a 3D conformer shown as an interactive, rotatable model.

Embeds the molecule in 3D (ETKDGv3 + force-field optimization, explicit hydrogens) and opens a drag-to-rotate ball-and-stick viewer in the chat panel. Also writes an SDF file for molecular modelling tools.

Use this when the user asks about 3D structure, molecular geometry (tetrahedral, planar...), conformation or spatial arrangement.

Not this tool for: a flat 2D structure drawing or a Fischer/Haworth projection — use generate_molecule.

IMPORTANT: Pass English/IUPAC names or SMILES; use label for the localized display name.

Args: name_or_smiles: English/IUPAC compound name or SMILES string. label: Optional display name (localizable).

NameRequiredDescriptionDefault
labelNo
name_or_smilesYes

Output Schema

NameRequiredDescription
nameYes
typeNo
atomsNo
bondsNo
filesNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full disclosure burden and does substantial work: it names the embedding pipeline (ETKDGv3 + force-field optimization, explicit hydrogens), the side effect of opening a chat-panel viewer, and the file side effect (writes an SDF for modelling tools). What it omits is failure behavior for unparseable names/SMILES and where/how the SDF persists, which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and output, then usage triggers, then exclusions, then the critical input-format warning — a sensible priority order for an agent. The trailing Args block partly restates the prose, which is mild redundancy but justified given the zero description coverage in the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter generation tool with an output schema present, the definition covers purpose, routing, input formats, and both render and file side effects, so an agent can call it correctly. It stops short of noting what happens on invalid input or whether the viewer/SDF artifact can be retrieved later.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: name_or_smiles is defined as an English/IUPAC name or SMILES string, and label as an optional localizable display name. The added warning to keep localized text out of name_or_smiles is genuine meaning beyond the schema, though it gives no SMILES syntax examples or validation rules.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Generate a 3D conformer") plus the concrete output form (interactive rotatable ball-and-stick model, SDF file). It explicitly distinguishes itself from generate_molecule for flat 2D drawings, so an agent can separate it from siblings without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit positive triggers (questions about 3D structure, tetrahedral/planar geometry, conformation, spatial arrangement) and an explicit exclusion with a named alternative ("Not this tool for: a flat 2D structure drawing or a Fischer/Haworth projection — use generate_molecule"). This is the when/when-not/alternative pattern at full strength.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_mechanismA

Show a reaction mechanism step by step with curved arrows, drawn with the user's own substrates.

Three mechanism families, each with a stated limit: SN2 — a methyl, primary or secondary alkyl chloride, bromide or iodide with one anionic nucleophile (OH⁻, CN⁻, I⁻, Br⁻, RO⁻, N₃⁻, RS⁻/HS⁻); a stereocentre is inverted. SN1 — a tertiary, benzylic or allylic alkyl halide with water, an alcohol or one of those anions. Fischer esterification — one carboxylic acid with one primary or secondary alcohol. Substrates outside the limit return an error that names the reason. Without substrates, or if the drawing fails, the textbook example is shown and the result says so (substrates_drawn, fallback_reason).

Use this when the user asks about one of these mechanisms, electron-flow arrows, or wants to see how such a reaction proceeds step by step.

A question that starts "why does …" or "I don't understand why …" about a mechanism is the same request in disguise ("why does SN2 invert the centre?"). The arrows ARE the explanation; draw them and explain alongside, rather than describing them in words.

Not this tool for: the net equation educt → product without intermediates — that is generate_reaction. Only the mechanism types listed in reaction_type exist; for anything else use generate_reaction.

Args: reaction_type: "sn2", "sn1" or "fischer_ester". substrates: The user's substrates (names or SMILES): halide and nucleophile, or acid and alcohol. current_step: 0 = overview (all steps), 1-N = specific step.

NameRequiredDescriptionDefault
substratesYes
current_stepNo
reaction_typeYes

Output Schema

NameRequiredDescription
nameYes
typeNo
stepsYes
current_stepNo
reaction_typeYes
fallback_reasonNo
substrates_drawnNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations at all, the description carries the full burden and does so: it states the hard substrate limits per family (e.g. SN2 needs methyl/primary/secondary halide plus one anionic nucleophile; SN1 needs tertiary/benzylic/allylic), that out-of-limit substrates return an error naming the reason, and that missing substrates or drawing failure fall back to the textbook example with substrates_drawn and fallback_reason set. It also discloses the stereocentre inversion outcome, which is genuine behavioral information rather than restated input.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then organized into family limits, usage triggers, exclusions, and args — a structure an agent can scan. It is long-ish and mildly repetitive, since the exclusion of generate_reaction is stated twice (once as 'Not this tool for' and once as 'for anything else use generate_reaction'), but nearly every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value structure need not be explained, yet the description still names the key result fields (substrates_drawn, fallback_reason). Combined with per-family preconditions, error behavior, and fallback behavior, nothing an agent needs in order to call this correctly for a three-parameter chemistry tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does for all three parameters: reaction_type's three values, substrates as names or SMILES with the per-family pairing (halide + nucleophile, or acid + alcohol), and current_step as 0 = overview of all steps versus 1-N = a specific step. This adds real meaning beyond the bare enum and array types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line states a specific verb and resource — draw a reaction mechanism step by step with curved arrows using the user's substrates — and the three supported families (SN2, SN1, Fischer esterification) are enumerated. It explicitly names the sibling it is not (generate_reaction) and the condition that separates them (net equation without intermediates).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit when-to-use trigger (user asks about these mechanisms or electron-flow arrows) and an explicit when-not (net educt → product is generate_reaction; unsupported mechanism types are generate_reaction). It even resolves the ambiguous case of 'why does …' questions, telling the agent that is the same request and to answer with arrows rather than prose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_moleculeA

Draw one compound as a 2D structure — the default for a single substance.

Writes PNG/SVG files and an interactive panel (properties, functional groups). A bare compound name ("caffeine") also means this tool, and so does a question about why one compound behaves as it does (acidity, solubility) — the answer is in its structure. A Fischer or Haworth projection of a sugar or amino acid, or a drawing with all H atoms, is this tool too: set view to "fischer", "haworth" or "all_h".

Not this tool for: several individual structures (use batch_generate), structural differences (use compare_molecules), a reaction scheme (use generate_reaction), a data sheet (use lookup_molecule_data), a single named value such as melting point, CAS number or GHS hazards (use lookup), the IR bands or ¹H signals to expect (use predict_spectrum), a spectrum drawing (use generate_spectrum), which species of an acid dominates at a given pH (use generate_species_distribution), or a rotatable 3D model or the shape in space (use generate_3d).

Args: name_or_smiles: English/IUPAC compound name or SMILES string. label: Display name shown below the structure (may be localized). formats: Any of "png", "svg", "cdxml" (default: png + svg). Add "cdxml" only when the structure is to be edited in ChemDraw. annotate_stereo: True prints CIP descriptors (R/S, E/Z) at each stereocenter. abbreviate_groups: True draws common substituents as the short labels chemists write by hand (Ph, Bn, OAc, OMe, CO2H, NO2, tBu, Boc, Ts, TMS). The chemistry is unchanged; no hover tooltips in the panel. render_style: "" standard · "compact" thin bonds for small print · "presentation" thick bonds for slides · "grayscale" b/w palette. stereo_variants: True returns every stereoisomer of the open centers (max 3) as a pick list instead of a drawing; only on request. view: "fischer"/"haworth"/"all_h" opens on that drawing, only if the user names it.

NameRequiredDescriptionDefault
viewNo
labelNo
formatsNo
render_styleNo
name_or_smilesYes
annotate_stereoNo
stereo_variantsNo
abbreviate_groupsNo

Output Schema

NameRequiredDescription
svgNo
nameNo
typeNo
atomsNo
filesNo
viewsNo
messageNo
viewSvgNo
lipinskiNo
subtitleNo
viewAtomsNo
candidatesNo
cdxml_pathNo
propertiesNo
stereoNoteNo
initialViewNo
viewRequestNo
projectionNoteNo
stereoWarningsNo
functionalGroupsNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose real side effects: it writes PNG/SVG files plus an interactive panel, and cdxml is a special-purpose extra. It also flags a genuine behavioral tradeoff (abbreviate_groups removes hover tooltips) and a mode that changes the return shape entirely (stereo_variants returns a pick list instead of a drawing, capped at 3). Gaps remain around where files are written, whether existing files are overwritten, and whether an unresolvable name errors or falls back — enough to keep it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: the core purpose and default status come first, then exclusions, then a per-argument glossary where each entry is one tight line. The only bloat is the exhaustive exclusion list, where a few entries (lookup for melting point/CAS/GHS) restate close variants of the same routing rule; trimming those would lose nothing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter tool with no annotations and 0% schema coverage, this is close to complete: purpose, alternatives, all argument semantics, and the key side effect (file writing plus panel) are covered, and the output schema means return values need not be described. The remaining shortfall is operational — no indication of output location, naming, or overwrite behavior, which matters for a tool whose main effect is writing files to disk.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate entirely, and it does: every one of the 8 parameters is given meaning, allowed values, and defaults that the schema omits. The enum-like values for render_style (compact/presentation/grayscale), view (fischer/haworth/all_h), and formats (png/svg/cdxml) are spelled out, along with non-obvious guidance such as adding cdxml only for ChemDraw editing and using stereo_variants "only on request."

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ("Draw one compound as a 2D structure") and immediately fixes scope with "the default for a single substance." It then distinguishes itself from the closest sibling (batch_generate) and from a dozen other tools by resource type, so an agent can route without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit negative-routing block ("Not this tool for: ... use X instead") covering individual vs. batch, comparison, reactions, data sheets, single named values, spectra, speciation, and 3D. It also affirmatively maps implicit user intents — a bare compound name, a "why does it behave this way" question, a Fischer/Haworth request — onto this tool, which is the rare case where intent-to-tool inference is documented rather than assumed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_reactionA

Draw a reaction scheme from reactants, products and conditions.

Writes PNG/SVG files and returns a panel with conditions above and below the arrow. arrow: "forward" (→), "equilibrium" (⇌, reversible) or "retro" (⇒). Use it when explaining a reaction as well as for explicit drawing requests. Pass English or IUPAC compound names, or SMILES.

Not this tool for: the step-by-step SN1, SN2 or Fischer esterification mechanism with electron-flow arrows (use generate_mechanism); a TLC plate sketch from Rf values, even of a reaction mixture (use generate_tlc); one compound or a property of one compound such as its acidity (use generate_molecule), independent structures (use batch_generate), or structural differences (use compare_molecules).

Args: reactants: List of English/IUPAC reactant names or SMILES strings. products: List of English/IUPAC product names or SMILES strings. conditions: Text above the arrow (e.g. 'H2SO4, 0-5 °C'); formula digits are subscripted, a line break starts a new line. conditions_below: Text under the arrow (e.g. 'reflux, 2 h'). arrow: "forward" (→), "equilibrium" (⇌, reversible reaction) or "retro" (⇒, retrosynthesis: target as reactants, precursors as products). name: Display name for the reaction step (can be localized). formats: Any of "png", "svg", "cdxml" (default: png + svg). Add "cdxml" only when the scheme is to be edited in ChemDraw. abbreviate_groups: True draws common substituents as short labels (Ph, OAc, OMe, CO2H, tBu, Boc …); the CDXML keeps full structures. render_style: "" standard · "compact" small print · "presentation" slides · "grayscale" b/w palette. coefficients: One integer per species, reactants then products ([2, 1, 2] draws 2 H2 + O2 → 2 H2O). Set only when the user asks for a balanced equation; otherwise draw as given — the panel's "Apply coefficients" button sets them.

NameRequiredDescriptionDefault
nameNo
arrowNoforward
formatsNo
productsYes
reactantsYes
conditionsNo
coefficientsNo
render_styleNo
conditions_belowNo
abbreviate_groupsNo

Output Schema

NameRequiredDescription
nameNo
typeNo
arrowNo
filesNo
balanceNo
requestNo
productsNo
reactantsNo
cdxml_pathNo
conditionsNo
coefficientsNo
conditions_belowNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does substantial work: it discloses that the tool writes PNG/SVG (and optional CDXML) files, returns a panel with conditions rendered above and below the arrow, that CDXML preserves full structures while the PNG is abbreviated, and that a 'Apply coefficients' button exists in the panel. It does not state file locations, overwrite behavior, or any failure modes for unresolvable compound names, which keeps it short of a 5 for a file-writing tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, then a routing block, then a per-argument list — the structure matches how an agent reads it. The exclusion paragraph is dense but every clause routes to a distinct sibling, and the Args lines carry information the schema lacks. It is long, but for a 10-parameter tool with zero schema coverage the length is largely earned.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter generative tool with no annotations and no schema descriptions, the definition supplies purpose, routing, all parameter semantics, output artifacts, and the coefficients default-vs-explicit rule. An output schema exists, so return values need no further explanation, and nothing an agent needs to call this correctly appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate entirely, and it does: every one of the 10 parameters is documented with meaning beyond type — arrow values are explained with their symbols and retro's reactant/product convention, formats gets a default and a conditional rule ('Add cdxml only when edited in ChemDraw'), coefficients gets ordering and a strict 'set only when the user asks for a balanced equation' rule, render_style enumerates the four valid strings, and abbreviate_groups lists example labels.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Draw a reaction scheme from reactants, products and conditions') and immediately pins down the scope: arrow above/below conditions, three arrow types, PNG/SVG output. It also explicitly names the sibling tools it is not (generate_mechanism, generate_tlc, generate_molecule, batch_generate, compare_molecules), so an agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives positive triggers ('Use it when explaining a reaction as well as for explicit drawing requests') and an explicit negative list with the substitute tool for each case: mechanisms with electron flow → generate_mechanism, TLC plates → generate_tlc, single compounds/properties → generate_molecule, independent structures → batch_generate, comparisons → compare_molecules. The when/when-not/alternative triad is fully covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_species_distributionA

Draw the species distribution of an acid over pH (Henderson-Hasselbalch).

Plots the fraction α of every protonation species against pH with the pKa values marked — the standard diagram for absorption/distribution reasoning in pharmacy.

Use this when the user asks which species dominates at a given pH, about degree of ionization, or absorption across membranes. YOU supply pKa values (ascending) from your knowledge; pass species labels (formulas like "H₂PO₄⁻") for a readable legend.

Not this tool for: pH against added titrant volume, equivalence points or indicator choice (use generate_titration_curve). It answers "which species when", not "what pH do I have" — the pH of a solution or buffer, or the ionised fraction at one pH, as a number is calculate_ph.

Args: substance: Display name, e.g. "Phosphoric acid" (localizable). pka_values: pKa per protolysis step, ascending. labels: Optional species labels, most protonated first (len = len(pka_values) + 1).

NameRequiredDescriptionDefault
labelsNo
substanceYes
pka_valuesYes

Output Schema

NameRequiredDescription
svgNo
nameYes
typeNo
filesNo
notesNo
subtitleNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden; it discloses that it renders a plot with pKa values marked and that the caller must supply pKa values from its own knowledge. What is missing is the output medium (image vs. saved file) and any note about handing off to save_png, which matters given a save_png sibling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then when-to-use, then exclusions, then an Args block — a clean hierarchy with no filler sentences. Minor redundancy: the Args section largely restates parameter meaning already given in prose, and the "standard diagram" aside is decorative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value detail is not required, and the description covers purpose, selection criteria, alternatives, and all three parameters with their ordering constraints. Nothing an agent needs to invoke this correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description fully compensates: substance is a localizable display name, pka_values are per protolysis step and must be ascending, and labels are optional, most-protonated-first, with the hard constraint len(labels) = len(pka_values) + 1. None of that appears in the raw schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource ("Draw the species distribution of an acid over pH") plus the underlying method (Henderson-Hasselbalch). It immediately distinguishes itself from titration-curve and pH-calculation siblings, so an agent can pick it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the triggering user intents (which species dominates at a given pH, degree of ionization, absorption across membranes) and supplies a formal exclusion block routing titrant-volume/equivalence-point questions to generate_titration_curve and numeric pH/ionised-fraction questions to calculate_ph.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_spectrumA

Draw a spectrum — IR, ¹H/¹³C NMR, mass spectrum (MS), UV/Vis, Raman, NIR, fluorescence, ORD or CD — as PNG/SVG files with a panel.

Any request to draw, sketch, plot or show a spectrum is this tool, including a "schematic" spectrum of a named compound ("aspirin IR spectrum schematic") and requests with no peak values: then supply typical literature peak positions yourself (aspirin IR: C=O ~1750 and ~1690 cm⁻¹, broad O–H ~2500–3300 cm⁻¹). Use it instead of drawing the spectrum as a generic chart or visualization — this tool gets the axis conventions right (IR: inverted wavenumber axis with transmission dips; NMR: ppm right to left; MS: bars). It draws exactly the peaks it is given; it predicts nothing.

Not this tool for: working out WHICH bands to expect, or what a measured wavenumber belongs to (use predict_spectrum — its band list can then be drawn here), or the compound's structure formula (use generate_molecule).

Args: spectrum_type: One of "ir", "nir", "raman", "uv_vis", "fluorescence", "ord", "cd", "nmr_1h", "nmr_13c", "ms". peaks: Peak list. position uses the type's natural unit (cm⁻¹ for ir/nir/raman, nm for uv_vis/fluorescence/ord/cd, ppm for NMR, m/z for ms). intensity is relative on any scale (negative values only for ord/cd). width (optional) is the half-width in x-units; label (optional) annotates the peak in the plot (e.g. "C=O"). title: Display name shown in the plot title, also used for the filename (can be localized, e.g. "Aspirin IR"). formats: Output file formats, any of "png", "svg" (default: both). CDXML is not available for spectra.

NameRequiredDescriptionDefault
peaksYes
titleNo
formatsNo
spectrum_typeYes

Output Schema

NameRequiredDescription
svgNo
nameNo
typeNo
filesNo
spectrum_typeYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose real behavior: it 'draws exactly the peaks it is given; it predicts nothing', enforces axis conventions per type (IR inverted wavenumber, NMR ppm right-to-left, MS bars), and notes CDXML is unavailable for spectra. It does not describe where files are written or how they are returned, but the presence of an output schema covers the return contract.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then usage guidance, then exclusions, then a structured 'Args' section — an agent can stop reading at any level. It runs long and repeats the axis-convention idea in the parenthetical, but each block adds distinct routing or parameter information rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, 4-parameter generator with 0% schema coverage, the description fills every gap an agent needs: valid type values, unit conventions, optional-field semantics, defaults, and the boundary against predict_spectrum. Return values need not be explained because an output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate and it does: it lists all ten valid spectrum_type values (the schema has no enum), defines position units per type (cm⁻¹, nm, ppm, m/z), explains intensity as relative and negative only for ord/cd, defines width as half-width in x-units, and explains label annotation. It also covers title's dual role as plot title and filename and formats' default of both png and svg.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Draw a spectrum') and enumerates the exact spectrum types covered (IR, ¹H/¹³C NMR, MS, UV/Vis, Raman, NIR, fluorescence, ORD, CD) plus output formats. It explicitly distinguishes itself from generic chart/visualization tools and from the sibling generate_molecule, so an agent can identify it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit positive triggers, including the ambiguous case of a 'schematic' spectrum with no peak values, and instructs the agent to supply typical literature positions itself with concrete example values. It also names exclusions ('Not this tool for: working out WHICH bands to expect... use predict_spectrum') and a second alternative (generate_molecule), leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_titration_curveA

Draw a titration curve: weak (or polyprotic) acid vs. strong base.

Computes pH against titrant volume from the exact charge balance and marks equivalence points (per protolysis step), the buffer points (pH = pKa at half-equivalence) and optionally the indicator transition range as a shaded band.

Use this when the user asks about titrations, equivalence points, buffer regions or indicator choice. YOU supply the substance data from your knowledge: pKa values in ascending order, sensible concentrations (0.1 M is the classic teaching case) and the indicator's transition range.

Not this tool for: which species dominates at a given pH, or the degree of ionization across the pH range (use generate_species_distribution). A single pH value as a number is not drawn — that is calculate_ph, which solves the same charge balance and shows the working; this tool only draws.

Args: substance: Display name, e.g. "Acetic acid with NaOH" (localizable). pka_values: pKa per protolysis step, ascending (1-3 values). c_acid: Acid concentration in mol/L. v_acid_ml: Initial acid volume in mL. c_titrant: Titrant (strong base) concentration in mol/L. indicator: Optional {"name": "...", "ph_range": [low, high]}.

NameRequiredDescriptionDefault
c_acidYes
c_titrantYes
indicatorNo
substanceYes
v_acid_mlYes
pka_valuesYes

Output Schema

NameRequiredDescription
svgNo
nameYes
typeNo
filesNo
notesNo
subtitleNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden, and it largely does: it discloses the underlying physics (exact charge balance), the derived annotations (equivalence points per protolysis step, buffer points at pH = pKa, optional indicator band) and the fact that it draws rather than solves-and-explains. It does not state the output artifact format or cost/runtime, but the output schema covers return values.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with verb+resource, then behavior, then when/when-not, then args — a logical order an agent can skim. It runs long and the Args block partly restates parameter names, but with 0% schema coverage that repetition is justified rather than wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter plotting tool with an output schema, everything needed to call it correctly is present: units, pKa ordering, guidance that the caller must supply the chemistry data from its own knowledge, and clear boundaries against the two nearest siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and all parameter titles are bare camel-case, so the Args block does real work: units for every numeric (mol/L, mL), ordering and cardinality constraint on pka_values (ascending, 1-3 values), substance as a localizable display name, and the shape of the optional indicator object ({"name", "ph_range": [low, high]}). Nothing is left to guess.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: "Draw a titration curve: weak (or polyprotic) acid vs. strong base." It also names the computation basis (exact charge balance) and what is annotated on the plot, so the agent knows exactly what artifact this produces versus a numeric calculation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ("when the user asks about titrations, equivalence points, buffer regions or indicator choice") plus two explicit exclusions with the correct alternative named: generate_species_distribution for speciation, calculate_ph for a single numeric pH. Routing is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_tlcA

Draw a TLC plate sketch from Rf values as print-ready PNG/SVG files.

Use this whenever the user reports a thin-layer chromatography result ("TLC of my esterification: educt at 0.3, product at 0.65, the co-spot shows both") or asks for the plate sketch a lab report requires. The tool draws exactly the Rf values it is given — it predicts nothing.

The plate is read from the bottom: start line at Rf 0, solvent front at Rf 1, so a spot at Rf 0.8 sits near the top. One lane = one application point with its own caption; a lane can carry several spots, so a co-spot lane showing educt AND product is simply two spots on one lane. Every spot is annotated with its Rf value so the sketch can be read off.

Not this tool for: the reaction scheme of the reaction being monitored (generate_reaction), or a spectrum (generate_spectrum).

Args: lanes: The lanes from left to right, e.g. [{"name": "Edukt", "spots": [{"rf": 0.30, "label": "Säure"}]}, {"name": "Reaktion", "spots": [{"rf": 0.65, "label": "Ester"}]}, {"name": "Co-Spot", "spots": [{"rf": 0.30}, {"rf": 0.65}]}] rf must lie between 0 and 1 — it is a ratio (distance travelled by the substance / distance travelled by the front), so values outside that range are rejected instead of silently clipped. label (optional) names the substance at that spot; intensity (optional, 0…1, default 1) draws a faint spot fainter. title: Shown in the plot title and used for the filename, e.g. "Veresterung Ansatz 2" (free text, can be localized). solvent: Mobile phase / eluent as it goes into the report, e.g. "Toluol/Ethylacetat 8:2" — printed as a caption on the sketch. detection: How the spots were visualized, e.g. "UV 254 nm", "Iod", "Ninhydrin" — printed next to the mobile phase. formats: Output file formats, any of "png", "svg" (default: both). CDXML is not available for plates.

NameRequiredDescriptionDefault
lanesYes
titleNo
formatsNo
solventNo
detectionNo

Output Schema

NameRequiredDescription
svgNo
nameNo
typeNo
filesNo
lanesNo
solventNo
detectionNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it states the tool predicts nothing, rejects out-of-range rf instead of silently clipping, defines plate orientation (start line at 0, front at 1), and notes CDXML is unavailable for plates. These are non-obvious behavioral constraints an agent could not infer elsewhere.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then geometry, then exclusions, then Args — a clear structure with section labels. It is on the long side and the co-spot explanation is stated twice (narrative and the Not-this-tool block area), but almost every sentence adds information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter generation tool with an output schema (so return values need not be described) and no annotations, the definition covers geometry, validation rules, param meanings, and sibling boundaries. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the Args section explains every parameter: the nested lane/spot structure with a worked JSON example, rf as a ratio with its valid range and rejection behavior, optional label and intensity (with the faint-spot effect), title's dual role as plot title and filename, and formats' allowed values and default. This fully compensates for the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+output ('Draw a TLC plate sketch from Rf values as print-ready PNG/SVG files'), and explicitly distinguishes itself from generate_reaction and generate_spectrum. An agent can route this without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete trigger (user reports a TLC result, with a verbatim example utterance) and a separate 'Not this tool for' block naming the sibling tools to use instead. Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookupA

Fetch a specific fact or value about a compound as plain text.

Use it when the request asks for a named piece of data — pick the topic:

  • "properties" (default): formula, molecular weight, CAS number, IUPAC name, LogP, InChIKey (PubChem).

  • "safety": GHS hazards — H/P statements, pictograms, signal word. For lab protocols and risk assessments.

  • "physical": experimental melting point, boiling point, density, solubility.

  • "biochem": compound class and biological role (ChEBI), related enzymes and proteins (UniProt).

  • "pathway": metabolic pathways the compound appears in (KEGG).

Not this tool for: a bare compound name with no named value asked for — that means show the substance, use generate_molecule. Nor for a visual data sheet with the structure beside the facts — use lookup_molecule_data. Nor for the IR bands or ¹H signals a structure should give — derived from the structure, not looked up — use predict_spectrum. This tool draws nothing; it returns text.

IMPORTANT: Always pass English or IUPAC compound names, never localized names — 'Aspirin' not 'Acetylsalicylsäure', 'Caffeine' not 'Coffein'.

Args: name: English/IUPAC compound name (e.g. 'Aspirin', 'Histidine'). topic: Which facts to fetch — see the list above.

NameRequiredDescriptionDefault
nameYes
topicNoproperties

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the burden — and it does disclose the response modality ('returns text', 'draws nothing') plus the upstream data sources behind each topic (PubChem, ChEBI, UniProt, KEGG), which tells the agent where facts come from and why coverage varies. It does not mention failure behavior for unknown compounds, caching, or rate limits, which keeps it out of the top band.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, then a scannable bulleted topic list, then exclusions — a logical order that lets an agent stop reading early once it has what it needs. It is slightly longer than necessary; the 'see the list above' pointer in Args and the repeated default restate information already given in the bullets.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with an output schema already documenting return values, the description covers everything else an agent needs: which topic yields which class of facts, the naming convention for input, and the boundaries against three overlapping sibling tools. Nothing required to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate and does: every `topic` enum value is defined with the exact facts it returns, and the practical use case for at least two ('safety' for lab protocols, 'physical' for experimental values) is spelled out. The `name` parameter gains a hard constraint absent from the schema — English/IUPAC names only, with concrete contrastive examples ('Aspirin' not 'Acetylsalicylsäure').

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource — 'Fetch a specific fact or value about a compound as plain text' — and immediately clarifies the output modality. It explicitly separates itself from three siblings (generate_molecule for bare names, lookup_molecule_data for visual data sheets, predict_spectrum for derived spectra), so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives both directions: a positive trigger ('when the request asks for a named piece of data') and three explicit exclusions each paired with the alternative tool to use instead. The default topic and the 'Not this tool for' block remove nearly all ambiguity about when to select it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_molecule_dataA

Show a compound's data sheet: structure, PubChem properties and GHS safety.

Use it for a data sheet or facts available from those sources. The molecule panel also calls this tool when the user clicks Data. Internet access is required. Missing values are not evidence that a property or hazard is absent.

Not this tool for: a bare compound name with no data requested — use generate_molecule; one named value as text, or physical constants, biological role or metabolic pathways — use lookup. Pass English or IUPAC names, or SMILES.

Args: name: English/IUPAC compound name or SMILES (e.g. 'Aspirin').

NameRequiredDescriptionDefault
nameYes

Output Schema

NameRequiredDescription
nameNo
typeNo
atomsNo
smilesNo
sourcesNo
stereoNoteNo
molecule_svgNo
stereoWarningsNo
functionalGroupsNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations to carry the burden, the description still discloses two non-obvious behavioral traits: internet access is required, and missing values are not evidence of absence (a real interpretation hazard for safety data). It also notes the molecule panel invokes it on the Data click. It does not cover latency, caching, or failure modes, which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the payload description, then a labeled exclusion block, then an Args section — a clean decision-oriented structure. Every sentence carries information; the panel-trigger sentence is the only one that could arguably be trimmed for an agent audience.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only lookup with no annotations and an output schema already documenting return values, the description supplies everything an agent needs: what is returned conceptually, when to pick it, which siblings to prefer instead, the accepted identifier formats, and the network dependency.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the schema is a bare string with no description, so the description must define the argument entirely — and it does: "Pass English or IUPAC names, or SMILES" with an inline example ('Aspirin'). That is more than adequate for a single required parameter, though it does not discuss how ambiguous names are resolved.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Show a compound's data sheet") and enumerates what the sheet contains: structure, PubChem properties and GHS safety. The explicit "Not this tool for" block names the sibling tools (generate_molecule, lookup) that handle adjacent cases, so an agent can distinguish it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an affirmative use case ("a data sheet or facts available from those sources") plus two explicit exclusions with the alternative tool named for each: bare compound name with no data requested -> generate_molecule, single named value or physical constants/biological role/metabolic pathways -> lookup. Nothing about routing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

predict_spectrumA

Say what a spectrum of this structure should show — or read a band.

Three questions, all of them exam material:

  • "ir_bands": which IR bands to expect for a structure, with range, intensity and band shape, ordered as you read a spectrum (high wavenumber first). Needs structure.

  • "assign_wavenumber": you measured a band — which groups absorb there? Ordered by how centrally the value sits in each range. Needs wavenumber in cm⁻¹.

  • "nmr_signals": how many ¹H signals the structure gives and in what integral ratio. Needs structure.

Deterministic on purpose, and therefore honestly limited: band positions come from a curated table matched to the structure, signals from the topological equivalence of the protons. It does NOT predict chemical shifts in ppm — that would take a model and would be guesswork.

The band list is ready to hand to generate_spectrum if a drawing is wanted; this tool only says what to expect.

Not this tool for: drawing a spectrum from peaks you already have (generate_spectrum), or looking up measured data for a substance (lookup).

Args: topic: Which question to answer — see the list above. structure: English/IUPAC name or SMILES of the compound ("ir_bands", "nmr_signals"). wavenumber: Measured band position in cm⁻¹ ("assign_wavenumber").

NameRequiredDescriptionDefault
topicYes
structureNo
wavenumberNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does: it discloses the method (curated table matched to structure, topological proton equivalence), the deliberate limitation (no ppm chemical shifts, deterministic rather than modeled), and the output ordering rule (high wavenumber first, centrality-ordered assignments). These are exactly the behavioral facts an agent needs to trust and interpret results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-sentence purpose, then structured bullets mapping topic to question, then constraints, then exclusions — a sensible order. A few phrases ('all of them exam material', 'honestly limited') are tone rather than information and could be trimmed without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Return values need not be explained since an output schema exists, and everything else an agent needs for a three-parameter prediction tool — topic routing, argument formats, determinism, known limitations, sibling routing — is present. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the Args block compensates by documenting all three parameters: accepted name formats (English/IUPAC or SMILES) for structure, units (cm⁻¹) for wavenumber, and which topic consumes each. It stops just short of stating what happens if an inapplicable parameter is supplied (e.g. wavenumber with 'ir_bands'), leaving that edge case to inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line states a specific verb and resource ('say what a spectrum of this structure should show — or read a band') and the three topics are enumerated by name and output. The closing 'Not this tool for' paragraph explicitly separates it from generate_spectrum and lookup, so an agent can disambiguate without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Each topic carries its own use condition and required argument ('ir_bands' needs structure, 'assign_wavenumber' needs wavenumber in cm⁻¹). The alternatives — generate_spectrum for drawing from known peaks and lookup for measured data — are named with the condition that selects them, and the hand-off from band list to generate_spectrum is spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_pngA

Internal helper for the panel UI — never call this directly.

The panel's export button calls it when the image clipboard is blocked by the sandbox; saving a picture is the user's click, not yours. The generate_* tools already write their PNG and SVG files themselves.

Expects a base64 PNG (with or without a data:image/png;base64, prefix) and returns the path it was written to.

NameRequiredDescriptionDefault
filenameYes
png_base64Yes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral burden and does disclose the invocation context, the clipboard/sandbox condition, accepted input format, and that it returns the written path. It does not mention overwrite behavior, permissions, or error handling for file writes, which are relevant gaps for a save operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The warning not to call the tool is front-loaded, and the remaining sentences are short and purposeful. Every sentence adds either usage context or a relevant input/output detail without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not explain return values in detail, and it already states that a path is returned. For a two-parameter internal helper it is largely complete, though filename semantics remain underspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It partially does by explaining that png_base64 is a base64 PNG with an optional data:image/png;base64, prefix, but it says nothing about the filename parameter's expected path, directory, extension, or overwrite semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action (save a PNG), the expected input (base64 PNG), and the result (returns the written path). It also explicitly distinguishes this from the generate_* tools, which already write their own PNG and SVG files, so an agent can tell this is not the normal image-generation path.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an unusually explicit usage rule: never call this directly, because the panel's export button invokes it when sandbox clipboard access is blocked. It also names the relevant alternative behavior by noting that generate_* tools already write their files themselves.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.7.0
    • Addedcalculate_ph
    • Addedgenerate_3d
    • Addedgenerate_mechanism
    • Addedgenerate_species_distribution
    • Addedgenerate_spectrum
    • Addedgenerate_titration_curve
    • Addedgenerate_tlc
    • Addedlookup
    • Addedpredict_spectrum
  2. 4 tool updatesv0.6.0
    • Changedbatch_generate12 fields changed
      • addedOutput schema / $defs / IsomerCandidate
        Added value: +{
        +  "description": "One structure a family name (\"xylene\", \"Glucose\") can mean.",
        +  "properties": {
        +    "label": {
        +      "title": "Label",
        +      "type": "string"
        +    },
        +    "name": {
        +      "default": "",
        +      "title": "Name",
        +      "type": "string"
        +    },
        +    "smiles": {
        +      "title": "Smiles",
        +      "type": "string"
        +    },
        +    "svg": {
        +      "default": "",
        +      "title": "Svg",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "label",
        +    "smiles"
        +  ],
        +  "title": "IsomerCandidate",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / MoleculePayload / properties / candidates
        Added value: +{
        +  "default": [],
        +  "items": {
        +    "$ref": "#/$defs/IsomerCandidate"
        +  },
        +  "title": "Candidates",
        +  "type": "array"
        +}
      • addedOutput schema / $defs / MoleculePayload / properties / initialView
        Added value: +{
        +  "default": "",
        +  "title": "Initialview",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / MoleculePayload / properties / message
        Added value: +{
        +  "default": "",
        +  "title": "Message",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / MoleculePayload / properties / projectionNote
        Added value: +{
        +  "default": "",
        +  "title": "Projectionnote",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / MoleculePayload / properties / stereoNote
        Added value: +{
        +  "default": "",
        +  "title": "Stereonote",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / MoleculePayload / properties / stereoWarnings
        Added value: +{
        +  "default": [],
        +  "items": {
        +    "$ref": "#/$defs/StereoWarning"
        +  },
        +  "title": "Stereowarnings",
        +  "type": "array"
        +}
      • addedOutput schema / $defs / MoleculePayload / properties / viewAtoms
        Added value: +{
        +  "default": [],
        +  "items": {
        +    "$ref": "#/$defs/AtomData"
        +  },
        +  "title": "Viewatoms",
        +  "type": "array"
        +}
      • addedOutput schema / $defs / MoleculePayload / properties / viewRequest
        Added value: +{
        +  "additionalProperties": true,
        +  "default": {},
        +  "title": "Viewrequest",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / MoleculePayload / properties / viewSvg
        Added value: +{
        +  "default": "",
        +  "title": "Viewsvg",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / MoleculePayload / properties / views
        Added value: +{
        +  "default": [],
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Views",
        +  "type": "array"
        +}
      • addedOutput schema / $defs / StereoWarning
        Added value: +{
        +  "description": "Ein Stereoelement, dessen Konfiguration die Eingabe offen lässt.",
        +  "properties": {
        +    "atoms": {
        +      "default": [],
        +      "items": {
        +        "type": "integer"
        +      },
        +      "title": "Atoms",
        +      "type": "array"
        +    },
        +    "kind": {
        +      "title": "Kind",
        +      "type": "string"
        +    },
        +    "label": {
        +      "default": "",
        +      "title": "Label",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "title": "StereoWarning",
        +  "type": "object"
        +}
    • Changedgenerate_molecule14 fields changed
      • addedInput schema / properties / stereo_variants
        Added value: +{
        +  "default": false,
        +  "title": "Stereo Variants",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / view
        Added value: +{
        +  "default": "",
        +  "title": "View",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / IsomerCandidate
        Added value: +{
        +  "description": "One structure a family name (\"xylene\", \"Glucose\") can mean.",
        +  "properties": {
        +    "label": {
        +      "title": "Label",
        +      "type": "string"
        +    },
        +    "name": {
        +      "default": "",
        +      "title": "Name",
        +      "type": "string"
        +    },
        +    "smiles": {
        +      "title": "Smiles",
        +      "type": "string"
        +    },
        +    "svg": {
        +      "default": "",
        +      "title": "Svg",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "label",
        +    "smiles"
        +  ],
        +  "title": "IsomerCandidate",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / StereoWarning
        Added value: +{
        +  "description": "Ein Stereoelement, dessen Konfiguration die Eingabe offen lässt.",
        +  "properties": {
        +    "atoms": {
        +      "default": [],
        +      "items": {
        +        "type": "integer"
        +      },
        +      "title": "Atoms",
        +      "type": "array"
        +    },
        +    "kind": {
        +      "title": "Kind",
        +      "type": "string"
        +    },
        +    "label": {
        +      "default": "",
        +      "title": "Label",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "title": "StereoWarning",
        +  "type": "object"
        +}
      • addedOutput schema / properties / candidates
        Added value: +{
        +  "default": [],
        +  "items": {
        +    "$ref": "#/$defs/IsomerCandidate"
        +  },
        +  "title": "Candidates",
        +  "type": "array"
        +}
      • addedOutput schema / properties / initialView
        Added value: +{
        +  "default": "",
        +  "title": "Initialview",
        +  "type": "string"
        +}
      • addedOutput schema / properties / message
        Added value: +{
        +  "default": "",
        +  "title": "Message",
        +  "type": "string"
        +}
      • addedOutput schema / properties / projectionNote
        Added value: +{
        +  "default": "",
        +  "title": "Projectionnote",
        +  "type": "string"
        +}
      • addedOutput schema / properties / stereoNote
        Added value: +{
        +  "default": "",
        +  "title": "Stereonote",
        +  "type": "string"
        +}
      • addedOutput schema / properties / stereoWarnings
        Added value: +{
        +  "default": [],
        +  "items": {
        +    "$ref": "#/$defs/StereoWarning"
        +  },
        +  "title": "Stereowarnings",
        +  "type": "array"
        +}
      • addedOutput schema / properties / viewAtoms
        Added value: +{
        +  "default": [],
        +  "items": {
        +    "$ref": "#/$defs/AtomData"
        +  },
        +  "title": "Viewatoms",
        +  "type": "array"
        +}
      • addedOutput schema / properties / viewRequest
        Added value: +{
        +  "additionalProperties": true,
        +  "default": {},
        +  "title": "Viewrequest",
        +  "type": "object"
        +}
      • addedOutput schema / properties / viewSvg
        Added value: +{
        +  "default": "",
        +  "title": "Viewsvg",
        +  "type": "string"
        +}
      • addedOutput schema / properties / views
        Added value: +{
        +  "default": [],
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Views",
        +  "type": "array"
        +}
    • Changedgenerate_reaction10 fields changed
      • addedInput schema / properties / arrow
        Added value: +{
        +  "default": "forward",
        +  "enum": [
        +    "forward",
        +    "equilibrium",
        +    "retro"
        +  ],
        +  "title": "Arrow",
        +  "type": "string"
        +}
      • addedInput schema / properties / coefficients
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "integer"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Coefficients"
        +}
      • addedInput schema / properties / conditions_below
        Added value: +{
        +  "default": "",
        +  "title": "Conditions Below",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / MolEntry / properties / coefficient
        Added value: +{
        +  "default": 1,
        +  "title": "Coefficient",
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / ReactionBalance
        Added value: +{
        +  "description": "Atom and charge balance of the equation as drawn (all coefficients 1).",
        +  "properties": {
        +    "balanced": {
        +      "title": "Balanced",
        +      "type": "boolean"
        +    },
        +    "chargeDifference": {
        +      "default": 0,
        +      "title": "Chargedifference",
        +      "type": "integer"
        +    },
        +    "difference": {
        +      "additionalProperties": {
        +        "type": "integer"
        +      },
        +      "default": {},
        +      "title": "Difference",
        +      "type": "object"
        +    },
        +    "formulas": {
        +      "default": [],
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Formulas",
        +      "type": "array"
        +    },
        +    "note": {
        +      "default": "",
        +      "title": "Note",
        +      "type": "string"
        +    },
        +    "suggestedCoefficients": {
        +      "anyOf": [
        +        {
        +          "items": {
        +            "type": "integer"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "title": "Suggestedcoefficients"
        +    },
        +    "suggestedEquation": {
        +      "default": "",
        +      "title": "Suggestedequation",
        +      "type": "string"
        +    },
        +    "summary": {
        +      "default": "",
        +      "title": "Summary",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "balanced"
        +  ],
        +  "title": "ReactionBalance",
        +  "type": "object"
        +}
      • addedOutput schema / properties / arrow
        Added value: +{
        +  "default": "forward",
        +  "title": "Arrow",
        +  "type": "string"
        +}
      • addedOutput schema / properties / balance
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/ReactionBalance"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedOutput schema / properties / coefficients
        Added value: +{
        +  "default": [],
        +  "items": {
        +    "type": "integer"
        +  },
        +  "title": "Coefficients",
        +  "type": "array"
        +}
      • addedOutput schema / properties / conditions_below
        Added value: +{
        +  "default": "",
        +  "title": "Conditions Below",
        +  "type": "string"
        +}
      • addedOutput schema / properties / request
        Added value: +{
        +  "additionalProperties": true,
        +  "default": {},
        +  "title": "Request",
        +  "type": "object"
        +}
    • Changedlookup_molecule_data9 fields changed
      • addedOutput schema / $defs / DatabaseSource / properties / groups
        Added value: +{
        +  "default": [],
        +  "items": {
        +    "$ref": "#/$defs/GhsGroup"
        +  },
        +  "title": "Groups",
        +  "type": "array"
        +}
      • addedOutput schema / $defs / DatabaseSource / properties / note
        Added value: +{
        +  "default": "",
        +  "title": "Note",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / DatabaseSource / properties / status
        Added value: +{
        +  "default": "",
        +  "title": "Status",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / GhsGroup
        Added value: +{
        +  "description": "Die Einstufung EINER Quelle (PubChem ReferenceNumber).",
        +  "properties": {
        +    "hazards": {
        +      "default": [],
        +      "items": {
        +        "$ref": "#/$defs/GhsHazard"
        +      },
        +      "title": "Hazards",
        +      "type": "array"
        +    },
        +    "id": {
        +      "title": "Id",
        +      "type": "string"
        +    },
        +    "lead": {
        +      "default": false,
        +      "title": "Lead",
        +      "type": "boolean"
        +    },
        +    "not_classified": {
        +      "anyOf": [
        +        {
        +          "$ref": "#/$defs/GhsNotClassified"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null
        +    },
        +    "note": {
        +      "default": "",
        +      "title": "Note",
        +      "type": "string"
        +    },
        +    "p_codes": {
        +      "default": [],
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "P Codes",
        +      "type": "array"
        +    },
        +    "pictograms": {
        +      "default": [],
        +      "items": {
        +        "type": "string"
        +      },
        +      "title": "Pictograms",
        +      "type": "array"
        +    },
        +    "record_name": {
        +      "default": "",
        +      "title": "Record Name",
        +      "type": "string"
        +    },
        +    "reports_total": {
        +      "anyOf": [
        +        {
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "title": "Reports Total"
        +    },
        +    "signal": {
        +      "default": "",
        +      "title": "Signal",
        +      "type": "string"
        +    },
        +    "source": {
        +      "title": "Source",
        +      "type": "string"
        +    },
        +    "url": {
        +      "default": "",
        +      "title": "Url",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "source"
        +  ],
        +  "title": "GhsGroup",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / GhsHazard
        Added value: +{
        +  "properties": {
        +    "code": {
        +      "title": "Code",
        +      "type": "string"
        +    },
        +    "percent": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "title": "Percent"
        +    },
        +    "text": {
        +      "default": "",
        +      "title": "Text",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code"
        +  ],
        +  "title": "GhsHazard",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / GhsNotClassified
        Added value: +{
        +  "description": "Eine Quelle meldet ausdruecklich \"erfuellt die GHS-Kriterien nicht\".",
        +  "properties": {
        +    "percent": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "title": "Percent"
        +    },
        +    "reports": {
        +      "anyOf": [
        +        {
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "title": "Reports"
        +    },
        +    "total": {
        +      "anyOf": [
        +        {
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "title": "Total"
        +    }
        +  },
        +  "title": "GhsNotClassified",
        +  "type": "object"
        +}
      • addedOutput schema / $defs / StereoWarning
        Added value: +{
        +  "description": "Ein Stereoelement, dessen Konfiguration die Eingabe offen lässt.",
        +  "properties": {
        +    "atoms": {
        +      "default": [],
        +      "items": {
        +        "type": "integer"
        +      },
        +      "title": "Atoms",
        +      "type": "array"
        +    },
        +    "kind": {
        +      "title": "Kind",
        +      "type": "string"
        +    },
        +    "label": {
        +      "default": "",
        +      "title": "Label",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "title": "StereoWarning",
        +  "type": "object"
        +}
      • addedOutput schema / properties / stereoNote
        Added value: +{
        +  "default": "",
        +  "title": "Stereonote",
        +  "type": "string"
        +}
      • addedOutput schema / properties / stereoWarnings
        Added value: +{
        +  "default": [],
        +  "items": {
        +    "$ref": "#/$defs/StereoWarning"
        +  },
        +  "title": "Stereowarnings",
        +  "type": "array"
        +}
  3. 7 tool updatesv0.1.0
    • First observedbatch_generate
    • First observedcompare_molecules
    • First observedexport_anki_deck
    • First observedgenerate_molecule
    • First observedgenerate_reaction
    • First observedlookup_molecule_data
    • First observedsave_png

TDQS

A4.5/5.0

Scored across 16 tools

Disambiguation5/5

Every tool carries explicit 'Not this tool for' cross-references that draw sharp boundaries between the near-neighbours: calculate_ph (compute) vs generate_titration_curve / generate_species_distribution (draw), predict_spectrum (what bands) vs generate_spectrum (draw given peaks), generate_molecule vs batch_generate vs compare_molecules, and lookup (text value) vs lookup_molecule_data (visual data sheet). The only residual overlap is lookup vs lookup_molecule_data, and both descriptions state the split (plain text fact vs rendered sheet). An agent can route reliably from these descriptions alone.

Naming Consistency4/5

Overwhelmingly a consistent verb_noun snake_case pattern: generate_molecule, generate_spectrum, generate_tlc, generate_3d, predict_spectrum, compare_molecules, export_anki_deck, calculate_ph. Minor deviations exist — batch_generate inverts the order, lookup is a bare verb with no object, and save_png is a naming outlier — but the set remains predictable.

Tool Count4/5

16 tools is at the upper edge of the ideal range and leans heavy, but the domain is genuinely broad (2D/3D structures, reactions, mechanisms, spectra, TLC, titration, pH, lookups, Anki export) and each tool maps to a distinct user intent. One slot is wasted on save_png, which is documented as an internal panel helper that agents must never call — that is an exposed tool that does not earn a place in the agent-facing surface.

Completeness4/5

The surface covers the full workflow of a chemistry teaching/drawing server: draw single, batch, compare, 3D, reactions, mechanisms, spectra prediction and rendering, TLC, titration curves, species distribution, pH computation, fact lookups and flashcard export. Remaining gaps are acknowledged rather than hidden — no chemical-shift prediction, only three mechanism families, and no generic molecule file export outside the SDF written by generate_3d.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents and applications to search, retrieve, and analyze chemical compounds, substances, and bioassays from PubChem's vast chemical information database through comprehensive tools for chemical research and discovery.
    10
    1,804 npm
    10
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    ChemMCP is an easy-to-use and extensible chemistry toolkit for LLMs and AI assistants, enabling molecular analysis, property prediction, and reaction synthesis tasks without domain-specific training.
    74
    Apache 2.0
  • A
    license
    C
    quality
    D
    maintenance
    Enables chemical reaction predictions (retrosynthesis, product, reagents), molecule validation, and property calculation through the Model Context Protocol, integrating with AI assistants.
    5
    MIT