Skip to main content
Glama

Version License Docker MCP SDK npm TypeScript Bun

Install in Claude Desktop Install in Cursor Install in VS Code

Framework

Public Hosted Server: https://pubchem.caseyjhand.com/mcp


Tools

Ten tools for querying PubChem's chemical information database:

Tool Name

Description

pubchem_search_compounds

Search for compounds by name, SMILES, InChIKey, formula, substructure, superstructure, or 2D similarity.

pubchem_get_compound_details

Get physicochemical properties, descriptions, synonyms, drug-likeness, and classification for compounds by CID.

pubchem_get_compound_image

Fetch a 2D structure diagram (PNG) for a compound by CID.

pubchem_get_compound_3d_structure

Fetch a 3D conformer (atomic coordinates and bonds) for a compound by CID, as parsed JSON or raw SDF.

pubchem_get_compound_xrefs

Get external database cross-references (PubMed, patents, genes, proteins, etc.).

pubchem_get_compound_safety

Get GHS hazard classification and safety data for one or more compounds by CID (batch).

pubchem_get_bioactivity

Get a compound's bioactivity profile: assay results, targets, and activity values; filter by outcome or molecular target.

pubchem_get_compound_interactions

Get drug-drug, drug-food, and chemical-target interactions for a compound by CID.

pubchem_search_assays

Find bioassays by biological target (gene symbol, protein, Gene ID, UniProt accession).

pubchem_get_summary

Get summaries for PubChem entities: assays, genes, proteins, taxonomy.

pubchem_search_compounds

Search PubChem for chemical compounds across five search modes.

  • Identifier lookup — resolve compound names, SMILES, or InChIKeys to CIDs (batch up to 25)

  • Formula search — find compounds by molecular formula in Hill notation

  • Substructure/superstructure — find compounds containing or contained within a query structure

  • 2D similarity — find structurally similar compounds by Tanimoto similarity (configurable threshold)

  • Caps at 200 CIDs per page; offset pages further, to a ceiling of 10,000. Identifier lookups page over the set already resolved; formula and structure searches widen their bounded upstream request to reach a page, so deep pages cost more upstream

  • Optionally hydrate results with properties to avoid a follow-up details call


pubchem_get_compound_details

Get detailed compound information by CID.

  • Batches up to 100 CIDs in a single request

  • 27 available properties: molecular weight, SMILES, InChIKey, XLogP, TPSA, complexity, stereo counts, and more

  • Optionally includes textual descriptions (pharmacology, mechanism, therapeutic use) from PUG View — fetched for the first 10 CIDs of a batch, with the skipped CIDs named in the response

  • Optionally includes known synonyms (trade names, systematic names, registry numbers)

  • Synonyms and descriptions are paged: synonymOffset and descriptionOffset window every compound in the batch at the same position, reaching the entries past a page

  • Optionally computes drug-likeness assessment (Lipinski Rule of Five + Veber rules) from fetched properties

  • Optionally fetches pharmacological classification (FDA classes, mechanisms of action, MeSH classes, ATC codes)


pubchem_get_bioactivity

Get a compound's bioactivity profile from PubChem BioAssay.

  • Returns assay outcomes (Active/Inactive/Inconclusive), target info (protein accessions, NCBI Gene IDs), and quantitative values (IC50, EC50, Ki)

  • Filter by outcome and/or a specific molecular target (NCBI Gene ID or protein accession)

  • Caps at 100 results per page; offset reaches the rest (well-studied compounds may have thousands)


pubchem_get_summary

Get descriptive summaries for four PubChem entity types.

  • Assays (AID), genes (Gene ID), proteins (UniProt accession), taxonomy (Tax ID)

  • Up to 10 entities per call

  • Type-specific field extraction for clean, structured output


pubchem_get_compound_interactions

Get a compound's interaction data by CID.

  • Drug-drug interactions (DrugBank), drug-food interactions, and chemical-target binding/activity (BindingDB, ChEMBL, and others)

  • Select which interaction kinds to fetch and cap entries per kind

  • Paged per kind: each reports its source-record total and its own nextOffset, and offset reaches the records past a page

  • Each entry carries its originating source — coverage is richest for approved drugs


pubchem_get_compound_3d_structure

Get a compound's default 3D conformer by CID.

  • format="json" returns parsed atoms (element + x/y/z) and bonds for direct reasoning; format="sdf" returns raw V2000 SDF for passthrough to docking or rendering

  • maxAtoms/maxBonds bound the atom/bond preview and includeRawSdf opts into a large raw SDF past the safe line cap; atomCount/bondCount always report the totals and any capping is disclosed

  • Optionally lists alternate conformer IDs

  • Returns a typed not-found when PubChem has no computed 3D coordinates (large molecules, mixtures, some salts)

Related MCP server: PubChem Chemical Safety MCP Server

Resources

Compound and assay records are also exposed as URI-templated MCP resources, backed by the same client methods as the tools:

URI Template

Returns

pubchem://compound/{cid}

Core physicochemical properties (JSON).

pubchem://compound/{cid}/safety

GHS hazard classification (JSON).

pubchem://compound/{cid}/image

2D structure diagram (PNG).

pubchem://compound/{cid}/xrefs

External cross-references (JSON).

pubchem://compound/{cid}/bioactivity

Bioassay activity profile (JSON).

pubchem://assay/{aid}

BioAssay summary (JSON).

Features

Built on @cyanheads/mcp-ts-core:

  • Declarative tool definitions — single file per tool, framework handles registration and validation

  • Unified error handling across all tools

  • Pluggable auth (none, jwt, oauth)

  • Swappable storage backends: in-memory, filesystem, Supabase, Cloudflare KV/R2/D1

  • Structured logging with optional OpenTelemetry tracing

  • Runs locally (stdio/HTTP) or containerized via Docker

PubChem-specific:

  • Rate-limited client for PUG REST and PUG View APIs (5 req/s with automatic queuing)

  • Retry with exponential backoff on 5xx errors and network failures

  • All tools are read-only and idempotent — no API keys required

Getting Started

Public Hosted Instance

A public instance is available at https://pubchem.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:

{
  "mcpServers": {
    "pubchem-mcp-server": {
      "type": "streamable-http",
      "url": "https://pubchem.caseyjhand.com/mcp"
    }
  }
}

Self-Hosted / Local

Add to your MCP client config (e.g., claude_desktop_config.json):

{
  "mcpServers": {
    "pubchem-mcp-server": {
      "type": "stdio",
      "command": "bunx",
      "args": ["@cyanheads/pubchem-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio"
      }
    }
  }
}

Prerequisites

Installation

  1. Clone the repository:

git clone https://github.com/cyanheads/pubchem-mcp-server.git
  1. Navigate into the directory:

cd pubchem-mcp-server
  1. Install dependencies:

bun install

Configuration

No API keys are required — PubChem's API is freely accessible.

Variable

Description

Default

MCP_TRANSPORT_TYPE

Transport: stdio or http.

stdio

MCP_HTTP_PORT

Port for HTTP server.

3010

MCP_HTTP_HOST

Host for HTTP server.

localhost

MCP_AUTH_MODE

Auth mode: none, jwt, or oauth.

none

MCP_LOG_LEVEL

Log level (RFC 5424).

info

STORAGE_PROVIDER_TYPE

Storage backend.

in-memory

OTEL_ENABLED

Enable OpenTelemetry.

false

Running the Server

Local Development

  • Build and run:

    bun run rebuild
    bun run start:stdio   # or start:http
  • Run checks and tests:

    bun run devcheck     # Lints, formats, type-checks
    bun run test         # Runs test suite

Docker

docker build -t pubchem-mcp-server .
docker run -p 3010:3010 pubchem-mcp-server

Project Structure

Directory

Purpose

src/mcp-server/tools/definitions/

Tool definitions (*.tool.ts).

src/services/pubchem/

PubChem API client with rate limiting and response parsing.

scripts/

Build, clean, devcheck, and tree generation scripts.

Development Guide

See CLAUDE.md for development guidelines and architectural rules. The short version:

  • Handlers throw, framework catches — no try/catch in tool logic

  • Use ctx.log for domain-specific logging

  • Register new tools in the index.ts barrel file

Contributing

Issues and pull requests are welcome. Run checks before submitting:

bun run devcheck
bun run test

License

Apache-2.0 — see LICENSE for details.

Available Tools

10 tools
pubchem_get_bioactivityGet BioactivityA
Read-onlyIdempotent
Inspect

Get a compound's bioactivity profile: which assays tested it, activity outcomes (Active/Inactive/Inconclusive), target identifiers (NCBI Gene ID, UniProt/GenBank accession), and quantitative values (IC50, EC50, Ki, etc.). Filter by outcome and/or a specific molecular target (NCBI Gene ID or protein accession) to focus the profile — e.g. "is this compound active against target T?".

ParametersJSON Schema
NameRequiredDescriptionDefault
cidYesPubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds.
offsetNoZero-based index of the first assay to return, applied after the outcome and target filters. Pass the nextOffset from a previous call to read the following page. Default: 0.
maxResultsNoMax assay results to return per page (1-100). Well-studied compounds have thousands of records; use offset to reach the ones past this page. Default: 20.
targetGeneIdNoFilter to assays against this NCBI Gene ID. Obtain Gene IDs from pubchem_search_assays or the targetGeneId field of an unfiltered result here. Combine with outcomeFilter="active" to answer "is this compound active against target T?".
outcomeFilterNoFilter by activity outcome. "active" shows only assays where the compound showed activity — most useful for understanding biological profile. Default: "all".all
targetAccessionNoFilter to assays against this target protein accession (UniProt/GenBank), e.g. "P35354". Obtain accessions from pubchem_search_assays or the targetAccession field of an unfiltered result here.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe maxResults cap that was applied.
cidNoPubChem Compound ID.
errorNoPresent when the call failed. Absent on success.
shownNoAssays returned on this page.
noticeNoRecovery guidance when the filter yields no results or the compound has no bioactivity data.
offsetNoZero-based index of the first assay returned.
resultsNoAssay results matching the filter.
truncatedNoTrue when matching assays remain past this page.
nextOffsetNoOffset to pass on the next call to continue past this page. Omitted when no further assays match.
activeCountNoAssays with "Active" outcome.
totalAssaysNoTotal unique assays for this compound.
targetFilterNoTarget filter applied (gene ID and/or protein accession), when set.
filteredCountNoExact number of assays matching the outcome and target filters, across all pages.
inactiveCountNoAssays with "Inactive" outcome.
outcomeFilterNoOutcome filter applied: active, inactive, or all.
returnedCountNoAssays returned on this page.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds useful behavioral context about the type of data returned and the filtering workflow. Pagination and result-shape details are not in the description, but the schema and output schema carry that burden.

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?

Two sentences with a clear front-loaded purpose, followed by a compact enumeration of outputs and a practical example. Every clause earns its place, and there is no redundant restating of parameter names or schema content.

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 a rich input schema, output schema, and annotations, the description provides all essential context: what the tool returns, what filters exist, and how to frame a target-specific question. Nothing critical is missing for an agent to select and invoke it correctly.

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 100%, so the baseline is 3. The description adds a meaningful use case for combining targetGeneId and outcomeFilter, but it does not materially improve on the already-detailed parameter descriptions in the 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?

