pubchem-mcp-server
This server provides MCP tools and resources for searching and retrieving chemical, safety, bioactivity, and biological-assay data from PubChem.
Search compounds by name, SMILES, InChIKey, molecular formula, substructure/superstructure, or 2D similarity, with paging and optional property hydration
Get compound details including physicochemical properties, descriptions, synonyms, drug-likeness (Lipinski/Veber), and pharmacological classification (FDA, MeSH, ATC)
Fetch 2D structure images as PNG in small or large sizes
Get 3D conformer structures as parsed JSON atoms/bonds or raw V2000 SDF
Retrieve cross-references to PubMed, patents, genes, proteins, CAS registry numbers, and taxonomy IDs
Get GHS safety data — signal words, pictograms, H-codes, and P-codes — with per-compound status
Query bioactivity profiles — assay outcomes, targets, and activity values — filterable by outcome or molecular target
Get drug-drug, drug-food, and chemical-target interactions with source attribution
Search bioassays by gene symbol, protein name, Gene ID, or UniProt accession
Get entity summaries for assays, genes, proteins, and taxonomy entries
Expose resources for compound properties, safety, images, cross-references, bioactivity, and assay summaries via URI templates
Provides access to PubChem's chemical information database, enabling searches for chemical compounds by identifier, structure, similarity, and molecular formula. Retrieves compound properties, structural images, substance details, bioassay summaries, and cross-references to external databases including PubMed.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@pubchem-mcp-serversearch for aspirin and get its molecular weight"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Public Hosted Server: https://pubchem.caseyjhand.com/mcp
Overview
Chemical compound and bioassay data from PubChem's PUG REST and PUG View APIs. Search compounds by identifier, formula, or structure; fetch physicochemical properties, safety data, bioactivity, interactions, cross-references, and 3D structures; find bioassays by biological target. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
Tools
Tool | Description |
| Search for compounds by name, SMILES, InChIKey, formula, substructure, superstructure, or 2D similarity. |
| Get physicochemical properties, descriptions, synonyms, drug-likeness, and classification for compounds by CID. |
| Fetch a 2D structure diagram (PNG) for a compound by CID. |
| Fetch a 3D conformer (atomic coordinates and bonds) for a compound by CID, as parsed JSON or raw SDF. |
| Get external database cross-references (PubMed, patents, genes, proteins, etc.). |
| Get GHS hazard classification and safety data for one or more compounds by CID (batch). |
| Get a compound's bioactivity profile: assay results, targets, and activity values; filter by outcome or molecular target. |
| Get drug-drug, drug-food, and chemical-target interactions for a compound by CID. |
| Find bioassays by biological target (gene symbol, protein, Gene ID, UniProt accession). |
| Get summaries for PubChem entities: assays, genes, proteins, taxonomy. |
Resources
Compound and assay records are also exposed as URI-templated resources, backed by the same client methods as the tools; many MCP clients are tool-only and never surface resources.
Resource | Description |
| Core physicochemical properties (JSON). |
| GHS hazard classification (JSON). |
| 2D structure diagram (PNG). |
| External cross-references (JSON). |
| Bioassay activity profile (JSON). |
| BioAssay summary (JSON). |
Related MCP server: PubChem Chemical Safety MCP Server
Capability reference
pubchem_search_compounds tool
Five search strategies: identifier (name/SMILES/InChIKey, batched 1-25), formula (Hill notation, optional
allowOtherElements), substructure/superstructure containment, or 2D Tanimoto similarity (threshold 70-100, default 90)Caps at 200 CIDs per page (default 20);
offsetpages to a ceiling of 10,000 — identifier lookups resolve every match up front so paging is free, while formula/structure/similarity searches cost more upstream per deep pageOptional
propertieshydration avoids a follow-uppubchem_get_compound_detailscallIdentifier mode reports
unresolvedIdentifiersfor inputs that resolved to no CID, plus notices when multiple inputs collide on one CIDReports an exact
totalFoundwhen the full match set was observed, or atotalFoundAtLeastfloor when a bounded upstream search saturated
pubchem_get_compound_details tool
Up to 100 CIDs per call; 27 available properties, defaulting to a core set of 14 (formula, weight, IUPAC name, SMILES forms, InChIKey, XLogP, TPSA, H-bond/rotatable-bond counts, heavy atom count, charge, complexity)
Optional textual descriptions, paged via
descriptionOffset/maxDescriptions(default 3, up to 20) — fetched only for the first 10 CIDs in the batch, remaining CIDs listed inskippedCidsOptional synonyms for every found CID, paged via
synonymOffset/maxSynonyms(default 20, up to 100)Optional drug-likeness assessment (Lipinski Rule of Five + Veber rules), computed from the returned properties at no extra latency
Optional pharmacological classification (FDA classes/mechanisms, MeSH classes, ATC codes) — same 10-CID fan-out cap as descriptions
Per-CID
found: falsedistinguishes a nonexistent CID from a real compound PubChem simply has no data for
pubchem_get_compound_image tool
Single CID;
sizeis"small"(100x100) or"large"(300x300, default)Returns base64-encoded PNG plus width/height
Typed
cid_not_founderror when PubChem has no record for the CID
pubchem_get_compound_3d_structure tool
Single CID;
format="json"(default) returns parsed atoms (element + x/y/z) and bonds,format="sdf"returns the raw V2000 SDF textmaxAtoms/maxBondscap the JSON preview (default 200 each);atomCount/bondCountalways report the full totals, with any capping disclosed via enrichmentincludeRawSdfbypasses the default 500-line cap on the raw SDF textOptional
includeAlternateConformerIdslists conformer IDs beyond the defaultTyped
no_3d_structureerror when PubChem has no computed 3D coordinates (large molecules, mixtures, some salts)
pubchem_get_compound_xrefs tool
Single CID; one or more
xrefTypes— string IDs (RegistryID,RNfor CAS numbers,PatentID) and numeric IDs (PubMedID,GeneID,ProteinGI,TaxonomyID)Paged per type:
maxPerTypeup to 500 (default 50), with the sameoffsetapplied across every requested typeEach type reports its own
totalAvailableandtruncatedflagEmpty-result notice distinguishes "this compound has none of the requested types" from a possibly-mistyped CID
pubchem_get_compound_safety tool
Batch of 1-25 CIDs
Returns GHS signal word, pictograms, hazard statements (H-codes), and precautionary statements (P-codes), with source attribution
Per-CID
status:ok,no_ghs_data(compound exists, no deposited classification), orcid_not_found(no PubChem record at all) — kept distinct so a bad CID never reads as "no hazards on file"Precautionary statements carry a
decodedflag — false for codes needing label-specific fill text or outside the decoder table; the code itself is still authoritative
pubchem_get_bioactivity tool
Single CID; filter by
outcomeFilter(active/inactive/all, defaultall) and/ortargetGeneId/targetAccessionCaps at 100 results per page (default 20);
offsetreaches the restReports
totalAssays/activeCount/inactiveCountfor the whole compound, plusfilteredCount/returnedCountfor the current pageNotices distinguish "no bioactivity data at all" from "the filter excluded everything" from "offset past the end"
pubchem_get_compound_interactions tool
Single CID; one or more
kinds—drug-drug(DrugBank),drug-food,target(binding/activity from BindingDB, ChEMBL, and others); default["drug-drug"]maxEntriesper kind per page (1-50, default 10);offsetcounts source records rather than returned entries, capped at 2,147,483,646Each kind pages independently —
paging[]reports per-kindtotalRecords/nextOffset/truncated; the top-levelnextOffsetis populated only when exactly one requested kind still has records leftA kind that fails to retrieve is named in
failedKindswithout failing the kinds that succeeded
pubchem_search_assays tool
Search by
targetType:genesymbol/proteinname(text),geneid(NCBI Gene ID),proteinaccession(UniProt)Caps at 200 AIDs per page (default 50);
offsetpages to the total foundRejects a blank
targetQueryand a non-numericgeneidquery before the upstream callReports
totalFoundacross all pages and distinguishes "no match" from "offset past the end"
pubchem_get_summary tool
entityType:assay(AID),gene(NCBI Gene ID),protein(UniProt accession), ortaxonomy(Tax ID); up to 10 identifiers per callPer-identifier
foundflag; populated fields depend onentityType(taxonomy includes an orderedlineage, gene includessymbol/taxonomy)Notice reports how many identifiers were not found and which ID type
entityTypeexpects
pubchem://compound/{cid} resource
Core physicochemical properties (the same default 14-property set as
pubchem_get_compound_details), asapplication/jsonThrows a typed not-found when the CID doesn't exist in PubChem
Use
pubchem_get_compound_detailsto select specific properties or add descriptions, synonyms, drug-likeness, and classification
pubchem://compound/{cid}/safety resource
GHS hazard classification as
application/jsonstatus(ok/no_ghs_data/cid_not_found) is the only signal distinguishing a bad CID from a compound with no deposited classification — a resource read has no notice surface
pubchem://compound/{cid}/image resource
2D structure diagram, 300x300 PNG, returned as a base64 blob
Use
pubchem_get_compound_imagefor the 100x100 size option
pubchem://compound/{cid}/xrefs resource
Focused default set —
RN(CAS),RegistryID,PubMedID— up to 25 IDs per type, asapplication/jsonUse
pubchem_get_compound_xrefsfor the full set of xref types, a higher per-type cap, and offset paging
pubchem://compound/{cid}/bioactivity resource
Up to 25 assays as
application/json, plustotalAssays/activeCountfor the whole compoundUse
pubchem_get_bioactivityto filter by outcome or target, raise the cap, or page with offset
pubchem://assay/{aid} resource
BioAssay summary as
application/json— name, description, source, protocol, substance countsThrows a typed not-found when the AID doesn't exist
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
PubChem-specific:
Covers both PUG REST (search, properties, cross-references, safety, bioactivity, interactions) and PUG View (textual descriptions, pharmacological classification) endpoints
Rate-limited client (5 req/s) with automatic request queuing, and retry with exponential backoff on 5xx errors and network failures
Hand-rolled V2000 SDF parser for 3D conformer atoms and bonds; drug-likeness (Lipinski/Veber) computed from already-fetched properties, adding no extra latency
All tools are read-only and idempotent — no API keys required, PubChem's API is freely accessible
Agent-friendly output:
Discriminated output contracts — per-CID
status(ok/no_ghs_data/cid_not_found) andfoundflags let callers branch on data instead of matching an error stringGraceful partial failure — batch tools return per-item results alongside
unresolvedIdentifiers,skippedCids, andfailedKindsrather than failing the whole callResponse shaping — truncation disclosure (
truncated,shown/cap,nextOffset) on every capped list, plus atotalFoundAtLeastfloor in place of a count when an upstream search saturatesTyped error reasons — validation and not-found failures declare a
reason(e.g.cid_not_found,missing_identifier_args,invalid_cid_query) with actionable recovery text, not generic messages
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 the following to your MCP client configuration file.
{
"mcpServers": {
"pubchem-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/pubchem-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"pubchem-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/pubchem-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio"
}
}
}
}Or with Docker:
{
"mcpServers": {
"pubchem-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/pubchem-mcp-server:latest"]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.4.0 or higher (or Node.js v24+).
No API keys required — PubChem's API is freely accessible.
Installation
Clone the repository:
git clone https://github.com/cyanheads/pubchem-mcp-server.gitNavigate into the directory:
cd pubchem-mcp-serverInstall dependencies:
bun installConfigure environment (optional):
cp .env.example .env
# edit .env to override transport, session mode, storage, or logging defaultsConfiguration
Variable | Description | Default |
| Transport: |
|
| Port for HTTP server. |
|
| Host for HTTP server. |
|
|
|
|
| Auth mode: |
|
| Log level (RFC 5424). |
|
| Storage backend. |
|
| Enable OpenTelemetry. |
|
See .env.example for the full list of optional overrides.
Running the server
Local development
Build and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t pubchem-mcp-server .
docker run --rm -p 3010:3010 pubchem-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/pubchem-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
|
|
| Tool definitions ( |
| Resource definitions ( |
| PubChem API client — rate limiting, retry, and response/SDF parsing. |
| Build, clean, devcheck, and tree generation scripts. |
| Unit and integration tests. |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped loggingWrap external API calls: validate the raw PubChem response → normalize to a domain type → return the output schema; never fabricate missing fields
Register new tools and resources in the
index.tsbarrel files
Contributing
Issues are welcome. Run checks before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
Available Tools
10 toolspubchem_get_bioactivityGet BioactivityARead-onlyIdempotentInspect
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?".
| Name | Required | Description | Default |
|---|---|---|---|
| cid | Yes | PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds. | |
| offset | No | 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. | |
| maxResults | No | 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. | |
| targetGeneId | No | 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?". | |
| outcomeFilter | No | Filter by activity outcome. "active" shows only assays where the compound showed activity — most useful for understanding biological profile. Default: "all". | all |
| targetAccession | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The maxResults cap that was applied. |
| cid | No | PubChem Compound ID. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Assays returned on this page. |
| notice | No | Recovery guidance when the filter yields no results or the compound has no bioactivity data. |
| offset | No | Zero-based index of the first assay returned. |
| results | No | Assay results matching the filter. |
| truncated | No | True when matching assays remain past this page. |
| nextOffset | No | Offset to pass on the next call to continue past this page. Omitted when no further assays match. |
| activeCount | No | Assays with "Active" outcome. |
| totalAssays | No | Total unique assays for this compound. |
| targetFilter | No | Target filter applied (gene ID and/or protein accession), when set. |
| filteredCount | No | Exact number of assays matching the outcome and target filters, across all pages. |
| inactiveCount | No | Assays with "Inactive" outcome. |
| outcomeFilter | No | Outcome filter applied: active, inactive, or all. |
| returnedCount | No | Assays returned on this page. |
TDQS
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.
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.
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.
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.
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.
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 StructureARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| cid | Yes | PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds. | |
| format | No | Output format. "json" (default) returns parsed atoms and bonds. "sdf" returns the raw V2000 SDF text for passthrough to other tools. | json |
| maxAtoms | No | 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. | |
| maxBonds | No | 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. | |
| includeRawSdf | No | 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". | |
| includeAlternateConformerIds | No | List the IDs of additional computed conformers beyond the default. Slower than the default response. Default: false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cid | No | PubChem Compound ID. |
| sdf | No | Raw V2000 SDF text. Populated when format="sdf". |
| atoms | No | Parsed atoms. Populated when format="json". |
| bonds | No | Parsed bonds. Populated when format="json". |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance naming which lists were capped and how to widen them. |
| atomCap | No | The atom cap applied (explicit maxAtoms or the safe default), when the atom list was capped. |
| bondCap | No | The bond cap applied (explicit maxBonds or the safe default), when the bond list was capped. |
| atomCount | No | Number of atoms in the conformer. |
| bondCount | No | Number of bonds in the conformer. |
| truncated | No | True when the atom list, bond list, or raw SDF was capped below its total. atomCount/bondCount always report the full totals. |
| shownAtoms | No | Atoms returned after the cap, when fewer than atomCount. Raise maxAtoms for more. |
| shownBonds | No | Bonds returned after the cap, when fewer than bondCount. Raise maxBonds for more. |
| conformerId | No | Default (primary) conformer ID. Present when includeAlternateConformerIds is set. |
| shownSdfLines | No | SDF lines returned when format="sdf" and the raw text was line-capped. Set includeRawSdf for the full record. |
| alternateConformerIds | No | Conformer IDs beyond the default. Present when includeAlternateConformerIds is set and alternates exist. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, open-world, and idempotent behavior, so the bar for additional disclosure is lower. The description adds meaningful context beyond annotations: the format-dependent output differences (structured JSON vs raw SDF passthrough), the optional alternate conformer listing, and the critical caveat that not every compound has computed 3D coordinates. This is exactly the kind of behavioral nuance an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the core action is front-loaded, format details and use cases follow, and the availability caveat is placed last. Every sentence earns its place, and the length is proportionate to the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, idempotent retrieval tool with a rich schema and output schema, the description covers all essential context: what is returned, format differences, alternate conformer option, and the key failure mode (missing 3D coordinates). The schema handles maxAtoms/maxBonds and SDF line-cap details, while annotations cover safety. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter already has a detailed description covering format defaults, truncation behavior, and effect conditions. The main description repeats some of this (e.g., format options and alternate conformer IDs) but does not add meaning beyond the schema. Baseline 3 is appropriate since the schema carries the parameter-documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 a compound's default 3D conformer — atomic coordinates and bonds — for one CID." This clearly distinguishes it from sibling tools like pubchem_get_compound_details or pubchem_get_compound_image, which serve different data needs. No ambiguity remains about what this tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates this is for fetching 3D structure data for a single CID, and the schema's cid parameter directs users to pubchem_search_compounds for resolving names/SMILES. However, it does not explicitly state when not to use this tool or name alternative siblings for related but distinct data (e.g., details, interactions). The context is clear but exclusions are implied rather than stated.
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 DetailsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cids | Yes | PubChem Compound IDs to fetch (1-100). Resolve from names/SMILES with pubchem_search_compounds. | |
| properties | No | Properties to retrieve. Defaults to a core set: MolecularFormula, MolecularWeight, IUPACName, CanonicalSMILES, IsomericSMILES, InChIKey, XLogP, TPSA, HBondDonorCount, HBondAcceptorCount, RotatableBondCount, HeavyAtomCount, Charge, Complexity. | |
| maxSynonyms | No | 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. | |
| synonymOffset | No | 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. | |
| includeSynonyms | No | 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. | |
| maxDescriptions | No | 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. | |
| descriptionOffset | No | 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. | |
| includeDescription | No | 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. | |
| includeDrugLikeness | No | 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. | |
| includeClassification | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Recovery guidance covering the skipped CIDs, an offset that runs past every compound, and pages that remain. Absent when nothing was skipped or truncated. |
| compounds | No | Compound detail records. |
| truncated | No | 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. |
| skippedCids | No | 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. |
| enrichedCids | No | CIDs whose descriptions and classification were fetched. Present only when the batch exceeded the per-call fan-out limit and other CIDs were skipped. |
| synonymOffset | No | Zero-based index of the first synonym returned within each compound's list. Present when includeSynonyms is true. |
| descriptionOffset | No | Zero-based index of the first description returned within each compound's list. Present when includeDescription is true. |
| nextSynonymOffset | No | synonymOffset to pass on the next call to continue past this page. Omitted when no compound in the batch has further synonyms. |
| nextDescriptionOffset | No | descriptionOffset to pass on the next call to continue past this page. Omitted when no compound in the batch has further descriptions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds only the batch ceiling ('up to 100 CIDs per call'), which duplicates maxItems in the schema, and says nothing about the 10-CID cap on descriptions/classification, the skippedCids behavior, or synonym paging — all of which are disclosed only in parameter descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core verb and resource, followed by the payload enumeration. The long parenthetical lists are dense but each item earns its place by telling the agent what the optional flags yield.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers the batch limit and optional payload categories. It leaves pagination/flags to the schema, which is acceptable given full schema coverage, though the description alone would not warn an agent about the 10-CID cap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 all ten parameters thoroughly, including defaults, offsets, and pagination semantics. The description adds no parameter-level meaning beyond naming the optional payloads, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (compound details by CID) and enumerates the returned payload categories: physicochemical properties, textual descriptions, synonyms, drug-likeness, and pharmacological classification. This lets an agent distinguish it from siblings like pubchem_get_compound_safety, pubchem_get_compound_xrefs, and pubchem_get_compound_image without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says nothing about when to reach for this tool versus the other eight compound tools or pubchem_search_compounds; the only routing hint ('resolve with pubchem_search_compounds') lives in the cids schema field, not the description. An agent must infer the search-then-detail workflow from structured data rather than being told.
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 ImageARead-onlyIdempotentInspect
Fetch a 2D structure diagram (PNG image) for a compound by CID.
| Name | Required | Description | Default |
|---|---|---|---|
| cid | Yes | PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds. | |
| size | No | Image size: "small" (100x100) or "large" (300x300). Default: "large". | large |
Output Schema
| Name | Required | Description |
|---|---|---|
| cid | No | PubChem Compound ID. |
| error | No | Present when the call failed. Absent on success. |
| width | No | Image width in pixels. |
| height | No | Image height in pixels. |
| mimeType | No | MIME type — always "image/png". |
| imageBase64 | No | Base64-encoded PNG image data. |
TDQS
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 the PNG output format, which is useful, but it does not disclose other behavioral details such as response encoding or rate limits; with annotations present, this is acceptable but not outstanding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence contains the essential verb, resource, format, and key with no filler. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only image getter with 100% schema coverage, full annotations, and an output schema, the description is sufficient for selection and invocation. It loses one point only because explicit sibling differentiation is left to inference rather than stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters have meaningful descriptions, including the enum values and default for size. The description's 'by CID' adds no information beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource ('2D structure diagram'), format ('PNG image'), and key ('CID'), which clearly distinguishes it from sibling tools like the 3D structure or details tools. The title reinforces this without tautology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The '2D' qualifier implies this is the compound image tool and implicitly contrasts with get_compound_3d_structure, but it does not explicitly state when to prefer this tool over siblings or when not to use it. The schema's cid parameter does add a useful prerequisite by recommending pubchem_search_compounds for resolving a CID.
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 InteractionsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cid | Yes | PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds. | |
| kinds | No | Interaction kinds to fetch. "drug-drug" (interactions with other drugs), "drug-food" (dietary interactions), "target" (binding/activity against molecular targets). Default: ["drug-drug"]. | |
| offset | No | 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. | |
| maxEntries | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cid | No | PubChem Compound ID. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | 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. |
| offset | No | Zero-based start position read within each requested kind. |
| paging | No | 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. |
| entries | No | Interaction entries across the requested kinds. |
| truncated | No | 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. |
| nextOffset | No | 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. |
| failedKinds | No | Interaction kinds that could not be retrieved (comma-separated). The returned entries cover the kinds that succeeded; retry to re-attempt the failed ones. |
| returnedCount | No | Total interaction entries returned across all kinds. |
| requestedKinds | No | Interaction kinds requested (comma-separated). |
TDQS
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.
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.
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.
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.
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.
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 SafetyARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cids | Yes | PubChem Compound IDs to fetch safety data for (1-25). Resolve from names/SMILES with pubchem_search_compounds. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | 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. |
| results | No | Safety results, one per requested CID (input order preserved). |
| withDataCount | No | CIDs with GHS safety data available. |
| requestedCount | No | CIDs requested. |
TDQS
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.
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.
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.
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.
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.
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-ReferencesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cid | Yes | PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds. | |
| offset | No | 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. | |
| xrefTypes | Yes | 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. | |
| maxPerType | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cid | No | PubChem Compound ID. |
| error | No | Present when the call failed. Absent on success. |
| xrefs | No | Cross-references grouped by type. |
| notice | No | 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. |
| offset | No | Zero-based index of the first ID returned within each type. |
| truncated | No | 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. |
| nextOffset | No | Offset to pass on the next call to continue past this page. Omitted when no requested type has further IDs. |
TDQS
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.
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.
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.
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.
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.
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 SummaryARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entityType | Yes | Entity type. Determines ID format and returned fields. | |
| identifiers | Yes | Entity 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
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Recovery guidance when one or more identifiers were not found. |
| summaries | No | Summary results. |
| entityType | No | Entity type queried. |
| foundCount | No | Identifiers resolved to a summary. |
| requestedCount | No | Identifiers requested. |
TDQS
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.
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.
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.
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.
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.
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 AssaysARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Zero-based index of the first AID to return. Pass the nextOffset from a previous call to read the following page. Default: 0. | |
| maxResults | No | 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. | |
| targetType | Yes | Target identifier type. "genesymbol" and "proteinname" accept text names. "geneid" accepts NCBI Gene IDs. "proteinaccession" accepts UniProt accessions. | |
| targetQuery | Yes | Target identifier. Examples: "EGFR" (genesymbol), "Epidermal growth factor receptor" (proteinname), "1956" (geneid), "P00533" (proteinaccession). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The maxResults cap that was applied. |
| aids | No | PubChem Assay IDs. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | AIDs returned on this page. |
| notice | No | 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. |
| offset | No | Zero-based index of the first AID returned. |
| truncated | No | True when matching AIDs remain past this page. |
| nextOffset | No | Offset to pass on the next call to continue past this page. Omitted when no further AIDs match. |
| targetType | No | Target identifier type used: genesymbol, proteinname, geneid, or proteinaccession. |
| totalFound | No | Total AIDs found for this target, across all pages. |
| targetQuery | No | Target identifier searched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, covering safety and idempotency. The description adds value by disclosing the paginated return ('page of assay IDs'), how to page with offset, and the maxResults limit, which are behavioral details not present in the annotations. No contradictions exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no redundancy. The purpose is front-loaded, the identifier types are listed, and the pagination/next-step info is concise. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, the input identifier types, the output (AIDs), pagination behavior, and the natural next step. An output schema exists, so detailed return fields are not needed. No critical gap remains for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 all four parameters with examples and ranges. The description reinforces the accepted target types but does not add substantive meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Find'), a clear resource ('PubChem bioassays'), and the criteria ('associated with a biological target'), distinguishing it from sibling compound search tools. It also lists the accepted identifier types, making the tool's scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives workflow context by noting returned AIDs 'can be explored further with pubchem_get_summary', implicitly indicating when to use this tool versus that one. However, it does not explicitly contrast it with sibling search tools like pubchem_search_compounds, so it falls just short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pubchem_search_compoundsSearch CompoundsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Required for substructure/superstructure/similarity searches. A SMILES string (e.g. "CC(=O)O") or PubChem CID as a string (e.g. "2244"). | |
| offset | No | 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. | |
| formula | No | Required for formula search. Molecular formula in Hill notation (e.g. "C6H12O6", "CaH2O2"). | |
| queryType | No | Required for structure/similarity searches. Format of the query: "smiles" or "cid". | |
| threshold | No | Similarity search only. Minimum Tanimoto similarity (70-100). 90+ for close analogs, 70-80 for scaffold hops. Default: 90. | |
| maxResults | No | Maximum CIDs to return per page (1-200). Use offset to reach matches past this page. Default: 20. | |
| properties | No | Optional: fetch these properties for each result, avoiding a follow-up details call. E.g. ["MolecularFormula", "MolecularWeight", "CanonicalSMILES"]. | |
| searchType | Yes | 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. | |
| identifiers | No | 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). | |
| identifierType | No | Required for identifier search. Type of chemical identifier: "name", "smiles", or "inchikey". | |
| allowOtherElements | No | Formula search only. When true, includes compounds with additional elements beyond the formula. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The maxResults cap that was applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | CIDs returned on this page. |
| notice | No | 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. |
| offset | No | Zero-based index of the first CID returned. |
| results | No | Matching compounds. |
| truncated | No | True when matching CIDs remain past this page. |
| nextOffset | No | Offset to pass on the next call to continue past this page. Omitted when no further matches remain. |
| searchType | No | Search strategy used: identifier, formula, substructure, superstructure, or similarity. |
| totalFound | No | 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. |
| totalFoundAtLeast | No | 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. |
| unresolvedIdentifiers | No | Identifier-mode only: input identifiers that resolved to no CID. Omitted when every identifier resolved and for non-identifier searches. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and idempotent, and the description adds meaningful behavioral details: batching up to 25 identifiers, pagination semantics with maxResults/offset, and optional property hydration to avoid follow-up calls. It doesn't fully cover rate limits or upstream cost details, but the provided context is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences cover the tool's purpose, pagination behavior, search modes, batching, and hydration benefit without redundancy. Key information is front-loaded, and every sentence adds operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 11 parameters, the description covers the high-level search strategies, pagination, batching, and how to avoid a follow-up call. The output schema and annotations cover the remaining details, so an agent has enough context 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.
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 value by summarizing the five searchType modes, the identifier batch limit of 25, the meaning of Tanimoto similarity threshold range, and the purpose of property hydration. This goes beyond merely restating schema fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches PubChem for compounds by multiple strategies (identifier, formula, substructure, superstructure, similarity) and returns a page of CIDs. It uses specific verbs and resources and the sibling list shows it is distinct from compound detail, image, and bioactivity tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys when to use it and how to page through results with offset, and explicitly mentions that hydrating with properties avoids a follow-up pubchem_get_compound_details call. It does not explicitly say when not to use it versus sibling search tools like pubchem_search_assays, but the search scope is clear from the resource name and description.
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.
4 tool updates
v0.6.3- Changed
pubchem_get_compound_3d_structure1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"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."New value: +"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."
- Changed
pubchem_get_compound_image1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"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."New value: +"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."
- Changed
pubchem_search_assays1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"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."New value: +"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."
- Changed
pubchem_search_compounds1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"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."New value: +"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."
1 tool update
v0.6.2- Changed
pubchem_get_compound_details26 fields changed- removed
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / hba / properties / pass / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / hba / properties / pass / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / hba / properties / value / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / hba / properties / value / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / hbd / properties / pass / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / hbd / properties / pass / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / hbd / properties / value / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / hbd / properties / value / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / mw / properties / pass / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / mw / properties / pass / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / mw / properties / value / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / mw / properties / value / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / xLogP / properties / pass / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / xLogP / properties / pass / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / xLogP / properties / value / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / xLogP / properties / value / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / compounds / items / properties / drugLikeness / properties / pass / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Output schema / properties / compounds / items / properties / drugLikeness / properties / pass / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / compounds / items / properties / drugLikeness / properties / veber / properties / rotatableBonds / properties / pass / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Output schema / properties / compounds / items / properties / drugLikeness / properties / veber / properties / rotatableBonds / properties / pass / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / compounds / items / properties / drugLikeness / properties / veber / properties / rotatableBonds / properties / value / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / compounds / items / properties / drugLikeness / properties / veber / properties / rotatableBonds / properties / value / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / compounds / items / properties / drugLikeness / properties / veber / properties / tpsa / properties / pass / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Output schema / properties / compounds / items / properties / drugLikeness / properties / veber / properties / tpsa / properties / pass / typeAdded value: +[ + "boolean", + "null" +] - removed
Output schema / properties / compounds / items / properties / drugLikeness / properties / veber / properties / tpsa / properties / value / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / compounds / items / properties / drugLikeness / properties / veber / properties / tpsa / properties / value / typeAdded value: +[ + "number", + "null" +]
10 tool updates
v0.6.1- Changed
pubchem_get_bioactivity6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "cid", + "totalAssays", + "activeCount", + "inactiveCount", + "results", + "outcomeFilter", + "filteredCount", + "returnedCount", + "offset" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "cid", - "totalAssays", - "activeCount", - "inactiveCount", - "results", - "outcomeFilter", - "filteredCount", - "returnedCount", - "offset" -]
- Changed
pubchem_get_compound_3d_structure6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "cid", + "atomCount", + "bondCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "cid", - "atomCount", - "bondCount" -]
- Changed
pubchem_get_compound_details7 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "compounds", + "truncated" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - added
Output schema / properties / truncatedAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "compounds" -]
- Changed
pubchem_get_compound_image6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "cid", + "imageBase64", + "mimeType", + "width", + "height" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "cid", - "imageBase64", - "mimeType", - "width", - "height" -]
- Changed
pubchem_get_compound_interactions7 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "cid", + "entries", + "paging", + "requestedKinds", + "returnedCount", + "truncated", + "offset" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - added
Output schema / properties / truncatedAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "cid", - "entries", - "paging", - "requestedKinds", - "returnedCount", - "offset" -]
- Changed
pubchem_get_compound_safety6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results", + "requestedCount", + "withDataCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "results", - "requestedCount", - "withDataCount" -]
- Changed
pubchem_get_compound_xrefs7 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "cid", + "xrefs", + "offset", + "truncated" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - added
Output schema / properties / truncatedAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "cid", - "xrefs", - "offset" -]
- Changed
pubchem_get_summary6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "entityType", + "summaries", + "requestedCount", + "foundCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "entityType", - "summaries", - "requestedCount", - "foundCount" -]
- Changed
pubchem_search_assays6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "aids", + "targetType", + "targetQuery", + "totalFound", + "offset" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "aids", - "targetType", - "targetQuery", - "totalFound", - "offset" -]
- Changed
pubchem_search_compounds6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results", + "searchType", + "offset" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "results", - "searchType", - "offset" -]
9 tool updates
v0.6.0- Changed
pubchem_get_bioactivity10 fields changed- changed
Input schema / properties / maxResults / descriptionPrevious 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." - changed
Input schema / properties / maxResults / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / offsetAdded 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" +} - changed
Output schema / properties / filteredCount / descriptionPrevious 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." - added
Output schema / properties / nextOffsetAdded value: +{ + "description": "Offset to pass on the next call to continue past this page. Omitted when no further assays match.", + "type": "number" +} - added
Output schema / properties / offsetAdded value: +{ + "description": "Zero-based index of the first assay returned.", + "type": "number" +} - changed
Output schema / properties / returnedCount / descriptionPrevious value: -"Assays returned after the maxResults cap."New value: +"Assays returned on this page." - changed
Output schema / properties / shown / descriptionPrevious value: -"Assays returned after the maxResults cap."New value: +"Assays returned on this page." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when results were capped at maxResults — more matching assays exist."New value: +"True when matching assays remain past this page." - changed
Output schema / requiredPrevious value: -[ - "cid", - "totalAssays", - "activeCount", - "inactiveCount", - "results", - "outcomeFilter", - "filteredCount", - "returnedCount" -]New value: +[ + "cid", + "totalAssays", + "activeCount", + "inactiveCount", + "results", + "outcomeFilter", + "filteredCount", + "returnedCount", + "offset" +]
- Changed
pubchem_get_compound_3d_structure1 field changed- changed
Input schema / properties / includeAlternateConformerIds / descriptionPrevious 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."
- Changed
pubchem_get_compound_details20 fields changed- changed
Input schema / properties / cids / descriptionPrevious 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." - added
Input schema / properties / descriptionOffsetAdded 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" +} - changed
Input schema / properties / includeClassification / descriptionPrevious 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." - changed
Input schema / properties / includeDescription / descriptionPrevious 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." - changed
Input schema / properties / includeDrugLikeness / descriptionPrevious 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." - changed
Input schema / properties / includeSynonyms / descriptionPrevious 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." - changed
Input schema / properties / maxDescriptions / descriptionPrevious 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." - changed
Input schema / properties / maxSynonyms / descriptionPrevious 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." - added
Input schema / properties / synonymOffsetAdded 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" +} - changed
Output schema / properties / compounds / items / properties / descriptions / descriptionPrevious 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." - changed
Output schema / properties / compounds / items / properties / descriptionsTotal / descriptionPrevious 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." - changed
Output schema / properties / compounds / items / properties / synonyms / descriptionPrevious value: -"Known names and synonyms."New value: +"Known names and synonyms on this page, windowed by synonymOffset/maxSynonyms. Empty when synonymOffset runs past synonymsTotal." - changed
Output schema / properties / compounds / items / properties / synonymsTotal / descriptionPrevious 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." - added
Output schema / properties / descriptionOffsetAdded value: +{ + "description": "Zero-based index of the first description returned within each compound's list. Present when includeDescription is true.", + "type": "number" +} - added
Output schema / properties / enrichedCidsAdded 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" +} - added
Output schema / properties / nextDescriptionOffsetAdded 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" +} - added
Output schema / properties / nextSynonymOffsetAdded 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" +} - added
Output schema / properties / noticeAdded 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" +} - added
Output schema / properties / skippedCidsAdded 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" +} - added
Output schema / properties / synonymOffsetAdded value: +{ + "description": "Zero-based index of the first synonym returned within each compound's list. Present when includeSynonyms is true.", + "type": "number" +}
- Changed
pubchem_get_compound_interactions8 fields changed- changed
Input schema / properties / maxEntries / descriptionPrevious 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." - added
Input schema / properties / offsetAdded 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" +} - removed
Output schema / properties / entries / items / properties / severityRemoved 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" -} - added
Output schema / properties / nextOffsetAdded 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" +} - changed
Output schema / properties / notice / descriptionPrevious 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." - added
Output schema / properties / offsetAdded value: +{ + "description": "Zero-based start position read within each requested kind.", + "type": "number" +} - added
Output schema / properties / pagingAdded 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" +} - changed
Output schema / requiredPrevious value: -[ - "cid", - "entries", - "requestedKinds", - "returnedCount" -]New value: +[ + "cid", + "entries", + "paging", + "requestedKinds", + "returnedCount", + "offset" +]
- Changed
pubchem_get_compound_safety6 fields changed- changed
Output schema / properties / notice / descriptionPrevious 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." - added
Output schema / properties / results / items / properties / ghs / properties / precautionaryStatements / items / properties / decodedAdded 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" +} - changed
Output schema / properties / results / items / properties / ghs / properties / precautionaryStatements / items / properties / statement / descriptionPrevious 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." - changed
Output schema / properties / results / items / properties / ghs / properties / precautionaryStatements / items / requiredPrevious value: -[ - "code", - "statement" -]New value: +[ + "code", + "statement", + "decoded" +] - added
Output schema / properties / results / items / properties / statusAdded 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" +} - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "cid", - "hasData" -]New value: +[ + "cid", + "hasData", + "status" +]
- Changed
pubchem_get_compound_xrefs10 fields changed- changed
Input schema / properties / maxPerType / descriptionPrevious 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." - changed
Input schema / properties / maxPerType / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / offsetAdded 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" +} - added
Output schema / properties / nextOffsetAdded value: +{ + "description": "Offset to pass on the next call to continue past this page. Omitted when no requested type has further IDs.", + "type": "number" +} - changed
Output schema / properties / notice / descriptionPrevious 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." - added
Output schema / properties / offsetAdded value: +{ + "description": "Zero-based index of the first ID returned within each type.", + "type": "number" +} - changed
Output schema / properties / xrefs / items / properties / ids / descriptionPrevious value: -"Cross-reference IDs (capped by maxPerType)."New value: +"Cross-reference IDs on this page (window of offset + maxPerType)." - changed
Output schema / properties / xrefs / items / properties / totalAvailable / descriptionPrevious value: -"Total IDs available before truncation."New value: +"Total IDs available for this type, across all pages." - changed
Output schema / properties / xrefs / items / properties / truncated / descriptionPrevious value: -"Whether results were truncated."New value: +"True when IDs for this type remain past the current page." - changed
Output schema / requiredPrevious value: -[ - "cid", - "xrefs" -]New value: +[ + "cid", + "xrefs", + "offset" +]
- Changed
pubchem_get_summary1 field changed- changed
Output schema / properties / summaries / items / properties / data / properties / lineage / descriptionPrevious 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."
- Changed
pubchem_search_assays10 fields changed- changed
Input schema / properties / maxResults / descriptionPrevious 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." - changed
Input schema / properties / maxResults / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / offsetAdded 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" +} - added
Output schema / properties / nextOffsetAdded value: +{ + "description": "Offset to pass on the next call to continue past this page. Omitted when no further AIDs match.", + "type": "number" +} - changed
Output schema / properties / notice / descriptionPrevious 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." - added
Output schema / properties / offsetAdded value: +{ + "description": "Zero-based index of the first AID returned.", + "type": "number" +} - changed
Output schema / properties / shown / descriptionPrevious value: -"AIDs returned after the maxResults cap."New value: +"AIDs returned on this page." - changed
Output schema / properties / totalFound / descriptionPrevious value: -"Total AIDs found before the maxResults cap."New value: +"Total AIDs found for this target, across all pages." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when AIDs were capped at maxResults — more assays exist than returned."New value: +"True when matching AIDs remain past this page." - changed
Output schema / requiredPrevious value: -[ - "aids", - "targetType", - "targetQuery", - "totalFound" -]New value: +[ + "aids", + "targetType", + "targetQuery", + "totalFound", + "offset" +]
- Changed
pubchem_search_compounds11 fields changed- changed
Input schema / properties / maxResults / descriptionPrevious 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." - changed
Input schema / properties / maxResults / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / offsetAdded 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" +} - added
Output schema / properties / nextOffsetAdded value: +{ + "description": "Offset to pass on the next call to continue past this page. Omitted when no further matches remain.", + "type": "number" +} - changed
Output schema / properties / notice / descriptionPrevious 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." - added
Output schema / properties / offsetAdded value: +{ + "description": "Zero-based index of the first CID returned.", + "type": "number" +} - changed
Output schema / properties / shown / descriptionPrevious value: -"CIDs returned after the maxResults cap."New value: +"CIDs returned on this page." - changed
Output schema / properties / totalFound / descriptionPrevious 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." - added
Output schema / properties / totalFoundAtLeastAdded 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" +} - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when CIDs were capped at maxResults — more matches exist than returned."New value: +"True when matching CIDs remain past this page." - changed
Output schema / requiredPrevious value: -[ - "results", - "searchType", - "totalFound" -]New value: +[ + "results", + "searchType", + "offset" +]
4 tool updates
v0.2.5- Changed
pubchem_get_compound_3d_structure10 fields changed- added
Input schema / properties / includeRawSdfAdded 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" +} - added
Input schema / properties / maxAtomsAdded 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" +} - added
Input schema / properties / maxBondsAdded 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" +} - added
Output schema / properties / atomCapAdded value: +{ + "description": "The atom cap applied (explicit maxAtoms or the safe default), when the atom list was capped.", + "type": "number" +} - added
Output schema / properties / bondCapAdded value: +{ + "description": "The bond cap applied (explicit maxBonds or the safe default), when the bond list was capped.", + "type": "number" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance naming which lists were capped and how to widen them.", + "type": "string" +} - added
Output schema / properties / shownAtomsAdded value: +{ + "description": "Atoms returned after the cap, when fewer than atomCount. Raise maxAtoms for more.", + "type": "number" +} - added
Output schema / properties / shownBondsAdded value: +{ + "description": "Bonds returned after the cap, when fewer than bondCount. Raise maxBonds for more.", + "type": "number" +} - added
Output schema / properties / shownSdfLinesAdded value: +{ + "description": "SDF lines returned when format=\"sdf\" and the raw text was line-capped. Set includeRawSdf for the full record.", + "type": "number" +} - added
Output schema / properties / truncatedAdded 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" +}
- Changed
pubchem_get_compound_details2 fields changed- added
Input schema / properties / maxSynonymsAdded 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" +} - added
Output schema / properties / compounds / items / properties / synonymsTotalAdded value: +{ + "description": "Total synonyms available before truncation. Larger than synonyms.length when more exist — increase maxSynonyms to see them.", + "type": "number" +}
- Changed
pubchem_get_compound_xrefs1 field changed- added
Output schema / properties / noticeAdded 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" +}
- Changed
pubchem_search_compounds1 field changed- added
Output schema / properties / unresolvedIdentifiersAdded 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" +}
3 tool updates
v0.2.4- Changed
pubchem_get_bioactivity3 fields changed- added
Output schema / properties / capAdded value: +{ + "description": "The maxResults cap that was applied.", + "type": "number" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Assays returned after the maxResults cap.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when results were capped at maxResults — more matching assays exist.", + "type": "boolean" +}
- Changed
pubchem_search_assays3 fields changed- added
Output schema / properties / capAdded value: +{ + "description": "The maxResults cap that was applied.", + "type": "number" +} - added
Output schema / properties / shownAdded value: +{ + "description": "AIDs returned after the maxResults cap.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when AIDs were capped at maxResults — more assays exist than returned.", + "type": "boolean" +}
- Changed
pubchem_search_compounds3 fields changed- added
Output schema / properties / capAdded value: +{ + "description": "The maxResults cap that was applied.", + "type": "number" +} - added
Output schema / properties / shownAdded value: +{ + "description": "CIDs returned after the maxResults cap.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when CIDs were capped at maxResults — more matches exist than returned.", + "type": "boolean" +}
5 tool updates
v0.2.2- Changed
pubchem_get_bioactivity8 fields changed- added
Input schema / properties / targetAccessionAdded 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" +} - added
Input schema / properties / targetGeneIdAdded 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" +} - added
Output schema / properties / filteredCountAdded value: +{ + "description": "Assays matching the outcome and target filters, before the maxResults cap.", + "type": "number" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Recovery guidance when the filter yields no results or the compound has no bioactivity data.", + "type": "string" +} - added
Output schema / properties / outcomeFilterAdded value: +{ + "description": "Outcome filter applied: active, inactive, or all.", + "type": "string" +} - added
Output schema / properties / returnedCountAdded value: +{ + "description": "Assays returned after the maxResults cap.", + "type": "number" +} - added
Output schema / properties / targetFilterAdded value: +{ + "description": "Target filter applied (gene ID and/or protein accession), when set.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "cid", - "totalAssays", - "activeCount", - "inactiveCount", - "results" -]New value: +[ + "cid", + "totalAssays", + "activeCount", + "inactiveCount", + "results", + "outcomeFilter", + "filteredCount", + "returnedCount" +]
- Added
pubchem_get_compound_3d_structure - Added
pubchem_get_compound_interactions - Changed
pubchem_get_compound_safety12 fields changed- removed
Input schema / properties / cidRemoved value: -{ - "description": "PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds.", - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" -} - added
Input schema / properties / cidsAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "cid" -]New value: +[ + "cids" +] - removed
Output schema / properties / cidRemoved value: -{ - "description": "PubChem Compound ID.", - "type": "number" -} - removed
Output schema / properties / ghsRemoved 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" -} - removed
Output schema / properties / hasDataRemoved value: -{ - "description": "Whether GHS safety data is available for this compound.", - "type": "boolean" -} - added
Output schema / properties / noticeAdded value: +{ + "description": "Cross-tool guidance when one or more CIDs have no GHS data, pointing to an alternative source.", + "type": "string" +} - added
Output schema / properties / requestedCountAdded value: +{ + "description": "CIDs requested.", + "type": "number" +} - added
Output schema / properties / resultsAdded 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" +} - removed
Output schema / properties / sourceRemoved value: -{ - "description": "Data source attribution.", - "type": "string" -} - added
Output schema / properties / withDataCountAdded value: +{ + "description": "CIDs with GHS safety data available.", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "cid", - "hasData" -]New value: +[ + "results", + "requestedCount", + "withDataCount" +]
- Changed
pubchem_get_summary4 fields changed- added
Output schema / properties / foundCountAdded value: +{ + "description": "Identifiers resolved to a summary.", + "type": "number" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Recovery guidance when one or more identifiers were not found.", + "type": "string" +} - added
Output schema / properties / requestedCountAdded value: +{ + "description": "Identifiers requested.", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "entityType", - "summaries" -]New value: +[ + "entityType", + "summaries", + "requestedCount", + "foundCount" +]
8 tool updates
v0.1.22- Changed
pubchem_get_bioactivity6 fields changed- changed
Input schema / properties / cid / descriptionPrevious value: -"PubChem Compound ID."New value: +"PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds." - added
Output schema / properties / results / items / descriptionAdded value: +"Assay result entry." - added
Output schema / properties / results / items / properties / activityValues / items / descriptionAdded value: +"Quantitative activity measurement entry." - changed
Output schema / properties / results / items / properties / activityValues / items / properties / name / descriptionPrevious value: -"Measurement name (e.g. IC50, EC50, Ki)."New value: +"Measurement name (e.g. IC50, EC50, Ki). Omitted when not reported." - changed
Output schema / properties / results / items / properties / activityValues / items / properties / unit / descriptionPrevious value: -"Unit of measurement (e.g. uM, nM)."New value: +"Unit of measurement (e.g. uM, nM). Omitted when not reported." - changed
Output schema / properties / results / items / properties / activityValues / items / requiredPrevious value: -[ - "name", - "value", - "unit" -]New value: +[ + "value" +]
- Changed
pubchem_get_compound_details19 fields changed- changed
Input schema / properties / cids / descriptionPrevious 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." - changed
Input schema / properties / includeClassification / descriptionPrevious 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." - changed
Input schema / properties / includeDescription / descriptionPrevious 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." - changed
Input schema / properties / includeSynonyms / descriptionPrevious 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." - added
Input schema / properties / maxDescriptionsAdded 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" +} - added
Output schema / properties / compounds / items / descriptionAdded value: +"Per-CID compound detail record." - added
Output schema / properties / compounds / items / properties / classification / properties / atcCodes / items / descriptionAdded value: +"ATC code entry with hierarchical description." - removed
Output schema / properties / compounds / items / properties / descriptionRemoved value: -{ - "description": "Textual description from PUG View.", - "type": "string" -} - added
Output schema / properties / compounds / items / properties / descriptionsAdded 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" +} - added
Output schema / properties / compounds / items / properties / descriptionsTotalAdded value: +{ + "description": "Total distinct descriptions available before truncation. Larger than descriptions.length when more sources exist — increase maxDescriptions to see them.", + "type": "number" +} - changed
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / mw / descriptionPrevious value: -"Molecular weight rule (≤500)."New value: +"Molecular weight rule (≤500 g/mol)." - changed
Output schema / properties / compounds / items / properties / drugLikeness / properties / lipinski / properties / xLogP / descriptionPrevious value: -"XLogP rule (≤5)."New value: +"XLogP rule (≤5; calculated logP)." - added
Output schema / properties / compounds / items / properties / drugLikeness / properties / pass / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "null" + } +] - changed
Output schema / properties / compounds / items / properties / drugLikeness / properties / pass / descriptionPrevious value: -"Overall drug-likeness pass."New value: +"Overall drug-likeness pass. Null when insufficient properties were available." - removed
Output schema / properties / compounds / items / properties / drugLikeness / properties / pass / typeRemoved value: -"boolean" - changed
Output schema / properties / compounds / items / properties / drugLikeness / properties / veber / properties / tpsa / descriptionPrevious value: -"TPSA rule (≤140)."New value: +"Topological polar surface area rule (≤140 Ų)." - added
Output schema / properties / compounds / items / properties / foundAdded value: +{ + "description": "False when the CID does not exist in PubChem (properties, description, etc. are empty).", + "type": "boolean" +} - changed
Output schema / properties / compounds / items / properties / properties / descriptionPrevious 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)." - changed
Output schema / properties / compounds / items / requiredPrevious value: -[ - "cid", - "properties" -]New value: +[ + "cid", + "found", + "properties" +]
- Changed
pubchem_get_compound_image2 fields changed- changed
Input schema / properties / cid / descriptionPrevious value: -"PubChem Compound ID."New value: +"PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds." - changed
Output schema / properties / mimeType / descriptionPrevious value: -"Image MIME type."New value: +"MIME type — always \"image/png\"."
- Changed
pubchem_get_compound_safety3 fields changed- changed
Input schema / properties / cid / descriptionPrevious value: -"PubChem Compound ID."New value: +"PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds." - added
Output schema / properties / ghs / properties / hazardStatements / items / descriptionAdded value: +"GHS hazard statement entry." - added
Output schema / properties / ghs / properties / precautionaryStatements / items / descriptionAdded value: +"GHS precautionary statement entry."
- Changed
pubchem_get_compound_xrefs7 fields changed- changed
Input schema / properties / cid / descriptionPrevious value: -"PubChem Compound ID."New value: +"PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds." - changed
Input schema / properties / maxPerType / descriptionPrevious 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." - changed
Input schema / properties / xrefTypes / descriptionPrevious 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." - added
Output schema / properties / xrefs / items / descriptionAdded value: +"Cross-reference group for one type." - changed
Output schema / properties / xrefs / items / properties / ids / items / anyOfPrevious 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" + } +] - added
Output schema / properties / xrefs / items / properties / ids / items / descriptionAdded value: +"Cross-reference identifier — string or number depending on type." - changed
Output schema / properties / xrefs / items / properties / type / descriptionPrevious value: -"Cross-reference type."New value: +"Cross-reference type: RegistryID, RN, PubMedID, PatentID, GeneID, ProteinGI, or TaxonomyID."
- Changed
pubchem_get_summary8 fields changed- changed
Input schema / properties / identifiers / items / anyOfPrevious 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" + } +] - added
Input schema / properties / identifiers / items / descriptionAdded value: +"Entity identifier — string or number depending on entityType." - added
Output schema / properties / summaries / items / descriptionAdded value: +"Per-identifier summary result." - changed
Output schema / properties / summaries / items / properties / data / additionalPropertiesPrevious value: -{}New value: +false - changed
Output schema / properties / summaries / items / properties / data / descriptionPrevious value: -"Entity summary data (shape varies by type)."New value: +"Entity summary data. Populated fields depend on entityType." - added
Output schema / properties / summaries / items / properties / data / propertiesAdded 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" + } +} - removed
Output schema / properties / summaries / items / properties / data / propertyNamesRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / summaries / items / properties / identifier / anyOfPrevious 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" + } +]
- Changed
pubchem_search_assays4 fields changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Recovery guidance when no assays matched — echoes the target and suggests alternative search types. Absent when assays were returned.", + "type": "string" +} - changed
Output schema / properties / targetType / descriptionPrevious value: -"Target identifier type used."New value: +"Target identifier type used: genesymbol, proteinname, geneid, or proteinaccession." - changed
Output schema / properties / totalFound / descriptionPrevious value: -"Total AIDs found."New value: +"Total AIDs found before the maxResults cap." - changed
Output schema / requiredPrevious value: -[ - "targetType", - "targetQuery", - "totalFound", - "aids" -]New value: +[ + "aids", + "targetType", + "targetQuery", + "totalFound" +]
- Changed
pubchem_search_compounds9 fields changed- changed
Input schema / properties / identifiers / descriptionPrevious 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)." - changed
Input schema / properties / query / descriptionPrevious 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\")." - changed
Input schema / properties / searchType / descriptionPrevious 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." - added
Output schema / properties / noticeAdded value: +{ + "description": "Recovery guidance when no compounds matched — echoes search strategy and suggests how to broaden. Absent when results were returned.", + "type": "string" +} - added
Output schema / properties / results / items / descriptionAdded value: +"Matching compound entry." - changed
Output schema / properties / results / items / properties / properties / descriptionPrevious value: -"Compound properties when requested."New value: +"Compound properties keyed by name (echoes input.properties; only present when requested)." - changed
Output schema / properties / searchType / descriptionPrevious value: -"The search strategy used."New value: +"Search strategy used: identifier, formula, substructure, superstructure, or similarity." - changed
Output schema / properties / totalFound / descriptionPrevious value: -"Total CIDs found (before maxResults cap)."New value: +"Total CIDs found before the maxResults cap." - changed
Output schema / requiredPrevious value: -[ - "searchType", - "totalFound", - "results" -]New value: +[ + "results", + "searchType", + "totalFound" +]
8 tool updates
v0.1.11- First observed
pubchem_get_bioactivity - First observed
pubchem_get_compound_details - First observed
pubchem_get_compound_image - First observed
pubchem_get_compound_safety - First observed
pubchem_get_compound_xrefs - First observed
pubchem_get_summary - First observed
pubchem_search_assays - First observed
pubchem_search_compounds
TDQS
Scored across 10 tools
Each tool targets a distinct PubChem resource or action, and the descriptions make the boundaries clear. The only mild ambiguity is between compound_xrefs and compound_interactions, since both mention gene/protein or target associations, but the descriptions clarify that one is external references and the other is interaction data.
All tools follow the consistent pubchem_<verb>_<object> pattern using snake_case, with get and search as the only verbs. Object names are descriptive and predictable, making the tool set easy to navigate.
Ten tools is well within the ideal range for a domain-specific retrieval server. Each tool covers a meaningful capability without redundancy or unnecessary bloat.
The surface covers the main compound workflow: searching by identifier/structure, retrieving properties, safety data, images, 3D structures, interactions, bioactivity, and assay/target summaries. Minor gaps exist around full assay protocol details, but the summary and bioactivity tools provide workable alternatives.
Maintenance
Related MCP Connectors
Link compounds to protein targets, rank bioactivity, and look up drug mechanisms and indications.
Connect AI clients to biomedical data and tools.
Discover, inspect and run 63,000+ agent tools from one balance. Pay per call, no subscriptions.
- GoroOAuthai.usegoro
62 real-world tools for agents: search, scraping, social, enrichment, image, video, voice.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables 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.30MIT
- AlicenseBqualityDmaintenanceEnables 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.3MIT
- AlicenseBqualityDmaintenanceEnables AI agents to search the Chemspace API for synthesizable building blocks and screening compounds using exact matches, substructure searches, and similarity searches by SMILES strings.31MIT
- FlicenseNot gradedqualityDmaintenanceEnables 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-