The description names a specific verb and resource: 'Get a compound's bioactivity profile', then enumerates the concrete contents (assays, outcomes, target identifiers, quantitative values). This clearly distinguishes it from sibling tools such as get_compound_details or get_compound_interactions without needing to open 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 Guidelines4/5

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

The description gives clear usage context: retrieve a bioactivity profile and optionally filter by outcome or molecular target. The concrete example 'is this compound active against target T?' makes the intended use immediately actionable. It does not explicitly name exclusions or alternative sibling tools, but for a read-only profile query the context is clear.

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

pubchem_get_compound_3d_structureGet Compound 3D StructureA
Read-onlyIdempotent
Inspect

Get a compound's default 3D conformer — atomic coordinates and bonds — for one CID. format="json" (default) returns atoms and bonds parsed into structured fields; format="sdf" returns the raw V2000 SDF text for passthrough to docking, rendering, or conformer tools. Optionally lists alternate conformer IDs. Not every compound has computed 3D coordinates (large molecules, mixtures, and some salts do not).

ParametersJSON Schema
NameRequiredDescriptionDefault
cidYesPubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds.
formatNoOutput format. "json" (default) returns parsed atoms and bonds. "sdf" returns the raw V2000 SDF text for passthrough to other tools.json
maxAtomsNoCap the atoms returned in the format="json" preview. atomCount always reports the full total; omitted rows are disclosed via the truncated/shownAtoms enrichment. Defaults to the first 200 atoms.
maxBondsNoCap the bonds returned in the format="json" preview. bondCount always reports the full total; omitted rows are disclosed via the truncated/shownBonds enrichment. Defaults to the first 200 bonds.
includeRawSdfNoFor format="sdf", return the complete raw V2000 SDF even when it exceeds the safe line cap. Default false: an SDF longer than 500 lines is line-capped with disclosure. No effect when format="json".
includeAlternateConformerIdsNoList the IDs of additional computed conformers beyond the default. Slower than the default response. Default: false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cidNoPubChem Compound ID.
sdfNoRaw V2000 SDF text. Populated when format="sdf".
atomsNoParsed atoms. Populated when format="json".
bondsNoParsed bonds. Populated when format="json".
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance naming which lists were capped and how to widen them.
atomCapNoThe atom cap applied (explicit maxAtoms or the safe default), when the atom list was capped.
bondCapNoThe bond cap applied (explicit maxBonds or the safe default), when the bond list was capped.
atomCountNoNumber of atoms in the conformer.
bondCountNoNumber of bonds in the conformer.
truncatedNoTrue when the atom list, bond list, or raw SDF was capped below its total. atomCount/bondCount always report the full totals.
shownAtomsNoAtoms returned after the cap, when fewer than atomCount. Raise maxAtoms for more.
shownBondsNoBonds returned after the cap, when fewer than bondCount. Raise maxBonds for more.
conformerIdNoDefault (primary) conformer ID. Present when includeAlternateConformerIds is set.
shownSdfLinesNoSDF lines returned when format="sdf" and the raw text was line-capped. Set includeRawSdf for the full record.
alternateConformerIdsNoConformer IDs beyond the default. Present when includeAlternateConformerIds is set and alternates exist.

TDQS

A4.3/5.0
Behavior4/5

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

With annotations already marking the operation as read-only and idempotent, the description adds valuable behavioral context: it explains the json/sdf output split, the default-conformer semantics, the optional alternate-conformer listing, and the concrete limitation that not all compounds have computed 3D coordinates. This goes beyond what annotations alone convey.

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 description is compact and front-loaded: three sentences cover the core purpose, format behavior, optional alternate conformers, and a key caveat without any wasted words. Every sentence contributes actionable 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?

Given the fully covered 100% schema, read-only annotations, and an output schema, the description need not restate return values or parameter details. It supplies the missing context—default-conformer behavior, format intent, alternate conformers, and data-availability caveats—making it sufficient for correct selection and invocation.

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 100%, and the parameter descriptions already explain maxAtoms, maxBonds, includeRawSdf, and includeAlternateConformerIds in detail. The main description adds only light paraphrasing about format behavior and does not introduce significant new parameter semantics beyond what the schema already provides.

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 verb and resource: 'Get a compound's default 3D conformer — atomic coordinates and bonds — for one CID.' This clearly distinguishes the tool from siblings that search compounds, fetch details, images, or safety data, while also specifying the single-CID scope.

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

Usage Guidelines4/5

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

The description gives clear guidance on when to use each format ('format="json"... returns atoms and bonds parsed... format="sdf" returns raw V2000 SDF text') and notes the single-CID scope. It does not explicitly contrast the tool with every sibling or state when not to use it, but the unique 3D-conformer purpose plus the schema's pointer to pubchem_search_compounds for CID resolution provide adequate context.

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

pubchem_get_compound_detailsGet Compound DetailsA
Read-onlyIdempotent
Inspect

Get detailed compound information by CID. Returns physicochemical properties (molecular weight, SMILES, InChIKey, XLogP, TPSA, etc.), optionally with a textual description (pharmacology, mechanism, therapeutic use), known synonyms, drug-likeness assessment (Lipinski/Veber rules), and/or pharmacological classification (FDA classes, MeSH classes, ATC codes). Accepts up to 100 CIDs per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
cidsYesPubChem Compound IDs to fetch (1-100). Resolve from names/SMILES with pubchem_search_compounds.
propertiesNoProperties to retrieve. Defaults to a core set: MolecularFormula, MolecularWeight, IUPACName, CanonicalSMILES, IsomericSMILES, InChIKey, XLogP, TPSA, HBondDonorCount, HBondAcceptorCount, RotatableBondCount, HeavyAtomCount, Charge, Complexity.
maxSynonymsNoMax synonyms returned per compound per page (1-100). PubChem lists hundreds for common drugs; use synonymOffset to reach the ones past this page. Default: 20.
synonymOffsetNoZero-based index of the first synonym to return within each compound's synonym list. The same offset is applied to every compound in the batch. Pass the nextSynonymOffset from a previous call to read the following page. Default: 0.
includeSynonymsNoFetch known names and synonyms (trade names, systematic names, registry numbers), paged via synonymOffset/maxSynonyms. Fetched for every found CID in the batch. Slower for large CID lists.
maxDescriptionsNoMax number of distinct description entries per compound per page (1-20). PubChem returns near-duplicate summaries from many depositors; duplicates are collapsed before this cap applies. Default: 3.
descriptionOffsetNoZero-based index of the first description to return within each compound's description list. The same offset is applied to every compound in the batch. Pass the nextDescriptionOffset from a previous call to read the following page. Default: 0.
includeDescriptionNoInclude textual descriptions (pharmacology, mechanism, therapeutic use) attributed by source. Well-studied compounds have many overlapping summaries — paged via descriptionOffset/maxDescriptions. Fetched only for the first 10 CIDs in the batch; remaining CIDs return without descriptions and are listed in the response's skippedCids.
includeDrugLikenessNoCompute drug-likeness assessment: Lipinski Rule of Five (MW, XLogP, HBD, HBA) and Veber rules (TPSA, rotatable bonds). Computed from the returned properties, so it adds no latency.
includeClassificationNoInclude pharmacological classification: FDA Established Pharmacologic Classes, mechanisms of action, MeSH classes, and ATC codes. Fetched only for the first 10 CIDs in the batch; remaining CIDs return without classification and are listed in the response's skippedCids.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery guidance covering the skipped CIDs, an offset that runs past every compound, and pages that remain. Absent when nothing was skipped or truncated.
compoundsNoCompound detail records.
truncatedNoTrue when this response is not the whole picture: a compound has further synonyms or descriptions past this page, or CIDs were skipped by the per-call fan-out limit. Per-compound totals are in compounds[].synonymsTotal / compounds[].descriptionsTotal; the skipped CIDs are in skippedCids.
skippedCidsNoCIDs found in PubChem whose descriptions and classification were NOT fetched because the batch exceeded the per-call fan-out limit. Their absence from a record means "not requested", not "PubChem has none" — re-request these CIDs in a follow-up call. Present only when CIDs were skipped.
enrichedCidsNoCIDs whose descriptions and classification were fetched. Present only when the batch exceeded the per-call fan-out limit and other CIDs were skipped.
synonymOffsetNoZero-based index of the first synonym returned within each compound's list. Present when includeSynonyms is true.
descriptionOffsetNoZero-based index of the first description returned within each compound's list. Present when includeDescription is true.
nextSynonymOffsetNosynonymOffset to pass on the next call to continue past this page. Omitted when no compound in the batch has further synonyms.
nextDescriptionOffsetNodescriptionOffset to pass on the next call to continue past this page. Omitted when no compound in the batch has further descriptions.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint/idempotentHint annotations, the description discloses meaningful behavior: a 100-CID batch limit, paged synonyms/descriptions via offsets, a first-10-CID cap for descriptions and classification, and skippedCids reporting. This gives agents important execution expectations without contradicting the annotations.

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 description is compact and front-loaded: purpose first, then return categories, then the batch cap. Every sentence contributes useful information, and detailed parameter behavior is appropriately delegated to the schema.

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 read-only annotations, full parameter documentation, and an output schema, the description supplies the remaining contextual glue: batch limits, optional enrichment features, pagination behavior, and per-CID caps. An agent has enough information to select and invoke this tool correctly.

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 100%, so the structured schema already fully documents every parameter. The tool description adds no parameter-level semantics beyond those already present in the schema; it only summarizes the available optional features at a high level.

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 uses a specific verb and resource ('Get detailed compound information by CID') and enumerates exact return categories: physicochemical properties, textual descriptions, synonyms, drug-likeness, and pharmacological classification. This makes the tool's purpose unambiguous and clearly distinct from sibling tools like image, safety, or bioactivity lookups.

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

Usage Guidelines4/5

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

The 'by CID' framing implies use when CIDs are already known, and the cids parameter explicitly routes name/SMILES resolution to pubchem_search_compounds. It does not explicitly state when not to use this tool versus pubchem_get_summary or pubchem_get_safety, so it falls just short of a 5.

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

pubchem_get_compound_imageGet Compound ImageA
Read-onlyIdempotent
Inspect

Fetch a 2D structure diagram (PNG image) for a compound by CID.

ParametersJSON Schema
NameRequiredDescriptionDefault
cidYesPubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds.
sizeNoImage size: "small" (100x100) or "large" (300x300). Default: "large".large

Output Schema

ParametersJSON Schema
NameRequiredDescription
cidNoPubChem Compound ID.
errorNoPresent when the call failed. Absent on success.
widthNoImage width in pixels.
heightNoImage height in pixels.
mimeTypeNoMIME type — always "image/png".
imageBase64NoBase64-encoded PNG image data.

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, covering the safety profile. The description adds the PNG and 2D format details, but provides no additional behavioral context such as response format nuances or error behavior.

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 description is a single front-loaded sentence. Every phrase contributes: 'Fetch', '2D structure diagram', 'PNG image', and 'by CID'.

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 simple image-fetch tool, the description plus complete input schema, output schema, and read-only annotations provide all necessary information. There are no major gaps that would prevent an agent from invoking it correctly.

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 100%, with cid and size both documented including defaults and enum values. The description only restates 'by CID' and adds no parameter meaning beyond what the input schema already provides.

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 uses a specific verb 'Fetch' and identifies the exact resource: a '2D structure diagram (PNG image)' for a compound by CID. It clearly distinguishes this from siblings like pubchem_get_compound_3d_structure by emphasizing 2D and PNG.

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

Usage Guidelines3/5

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

The description implies use when a 2D image of a compound is needed, and the schema's cid description hints at resolving CID via pubchem_search_compounds. However, it does not explicitly state when to choose this tool over alternatives or provide exclusions.

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

pubchem_get_compound_interactionsGet Compound InteractionsA
Read-onlyIdempotent
Inspect

Get a compound's interaction data: drug-drug interactions (DrugBank), drug-food interactions, and chemical-target interactions (binding/activity from BindingDB, ChEMBL, and others). Each entry carries its originating source. Results are paged per kind, with the source-record total and the next offset reported for each. Richest for approved drugs; many compounds have no deposited interaction records.

ParametersJSON Schema
NameRequiredDescriptionDefault
cidYesPubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds.
kindsNoInteraction kinds to fetch. "drug-drug" (interactions with other drugs), "drug-food" (dietary interactions), "target" (binding/activity against molecular targets). Default: ["drug-drug"].
offsetNoZero-based start position within each requested kind, counted in source records rather than returned entries. The same offset applies to every kind in the call, and the kinds advance at different rates — when paging past the first page, request one kind per call and pass that kind's nextOffset. Default: 0.
maxEntriesNoMax entries per kind per page (1-50). Well-studied drugs have a long tail of interactions; use offset to reach the ones past this page. Default: 10.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cidNoPubChem Compound ID.
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when a kind failed, when no interaction data was found, when the offset runs past every requested kind, or when further pages remain. Absent when this page is complete and every kind resolved.
offsetNoZero-based start position read within each requested kind.
pagingNoPer-kind page position, one entry per requested kind that was retrieved. A kind listed in failedKinds is absent — its position is unknown, not exhausted.
entriesNoInteraction entries across the requested kinds.
truncatedNoTrue when at least one requested kind has source records remaining past this page. Which kinds, and how many records each holds, is in paging[].truncated / paging[].totalRecords.
nextOffsetNoOffset to pass on the next call, reported when exactly one requested kind has records remaining. Omitted when none do, and when several do — those advance to different positions, so read paging[].nextOffset instead.
failedKindsNoInteraction kinds that could not be retrieved (comma-separated). The returned entries cover the kinds that succeeded; retry to re-attempt the failed ones.
returnedCountNoTotal interaction entries returned across all kinds.
requestedKindsNoInteraction kinds requested (comma-separated).

TDQS

A4.2/5.0
Behavior5/5

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

Annotations already declare readOnly, openWorld, and idempotent behavior. The description adds meaningful behavior beyond that: results are paged per kind, each page reports source-record totals and next offsets, each entry carries its source, and coverage varies by drug approval status. No contradiction with annotations.

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?

Four dense sentences with no filler: the action is front-loaded, followed by categories and sources, then pagination behavior, then coverage caveat. Every sentence contributes operational or selection-relevant information.

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 a complete input schema, an output schema, and readOnly/openWorld/idempotent annotations, the description supplies the missing context: originating sources, pagination contract, and expected data sparsity. The only notable gap is explicit differentiation from the closely related bioactivity tool.

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 100%, so the schema already documents cid, kinds, offset, and maxEntries in detail. The description reinforces the per-kind paging concept but does not add parameter-level meaning beyond what the schema provides.

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 action ('Get a compound's interaction data') and enumerates the exact interaction categories and source databases (DrugBank, BindingDB, ChEMBL). This distinguishes it from sibling tools focused on details, images, safety, or bioactivity.

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

Usage Guidelines3/5

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

The description implies when to use it: when interaction records are needed, and it contextualizes expectations with 'Richest for approved drugs; many compounds have no deposited interaction records.' However, it never explicitly names alternatives or says when not to use it, especially relative to pubchem_get_bioactivity, which overlaps on target binding/activity.

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

pubchem_get_compound_safetyGet Compound SafetyA
Read-onlyIdempotent
Inspect

Get GHS (Globally Harmonized System) hazard classification and safety data for one or more compounds by CID. Returns signal word, pictograms, hazard statements (H-codes), and precautionary statements (P-codes) per compound. Data sourced from PubChem depositors — source attribution included.

ParametersJSON Schema
NameRequiredDescriptionDefault
cidsYesPubChem Compound IDs to fetch safety data for (1-25). Resolve from names/SMILES with pubchem_search_compounds.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery guidance when one or more CIDs returned no GHS data, listing the unrecognized CIDs to verify separately from the CIDs that exist but carry no deposited classification.
resultsNoSafety results, one per requested CID (input order preserved).
withDataCountNoCIDs with GHS safety data available.
requestedCountNoCIDs requested.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare the operation read-only, idempotent, and open-world. The description adds useful context by stating data comes from PubChem depositors and that source attribution is included, which helps set expectations about provenance and potential incompleteness. No behavioral claims contradict the annotations.

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?

Two sentences with no wasted wording. The first sentence front-loads the purpose and input; the second concisely covers output contents and data provenance. Every clause earns its place.

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 single-parameter tool with full schema coverage, read-only annotations, and an output schema, the description provides enough information to select and invoke the tool correctly: purpose, input method, expected outputs, and source context. A minor gap is the absence of explicit routing guidance between safety data and the other compound-focused sibling tools, but this is not essential for correct invocation.

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 100%, so the schema already fully documents the cids parameter, including the 1-25 count and the resolution pointer to pubchem_search_compounds. The tool description itself adds no additional parameter-level meaning, so the baseline score of 3 is appropriate.

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 action ('Get'), a specific resource ('GHS hazard classification and safety data for one or more compounds by CID'), and enumerates the concrete return contents (signal word, pictograms, H-codes, P-codes). This clearly differentiates it from sibling tools like pubchem_get_compound_details or pubchem_get_summary.

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

Usage Guidelines4/5

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

Provides clear context for when to use the tool: when GHS safety data for known CIDs is needed. It does not explicitly name sibling alternatives or state exclusions, but the domain-specific focus makes the intended use evident. The schema-level hint to resolve CIDs via pubchem_search_compounds adds further guidance.

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

pubchem_get_compound_xrefsGet Compound Cross-ReferencesA
Read-onlyIdempotent
Inspect

Get external database cross-references for a compound: PubMed citations, patent IDs, gene/protein associations, registry numbers, and taxonomy IDs. Results are paged per type — capped at maxPerType with the total count reported; reach the IDs past a page with offset.

ParametersJSON Schema
NameRequiredDescriptionDefault
cidYesPubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds.
offsetNoZero-based index of the first ID to return within each xref type. The same offset is applied to every requested type. Pass the nextOffset from a previous call to read the following page. Default: 0.
xrefTypesYesCross-reference types to retrieve. String IDs: RegistryID (DSSTox/EPA registry numbers), RN (CAS numbers), PatentID. Numeric IDs: PubMedID, GeneID (NCBI Gene), ProteinGI (legacy NCBI Protein GI), TaxonomyID.
maxPerTypeNoMax IDs to return per xref type per page (1-500). A compound may have thousands of PubMed references; use offset to reach the ones past this page. Total count always reported. Default: 50.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cidNoPubChem Compound ID.
errorNoPresent when the call failed. Absent on success.
xrefsNoCross-references grouped by type.
noticeNoRecovery guidance when every requested xref type returned zero IDs, when the offset runs past every type, or when further pages remain. Absent when this page is complete and non-empty.
offsetNoZero-based index of the first ID returned within each type.
truncatedNoTrue when at least one requested type has IDs remaining past this page. Which types, and how many IDs each holds in total, is in xrefs[].truncated / xrefs[].totalAvailable.
nextOffsetNoOffset to pass on the next call to continue past this page. Omitted when no requested type has further IDs.

TDQS

A4.5/5.0
Behavior5/5

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

The description transparently discloses pagination behavior: results are paged per type, capped at maxPerType, total counts are reported, and offset advances past the current page. This adds valuable behavioral detail beyond the annotations' readOnly, idempotent, and openWorld hints.

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?

Two sentences communicate the core purpose first and then the essential paging behavior. Every clause adds information, with no repetition of schema content or filler.

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 read-only, idempotent tool with a full input schema, an output schema, and clear paging rules in the description, nothing needed for correct invocation is missing. The cid resolution pointer is already present in the schema, and the output schema handles return-value details.

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?

The input schema already provides 100% parameter coverage with detailed descriptions for cid, offset, xrefTypes, and maxPerType. The description adds a helpful human-readable gloss of the xref type categories, but most parameter meaning is already carried by the schema, so the baseline of 3 is appropriate.

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 opens with a specific verb and resource: 'Get external database cross-references for a compound,' then enumerates the covered reference types (PubMed, patents, genes, registry numbers, taxonomy). This clearly distinguishes it from sibling compound tools like details, image, and safety.

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

Usage Guidelines4/5

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

The description clearly establishes this tool's context as fetching external cross-references, which implicitly tells an agent when to select it over sibling tools that handle details, images, or bioactivity. It does not explicitly name alternatives or exclusion conditions, but the resource-specific language gives adequate directional guidance.

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

pubchem_get_summaryGet Entity SummaryA
Read-onlyIdempotent
Inspect

Get descriptive summaries for PubChem entities by ID. Supports assays (AID), genes (Gene ID), proteins (UniProt accession), and taxonomy (Tax ID). Up to 10 per call.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityTypeYesEntity type. Determines ID format and returned fields.
identifiersYesEntity identifiers (1-10). Type depends on entityType: - assay: AID (number), e.g. [1000] - gene: Gene ID (number), e.g. [1956] - protein: UniProt accession (string), e.g. ["P00533"] - taxonomy: Tax ID (number), e.g. [9606]

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery guidance when one or more identifiers were not found.
summariesNoSummary results.
entityTypeNoEntity type queried.
foundCountNoIdentifiers resolved to a summary.
requestedCountNoIdentifiers requested.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, covering the main safety and repeatability traits. The description adds 'Up to 10 per call,' but this repeats the schema maxItems and does not disclose new behavioral context beyond the structured data.

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?

Two sentences with no filler. The main purpose is front-loaded, and the supported entity types are listed compactly without redundancy.

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?

The description covers the four entity categories and the batch limit, while the schema and output schema supply parameter and return details. It is sufficient for a read-only lookup tool, though it omits alternative-tool guidance entirely.

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 100%, including detailed identifier formats for each entity type. The description's entity-type list is a useful high-level summary but does not add meaning beyond what the input schema already provides.

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 clear verb and resource: 'Get descriptive summaries for PubChem entities by ID.' It also enumerates four supported entity types, which distinguishes it from compound-specific siblings like pubchem_get_compound_details.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus sibling tools. It does not name alternatives or provide exclusions such as 'for detailed compound data, use pubchem_get_compound_details instead.'

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

pubchem_search_assaysSearch AssaysA
Read-onlyIdempotent
Inspect

Find PubChem bioassays associated with a biological target. Search by gene symbol (e.g. "EGFR"), protein name, NCBI Gene ID, or UniProt accession. Returns a page of assay IDs (AIDs) — page past maxResults with offset — which can be explored further with pubchem_get_summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNoZero-based index of the first AID to return. Pass the nextOffset from a previous call to read the following page. Default: 0.
maxResultsNoMax AIDs to return per page (1-200). Popular targets may have thousands of assays; use offset to reach the ones past this page. Default: 50.
targetTypeYesTarget identifier type. "genesymbol" and "proteinname" accept text names. "geneid" accepts NCBI Gene IDs. "proteinaccession" accepts UniProt accessions.
targetQueryYesTarget identifier. Examples: "EGFR" (genesymbol), "Epidermal growth factor receptor" (proteinname), "1956" (geneid), "P00533" (proteinaccession).

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe maxResults cap that was applied.
aidsNoPubChem Assay IDs.
errorNoPresent when the call failed. Absent on success.
shownNoAIDs returned on this page.
noticeNoRecovery guidance when no assays matched, when the offset runs past the result set, or when further pages remain. Absent when this page is complete and non-empty.
offsetNoZero-based index of the first AID returned.
truncatedNoTrue when matching AIDs remain past this page.
nextOffsetNoOffset to pass on the next call to continue past this page. Omitted when no further AIDs match.
targetTypeNoTarget identifier type used: genesymbol, proteinname, geneid, or proteinaccession.
totalFoundNoTotal AIDs found for this target, across all pages.
targetQueryNoTarget identifier searched.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, and the description does not contradict them. Beyond those annotations, the description discloses that results are returned as a paginated page of AIDs and that offset/maxResults control access to additional pages, which is useful behavioral context. It does not cover error behavior, but that is not required given the annotation coverage.

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 description is compact and front-loaded: it states the main purpose first, then supported query types, then return/pagination behavior in a short second sentence. Every clause carries useful information for an agent, and there is no filler or repetition of obvious details.

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 paginated search tool, the description covers the supported query identifier types, the result shape (AIDs), pagination semantics, and the next step via pubchem_get_summary. The input schema fully documents every parameter and includes examples, while the annotations cover safety characteristics, so an agent has everything needed to select and invoke this tool correctly.

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 100%, so the baseline is 3 because the schema already documents offset, maxResults, targetType, and targetQuery thoroughly. The description restates the identifier types and gives examples such as 'EGFR' and 'P00533', but those same examples appear in the schema's parameter descriptions. It adds little semantic information beyond reinforcing what the schema already provides.

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 opens with a specific verb and resource: 'Find PubChem bioassays associated with a biological target.' It also names the accepted identifier types and states it returns a page of assay IDs, which clearly separates it from sibling compound-search and summary tools. The pointer to pubchem_get_summary further establishes that this is the search stage, not the detail stage.

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

Usage Guidelines4/5

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

The description gives clear context for when this tool is appropriate: when searching by a biological target identifier and wanting assay IDs. It also provides helpful guidance on pagination and names pubchem_get_summary as the follow-up tool. However, it does not explicitly contrast with alternatives like pubchem_search_compounds or state when not to use this tool.

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

pubchem_search_compoundsSearch CompoundsA
Read-onlyIdempotent
Inspect

Search PubChem for chemical compounds by identifier (name, SMILES, or InChIKey, batched up to 25), molecular formula in Hill notation, substructure or superstructure containment, or 2D Tanimoto similarity. Returns a page of CIDs — reach matches past maxResults with offset. Optionally hydrate results with properties to avoid a follow-up pubchem_get_compound_details call.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoRequired for substructure/superstructure/similarity searches. A SMILES string (e.g. "CC(=O)O") or PubChem CID as a string (e.g. "2244").
offsetNoZero-based index of the first CID to return. Pass the nextOffset from a previous call to read the following page. Identifier lookups resolve every match up front, so paging them is free; formula, substructure, superstructure, and similarity searches have to ask PubChem for offset + maxResults records to reach a page, so deep pages cost progressively more upstream — hence the 10000 ceiling. Default: 0.
formulaNoRequired for formula search. Molecular formula in Hill notation (e.g. "C6H12O6", "CaH2O2").
queryTypeNoRequired for structure/similarity searches. Format of the query: "smiles" or "cid".
thresholdNoSimilarity search only. Minimum Tanimoto similarity (70-100). 90+ for close analogs, 70-80 for scaffold hops. Default: 90.
maxResultsNoMaximum CIDs to return per page (1-200). Use offset to reach matches past this page. Default: 20.
propertiesNoOptional: fetch these properties for each result, avoiding a follow-up details call. E.g. ["MolecularFormula", "MolecularWeight", "CanonicalSMILES"].
searchTypeYesSearch strategy. "identifier": name/SMILES/InChIKey lookup. "formula": molecular formula. "substructure": find compounds containing the query as a substructure. "superstructure": find compounds that are themselves substructures of the query. "similarity": 2D Tanimoto similarity to the query.
identifiersNoRequired for identifier search. Array of identifiers to resolve (1-25). Examples: ["aspirin", "ibuprofen"] for name, ["CC(=O)OC1=CC=CC=C1C(=O)O"] for SMILES, ["BSYNRYMUTXBXSQ-UHFFFAOYSA-N"] for inchikey (27-char block format).
identifierTypeNoRequired for identifier search. Type of chemical identifier: "name", "smiles", or "inchikey".
allowOtherElementsNoFormula search only. When true, includes compounds with additional elements beyond the formula.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe maxResults cap that was applied.
errorNoPresent when the call failed. Absent on success.
shownNoCIDs returned on this page.
noticeNoRecovery guidance when no compounds matched, when the offset runs past the matches observed, when identifiers failed to resolve, or when further pages remain. Absent when this page is complete and every identifier resolved.
offsetNoZero-based index of the first CID returned.
resultsNoMatching compounds.
truncatedNoTrue when matching CIDs remain past this page.
nextOffsetNoOffset to pass on the next call to continue past this page. Omitted when no further matches remain.
searchTypeNoSearch strategy used: identifier, formula, substructure, superstructure, or similarity.
totalFoundNoExact number of matching CIDs across all pages. Omitted when a formula, substructure, superstructure, or similarity search saturated the records it requested — PubChem returns no match count for those, so totalFoundAtLeast reports a floor instead.
totalFoundAtLeastNoLower bound on matching CIDs, reported in place of totalFound when the exact count is unavailable. At least this many match, and the true total may be higher; page further with offset to observe more.
unresolvedIdentifiersNoIdentifier-mode only: input identifiers that resolved to no CID. Omitted when every identifier resolved and for non-identifier searches.

TDQS

A4.3/5.0
Behavior4/5

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

The annotations already establish read-only, open-world, and idempotent behavior, so the bar is appropriately lower. The description adds useful behavioral context: results are returned as a page of CIDs, offset pagination reaches matches past maxResults, and property hydration can eliminate a follow-up call. No behavioral claims contradict the annotations.

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 description is compact at three sentences and front-loads the core search purpose before pagination and hydration details. Every sentence earns its place: search modes, output/paging behavior, and cross-tool optimization. There is no repetition of annotation or schema content beyond necessary orientation.

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 tool's high complexity—11 parameters, five search modes, conditional requirements—the description, combined with the fully documented schema and existing output schema, is complete enough for correct invocation. The description explains the key output guarantee, pagination, and the optional hydration path. Nothing material is missing for an agent to select and call the tool correctly.

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 100%, so the baseline is 3 and the schema already documents every parameter with examples, defaults, constraints, and per-mode requirements. The main description adds little beyond the schema: it restates batching up to 25 identifiers and Hill notation, both of which already appear in the schema. This consistency is useful but does not meaningfully exceed the schema's parameter documentation.

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 identifies a specific resource, PubChem compounds, and a precise action, search, with five enumerated modes: identifier, formula, substructure, superstructure, and similarity. It clarifies the primary output as CIDs and distinguishes itself from the sibling details tool by noting that property hydration avoids a follow-up pubchem_get_compound_details call. This makes the tool's purpose unambiguous and distinct from the other PubChem siblings.

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

Usage Guidelines4/5

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

The description gives clear context for when to use this tool: when searching for compounds by identifiers, formula, structural containment, or similarity. It also provides one concrete routing cue—hydrate results with properties to avoid a second call to pubchem_get_compound_details. It does not explicitly enumerate exclusions or name all sibling alternatives, but the guidance is sufficient for typical agent selection.

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. Dates show when Glama detected each change.

  1. 10 tool updatesv0.6.1
    • Changedpubchem_get_bioactivity6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "cid",
        +      "totalAssays",
        +      "activeCount",
        +      "inactiveCount",
        +      "results",
        +      "outcomeFilter",
        +      "filteredCount",
        +      "returnedCount",
        +      "offset"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "cid",
        -  "totalAssays",
        -  "activeCount",
        -  "inactiveCount",
        -  "results",
        -  "outcomeFilter",
        -  "filteredCount",
        -  "returnedCount",
        -  "offset"
        -]
    • Changedpubchem_get_compound_3d_structure6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "cid",
        +      "atomCount",
        +      "bondCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `no_3d_structure`: PubChem has no computed 3D conformer for the requested CID Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "no_3d_structure"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "cid",
        -  "atomCount",
        -  "bondCount"
        -]
    • Changedpubchem_get_compound_details7 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "compounds",
        +      "truncated"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when this response is not the whole picture: a compound has further synonyms or descriptions past this page, or CIDs were skipped by the per-call fan-out limit. Per-compound totals are in compounds[].synonymsTotal / compounds[].descriptionsTotal; the skipped CIDs are in skippedCids.",
        +  "type": "boolean"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "compounds"
        -]
    • Changedpubchem_get_compound_image6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "cid",
        +      "imageBase64",
        +      "mimeType",
        +      "width",
        +      "height"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `cid_not_found`: PubChem returned 404 for the requested CID Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "cid_not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "cid",
        -  "imageBase64",
        -  "mimeType",
        -  "width",
        -  "height"
        -]
    • Changedpubchem_get_compound_interactions7 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "cid",
        +      "entries",
        +      "paging",
        +      "requestedKinds",
        +      "returnedCount",
        +      "truncated",
        +      "offset"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when at least one requested kind has source records remaining past this page. Which kinds, and how many records each holds, is in paging[].truncated / paging[].totalRecords.",
        +  "type": "boolean"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "cid",
        -  "entries",
        -  "paging",
        -  "requestedKinds",
        -  "returnedCount",
        -  "offset"
        -]
    • Changedpubchem_get_compound_safety6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results",
        +      "requestedCount",
        +      "withDataCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "results",
        -  "requestedCount",
        -  "withDataCount"
        -]
    • Changedpubchem_get_compound_xrefs7 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "cid",
        +      "xrefs",
        +      "offset",
        +      "truncated"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when at least one requested type has IDs remaining past this page. Which types, and how many IDs each holds in total, is in xrefs[].truncated / xrefs[].totalAvailable.",
        +  "type": "boolean"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "cid",
        -  "xrefs",
        -  "offset"
        -]
    • Changedpubchem_get_summary6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "entityType",
        +      "summaries",
        +      "requestedCount",
        +      "foundCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "entityType",
        -  "summaries",
        -  "requestedCount",
        -  "foundCount"
        -]
    • Changedpubchem_search_assays6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "aids",
        +      "targetType",
        +      "targetQuery",
        +      "totalFound",
        +      "offset"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `blank_target_query`: targetQuery is empty or whitespace-only `invalid_geneid_query`: targetType is \"geneid\" but targetQuery is not a positive integer Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "blank_target_query",
        +            "invalid_geneid_query"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "aids",
        -  "targetType",
        -  "targetQuery",
        -  "totalFound",
        -  "offset"
        -]
    • Changedpubchem_search_compounds6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results",
        +      "searchType",
        +      "offset"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `missing_identifier_args`: searchType is \"identifier\" but identifierType or identifiers were omitted `missing_formula`: searchType is \"formula\" but the formula field was omitted `missing_structure_args`: substructure/superstructure/similarity search missing query or queryType `invalid_cid_query`: structure/similarity search with queryType \"cid\" but query is not a positive integer CID Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "missing_identifier_args",
        +            "missing_formula",
        +            "missing_structure_args",
        +            "invalid_cid_query"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "results",
        -  "searchType",
        -  "offset"
        -]
  2. 9 tool updatesv0.6.0
    • Changedpubchem_get_bioactivity10 fields changed
      • changedInput schema / properties / maxResults / description
        Previous value: -"Max assay results to return (1-100). Well-studied compounds have thousands of records. Default: 20."New value: +"Max assay results to return per page (1-100). Well-studied compounds have thousands of records; use offset to reach the ones past this page. Default: 20."
      • changedInput schema / properties / maxResults / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based index of the first assay to return, applied after the outcome and target filters. Pass the nextOffset from a previous call to read the following page. Default: 0.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / filteredCount / description
        Previous value: -"Assays matching the outcome and target filters, before the maxResults cap."New value: +"Exact number of assays matching the outcome and target filters, across all pages."
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Offset to pass on the next call to continue past this page. Omitted when no further assays match.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based index of the first assay returned.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / returnedCount / description
        Previous value: -"Assays returned after the maxResults cap."New value: +"Assays returned on this page."
      • changedOutput schema / properties / shown / description
        Previous value: -"Assays returned after the maxResults cap."New value: +"Assays returned on this page."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when results were capped at maxResults — more matching assays exist."New value: +"True when matching assays remain past this page."
      • changedOutput schema / required
        Previous value: -[
        -  "cid",
        -  "totalAssays",
        -  "activeCount",
        -  "inactiveCount",
        -  "results",
        -  "outcomeFilter",
        -  "filteredCount",
        -  "returnedCount"
        -]New value: +[
        +  "cid",
        +  "totalAssays",
        +  "activeCount",
        +  "inactiveCount",
        +  "results",
        +  "outcomeFilter",
        +  "filteredCount",
        +  "returnedCount",
        +  "offset"
        +]
    • Changedpubchem_get_compound_3d_structure1 field changed
      • changedInput schema / properties / includeAlternateConformerIds / description
        Previous value: -"List the IDs of additional computed conformers beyond the default. Adds one extra API call. Default: false."New value: +"List the IDs of additional computed conformers beyond the default. Slower than the default response. Default: false."
    • Changedpubchem_get_compound_details20 fields changed
      • changedInput schema / properties / cids / description
        Previous value: -"PubChem Compound IDs to fetch (1-100). Batched efficiently. Resolve from names/SMILES with pubchem_search_compounds."New value: +"PubChem Compound IDs to fetch (1-100). Resolve from names/SMILES with pubchem_search_compounds."
      • addedInput schema / properties / descriptionOffset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based index of the first description to return within each compound's description list. The same offset is applied to every compound in the batch. Pass the nextDescriptionOffset from a previous call to read the following page. Default: 0.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / includeClassification / description
        Previous value: -"Include pharmacological classification: FDA Established Pharmacologic Classes, mechanisms of action, MeSH classes, and ATC codes. Fetched only for the first 10 CIDs in the batch; remaining CIDs return without classification."New value: +"Include pharmacological classification: FDA Established Pharmacologic Classes, mechanisms of action, MeSH classes, and ATC codes. Fetched only for the first 10 CIDs in the batch; remaining CIDs return without classification and are listed in the response's skippedCids."
      • changedInput schema / properties / includeDescription / description
        Previous value: -"Include textual descriptions (pharmacology, mechanism, therapeutic use) attributed by source. Well-studied compounds have many overlapping summaries — capped via maxDescriptions. Fetched only for the first 10 CIDs in the batch; remaining CIDs return without descriptions."New value: +"Include textual descriptions (pharmacology, mechanism, therapeutic use) attributed by source. Well-studied compounds have many overlapping summaries — paged via descriptionOffset/maxDescriptions. Fetched only for the first 10 CIDs in the batch; remaining CIDs return without descriptions and are listed in the response's skippedCids."
      • changedInput schema / properties / includeDrugLikeness / description
        Previous value: -"Compute drug-likeness assessment: Lipinski Rule of Five (MW, XLogP, HBD, HBA) and Veber rules (TPSA, rotatable bonds). No extra API calls — computed from properties."New value: +"Compute drug-likeness assessment: Lipinski Rule of Five (MW, XLogP, HBD, HBA) and Veber rules (TPSA, rotatable bonds). Computed from the returned properties, so it adds no latency."
      • changedInput schema / properties / includeSynonyms / description
        Previous value: -"Fetch all known names and synonyms (trade names, systematic names, registry numbers). One API call per CID — slower than the property batch for large CID lists."New value: +"Fetch known names and synonyms (trade names, systematic names, registry numbers), paged via synonymOffset/maxSynonyms. Fetched for every found CID in the batch. Slower for large CID lists."
      • changedInput schema / properties / maxDescriptions / description
        Previous value: -"Max number of distinct description entries per compound (1-20). PubChem returns near-duplicate summaries from many depositors; we dedup and cap to keep responses focused. Default: 3."New value: +"Max number of distinct description entries per compound per page (1-20). PubChem returns near-duplicate summaries from many depositors; duplicates are collapsed before this cap applies. Default: 3."
      • changedInput schema / properties / maxSynonyms / description
        Previous value: -"Max synonyms returned per compound (1-100). PubChem lists hundreds for common drugs; capped to keep the response focused. Default: 20."New value: +"Max synonyms returned per compound per page (1-100). PubChem lists hundreds for common drugs; use synonymOffset to reach the ones past this page. Default: 20."
      • addedInput schema / properties / synonymOffset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based index of the first synonym to return within each compound's synonym list. The same offset is applied to every compound in the batch. Pass the nextSynonymOffset from a previous call to read the following page. Default: 0.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / compounds / items / properties / descriptions / description
        Previous value: -"Textual descriptions, deduplicated and capped at maxDescriptions. Each entry carries optional source attribution."New value: +"Textual descriptions on this page, deduplicated then windowed by descriptionOffset/maxDescriptions. Each entry carries optional source attribution. Empty when descriptionOffset runs past descriptionsTotal."
      • changedOutput schema / properties / compounds / items / properties / descriptionsTotal / description
        Previous value: -"Total distinct descriptions available before truncation. Larger than descriptions.length when more sources exist — increase maxDescriptions to see them."New value: +"Total distinct descriptions available for this compound, across all pages. Larger than descriptions.length when more sources exist — raise maxDescriptions or page with descriptionOffset to see them."
      • changedOutput schema / properties / compounds / items / properties / synonyms / description
        Previous value: -"Known names and synonyms."New value: +"Known names and synonyms on this page, windowed by synonymOffset/maxSynonyms. Empty when synonymOffset runs past synonymsTotal."
      • changedOutput schema / properties / compounds / items / properties / synonymsTotal / description
        Previous value: -"Total synonyms available before truncation. Larger than synonyms.length when more exist — increase maxSynonyms to see them."New value: +"Total synonyms available for this compound, across all pages. Larger than synonyms.length when more exist — raise maxSynonyms or page with synonymOffset to see them."
      • addedOutput schema / properties / descriptionOffset
        Added value: +{
        +  "description": "Zero-based index of the first description returned within each compound's list. Present when includeDescription is true.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / enrichedCids
        Added value: +{
        +  "description": "CIDs whose descriptions and classification were fetched. Present only when the batch exceeded the per-call fan-out limit and other CIDs were skipped.",
        +  "items": {
        +    "type": "number"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / nextDescriptionOffset
        Added value: +{
        +  "description": "descriptionOffset to pass on the next call to continue past this page. Omitted when no compound in the batch has further descriptions.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / nextSynonymOffset
        Added value: +{
        +  "description": "synonymOffset to pass on the next call to continue past this page. Omitted when no compound in the batch has further synonyms.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Recovery guidance covering the skipped CIDs, an offset that runs past every compound, and pages that remain. Absent when nothing was skipped or truncated.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / skippedCids
        Added value: +{
        +  "description": "CIDs found in PubChem whose descriptions and classification were NOT fetched because the batch exceeded the per-call fan-out limit. Their absence from a record means \"not requested\", not \"PubChem has none\" — re-request these CIDs in a follow-up call. Present only when CIDs were skipped.",
        +  "items": {
        +    "type": "number"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / synonymOffset
        Added value: +{
        +  "description": "Zero-based index of the first synonym returned within each compound's list. Present when includeSynonyms is true.",
        +  "type": "number"
        +}
    • Changedpubchem_get_compound_interactions8 fields changed
      • changedInput schema / properties / maxEntries / description
        Previous value: -"Max entries per kind (1-50). Well-studied drugs have a long tail of interactions. Default: 10."New value: +"Max entries per kind per page (1-50). Well-studied drugs have a long tail of interactions; use offset to reach the ones past this page. Default: 10."
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based start position within each requested kind, counted in source records rather than returned entries. The same offset applies to every kind in the call, and the kinds advance at different rates — when paging past the first page, request one kind per call and pass that kind's nextOffset. Default: 0.",
        +  "maximum": 2147483646,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • removedOutput schema / properties / entries / items / properties / severity
        Removed value: -{
        -  "description": "Raw severity as the source reports it — not normalized across sources, and frequently unset (most sources embed severity in the statement text).",
        -  "type": "string"
        -}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Offset to pass on the next call, reported when exactly one requested kind has records remaining. Omitted when none do, and when several do — those advance to different positions, so read paging[].nextOffset instead.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no interaction data was found for the requested kinds."New value: +"Guidance when a kind failed, when no interaction data was found, when the offset runs past every requested kind, or when further pages remain. Absent when this page is complete and every kind resolved."
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based start position read within each requested kind.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / paging
        Added value: +{
        +  "description": "Per-kind page position, one entry per requested kind that was retrieved. A kind listed in failedKinds is absent — its position is unknown, not exhausted.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "Page position for one interaction kind.",
        +    "properties": {
        +      "kind": {
        +        "description": "Interaction category this page covers.",
        +        "enum": [
        +          "drug-drug",
        +          "drug-food",
        +          "target"
        +        ],
        +        "type": "string"
        +      },
        +      "nextOffset": {
        +        "description": "Offset to pass on the next call to continue this kind past the current page. Omitted when no records remain.",
        +        "type": "number"
        +      },
        +      "returnedCount": {
        +        "description": "Interaction entries returned for this kind.",
        +        "type": "number"
        +      },
        +      "totalRecords": {
        +        "description": "Source records available for this kind, across all pages. Entries are derived from these records and can be fewer: a \"target\" record naming no molecular target and a \"drug-drug\" record carrying no statement both yield nothing, and duplicate measurements collapse within a page. Pages divide the records, not the entries, so a duplicate split across two pages is reported on both.",
        +        "type": "number"
        +      },
        +      "truncated": {
        +        "description": "True when source records remain for this kind past the current page.",
        +        "type": "boolean"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "returnedCount",
        +      "totalRecords",
        +      "truncated"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "cid",
        -  "entries",
        -  "requestedKinds",
        -  "returnedCount"
        -]New value: +[
        +  "cid",
        +  "entries",
        +  "paging",
        +  "requestedKinds",
        +  "returnedCount",
        +  "offset"
        +]
    • Changedpubchem_get_compound_safety6 fields changed
      • changedOutput schema / properties / notice / description
        Previous value: -"Cross-tool guidance when one or more CIDs have no GHS data, pointing to an alternative source."New value: +"Recovery guidance when one or more CIDs returned no GHS data, listing the unrecognized CIDs to verify separately from the CIDs that exist but carry no deposited classification."
      • addedOutput schema / properties / results / items / properties / ghs / properties / precautionaryStatements / items / properties / decoded
        Added value: +{
        +  "description": "Whether \"statement\" carries the standard text. False for codes needing label-specific fill text the depositor must supply (disposal method, firefighting agent, first-aid reference) and for codes outside the decoder table; the code itself is still authoritative.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / results / items / properties / ghs / properties / precautionaryStatements / items / properties / statement / description
        Previous value: -"Precautionary statement text."New value: +"Standard precautionary statement text for the code. Empty string when \"decoded\" is false — PubChem deposits P-codes without text, so a blank statement means the code was not decoded, never that the depositor supplied an empty statement."
      • changedOutput schema / properties / results / items / properties / ghs / properties / precautionaryStatements / items / required
        Previous value: -[
        -  "code",
        -  "statement"
        -]New value: +[
        +  "code",
        +  "statement",
        +  "decoded"
        +]
      • addedOutput schema / properties / results / items / properties / status
        Added value: +{
        +  "description": "Outcome for this CID. \"ok\": GHS data returned. \"no_ghs_data\": the compound exists in PubChem but has no deposited GHS classification. \"cid_not_found\": PubChem has no record for this CID at all — the identifier is wrong, so verify it with pubchem_search_compounds rather than concluding the compound is unclassified.",
        +  "enum": [
        +    "ok",
        +    "no_ghs_data",
        +    "cid_not_found"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "cid",
        -  "hasData"
        -]New value: +[
        +  "cid",
        +  "hasData",
        +  "status"
        +]
    • Changedpubchem_get_compound_xrefs10 fields changed
      • changedInput schema / properties / maxPerType / description
        Previous value: -"Max IDs to return per xref type (1-500). A compound may have thousands of PubMed references. Total count always reported. Default: 50."New value: +"Max IDs to return per xref type per page (1-500). A compound may have thousands of PubMed references; use offset to reach the ones past this page. Total count always reported. Default: 50."
      • changedInput schema / properties / maxPerType / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based index of the first ID to return within each xref type. The same offset is applied to every requested type. Pass the nextOffset from a previous call to read the following page. Default: 0.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Offset to pass on the next call to continue past this page. Omitted when no requested type has further IDs.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery guidance when every requested xref type returned zero IDs — hints to verify the CID. Absent when any cross-references were found."New value: +"Recovery guidance when every requested xref type returned zero IDs, when the offset runs past every type, or when further pages remain. Absent when this page is complete and non-empty."
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based index of the first ID returned within each type.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / xrefs / items / properties / ids / description
        Previous value: -"Cross-reference IDs (capped by maxPerType)."New value: +"Cross-reference IDs on this page (window of offset + maxPerType)."
      • changedOutput schema / properties / xrefs / items / properties / totalAvailable / description
        Previous value: -"Total IDs available before truncation."New value: +"Total IDs available for this type, across all pages."
      • changedOutput schema / properties / xrefs / items / properties / truncated / description
        Previous value: -"Whether results were truncated."New value: +"True when IDs for this type remain past the current page."
      • changedOutput schema / required
        Previous value: -[
        -  "cid",
        -  "xrefs"
        -]New value: +[
        +  "cid",
        +  "xrefs",
        +  "offset"
        +]
    • Changedpubchem_get_summary1 field changed
      • changedOutput schema / properties / summaries / items / properties / data / properties / lineage / description
        Previous value: -"Parent taxonomy lineage (taxonomy summaries)."New value: +"Taxonomic lineage ordered from the most inclusive rank to the most specific, e.g. [\"Eukaryota\", \"Metazoa\", \"Chordata\"] (taxonomy summaries). Ranks that do not apply to the entity are omitted."
    • Changedpubchem_search_assays10 fields changed
      • changedInput schema / properties / maxResults / description
        Previous value: -"Max AIDs to return (1-200). Popular targets may have thousands of assays. Default: 50."New value: +"Max AIDs to return per page (1-200). Popular targets may have thousands of assays; use offset to reach the ones past this page. Default: 50."
      • changedInput schema / properties / maxResults / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based index of the first AID to return. Pass the nextOffset from a previous call to read the following page. Default: 0.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Offset to pass on the next call to continue past this page. Omitted when no further AIDs match.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery guidance when no assays matched — echoes the target and suggests alternative search types. Absent when assays were returned."New value: +"Recovery guidance when no assays matched, when the offset runs past the result set, or when further pages remain. Absent when this page is complete and non-empty."
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based index of the first AID returned.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / shown / description
        Previous value: -"AIDs returned after the maxResults cap."New value: +"AIDs returned on this page."
      • changedOutput schema / properties / totalFound / description
        Previous value: -"Total AIDs found before the maxResults cap."New value: +"Total AIDs found for this target, across all pages."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when AIDs were capped at maxResults — more assays exist than returned."New value: +"True when matching AIDs remain past this page."
      • changedOutput schema / required
        Previous value: -[
        -  "aids",
        -  "targetType",
        -  "targetQuery",
        -  "totalFound"
        -]New value: +[
        +  "aids",
        +  "targetType",
        +  "targetQuery",
        +  "totalFound",
        +  "offset"
        +]
    • Changedpubchem_search_compounds11 fields changed
      • changedInput schema / properties / maxResults / description
        Previous value: -"Maximum CIDs to return (1-200). Default: 20."New value: +"Maximum CIDs to return per page (1-200). Use offset to reach matches past this page. Default: 20."
      • changedInput schema / properties / maxResults / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based index of the first CID to return. Pass the nextOffset from a previous call to read the following page. Identifier lookups resolve every match up front, so paging them is free; formula, substructure, superstructure, and similarity searches have to ask PubChem for offset + maxResults records to reach a page, so deep pages cost progressively more upstream — hence the 10000 ceiling. Default: 0.",
        +  "maximum": 10000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Offset to pass on the next call to continue past this page. Omitted when no further matches remain.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery guidance when no compounds matched — echoes search strategy and suggests how to broaden. Absent when results were returned."New value: +"Recovery guidance when no compounds matched, when the offset runs past the matches observed, when identifiers failed to resolve, or when further pages remain. Absent when this page is complete and every identifier resolved."
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based index of the first CID returned.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / shown / description
        Previous value: -"CIDs returned after the maxResults cap."New value: +"CIDs returned on this page."
      • changedOutput schema / properties / totalFound / description
        Previous value: -"Total CIDs found before the maxResults cap."New value: +"Exact number of matching CIDs across all pages. Omitted when a formula, substructure, superstructure, or similarity search saturated the records it requested — PubChem returns no match count for those, so totalFoundAtLeast reports a floor instead."
      • addedOutput schema / properties / totalFoundAtLeast
        Added value: +{
        +  "description": "Lower bound on matching CIDs, reported in place of totalFound when the exact count is unavailable. At least this many match, and the true total may be higher; page further with offset to observe more.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when CIDs were capped at maxResults — more matches exist than returned."New value: +"True when matching CIDs remain past this page."
      • changedOutput schema / required
        Previous value: -[
        -  "results",
        -  "searchType",
        -  "totalFound"
        -]New value: +[
        +  "results",
        +  "searchType",
        +  "offset"
        +]
  3. 4 tool updatesv0.2.5
    • Changedpubchem_get_compound_3d_structure10 fields changed
      • addedInput schema / properties / includeRawSdf
        Added value: +{
        +  "default": false,
        +  "description": "For format=\"sdf\", return the complete raw V2000 SDF even when it exceeds the safe line cap. Default false: an SDF longer than 500 lines is line-capped with disclosure. No effect when format=\"json\".",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / maxAtoms
        Added value: +{
        +  "description": "Cap the atoms returned in the format=\"json\" preview. atomCount always reports the full total; omitted rows are disclosed via the truncated/shownAtoms enrichment. Defaults to the first 200 atoms.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedInput schema / properties / maxBonds
        Added value: +{
        +  "description": "Cap the bonds returned in the format=\"json\" preview. bondCount always reports the full total; omitted rows are disclosed via the truncated/shownBonds enrichment. Defaults to the first 200 bonds.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / atomCap
        Added value: +{
        +  "description": "The atom cap applied (explicit maxAtoms or the safe default), when the atom list was capped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / bondCap
        Added value: +{
        +  "description": "The bond cap applied (explicit maxBonds or the safe default), when the bond list was capped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance naming which lists were capped and how to widen them.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / shownAtoms
        Added value: +{
        +  "description": "Atoms returned after the cap, when fewer than atomCount. Raise maxAtoms for more.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shownBonds
        Added value: +{
        +  "description": "Bonds returned after the cap, when fewer than bondCount. Raise maxBonds for more.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shownSdfLines
        Added value: +{
        +  "description": "SDF lines returned when format=\"sdf\" and the raw text was line-capped. Set includeRawSdf for the full record.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the atom list, bond list, or raw SDF was capped below its total. atomCount/bondCount always report the full totals.",
        +  "type": "boolean"
        +}
    • Changedpubchem_get_compound_details2 fields changed
      • addedInput schema / properties / maxSynonyms
        Added value: +{
        +  "default": 20,
        +  "description": "Max synonyms returned per compound (1-100). PubChem lists hundreds for common drugs; capped to keep the response focused. Default: 20.",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / compounds / items / properties / synonymsTotal
        Added value: +{
        +  "description": "Total synonyms available before truncation. Larger than synonyms.length when more exist — increase maxSynonyms to see them.",
        +  "type": "number"
        +}
    • Changedpubchem_get_compound_xrefs1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Recovery guidance when every requested xref type returned zero IDs — hints to verify the CID. Absent when any cross-references were found.",
        +  "type": "string"
        +}
    • Changedpubchem_search_compounds1 field changed
      • addedOutput schema / properties / unresolvedIdentifiers
        Added value: +{
        +  "description": "Identifier-mode only: input identifiers that resolved to no CID. Omitted when every identifier resolved and for non-identifier searches.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
  4. 3 tool updatesv0.2.4
    • Changedpubchem_get_bioactivity3 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The maxResults cap that was applied.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Assays returned after the maxResults cap.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when results were capped at maxResults — more matching assays exist.",
        +  "type": "boolean"
        +}
    • Changedpubchem_search_assays3 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The maxResults cap that was applied.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "AIDs returned after the maxResults cap.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when AIDs were capped at maxResults — more assays exist than returned.",
        +  "type": "boolean"
        +}
    • Changedpubchem_search_compounds3 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The maxResults cap that was applied.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "CIDs returned after the maxResults cap.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when CIDs were capped at maxResults — more matches exist than returned.",
        +  "type": "boolean"
        +}
  5. 5 tool updatesv0.2.2
    • Changedpubchem_get_bioactivity8 fields changed
      • addedInput schema / properties / targetAccession
        Added value: +{
        +  "description": "Filter to assays against this target protein accession (UniProt/GenBank), e.g. \"P35354\". Obtain accessions from pubchem_search_assays or the targetAccession field of an unfiltered result here.",
        +  "type": "string"
        +}
      • addedInput schema / properties / targetGeneId
        Added value: +{
        +  "description": "Filter to assays against this NCBI Gene ID. Obtain Gene IDs from pubchem_search_assays or the targetGeneId field of an unfiltered result here. Combine with outcomeFilter=\"active\" to answer \"is this compound active against target T?\".",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / filteredCount
        Added value: +{
        +  "description": "Assays matching the outcome and target filters, before the maxResults cap.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Recovery guidance when the filter yields no results or the compound has no bioactivity data.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / outcomeFilter
        Added value: +{
        +  "description": "Outcome filter applied: active, inactive, or all.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / returnedCount
        Added value: +{
        +  "description": "Assays returned after the maxResults cap.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / targetFilter
        Added value: +{
        +  "description": "Target filter applied (gene ID and/or protein accession), when set.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "cid",
        -  "totalAssays",
        -  "activeCount",
        -  "inactiveCount",
        -  "results"
        -]New value: +[
        +  "cid",
        +  "totalAssays",
        +  "activeCount",
        +  "inactiveCount",
        +  "results",
        +  "outcomeFilter",
        +  "filteredCount",
        +  "returnedCount"
        +]
    • Addedpubchem_get_compound_3d_structure
    • Addedpubchem_get_compound_interactions
    • Changedpubchem_get_compound_safety12 fields changed
      • removedInput schema / properties / cid
        Removed value: -{
        -  "description": "PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds.",
        -  "exclusiveMinimum": 0,
        -  "maximum": 9007199254740991,
        -  "type": "integer"
        -}
      • addedInput schema / properties / cids
        Added value: +{
        +  "description": "PubChem Compound IDs to fetch safety data for (1-25). Resolve from names/SMILES with pubchem_search_compounds.",
        +  "items": {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  "maxItems": 25,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "cid"
        -]New value: +[
        +  "cids"
        +]
      • removedOutput schema / properties / cid
        Removed value: -{
        -  "description": "PubChem Compound ID.",
        -  "type": "number"
        -}
      • removedOutput schema / properties / ghs
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "GHS classification data.",
        -  "properties": {
        -    "hazardStatements": {
        -      "description": "GHS hazard statements.",
        -      "items": {
        -        "additionalProperties": false,
        -        "description": "GHS hazard statement entry.",
        -        "properties": {
        -          "code": {
        -            "description": "H-code (e.g. \"H225\").",
        -            "type": "string"
        -          },
        -          "statement": {
        -            "description": "Hazard statement text.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "code",
        -          "statement"
        -        ],
        -        "type": "object"
        -      },
        -      "type": "array"
        -    },
        -    "pictograms": {
        -      "description": "GHS pictogram labels (e.g. \"Flammable\", \"Toxic\").",
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "precautionaryStatements": {
        -      "description": "GHS precautionary statements.",
        -      "items": {
        -        "additionalProperties": false,
        -        "description": "GHS precautionary statement entry.",
        -        "properties": {
        -          "code": {
        -            "description": "P-code (e.g. \"P210\").",
        -            "type": "string"
        -          },
        -          "statement": {
        -            "description": "Precautionary statement text.",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "code",
        -          "statement"
        -        ],
        -        "type": "object"
        -      },
        -      "type": "array"
        -    },
        -    "signalWord": {
        -      "description": "GHS signal word: \"Danger\" or \"Warning\".",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "pictograms",
        -    "hazardStatements",
        -    "precautionaryStatements"
        -  ],
        -  "type": "object"
        -}
      • removedOutput schema / properties / hasData
        Removed value: -{
        -  "description": "Whether GHS safety data is available for this compound.",
        -  "type": "boolean"
        -}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Cross-tool guidance when one or more CIDs have no GHS data, pointing to an alternative source.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / requestedCount
        Added value: +{
        +  "description": "CIDs requested.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / results
        Added value: +{
        +  "description": "Safety results, one per requested CID (input order preserved).",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "Per-CID safety result.",
        +    "properties": {
        +      "cid": {
        +        "description": "PubChem Compound ID.",
        +        "type": "number"
        +      },
        +      "ghs": {
        +        "additionalProperties": false,
        +        "description": "GHS classification data.",
        +        "properties": {
        +          "hazardStatements": {
        +            "description": "GHS hazard statements.",
        +            "items": {
        +              "additionalProperties": false,
        +              "description": "GHS hazard statement entry.",
        +              "properties": {
        +                "code": {
        +                  "description": "H-code (e.g. \"H225\").",
        +                  "type": "string"
        +                },
        +                "statement": {
        +                  "description": "Hazard statement text.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "code",
        +                "statement"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "pictograms": {
        +            "description": "GHS pictogram labels (e.g. \"Flammable\", \"Toxic\").",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "precautionaryStatements": {
        +            "description": "GHS precautionary statements.",
        +            "items": {
        +              "additionalProperties": false,
        +              "description": "GHS precautionary statement entry.",
        +              "properties": {
        +                "code": {
        +                  "description": "P-code (e.g. \"P210\").",
        +                  "type": "string"
        +                },
        +                "statement": {
        +                  "description": "Precautionary statement text.",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "code",
        +                "statement"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "signalWord": {
        +            "description": "GHS signal word: \"Danger\" or \"Warning\".",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "pictograms",
        +          "hazardStatements",
        +          "precautionaryStatements"
        +        ],
        +        "type": "object"
        +      },
        +      "hasData": {
        +        "description": "Whether GHS safety data is available for this compound.",
        +        "type": "boolean"
        +      },
        +      "source": {
        +        "description": "Data source attribution.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "cid",
        +      "hasData"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / source
        Removed value: -{
        -  "description": "Data source attribution.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / withDataCount
        Added value: +{
        +  "description": "CIDs with GHS safety data available.",
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "cid",
        -  "hasData"
        -]New value: +[
        +  "results",
        +  "requestedCount",
        +  "withDataCount"
        +]
    • Changedpubchem_get_summary4 fields changed
      • addedOutput schema / properties / foundCount
        Added value: +{
        +  "description": "Identifiers resolved to a summary.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Recovery guidance when one or more identifiers were not found.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / requestedCount
        Added value: +{
        +  "description": "Identifiers requested.",
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "entityType",
        -  "summaries"
        -]New value: +[
        +  "entityType",
        +  "summaries",
        +  "requestedCount",
        +  "foundCount"
        +]
  6. 8 tool updatesv0.1.22
    • Changedpubchem_get_bioactivity6 fields changed
      • changedInput schema / properties / cid / description
        Previous value: -"PubChem Compound ID."New value: +"PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds."
      • addedOutput schema / properties / results / items / description
        Added value: +"Assay result entry."
      • addedOutput schema / properties / results / items / properties / activityValues / items / description
        Added value: +"Quantitative activity measurement entry."
      • changedOutput schema / properties / results / items / properties / activityValues / items / properties / name / description
        Previous value: -"Measurement name (e.g. IC50, EC50, Ki)."New value: +"Measurement name (e.g. IC50, EC50, Ki). Omitted when not reported."
      • changedOutput schema / properties / results / items / properties / activityValues / items / properties / unit / description
        Previous value: -"Unit of measurement (e.g. uM, nM)."New value: +"Unit of measurement (e.g. uM, nM). Omitted when not reported."
      • changedOutput schema / properties / results / items / properties / activityValues / items / required
        Previous value: -[
        -  "name",
        -  "value",
        -  "unit"
        -]New value: +[
        +  "value"
        +]
    • Changedpubchem_get_compound_details19 fields changed
      • changedInput schema / properties / cids / description
        Previous value: -"PubChem Compound IDs to fetch (1-100). Batched efficiently."New value: +"PubChem Compound IDs to fetch (1-100). Batched efficiently. Resolve from names/SMILES with pubchem_search_compounds."
      • changedInput schema / properties / includeClassification / description
        Previous value: -"Fetch pharmacological classification from PUG View: FDA Established Pharmacologic Classes, mechanisms of action, MeSH classes, and ATC codes. Adds one API call per CID — consider limiting CID count when enabled."New value: +"Include pharmacological classification: FDA Established Pharmacologic Classes, mechanisms of action, MeSH classes, and ATC codes. Fetched only for the first 10 CIDs in the batch; remaining CIDs return without classification."
      • changedInput schema / properties / includeDescription / description
        Previous value: -"Fetch textual description from PUG View (pharmacology, mechanism, therapeutic use). Adds one API call per CID — consider limiting CID count when enabled."New value: +"Include textual descriptions (pharmacology, mechanism, therapeutic use) attributed by source. Well-studied compounds have many overlapping summaries — capped via maxDescriptions. Fetched only for the first 10 CIDs in the batch; remaining CIDs return without descriptions."
      • changedInput schema / properties / includeSynonyms / description
        Previous value: -"Fetch all known names and synonyms (trade names, systematic names, registry numbers)."New value: +"Fetch all known names and synonyms (trade names, systematic names, registry numbers). One API call per CID — slower than the property batch for large CID lists."
      • addedInput schema / properties / maxDescriptions
        Added value: +{
        +  "default": 3,
        +  "description": "Max number of distinct description entries per compound (1-20). PubChem returns near-duplicate summaries from many depositors; we dedup and cap to keep responses focused. Default: 3.",
        +  "maximum": 20,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / compounds / items / description
        Added value: +"Per-CID compound detail record."
      • addedOutput schema / properties / compounds / items / properties / classification / properties / atcCodes / items / description
        Added value: +"ATC code entry with hierarchical description."
      • removedOutput schema / properties / compounds / items / properties / description
        Removed value: -{
        -  "description": "Textual description from PUG View.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / compounds / items / properties / descriptions
        Added value: +{
        +  "description": "Textual descriptions, deduplicated and capped at maxDescriptions. Each entry carries optional source attribution.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "Description entry with optional source attribution.",
        +    "properties": {
        +      "source": {
        +        "description": "Depositor source (e.g. \"DrugBank\", \"Wikipedia\", \"ChEBI\").",
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Description text.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / compounds / items / properties / descriptionsTotal
        Added value: +{
        +  "description": "Total distinct descriptions available before truncation. Larger than descriptions.length when more sources exist — increase maxDescriptions to see them.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / mw / description
        Previous value: -"Molecular weight rule (≤500)."New value: +"Molecular weight rule (≤500 g/mol)."
      • changedOutput schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / xLogP / description
        Previous value: -"XLogP rule (≤5)."New value: +"XLogP rule (≤5; calculated logP)."
      • addedOutput schema / properties / compounds / items / properties / drugLikeness / properties / pass / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / compounds / items / properties / drugLikeness / properties / pass / description
        Previous value: -"Overall drug-likeness pass."New value: +"Overall drug-likeness pass. Null when insufficient properties were available."
      • removedOutput schema / properties / compounds / items / properties / drugLikeness / properties / pass / type
        Removed value: -"boolean"
      • changedOutput schema / properties / compounds / items / properties / drugLikeness / properties / veber / properties / tpsa / description
        Previous value: -"TPSA rule (≤140)."New value: +"Topological polar surface area rule (≤140 Ų)."
      • addedOutput schema / properties / compounds / items / properties / found
        Added value: +{
        +  "description": "False when the CID does not exist in PubChem (properties, description, etc. are empty).",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / compounds / items / properties / properties / description
        Previous value: -"Requested physicochemical properties."New value: +"Physicochemical properties keyed by name (echoes input.properties or the default core set; drug-likeness inputs are appended automatically when includeDrugLikeness is true)."
      • changedOutput schema / properties / compounds / items / required
        Previous value: -[
        -  "cid",
        -  "properties"
        -]New value: +[
        +  "cid",
        +  "found",
        +  "properties"
        +]
    • Changedpubchem_get_compound_image2 fields changed
      • changedInput schema / properties / cid / description
        Previous value: -"PubChem Compound ID."New value: +"PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds."
      • changedOutput schema / properties / mimeType / description
        Previous value: -"Image MIME type."New value: +"MIME type — always \"image/png\"."
    • Changedpubchem_get_compound_safety3 fields changed
      • changedInput schema / properties / cid / description
        Previous value: -"PubChem Compound ID."New value: +"PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds."
      • addedOutput schema / properties / ghs / properties / hazardStatements / items / description
        Added value: +"GHS hazard statement entry."
      • addedOutput schema / properties / ghs / properties / precautionaryStatements / items / description
        Added value: +"GHS precautionary statement entry."
    • Changedpubchem_get_compound_xrefs7 fields changed
      • changedInput schema / properties / cid / description
        Previous value: -"PubChem Compound ID."New value: +"PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds."
      • changedInput schema / properties / maxPerType / description
        Previous value: -"Max IDs to return per xref type (1-500). A compound may have thousands of PubMed references — this cap prevents bloat. Total count always reported. Default: 50."New value: +"Max IDs to return per xref type (1-500). A compound may have thousands of PubMed references. Total count always reported. Default: 50."
      • changedInput schema / properties / xrefTypes / description
        Previous value: -"Cross-reference types to retrieve. Options: RegistryID, RN (CAS numbers), PubMedID, PatentID, GeneID, ProteinGI, TaxonomyID."New value: +"Cross-reference types to retrieve. String IDs: RegistryID (DSSTox/EPA registry numbers), RN (CAS numbers), PatentID. Numeric IDs: PubMedID, GeneID (NCBI Gene), ProteinGI (legacy NCBI Protein GI), TaxonomyID."
      • addedOutput schema / properties / xrefs / items / description
        Added value: +"Cross-reference group for one type."
      • changedOutput schema / properties / xrefs / items / properties / ids / items / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "description": "String-form cross-reference ID (e.g. CAS number, patent).",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Numeric cross-reference ID (e.g. PubMed ID, Gene ID).",
        +    "type": "number"
        +  }
        +]
      • addedOutput schema / properties / xrefs / items / properties / ids / items / description
        Added value: +"Cross-reference identifier — string or number depending on type."
      • changedOutput schema / properties / xrefs / items / properties / type / description
        Previous value: -"Cross-reference type."New value: +"Cross-reference type: RegistryID, RN, PubMedID, PatentID, GeneID, ProteinGI, or TaxonomyID."
    • Changedpubchem_get_summary8 fields changed
      • changedInput schema / properties / identifiers / items / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "description": "String identifier (e.g. UniProt accession).",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Numeric identifier (e.g. AID, Gene ID, Tax ID).",
        +    "type": "number"
        +  }
        +]
      • addedInput schema / properties / identifiers / items / description
        Added value: +"Entity identifier — string or number depending on entityType."
      • addedOutput schema / properties / summaries / items / description
        Added value: +"Per-identifier summary result."
      • changedOutput schema / properties / summaries / items / properties / data / additionalProperties
        Previous value: -{}New value: +false
      • changedOutput schema / properties / summaries / items / properties / data / description
        Previous value: -"Entity summary data (shape varies by type)."New value: +"Entity summary data. Populated fields depend on entityType."
      • addedOutput schema / properties / summaries / items / properties / data / properties
        Added value: +{
        +  "aid": {
        +    "description": "Assay ID — present on assay summaries.",
        +    "type": "number"
        +  },
        +  "commonName": {
        +    "description": "Common name (taxonomy summaries).",
        +    "type": "string"
        +  },
        +  "description": {
        +    "description": "Descriptive text when available.",
        +    "type": "string"
        +  },
        +  "geneId": {
        +    "description": "NCBI Gene ID (gene summaries).",
        +    "type": "number"
        +  },
        +  "lineage": {
        +    "description": "Parent taxonomy lineage (taxonomy summaries).",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "name": {
        +    "description": "Primary display name.",
        +    "type": "string"
        +  },
        +  "numActive": {
        +    "description": "Substances marked active (assay summaries).",
        +    "type": "number"
        +  },
        +  "numSubstances": {
        +    "description": "Substances tested (assay summaries).",
        +    "type": "number"
        +  },
        +  "proteinAccession": {
        +    "description": "Protein accession (protein summaries).",
        +    "type": "string"
        +  },
        +  "rank": {
        +    "description": "Taxonomic rank (taxonomy summaries).",
        +    "type": "string"
        +  },
        +  "scientificName": {
        +    "description": "Scientific name (taxonomy summaries).",
        +    "type": "string"
        +  },
        +  "sourceName": {
        +    "description": "Data source attribution (assay summaries).",
        +    "type": "string"
        +  },
        +  "symbol": {
        +    "description": "Gene symbol (gene summaries).",
        +    "type": "string"
        +  },
        +  "synonyms": {
        +    "description": "Known synonyms / other names.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "taxonomy": {
        +    "description": "Taxonomy scientific name (gene/protein summaries).",
        +    "type": "string"
        +  },
        +  "taxonomyId": {
        +    "description": "NCBI Taxonomy ID (gene/protein/taxonomy summaries).",
        +    "type": "number"
        +  }
        +}
      • removedOutput schema / properties / summaries / items / properties / data / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / properties / summaries / items / properties / identifier / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "description": "String identifier (e.g. UniProt accession).",
        +    "type": "string"
        +  },
        +  {
        +    "description": "Numeric identifier (e.g. AID, Gene ID, Tax ID).",
        +    "type": "number"
        +  }
        +]
    • Changedpubchem_search_assays4 fields changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Recovery guidance when no assays matched — echoes the target and suggests alternative search types. Absent when assays were returned.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / targetType / description
        Previous value: -"Target identifier type used."New value: +"Target identifier type used: genesymbol, proteinname, geneid, or proteinaccession."
      • changedOutput schema / properties / totalFound / description
        Previous value: -"Total AIDs found."New value: +"Total AIDs found before the maxResults cap."
      • changedOutput schema / required
        Previous value: -[
        -  "targetType",
        -  "targetQuery",
        -  "totalFound",
        -  "aids"
        -]New value: +[
        +  "aids",
        +  "targetType",
        +  "targetQuery",
        +  "totalFound"
        +]
    • Changedpubchem_search_compounds9 fields changed
      • changedInput schema / properties / identifiers / description
        Previous value: -"Required for identifier search. Array of identifiers to resolve (1-25). Examples: [\"aspirin\", \"ibuprofen\"] for name, [\"CC(=O)OC1=CC=CC=C1C(=O)O\"] for SMILES."New value: +"Required for identifier search. Array of identifiers to resolve (1-25). Examples: [\"aspirin\", \"ibuprofen\"] for name, [\"CC(=O)OC1=CC=CC=C1C(=O)O\"] for SMILES, [\"BSYNRYMUTXBXSQ-UHFFFAOYSA-N\"] for inchikey (27-char block format)."
      • changedInput schema / properties / query / description
        Previous value: -"Required for substructure/superstructure/similarity searches. A SMILES string or PubChem CID (as string) for the query structure."New value: +"Required for substructure/superstructure/similarity searches. A SMILES string (e.g. \"CC(=O)O\") or PubChem CID as a string (e.g. \"2244\")."
      • changedInput schema / properties / searchType / description
        Previous value: -"Search strategy: \"identifier\" (name/SMILES/InChIKey lookup), \"formula\", \"substructure\", \"superstructure\", or \"similarity\"."New value: +"Search strategy. \"identifier\": name/SMILES/InChIKey lookup. \"formula\": molecular formula. \"substructure\": find compounds containing the query as a substructure. \"superstructure\": find compounds that are themselves substructures of the query. \"similarity\": 2D Tanimoto similarity to the query."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Recovery guidance when no compounds matched — echoes search strategy and suggests how to broaden. Absent when results were returned.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / results / items / description
        Added value: +"Matching compound entry."
      • changedOutput schema / properties / results / items / properties / properties / description
        Previous value: -"Compound properties when requested."New value: +"Compound properties keyed by name (echoes input.properties; only present when requested)."
      • changedOutput schema / properties / searchType / description
        Previous value: -"The search strategy used."New value: +"Search strategy used: identifier, formula, substructure, superstructure, or similarity."
      • changedOutput schema / properties / totalFound / description
        Previous value: -"Total CIDs found (before maxResults cap)."New value: +"Total CIDs found before the maxResults cap."
      • changedOutput schema / required
        Previous value: -[
        -  "searchType",
        -  "totalFound",
        -  "results"
        -]New value: +[
        +  "results",
        +  "searchType",
        +  "totalFound"
        +]
  7. 8 tool updatesv0.1.11
    • First observedpubchem_get_bioactivity
    • First observedpubchem_get_compound_details
    • First observedpubchem_get_compound_image
    • First observedpubchem_get_compound_safety
    • First observedpubchem_get_compound_xrefs
    • First observedpubchem_get_summary
    • First observedpubchem_search_assays
    • First observedpubchem_search_compounds

TDQS

A4.3/5.0

Scored across 10 tools

Disambiguation5/5

Each tool targets a distinct resource or operation: searching compounds, retrieving details, images, 3D structures, cross-references, safety data, bioactivity profiles, interactions, assay searches, and entity summaries. No meaningful overlap exists between tools like bioactivity (assay outcomes) and interactions (drug-drug/chemical-target interactions).

Naming Consistency5/5

All tools follow the 'pubchem_' prefix followed by a verb and a clear noun target (e.g., search_compounds, get_compound_details, get_compound_image, search_assays). The pattern is uniform, uses snake_case consistently, and the verbs (search/get) are applied predictably.

Tool Count5/5

With 10 tools, the server is well-scoped: each tool covers a specific aspect of PubChem data access without redundancy, staying comfortably within the ideal 3-15 range. The count matches the breadth of chemical and biological query needs.

Completeness5/5

The tool surface provides comprehensive coverage for a chemistry database: search by multiple identifiers, detailed properties, 2D/3D structures, cross-references, safety data, bioactivity, interactions, and assay/search summaries. All core read-only workflows are covered, and no obvious dead ends exist (e.g., search results can be fed into detail retrieval).

Maintenance

ActivityMaintained
ResponsivenessWithin a week

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables comprehensive access to PubChem's chemical database with over 110 million compounds. Supports chemical searches, structure analysis, bioactivity data, safety information, and molecular property calculations through 30 specialized tools.
    30
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Enables users to retrieve chemical safety information including compound properties, GHS safety classifications, and toxicity data from PubChem database using compound names or CIDs. Supports batch queries with caching for efficient chemical safety research and analysis.
    3
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to search and retrieve chemical compound information, structures, and physical properties from the PubChem database. It supports querying via compound names, SMILES notation, or CIDs to provide detailed molecular data for chemical analysis.
    5
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cyanheads/pubchem-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server