Koskamo

pubchem-mcp-server

An MCP server that allows agents to search the PubChem chemical database for compounds, properties, safety data, bioactivity, cross-references, and entity summaries via STDIO or Streamable HTTP.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

pubchem-mcp-server logo, by cyanheadsCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by cyanheads
MCP endpoint (Streamable HTTP)
https://pubchem.caseyjhand.com/mcp
Vendor documentation

What its tools do

10 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

10 of 10 have a description · 10 of 10 declare behavior hints · 10 of 10 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search PubChem for chemical compounds by identifier, formula, or structure
  • Fetch physicochemical properties and safety data for compounds
  • Retrieve bioactivity profiles and drug-food interactions
  • Find bioassays by biological target

Source and maintenance

Community listingRegistry 0.8.0
Maintenance checked

Protocol and capabilities

Server
pubchem-mcp-server 0.8.0
MCP protocol negotiated in check
2025-11-25
Tools
10 advertised
Resources
1 advertised
Resource templates
7 advertised
Prompts
0 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "logging": {},
  "prompts": {
    "listChanged": true
  },
  "resources": {
    "subscribe": true,
    "listChanged": true
  },
  "extensions": {
    "io.modelcontextprotocol/skills": {
      "directoryRead": true
    }
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Use the pubchem_* tools to query PubChem's chemical database. Compounds are addressed by CID, assays by AID. Most flows start at `pubchem_search_compounds` (name, SMILES, InChI, InChIKey, formula, substructure, superstructure, 2D similarity, or an assay's compounds by AID → CIDs), then call per-CID tools for details, safety, image, cross-references, bioactivity, interactions (drug-food, or `kinds: ["target"]` for the targets its assays name), or 3D structure. To find assays for a biological target, chain `pubchem_search_assays` (gene/protein → AIDs) into `pubchem_get_summary` (`entityType: assay`) for each AID's method, targets, and compound counts, then list an assay's active compounds with `pubchem_search_compounds` (`searchType: assay`, `aid`); to see which targets a compound is active against, call `pubchem_get_compound_interactions` with `kinds: ["target"]`; to check one target, call `pubchem_get_bioactivity` with a `cid` plus `targetGeneId`/`targetAccession`. `pubchem_get_summary` covers assay/gene/protein/taxonomy entity lookups. Compound and assay records are also exposed as URI-addressable resources (e.g. `pubchem://compound/{cid}`, `pubchem://assay/{aid}`).

Tools

10 advertised

pubchem_search_compounds — Search Compounds
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search PubChem for chemical compounds by identifier (name, SMILES, InChI, or InChIKey, up to 25 per call), molecular formula in Hill notation, substructure or superstructure containment, 2D Tanimoto similarity, or the compounds a bioassay (AID) found active or tested. 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.

pubchem_search_compounds input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "searchType"
  ],
  "properties": {
    "aid": {
      "type": "integer",
      "maximum": 2147483647,
      "minimum": 1,
      "description": "Required for assay search. PubChem Assay ID (AID) whose compounds to list, from 1 to 2147483647, e.g. 1000. Find AIDs for a biological target with pubchem_search_assays."
    },
    "query": {
      "type": "string",
      "description": "Required for substructure/superstructure/similarity searches. A SMILES string (e.g. \"CC(=O)O\") or PubChem CID as a string from 1 to 2147483647 (e.g. \"2244\")."
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "maximum": 9007199254740991,
      "minimum": 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, and assay searches fetch only the requested page, so both page to the end of their matches. 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: those four accept an offset up to 10000. Default: 0."
    },
    "formula": {
      "type": "string",
      "description": "Required for formula search. Molecular formula in Hill notation (e.g. \"C6H12O6\", \"CaH2O2\")."
    },
    "queryType": {
      "enum": [
        "smiles",
        "cid"
      ],
      "type": "string",
      "description": "Required for structure/similarity searches. Format of the query: \"smiles\" or \"cid\"."
    },
    "threshold": {
      "type": "number",
      "default": 90,
      "maximum": 100,
      "minimum": 70,
      "description": "Similarity search only. Minimum Tanimoto similarity (70-100). 90+ for close analogs, 70-80 for scaffold hops. Default: 90."
    },
    "activeOnly": {
      "type": "boolean",
      "default": true,
      "description": "Assay search only. When true (default), lists only the compounds the assay marked active; false lists every compound it tested."
    },
    "maxResults": {
      "type": "integer",
      "default": 20,
      "maximum": 1000,
      "minimum": 1,
      "description": "Maximum CIDs to return per page. The per-call cap is 200: a larger value (up to 1000) returns a page of 200 and is reported in cappedInputs. Use offset to reach matches past this page. Default: 20."
    },
    "properties": {
      "type": "array",
      "items": {
        "enum": [
          "MolecularFormula",
          "MolecularWeight",
          "CanonicalSMILES",
          "IsomericSMILES",
          "InChI",
          "InChIKey",
          "IUPACName",
          "Title",
          "XLogP",
          "ExactMass",
          "MonoisotopicMass",
          "TPSA",
          "Complexity",
          "Charge",
          "HBondDonorCount",
          "HBondAcceptorCount",
          "RotatableBondCount",
          "HeavyAtomCount",
          "IsotopeAtomCount",
          "AtomStereoCount",
          "DefinedAtomStereoCount",
          "UndefinedAtomStereoCount",
          "BondStereoCount",
          "DefinedBondStereoCount",
          "UndefinedBondStereoCount",
          "CovalentUnitCount",
          "Volume3D"
        ],
        "type": "string"
      },
      "description": "Optional: fetch these properties for each result, avoiding a follow-up details call. E.g. [\"MolecularFormula\", \"MolecularWeight\", \"CanonicalSMILES\"]."
    },
    "searchType": {
      "enum": [
        "identifier",
        "formula",
        "substructure",
        "superstructure",
        "similarity",
        "assay"
      ],
      "type": "string",
      "description": "Search strategy; each mode needs its own fields. \"identifier\": name/SMILES/InChI/InChIKey lookup — requires identifierType and identifiers. \"formula\": molecular formula — requires 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. substructure, superstructure, and similarity require query and queryType. \"assay\": compounds tested in a PubChem bioassay — requires aid; activeOnly (default true) keeps only the compounds the assay marked active."
    },
    "identifiers": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 1000,
      "minItems": 1,
      "description": "Required for identifier search. Array of identifiers to resolve. The per-call cap is 25: the first 25 are looked up, and any past that (up to 1000 in all) are returned in unprocessed, in input order, and reported in cappedInputs. Examples: [\"aspirin\", \"ibuprofen\"] for name, [\"CC(=O)OC1=CC=CC=C1C(=O)O\"] for SMILES, [\"InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)\"] for inchi (sent exactly as written, case kept), [\"BSYNRYMUTXBXSQ-UHFFFAOYSA-N\"] for inchikey (27-char block format; uppercased before lookup, any case accepted)."
    },
    "identifierType": {
      "enum": [
        "name",
        "smiles",
        "inchi",
        "inchikey"
      ],
      "type": "string",
      "description": "Required for identifier search. Type of chemical identifier: \"name\", \"smiles\", \"inchi\" (a full InChI string, case-sensitive), or \"inchikey\"."
    },
    "allowOtherElements": {
      "type": "boolean",
      "default": false,
      "description": "Formula search only. When true, includes compounds with additional elements beyond the formula."
    }
  },
  "additionalProperties": false
}
pubchem_search_compounds output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "results",
        "searchType",
        "offset"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "cap": {
      "type": "number",
      "description": "The page size applied: maxResults, or the per-call cap when maxResults exceeds it."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "missing_identifier_args",
                "missing_formula",
                "missing_structure_args",
                "invalid_cid_query",
                "offset_ceiling_exceeded",
                "missing_aid",
                "aid_not_found",
                "identifier_rejected",
                "search_query_rejected"
              ],
              "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 or blank. `missing_structure_args`: substructure/superstructure/similarity search with query or queryType omitted, or a blank query. `invalid_cid_query`: structure/similarity search with queryType \"cid\" but query is not an integer CID from 1 to 2147483647. `offset_ceiling_exceeded`: formula, substructure, superstructure, or similarity search with offset above 10000. `missing_aid`: searchType is \"assay\" but aid was omitted. `aid_not_found`: assay search where PubChem has no live assay with the given AID. `identifier_rejected`: identifier search where PubChem rejected every identifier in the batch as unreadable (HTTP 400) — for SMILES or InChI, a string it could not standardize into a structure. A batch with any other outcome lists rejected inputs in unresolvedIdentifiers instead. `search_query_rejected`: PubChem failed a formula, substructure, superstructure, or similarity search with HTTP 500 \"Search status indicates failure\" — its answer for a malformed SMILES or formula, a SMILES with a \"*\" wildcard atom, or a CID with no record — or refused any of these searches with HTTP 400, as it does a formula carrying a line break, another C0 control character other than tab and NUL, or DEL. Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "shown": {
      "type": "number",
      "description": "CIDs returned on this page."
    },
    "notice": {
      "type": "string",
      "description": "Recovery guidance when no compounds matched (for an assay search, when the assay recorded none of the requested kind), when the offset runs past the matches observed, when identifiers had no match or could not be interpreted, when identifiers collided on one CID, when further pages remain, or when a bounded search reached the offset ceiling. Absent when this page is complete and every identifier resolved to its own CID."
    },
    "offset": {
      "type": "number",
      "description": "Zero-based index of the first CID returned."
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "cid"
        ],
        "properties": {
          "cid": {
            "type": "number",
            "description": "PubChem Compound ID."
          },
          "identifier": {
            "type": "string",
            "description": "Echoed input identifier (identifier mode only)."
          },
          "properties": {
            "type": "object",
            "description": "Compound properties keyed by name (echoes input.properties; only present when requested).",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          }
        },
        "description": "Matching compound entry.",
        "additionalProperties": false
      },
      "description": "Matching compounds."
    },
    "truncated": {
      "type": "boolean",
      "description": "True when matching CIDs remain past this page."
    },
    "activeOnly": {
      "type": "boolean",
      "description": "Assay search only: true when the list holds only the compounds the assay marked active, false when it holds every compound tested."
    },
    "nextOffset": {
      "type": "number",
      "description": "Offset to pass on the next call to continue past this page. Omitted when no further matches remain, and when a formula, substructure, superstructure, or similarity page would continue past the 10000 offset ceiling (truncated stays true, and the notice says how to narrow the search and names the page at offset 10000 when it still reaches further matches)."
    },
    "searchType": {
      "type": "string",
      "description": "Search strategy used: identifier, formula, substructure, superstructure, similarity, or assay."
    },
    "totalFound": {
      "type": "number",
      "description": "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."
    },
    "unprocessed": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifier-mode only: identifiers past the per-call cap of 25, in input order, not looked up. Pass them in a follow-up call. Omitted when every identifier was looked up."
    },
    "cappedInputs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "input",
          "requested",
          "served"
        ],
        "properties": {
          "input": {
            "type": "string",
            "description": "Input name, e.g. \"maxResults\" or \"cids\"."
          },
          "served": {
            "type": "number",
            "description": "Value served: the per-call cap."
          },
          "requested": {
            "type": "number",
            "description": "Value requested: the page size, or the number of IDs in the batch."
          },
          "unprocessed": {
            "type": "number",
            "description": "ID batches only: IDs past the cap, listed in unprocessed in input order."
          }
        },
        "description": "One input served at its per-call cap.",
        "additionalProperties": false
      },
      "description": "Inputs that asked for more than their per-call cap, with the value requested and the value served. An ID batch lists the IDs past the cap in unprocessed. Omitted when every input was within its cap."
    },
    "totalFoundAtLeast": {
      "type": "number",
      "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."
    },
    "unresolvedIdentifiers": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifier-mode only: input identifiers that resolved to no CID — PubChem had no match, or could not interpret the input as identifierType (the notice says which). Omitted when every identifier resolved and for non-identifier searches."
    }
  },
  "additionalProperties": false
}
pubchem_search_compounds annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
pubchem_get_compound_details — Get Compound Details
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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). Fetches up to 100 CIDs per call; CIDs past that are returned in unprocessed for a follow-up call.

pubchem_get_compound_details input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "cids"
  ],
  "properties": {
    "cids": {
      "type": "array",
      "items": {
        "type": "integer",
        "maximum": 2147483647,
        "minimum": 1
      },
      "maxItems": 1000,
      "minItems": 1,
      "description": "PubChem Compound IDs to fetch. The per-call cap is 100: the first 100 are fetched, and any past that (up to 1000 in all) are returned in unprocessed, in input order, and reported in cappedInputs. Resolve from names/SMILES with pubchem_search_compounds."
    },
    "properties": {
      "type": "array",
      "items": {
        "enum": [
          "MolecularFormula",
          "MolecularWeight",
          "CanonicalSMILES",
          "IsomericSMILES",
          "InChI",
          "InChIKey",
          "IUPACName",
          "Title",
          "XLogP",
          "ExactMass",
          "MonoisotopicMass",
          "TPSA",
          "Complexity",
          "Charge",
          "HBondDonorCount",
          "HBondAcceptorCount",
          "RotatableBondCount",
          "HeavyAtomCount",
          "IsotopeAtomCount",
          "AtomStereoCount",
          "DefinedAtomStereoCount",
          "UndefinedAtomStereoCount",
          "BondStereoCount",
          "DefinedBondStereoCount",
          "UndefinedBondStereoCount",
          "CovalentUnitCount",
          "Volume3D"
        ],
        "type": "string"
      },
      "description": "Properties to retrieve. Defaults to a core set: MolecularFormula, MolecularWeight, IUPACName, CanonicalSMILES, IsomericSMILES, InChIKey, XLogP, TPSA, HBondDonorCount, HBondAcceptorCount, RotatableBondCount, HeavyAtomCount, Charge, Complexity."
    },
    "maxSynonyms": {
      "type": "integer",
      "default": 20,
      "maximum": 1000,
      "minimum": 1,
      "description": "Max synonyms returned per compound per page. The per-call cap is 100: a larger value (up to 1000) returns 100 per compound and is reported in cappedInputs. PubChem lists hundreds for common drugs; use synonymOffset to reach the ones past this page. Default: 20."
    },
    "synonymOffset": {
      "type": "integer",
      "default": 0,
      "maximum": 9007199254740991,
      "minimum": 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."
    },
    "includeSynonyms": {
      "type": "boolean",
      "default": false,
      "description": "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": {
      "type": "integer",
      "default": 3,
      "maximum": 1000,
      "minimum": 1,
      "description": "Max number of distinct description entries per compound per page. The per-call cap is 20: a larger value (up to 1000) returns 20 per compound and is reported in cappedInputs. PubChem returns near-duplicate summaries from many depositors; duplicates are collapsed before this cap applies. Default: 3."
    },
    "descriptionOffset": {
      "type": "integer",
      "default": 0,
      "maximum": 9007199254740991,
      "minimum": 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."
    },
    "includeDescription": {
      "type": "boolean",
      "default": false,
      "description": "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": {
      "type": "boolean",
      "default": false,
      "description": "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": {
      "type": "boolean",
      "default": false,
      "description": "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."
    }
  },
  "additionalProperties": false
}
pubchem_get_compound_details output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "compounds",
        "truncated"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "notice": {
      "type": "string",
      "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."
    },
    "compounds": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "cid",
          "found",
          "properties"
        ],
        "properties": {
          "cid": {
            "type": "number",
            "description": "PubChem Compound ID."
          },
          "found": {
            "type": "boolean",
            "description": "False when the CID does not exist in PubChem (properties, description, etc. are empty)."
          },
          "synonyms": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Known names and synonyms on this page, windowed by synonymOffset/maxSynonyms. Empty when synonymOffset runs past synonymsTotal."
          },
          "properties": {
            "type": "object",
            "description": "Physicochemical properties keyed by name (echoes input.properties or the default core set; drug-likeness inputs are appended automatically when includeDrugLikeness is true).",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "descriptions": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "text"
              ],
              "properties": {
                "text": {
                  "type": "string",
                  "description": "Description text."
                },
                "source": {
                  "type": "string",
                  "description": "Depositor source (e.g. \"DrugBank\", \"Wikipedia\", \"ChEBI\")."
                }
              },
              "description": "Description entry with optional source attribution.",
              "additionalProperties": false
            },
            "description": "Textual descriptions on this page, deduplicated then windowed by descriptionOffset/maxDescriptions. Each entry carries optional source attribution. Empty when descriptionOffset runs past descriptionsTotal."
          },
          "drugLikeness": {
            "type": "object",
            "required": [
              "lipinski",
              "pass",
              "veber"
            ],
            "properties": {
              "pass": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Overall drug-likeness pass. Null when insufficient properties were available."
              },
              "veber": {
                "type": "object",
                "required": [
                  "rotatableBonds",
                  "tpsa",
                  "violations"
                ],
                "properties": {
                  "tpsa": {
                    "type": "object",
                    "required": [
                      "limit",
                      "pass",
                      "value"
                    ],
                    "properties": {
                      "pass": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Whether the rule passes (null if value unavailable)."
                      },
                      "limit": {
                        "type": "number",
                        "description": "Rule threshold."
                      },
                      "value": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Measured value (null if unavailable)."
                      }
                    },
                    "description": "Topological polar surface area rule (≤140 Ų).",
                    "additionalProperties": false
                  },
                  "violations": {
                    "type": "number",
                    "description": "Number of Veber violations (0-2)."
                  },
                  "rotatableBonds": {
                    "type": "object",
                    "required": [
                      "limit",
                      "pass",
                      "value"
                    ],
                    "properties": {
                      "pass": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Whether the rule passes (null if value unavailable)."
                      },
                      "limit": {
                        "type": "number",
                        "description": "Rule threshold."
                      },
                      "value": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Measured value (null if unavailable)."
                      }
                    },
                    "description": "Rotatable bond count rule (≤10).",
                    "additionalProperties": false
                  }
                },
                "description": "Veber rules evaluation.",
                "additionalProperties": false
              },
              "lipinski": {
                "type": "object",
                "required": [
                  "hba",
                  "hbd",
                  "mw",
                  "violations",
                  "xLogP"
                ],
                "properties": {
                  "mw": {
                    "type": "object",
                    "required": [
                      "limit",
                      "pass",
                      "value"
                    ],
                    "properties": {
                      "pass": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Whether the rule passes (null if value unavailable)."
                      },
                      "limit": {
                        "type": "number",
                        "description": "Rule threshold."
                      },
                      "value": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Measured value (null if unavailable)."
                      }
                    },
                    "description": "Molecular weight rule (≤500 g/mol).",
                    "additionalProperties": false
                  },
                  "hba": {
                    "type": "object",
                    "required": [
                      "limit",
                      "pass",
                      "value"
                    ],
                    "properties": {
                      "pass": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Whether the rule passes (null if value unavailable)."
                      },
                      "limit": {
                        "type": "number",
                        "description": "Rule threshold."
                      },
                      "value": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Measured value (null if unavailable)."
                      }
                    },
                    "description": "HBond acceptor count rule (≤10).",
                    "additionalProperties": false
                  },
                  "hbd": {
                    "type": "object",
                    "required": [
                      "limit",
                      "pass",
                      "value"
                    ],
                    "properties": {
                      "pass": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Whether the rule passes (null if value unavailable)."
                      },
                      "limit": {
                        "type": "number",
                        "description": "Rule threshold."
                      },
                      "value": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Measured value (null if unavailable)."
                      }
                    },
                    "description": "HBond donor count rule (≤5).",
                    "additionalProperties": false
                  },
                  "xLogP": {
                    "type": "object",
                    "required": [
                      "limit",
                      "pass",
                      "value"
                    ],
                    "properties": {
                      "pass": {
                        "type": [
                          "boolean",
                          "null"
                        ],
                        "description": "Whether the rule passes (null if value unavailable)."
                      },
                      "limit": {
                        "type": "number",
                        "description": "Rule threshold."
                      },
                      "value": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Measured value (null if unavailable)."
                      }
                    },
                    "description": "XLogP rule (≤5; calculated logP).",
                    "additionalProperties": false
                  },
                  "violations": {
                    "type": "number",
                    "description": "Number of Lipinski violations (0-4)."
                  }
                },
                "description": "Lipinski Rule of Five evaluation.",
                "additionalProperties": false
              }
            },
            "description": "Drug-likeness assessment. lipinski.violations ≤ 1 and veber.violations = 0 → pass.",
            "additionalProperties": false
          },
          "synonymsTotal": {
            "type": "number",
            "description": "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."
          },
          "classification": {
            "type": "object",
            "required": [
              "atcCodes",
              "fdaClasses",
              "fdaMechanisms",
              "meshClasses"
            ],
            "properties": {
              "atcCodes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "code",
                    "description",
                    "levels"
                  ],
                  "properties": {
                    "code": {
                      "type": "string",
                      "description": "ATC level-5 (substance) code, e.g. \"N02BA01\"."
                    },
                    "levels": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "code",
                          "description"
                        ],
                        "properties": {
                          "code": {
                            "type": "string",
                            "description": "ATC code at this level, e.g. \"N02\"."
                          },
                          "description": {
                            "type": "string",
                            "description": "WHO ATC name at this level, e.g. \"Analgesics\"."
                          }
                        },
                        "description": "One ancestor level of the code.",
                        "additionalProperties": false
                      },
                      "description": "Levels 1-4 of the code, top-down: anatomical main group, therapeutic subgroup, pharmacological subgroup, chemical subgroup. Empty when PubChem lists the code without a WHO ATC hierarchy entry."
                    },
                    "description": {
                      "type": "string",
                      "description": "WHO ATC name for the code, e.g. \"Acetylsalicylic acid\". Empty when PubChem lists the code without a WHO ATC hierarchy entry."
                    }
                  },
                  "description": "One human ATC code with its WHO hierarchy.",
                  "additionalProperties": false
                },
                "description": "Human ATC codes in the order PubChem lists them. ATCvet codes and codes named only by a WHO Essential Medicines list are excluded."
              },
              "fdaClasses": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "FDA Established Pharmacologic Classes."
              },
              "meshClasses": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "MeSH pharmacological class descriptions."
              },
              "fdaMechanisms": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "FDA Mechanisms of Action."
              }
            },
            "description": "Pharmacological classification (FDA, MeSH, ATC).",
            "additionalProperties": false
          },
          "descriptionsTotal": {
            "type": "number",
            "description": "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."
          }
        },
        "description": "Per-CID compound detail record.",
        "additionalProperties": false
      },
      "description": "Compound detail records, one per CID fetched, in input order. CIDs past the per-call cap are in unprocessed instead."
    },
    "truncated": {
      "type": "boolean",
      "description": "True when this response is not the whole picture: a compound has further synonyms or descriptions past this page, CIDs were skipped by the per-call fan-out limit, or CIDs past the per-call cap were left unfetched. Per-compound totals are in compounds[].synonymsTotal / compounds[].descriptionsTotal; the skipped CIDs are in skippedCids, the unfetched ones in unprocessed."
    },
    "skippedCids": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "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."
    },
    "unprocessed": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "CIDs past the per-call cap of 100, in input order, not fetched. Pass them in a follow-up call. Omitted when every CID was fetched."
    },
    "cappedInputs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "input",
          "requested",
          "served"
        ],
        "properties": {
          "input": {
            "type": "string",
            "description": "Input name, e.g. \"maxResults\" or \"cids\"."
          },
          "served": {
            "type": "number",
            "description": "Value served: the per-call cap."
          },
          "requested": {
            "type": "number",
            "description": "Value requested: the page size, or the number of IDs in the batch."
          },
          "unprocessed": {
            "type": "number",
            "description": "ID batches only: IDs past the cap, listed in unprocessed in input order."
          }
        },
        "description": "One input served at its per-call cap.",
        "additionalProperties": false
      },
      "description": "Inputs that asked for more than their per-call cap, with the value requested and the value served. An ID batch lists the IDs past the cap in unprocessed. Omitted when every input was within its cap."
    },
    "enrichedCids": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "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."
    },
    "synonymOffset": {
      "type": "number",
      "description": "Zero-based index of the first synonym returned within each compound's list. Present when includeSynonyms is true."
    },
    "descriptionOffset": {
      "type": "number",
      "description": "Zero-based index of the first description returned within each compound's list. Present when includeDescription is true."
    },
    "nextSynonymOffset": {
      "type": "number",
      "description": "synonymOffset to pass on the next call to continue past this page. Omitted when no compound in the batch has further synonyms."
    },
    "nextDescriptionOffset": {
      "type": "number",
      "description": "descriptionOffset to pass on the next call to continue past this page. Omitted when no compound in the batch has further descriptions."
    }
  },
  "additionalProperties": false
}
pubchem_get_compound_details annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
pubchem_get_compound_image — Get Compound Image
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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

pubchem_get_compound_image input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "cid"
  ],
  "properties": {
    "cid": {
      "type": "integer",
      "maximum": 2147483647,
      "minimum": 1,
      "description": "PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds."
    },
    "size": {
      "enum": [
        "small",
        "large"
      ],
      "type": "string",
      "default": "large",
      "description": "Image size: \"small\" (100x100) or \"large\" (300x300). Default: \"large\"."
    }
  },
  "additionalProperties": false
}
pubchem_get_compound_image output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "cid",
        "imageBase64",
        "mimeType",
        "width",
        "height"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "cid": {
      "type": "number",
      "description": "PubChem Compound ID."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "cid_not_found"
              ],
              "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."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "width": {
      "type": "number",
      "description": "Image width in pixels."
    },
    "height": {
      "type": "number",
      "description": "Image height in pixels."
    },
    "mimeType": {
      "type": "string",
      "description": "MIME type — always \"image/png\"."
    },
    "imageBase64": {
      "type": "string",
      "description": "Base64-encoded PNG image data."
    }
  },
  "additionalProperties": false
}
pubchem_get_compound_image annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
pubchem_get_compound_3d_structure — Get Compound 3D Structure
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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).

pubchem_get_compound_3d_structure input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "cid"
  ],
  "properties": {
    "cid": {
      "type": "integer",
      "maximum": 2147483647,
      "minimum": 1,
      "description": "PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds."
    },
    "format": {
      "enum": [
        "sdf",
        "json"
      ],
      "type": "string",
      "default": "json",
      "description": "Output format. \"json\" (default) returns parsed atoms and bonds. \"sdf\" returns the raw V2000 SDF text for passthrough to other tools."
    },
    "maxAtoms": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 1,
      "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."
    },
    "maxBonds": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 1,
      "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."
    },
    "includeRawSdf": {
      "type": "boolean",
      "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\"."
    },
    "includeAlternateConformerIds": {
      "type": "boolean",
      "default": false,
      "description": "List the IDs of additional computed conformers beyond the default. Slower than the default response. Default: false."
    }
  },
  "additionalProperties": false
}
pubchem_get_compound_3d_structure output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "cid",
        "atomCount",
        "bondCount"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "cid": {
      "type": "number",
      "description": "PubChem Compound ID."
    },
    "sdf": {
      "type": "string",
      "description": "Raw V2000 SDF text. Populated when format=\"sdf\"."
    },
    "atoms": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "element",
          "x",
          "y",
          "z"
        ],
        "properties": {
          "x": {
            "type": "number",
            "description": "X coordinate (Angstroms)."
          },
          "y": {
            "type": "number",
            "description": "Y coordinate (Angstroms)."
          },
          "z": {
            "type": "number",
            "description": "Z coordinate (Angstroms)."
          },
          "element": {
            "type": "string",
            "description": "Element symbol (e.g. \"C\", \"O\", \"N\")."
          }
        },
        "description": "Atom with 3D Cartesian coordinates.",
        "additionalProperties": false
      },
      "description": "Parsed atoms. Populated when format=\"json\"."
    },
    "bonds": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "a1",
          "a2",
          "order"
        ],
        "properties": {
          "a1": {
            "type": "number",
            "description": "First atom index (1-based)."
          },
          "a2": {
            "type": "number",
            "description": "Second atom index (1-based)."
          },
          "order": {
            "type": "number",
            "description": "Bond order (1=single, 2=double, 3=triple, 4=aromatic)."
          }
        },
        "description": "Bond between two atoms.",
        "additionalProperties": false
      },
      "description": "Parsed bonds. Populated when format=\"json\"."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "no_3d_structure"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `no_3d_structure`: PubChem returned 404 for the CID's 3D record, its answer both when the compound has no computed 3D conformer (common for very large molecules, mixtures, and undefined salts) and when no compound has the CID. Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "notice": {
      "type": "string",
      "description": "Guidance naming which lists were capped and how to widen them."
    },
    "atomCap": {
      "type": "number",
      "description": "The atom cap applied (explicit maxAtoms or the safe default), when the atom list was capped."
    },
    "bondCap": {
      "type": "number",
      "description": "The bond cap applied (explicit maxBonds or the safe default), when the bond list was capped."
    },
    "atomCount": {
      "type": "number",
      "description": "Number of atoms in the conformer."
    },
    "bondCount": {
      "type": "number",
      "description": "Number of bonds in the conformer."
    },
    "truncated": {
      "type": "boolean",
      "description": "True when the atom list, bond list, or raw SDF was capped below its total. atomCount/bondCount always report the full totals."
    },
    "shownAtoms": {
      "type": "number",
      "description": "Atoms returned after the cap, when fewer than atomCount. Raise maxAtoms for more."
    },
    "shownBonds": {
      "type": "number",
      "description": "Bonds returned after the cap, when fewer than bondCount. Raise maxBonds for more."
    },
    "conformerId": {
      "type": "string",
      "description": "Default (primary) conformer ID. Present when includeAlternateConformerIds is set."
    },
    "shownSdfLines": {
      "type": "number",
      "description": "SDF lines returned when format=\"sdf\" and the raw text was line-capped. Set includeRawSdf for the full record."
    },
    "alternateConformerIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Conformer IDs beyond the default. Present when includeAlternateConformerIds is set and alternates exist."
    }
  },
  "additionalProperties": false
}
pubchem_get_compound_3d_structure annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
pubchem_get_compound_xrefs — Get Compound Cross-References
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Get external database cross-references for a compound: PubMed citations, patent IDs, gene associations, CAS and EC numbers with the number of source records that deposited each, other 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. PubMed IDs come highest (most recently assigned) first and the other numeric types in ascending order; CAS and EC come most-attested first; the other string IDs keep PubChem's order. A type that fails to load is named in failedTypes while the others still return; the call fails only when a type fails and no type other than ProteinGI (which PubChem no longer serves) loads.

pubchem_get_compound_xrefs input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "cid",
    "xrefTypes"
  ],
  "properties": {
    "cid": {
      "type": "integer",
      "maximum": 2147483647,
      "minimum": 1,
      "description": "PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds."
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "maximum": 9007199254740991,
      "minimum": 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."
    },
    "xrefTypes": {
      "type": "array",
      "items": {
        "enum": [
          "RegistryID",
          "RN",
          "PubMedID",
          "PatentID",
          "GeneID",
          "ProteinGI",
          "TaxonomyID",
          "CAS",
          "EC"
        ],
        "type": "string"
      },
      "minItems": 1,
      "description": "Cross-reference types to retrieve. String IDs: CAS (the CAS Registry Numbers deposited for this compound, most-attested first, each with the number of source records that deposited it — the first is the value most source records agree on), EC (European Community numbers, ordered and counted the same way), RN (every registry number PubChem associates with the record, unranked: the CAS number alongside deprecated and related CAS RNs, CAS RNs of other substances mapped to the structure, and EC numbers), RegistryID (DSSTox/EPA registry numbers), PatentID. Numeric IDs: PubMedID, GeneID (NCBI Gene — use it for gene/protein associations), ProteinGI (legacy NCBI Protein GI; PubChem currently returns no data for it, so use GeneID instead), TaxonomyID."
    },
    "maxPerType": {
      "type": "integer",
      "default": 50,
      "maximum": 1000,
      "minimum": 1,
      "description": "Max IDs to return per xref type per page. The per-call cap is 500: a larger value (up to 1000) returns 500 per type and is reported in cappedInputs. A compound may have thousands of PubMed references; use offset to reach the ones past this page. Total count always reported. Default: 50."
    }
  },
  "additionalProperties": false
}
pubchem_get_compound_xrefs output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "cid",
        "xrefs",
        "offset",
        "truncated"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "cid": {
      "type": "number",
      "description": "PubChem Compound ID."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "xrefs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "type",
          "ids",
          "totalAvailable",
          "truncated"
        ],
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "String-form cross-reference ID (e.g. CAS number, patent)."
                },
                {
                  "type": "number",
                  "description": "Numeric cross-reference ID (e.g. PubMed ID, Gene ID)."
                }
              ],
              "description": "Cross-reference identifier — string or number depending on type."
            },
            "description": "Cross-reference IDs on this page (window of offset + maxPerType). PubMedID is sorted numerically descending, so page one holds the highest, most recently assigned PMIDs; GeneID, ProteinGI and TaxonomyID numerically ascending; CAS and EC by the number of source records that deposited each, most first (ties in PubChem's order), so ids[0] is the value most source records agree on; RegistryID, RN and PatentID keep PubChem's order."
          },
          "type": {
            "type": "string",
            "description": "Cross-reference type: CAS, EC, RN, RegistryID, PubMedID, PatentID, GeneID, ProteinGI, or TaxonomyID. PubChem currently returns no data for ProteinGI; GeneID carries gene/protein associations."
          },
          "truncated": {
            "type": "boolean",
            "description": "True when IDs for this type remain past the current page."
          },
          "sourceCounts": {
            "type": "array",
            "items": {
              "type": "number",
              "description": "Number of source records that deposited the ID at this index."
            },
            "description": "CAS and EC only: how many source records deposited each ID on this page, aligned with ids — sourceCounts[i] is the count for ids[i]. One source can deposit several records, so this counts records, not distinct source names. More than one ID means the source records disagree; the counts show by how much."
          },
          "totalAvailable": {
            "type": "number",
            "description": "Total IDs available for this type, across all pages."
          }
        },
        "description": "Cross-reference group for one type.",
        "additionalProperties": false
      },
      "description": "Cross-references grouped by type, one group per requested type that loaded. A type listed in failedTypes is absent — its IDs are unknown, not empty."
    },
    "notice": {
      "type": "string",
      "description": "Guidance when a type failed to load, when every requested xref type returned zero IDs, when the offset runs past every type, when further pages remain, or when ProteinGI came back empty (PubChem serves no ProteinGI data). Absent when this page is complete and non-empty."
    },
    "offset": {
      "type": "number",
      "description": "Zero-based index of the first ID returned within each type."
    },
    "truncated": {
      "type": "boolean",
      "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."
    },
    "nextOffset": {
      "type": "number",
      "description": "Offset to pass on the next call to continue past this page. Omitted when no requested type has further IDs."
    },
    "failedTypes": {
      "type": "string",
      "description": "Requested xref types that could not be retrieved (comma-separated). The returned groups cover the types that loaded. A retry can recover a type that failed transiently (a timeout, network error, rate limit, or 5xx), and the notice names those; a type PubChem rejected fails the same way again."
    },
    "cappedInputs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "input",
          "requested",
          "served"
        ],
        "properties": {
          "input": {
            "type": "string",
            "description": "Input name, e.g. \"maxResults\" or \"cids\"."
          },
          "served": {
            "type": "number",
            "description": "Value served: the per-call cap."
          },
          "requested": {
            "type": "number",
            "description": "Value requested: the page size, or the number of IDs in the batch."
          },
          "unprocessed": {
            "type": "number",
            "description": "ID batches only: IDs past the cap, listed in unprocessed in input order."
          }
        },
        "description": "One input served at its per-call cap.",
        "additionalProperties": false
      },
      "description": "Inputs that asked for more than their per-call cap, with the value requested and the value served. An ID batch lists the IDs past the cap in unprocessed. Omitted when every input was within its cap."
    }
  },
  "additionalProperties": false
}
pubchem_get_compound_xrefs annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
pubchem_get_compound_safety — Get Compound Safety
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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, merged across sources, plus each source's own classification — its signal word, pictograms, H-codes with ECHA notifier agreement percentages, and notification counts — since sources often disagree. Reports ECHA "Not Classified" verdicts as their own status.

pubchem_get_compound_safety input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "cids"
  ],
  "properties": {
    "cids": {
      "type": "array",
      "items": {
        "type": "integer",
        "maximum": 2147483647,
        "minimum": 1
      },
      "maxItems": 1000,
      "minItems": 1,
      "description": "PubChem Compound IDs to fetch safety data for. The per-call cap is 25: the first 25 are looked up, and any past that (up to 1000 in all) are returned in unprocessed, in input order, and reported in cappedInputs. Resolve from names/SMILES with pubchem_search_compounds."
    }
  },
  "additionalProperties": false
}
pubchem_get_compound_safety output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "results",
        "requestedCount",
        "withDataCount"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "notice": {
      "type": "string",
      "description": "Guidance when one or more CIDs returned no hazard classification, listing the unrecognized CIDs to verify, the CIDs that exist but carry no deposited classification, and the CIDs whose only classifications are \"Not Classified\" verdicts, each separately."
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "cid",
          "hasData",
          "status"
        ],
        "properties": {
          "cid": {
            "type": "number",
            "description": "PubChem Compound ID."
          },
          "ghs": {
            "type": "object",
            "required": [
              "pictograms",
              "hazardStatements",
              "precautionaryStatements",
              "classifications"
            ],
            "properties": {
              "pictograms": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "GHS pictogram labels (e.g. \"Flammable\", \"Acute Toxic\"), union across classifications."
              },
              "signalWord": {
                "type": "string",
                "description": "GHS signal word, \"Danger\" or \"Warning\": the most severe any classification assigns. Omitted when none assigns one."
              },
              "classifications": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "pictograms",
                    "hazardCodes"
                  ],
                  "properties": {
                    "source": {
                      "type": "string",
                      "description": "Depositing source (e.g. \"European Chemicals Agency (ECHA)\", \"NITE-CMC\"). Omitted when PubChem names no reference for the classification."
                    },
                    "pictograms": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "This classification's pictogram labels."
                    },
                    "signalWord": {
                      "type": "string",
                      "description": "This classification's signal word. Omitted when the source assigns none."
                    },
                    "hazardCodes": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "code"
                        ],
                        "properties": {
                          "code": {
                            "type": "string",
                            "description": "H-code (e.g. \"H319\"). Statement text is in the top-level hazardStatements."
                          },
                          "agreement": {
                            "type": "string",
                            "description": "Share of notifying companies that assigned this code, exactly as PubChem prints it (e.g. \"37.7%\", \"> 99.9%\"). Present only where PubChem prints one beside the code, which is ECHA C&L classifications; read it against \"notifications\" — a single-company notification reports 100%."
                          }
                        },
                        "description": "Hazard code assigned by this classification.",
                        "additionalProperties": false
                      },
                      "description": "Hazard codes this classification assigns. Empty for a \"Not Classified\" verdict."
                    },
                    "sourceRecord": {
                      "type": "string",
                      "description": "The source's own record title (e.g. \"Ethanol - FY2013 (Revised classification)\", \"Ethanol (EC: 200-578-6)\"). Tells revisions of one source, and the ECHA C&L aggregate from single-company ECHA notifications, apart."
                    },
                    "notClassified": {
                      "type": "boolean",
                      "description": "True when this classification is ECHA's \"Not Classified\" verdict: notifiers assessed the compound and found it meets no GHS hazard criteria. Omitted otherwise."
                    },
                    "notifications": {
                      "type": "string",
                      "description": "Notifier counts behind an ECHA classification: the first line of ECHA's C&L notifications summary (e.g. \"Aggregated GHS information provided per 13886 reports by companies from 79 notifications…\"), or for a \"Not Classified\" verdict the verdict line (e.g. \"Reported as not meeting GHS hazard criteria by 188 of 203 companies…\"). Omitted for sources that deposit no counts."
                    }
                  },
                  "description": "One source's GHS classification, kept whole.",
                  "additionalProperties": false
                },
                "description": "Each source's classification in PubChem's order — EU harmonised, the ECHA C&L aggregate, single-company ECHA notifications, NITE-CMC revisions, and others. Sources can disagree; the top-level fields merge them."
              },
              "hazardStatements": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "code",
                    "statement"
                  ],
                  "properties": {
                    "code": {
                      "type": "string",
                      "description": "H-code (e.g. \"H225\")."
                    },
                    "statement": {
                      "type": "string",
                      "description": "Hazard statement text."
                    }
                  },
                  "description": "GHS hazard statement entry.",
                  "additionalProperties": false
                },
                "description": "GHS hazard statements, union across classifications. A code here may come from a single source — see classifications for which source assigned it and with what notifier agreement."
              },
              "precautionaryStatements": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "code",
                    "statement",
                    "decoded"
                  ],
                  "properties": {
                    "code": {
                      "type": "string",
                      "description": "P-code (e.g. \"P210\")."
                    },
                    "decoded": {
                      "type": "boolean",
                      "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."
                    },
                    "statement": {
                      "type": "string",
                      "description": "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."
                    }
                  },
                  "description": "GHS precautionary statement entry.",
                  "additionalProperties": false
                },
                "description": "GHS precautionary statements, union across classifications."
              }
            },
            "description": "GHS classification data.",
            "additionalProperties": false
          },
          "source": {
            "type": "string",
            "description": "Sources that deposited a GHS classification, in PubChem's order, joined with \"; \"."
          },
          "status": {
            "enum": [
              "ok",
              "not_classified",
              "no_ghs_data",
              "cid_not_found"
            ],
            "type": "string",
            "description": "Outcome for this CID. \"ok\": GHS hazard classification returned. \"not_classified\": every deposited classification is an ECHA \"Not Classified\" verdict — notifiers assessed the compound and found it meets no GHS hazard criteria; the verdicts and their notifier counts are in ghs.classifications. \"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."
          },
          "hasData": {
            "type": "boolean",
            "description": "Whether a GHS classification is on file for this compound (status \"ok\" or \"not_classified\"); \"ghs\" is present exactly when this is true."
          }
        },
        "description": "Per-CID safety result.",
        "additionalProperties": false
      },
      "description": "Safety results, one per CID looked up (input order preserved). CIDs past the per-call cap are in unprocessed instead."
    },
    "unprocessed": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "CIDs past the per-call cap of 25, in input order, not looked up. Pass them in a follow-up call. Omitted when every CID was looked up."
    },
    "cappedInputs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "input",
          "requested",
          "served"
        ],
        "properties": {
          "input": {
            "type": "string",
            "description": "Input name, e.g. \"maxResults\" or \"cids\"."
          },
          "served": {
            "type": "number",
            "description": "Value served: the per-call cap."
          },
          "requested": {
            "type": "number",
            "description": "Value requested: the page size, or the number of IDs in the batch."
          },
          "unprocessed": {
            "type": "number",
            "description": "ID batches only: IDs past the cap, listed in unprocessed in input order."
          }
        },
        "description": "One input served at its per-call cap.",
        "additionalProperties": false
      },
      "description": "Inputs that asked for more than their per-call cap, with the value requested and the value served. An ID batch lists the IDs past the cap in unprocessed. Omitted when every input was within its cap."
    },
    "withDataCount": {
      "type": "number",
      "description": "CIDs with a GHS classification on file (status \"ok\" or \"not_classified\")."
    },
    "requestedCount": {
      "type": "number",
      "description": "CIDs requested, including any past the per-call cap left in unprocessed."
    }
  },
  "additionalProperties": false
}
pubchem_get_compound_safety annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
pubchem_get_bioactivity — Get Bioactivity
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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

pubchem_get_bioactivity input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "cid"
  ],
  "properties": {
    "cid": {
      "type": "integer",
      "maximum": 2147483647,
      "minimum": 1,
      "description": "PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds."
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "maximum": 9007199254740991,
      "minimum": 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."
    },
    "assayType": {
      "type": "array",
      "items": {
        "enum": [
          "confirmatory",
          "screening",
          "summary",
          "other"
        ],
        "type": "string"
      },
      "minItems": 1,
      "description": "Keep only assays of these types: \"confirmatory\" (dose-response and other follow-up assays), \"screening\" (primary high-throughput screens), \"summary\" (records summarizing a project's assays), \"other\". Matched against PubChem's Assay Type regardless of case; an assay with no recorded type matches none. Combines with outcomeFilter and the target filters — an assay must pass all of them. Omit to keep every type."
    },
    "maxResults": {
      "type": "integer",
      "default": 20,
      "maximum": 1000,
      "minimum": 1,
      "description": "Max assay results to return per page. The per-call cap is 100: a larger value (up to 1000) returns a page of 100 and is reported in cappedInputs. Well-studied compounds have thousands of records; use offset to reach the ones past this page. Default: 20."
    },
    "targetGeneId": {
      "type": "integer",
      "maximum": 2147483647,
      "minimum": 1,
      "description": "Filter to assays against this NCBI Gene ID (1 to 2147483647), including assays recorded only under a protein accession this compound's assay table pairs with the Gene ID (e.g. 5742 also reaches rows carrying only P23219 when another row pairs the two). Obtain Gene IDs from the GeneID:N in a pubchem_get_compound_interactions target entry's partner (kinds: [\"target\"]) or the targetGeneId field of a result here without a target filter (rows from untargeted screens carry none). Combine with outcomeFilter=\"active\" to answer \"is this compound active against target T?\"."
    },
    "outcomeFilter": {
      "enum": [
        "active",
        "inactive",
        "all"
      ],
      "type": "string",
      "default": "all",
      "description": "Filter by activity outcome against each assay's reported target: the target a target filter matched, else the first target the assay lists. For a multi-target assay, outcomes against its other targets (in otherTargets) do not count. \"active\" keeps assays where that outcome is Active — most useful for understanding biological profile. Default: \"all\"."
    },
    "targetAccession": {
      "type": "string",
      "description": "Filter to assays against this target protein accession (UniProt/RefSeq/GenBank/PDB chain), e.g. \"P35354\", including assays recorded only under a Gene ID or another accession this compound's assay table pairs with it. Uppercased before matching; a PDB chain ID (the \"A\" in \"1ZHH_A\") is kept as given. With targetGeneId, both must name the same target — when the table ties them to different targets, nothing matches. Obtain accessions from an assay's targets in pubchem_get_summary (entityType \"assay\"), the accession:X in a pubchem_get_compound_interactions target entry's partner, or the targetAccession field of a result here without a target filter."
    }
  },
  "additionalProperties": false
}
pubchem_get_bioactivity output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "cid",
        "totalAssays",
        "activeCount",
        "inactiveCount",
        "results",
        "outcomeFilter",
        "filteredCount",
        "returnedCount",
        "offset"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "cap": {
      "type": "number",
      "description": "The page size applied: maxResults, or the per-call cap when maxResults exceeds it."
    },
    "cid": {
      "type": "number",
      "description": "PubChem Compound ID."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "shown": {
      "type": "number",
      "description": "Assays returned on this page."
    },
    "notice": {
      "type": "string",
      "description": "Recovery guidance when the filter yields no results or the compound has no bioactivity data."
    },
    "offset": {
      "type": "number",
      "description": "Zero-based index of the first assay returned."
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "aid",
          "assayName",
          "outcome",
          "activityValues"
        ],
        "properties": {
          "aid": {
            "type": "number",
            "description": "PubChem Assay ID."
          },
          "pmids": {
            "type": "array",
            "items": {
              "type": "number"
            },
            "description": "PubMed IDs of the publications the assay cites, highest (most recently assigned) first. Omitted when it cites none."
          },
          "outcome": {
            "type": "string",
            "description": "Activity outcome against the reported target — the one a target filter matched, else the assay's first: Active, Inactive, Inconclusive, Unspecified."
          },
          "assayName": {
            "type": "string",
            "description": "Assay name/title."
          },
          "assayType": {
            "type": "string",
            "description": "PubChem's assay type as written: Confirmatory, Screening, Summary, or Other. Omitted when PubChem records none."
          },
          "otherTargets": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "outcome",
                "activityValues"
              ],
              "properties": {
                "geneId": {
                  "type": "number",
                  "description": "NCBI Gene ID. Omitted when the row names none."
                },
                "outcome": {
                  "type": "string",
                  "description": "Activity outcome against this target."
                },
                "accession": {
                  "type": "string",
                  "description": "Protein accession. Omitted when the row names none."
                },
                "activityValues": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "value"
                    ],
                    "properties": {
                      "name": {
                        "type": "string",
                        "description": "Measurement name (e.g. IC50, EC50, Ki). Omitted when not reported."
                      },
                      "unit": {
                        "type": "string",
                        "description": "Unit of measurement (e.g. uM, nM). Omitted when not reported."
                      },
                      "value": {
                        "type": "number",
                        "description": "Measured value."
                      }
                    },
                    "description": "Quantitative activity measurement entry.",
                    "additionalProperties": false
                  },
                  "description": "Quantitative activity measurements against this target."
                }
              },
              "description": "Another target of the assay, with its own outcome and values.",
              "additionalProperties": false
            },
            "description": "The assay's other targets, each with its own outcome and measurements. Present only for an assay whose rows name more than one target."
          },
          "targetGeneId": {
            "type": "number",
            "description": "Reported target's NCBI Gene ID."
          },
          "activityValues": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "value"
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Measurement name (e.g. IC50, EC50, Ki). Omitted when not reported."
                },
                "unit": {
                  "type": "string",
                  "description": "Unit of measurement (e.g. uM, nM). Omitted when not reported."
                },
                "value": {
                  "type": "number",
                  "description": "Measured value."
                }
              },
              "description": "Quantitative activity measurement entry.",
              "additionalProperties": false
            },
            "description": "Quantitative activity measurements against the reported target."
          },
          "targetAccession": {
            "type": "string",
            "description": "Reported target's protein accession (UniProt/RefSeq/GenBank/PDB chain)."
          }
        },
        "description": "Assay result entry.",
        "additionalProperties": false
      },
      "description": "Assay results matching the filter."
    },
    "truncated": {
      "type": "boolean",
      "description": "True when matching assays remain past this page."
    },
    "nextOffset": {
      "type": "number",
      "description": "Offset to pass on the next call to continue past this page. Omitted when no further assays match."
    },
    "activeCount": {
      "type": "number",
      "description": "Assays whose outcome against their first listed target is \"Active\", across all assays and before any filter. A multi-target assay counts by its first target only."
    },
    "totalAssays": {
      "type": "number",
      "description": "Total unique assays for this compound."
    },
    "cappedInputs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "input",
          "requested",
          "served"
        ],
        "properties": {
          "input": {
            "type": "string",
            "description": "Input name, e.g. \"maxResults\" or \"cids\"."
          },
          "served": {
            "type": "number",
            "description": "Value served: the per-call cap."
          },
          "requested": {
            "type": "number",
            "description": "Value requested: the page size, or the number of IDs in the batch."
          },
          "unprocessed": {
            "type": "number",
            "description": "ID batches only: IDs past the cap, listed in unprocessed in input order."
          }
        },
        "description": "One input served at its per-call cap.",
        "additionalProperties": false
      },
      "description": "Inputs that asked for more than their per-call cap, with the value requested and the value served. An ID batch lists the IDs past the cap in unprocessed. Omitted when every input was within its cap."
    },
    "targetFilter": {
      "type": "string",
      "description": "Target identifiers matched, when a target filter is set: those passed plus every Gene ID and accession the compound's assay table pairs with them. When the two inputs name different targets, only the two inputs."
    },
    "filteredCount": {
      "type": "number",
      "description": "Exact number of assays matching the outcome, target, and assay-type filters, across all pages."
    },
    "inactiveCount": {
      "type": "number",
      "description": "Assays whose outcome against their first listed target is \"Inactive\", across all assays and before any filter. A multi-target assay counts by its first target only."
    },
    "outcomeFilter": {
      "type": "string",
      "description": "Outcome filter applied: active, inactive, or all."
    },
    "returnedCount": {
      "type": "number",
      "description": "Assays returned on this page."
    },
    "assayTypeFilter": {
      "type": "string",
      "description": "Assay types kept, comma-separated (e.g. \"confirmatory, summary\"), when assayType is set."
    }
  },
  "additionalProperties": false
}
pubchem_get_bioactivity annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
pubchem_get_compound_interactions — Get Compound Interactions
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Get a compound's interaction data: drug-food interactions, and the molecular targets its bioassays name — one entry per target as kinds defines it, with its assay counts by outcome and most potent active value, Active targets first, most potent first. Each entry carries its originating source. Results are paged per kind, with the record total and the next offset reported for each. Drug-food coverage is richest for approved drugs; target covers any compound PubChem has assay data for, and pubchem_get_bioactivity lists one target's assays when given the entry's GeneID or accession. Drug-drug interactions (DrugBank) are unavailable while PubChem's SDQ service refuses automated requests: an explicit drug-drug request is reported in failedKinds while the other kinds still return.

pubchem_get_compound_interactions input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "cid"
  ],
  "properties": {
    "cid": {
      "type": "integer",
      "maximum": 2147483647,
      "minimum": 1,
      "description": "PubChem Compound ID. Resolve from name/SMILES with pubchem_search_compounds."
    },
    "kinds": {
      "type": "array",
      "items": {
        "enum": [
          "drug-drug",
          "drug-food",
          "target"
        ],
        "type": "string"
      },
      "default": [
        "drug-food"
      ],
      "minItems": 1,
      "description": "Interaction kinds to fetch. \"drug-food\" (dietary interactions, from PUG View), \"target\" (molecular targets from the compound's assay summary: one entry per Gene ID with the accessions the table pairs with it, and one per identifier it never pairs, so a Gene ID and an accession that no row pairs are separate entries even when they name the same protein), \"drug-drug\" (interactions with other drugs, from PubChem's SDQ service, which refuses automated requests, so it is reported in failedKinds). Default: [\"drug-food\"]."
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "maximum": 2147483646,
      "minimum": 0,
      "description": "Zero-based start position within each requested kind, counted in records (molecular targets, for target) 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": {
      "type": "integer",
      "default": 10,
      "maximum": 1000,
      "minimum": 1,
      "description": "Max entries per kind per page. The per-call cap is 50: a larger value (up to 1000) reads a page of 50 per kind and is reported in cappedInputs. Well-studied drugs have a long tail of interactions; use offset to reach the ones past this page. Default: 10."
    }
  },
  "additionalProperties": false
}
pubchem_get_compound_interactions output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "cid",
        "entries",
        "paging",
        "requestedKinds",
        "returnedCount",
        "truncated",
        "offset"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "cid": {
      "type": "number",
      "description": "PubChem Compound ID."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "notice": {
      "type": "string",
      "description": "Guidance when a kind failed, when no interaction data was found, when the offset runs past every requested kind, when target names could not be retrieved, or when further pages remain. Absent when this page is complete and every kind resolved."
    },
    "offset": {
      "type": "number",
      "description": "Zero-based start position read within each requested kind."
    },
    "paging": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "kind",
          "returnedCount",
          "totalRecords",
          "truncated"
        ],
        "properties": {
          "kind": {
            "enum": [
              "drug-drug",
              "drug-food",
              "target"
            ],
            "type": "string",
            "description": "Interaction category this page covers."
          },
          "truncated": {
            "type": "boolean",
            "description": "True when source records remain for this kind past the current page."
          },
          "nextOffset": {
            "type": "number",
            "description": "Offset to pass on the next call to continue this kind past the current page. Omitted when no records remain."
          },
          "totalRecords": {
            "type": "number",
            "description": "Records available for this kind, across all pages: interaction records for drug-drug and drug-food, molecular targets for target. Entries are derived from these records and can be fewer: a drug-drug record carrying no statement yields nothing. Pages divide the records, not the entries."
          },
          "returnedCount": {
            "type": "number",
            "description": "Interaction entries returned for this kind."
          }
        },
        "description": "Page position for one interaction kind.",
        "additionalProperties": false
      },
      "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."
    },
    "entries": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "kind",
          "source",
          "text"
        ],
        "properties": {
          "kind": {
            "enum": [
              "drug-drug",
              "drug-food",
              "target"
            ],
            "type": "string",
            "description": "Interaction category."
          },
          "text": {
            "type": "string",
            "description": "The interaction statement. For a target: the assays naming it by outcome and its most potent Active value with that AID, in µM."
          },
          "source": {
            "type": "string",
            "description": "Originating source (e.g. \"DrugBank\", \"PubChem BioAssay\")."
          },
          "partner": {
            "type": "string",
            "description": "Interacting compound as the source reports it. For a target: its gene or protein name and organism, then the identifier pubchem_get_bioactivity filters on (GeneID:N → targetGeneId, accession:X → targetAccession); the identifier alone when no name resolves. A target whose identifiers join several Gene IDs is named by the accession they share and says \"group of N Gene IDs\"."
          }
        },
        "description": "A single interaction entry.",
        "additionalProperties": false
      },
      "description": "Interaction entries across the requested kinds."
    },
    "truncated": {
      "type": "boolean",
      "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."
    },
    "nextOffset": {
      "type": "number",
      "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."
    },
    "failedKinds": {
      "type": "string",
      "description": "Interaction kinds that could not be retrieved (comma-separated). The returned entries cover the kinds that succeeded. The notice says, per failed kind, whether a retry can help: a timeout, rate limit, network error, unreadable response, or upstream 5xx other than 501 can clear, while an HTTP 400, 403, or 501, a response in a shape the server does not expect, or a refusal from PubChem's SDQ service (drug-drug) does not."
    },
    "cappedInputs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "input",
          "requested",
          "served"
        ],
        "properties": {
          "input": {
            "type": "string",
            "description": "Input name, e.g. \"maxResults\" or \"cids\"."
          },
          "served": {
            "type": "number",
            "description": "Value served: the per-call cap."
          },
          "requested": {
            "type": "number",
            "description": "Value requested: the page size, or the number of IDs in the batch."
          },
          "unprocessed": {
            "type": "number",
            "description": "ID batches only: IDs past the cap, listed in unprocessed in input order."
          }
        },
        "description": "One input served at its per-call cap.",
        "additionalProperties": false
      },
      "description": "Inputs that asked for more than their per-call cap, with the value requested and the value served. An ID batch lists the IDs past the cap in unprocessed. Omitted when every input was within its cap."
    },
    "returnedCount": {
      "type": "number",
      "description": "Total interaction entries returned across all kinds."
    },
    "requestedKinds": {
      "type": "string",
      "description": "Interaction kinds requested (comma-separated)."
    }
  },
  "additionalProperties": false
}
pubchem_get_compound_interactions annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
pubchem_search_assays — Search Assays
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

pubchem_search_assays input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "targetType",
    "targetQuery"
  ],
  "properties": {
    "offset": {
      "type": "integer",
      "default": 0,
      "maximum": 9007199254740991,
      "minimum": 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."
    },
    "maxResults": {
      "type": "integer",
      "default": 50,
      "maximum": 1000,
      "minimum": 1,
      "description": "Max AIDs to return per page. The per-call cap is 200: a larger value (up to 1000) returns a page of 200 and is reported in cappedInputs. Popular targets may have thousands of assays; use offset to reach the ones past this page. Default: 50."
    },
    "targetType": {
      "enum": [
        "genesymbol",
        "proteinname",
        "geneid",
        "proteinaccession"
      ],
      "type": "string",
      "description": "Target identifier type. \"genesymbol\" and \"proteinname\" accept text names; a genesymbol matches the symbol case-insensitively across species, so a human symbol also returns assays on other species' orthologs. \"geneid\" accepts NCBI Gene IDs. \"proteinaccession\" accepts UniProt accessions. \"geneid\" and \"proteinaccession\" each pin one protein, but return overlapping, different assay sets for it, since PubChem records some assays under only one of the two identifiers; for a complete list for one protein, union both."
    },
    "targetQuery": {
      "type": "string",
      "description": "Target identifier. Examples: \"EGFR\" (genesymbol), \"Epidermal growth factor receptor\" (proteinname), \"1956\" (geneid), \"P00533\" (proteinaccession; uppercased before lookup, except a PDB chain ID such as the \"A\" in \"1ZHH_A\", which is kept as given)."
    }
  },
  "additionalProperties": false
}
pubchem_search_assays output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "aids",
        "targetType",
        "targetQuery",
        "totalFound",
        "offset"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "cap": {
      "type": "number",
      "description": "The page size applied: maxResults, or the per-call cap when maxResults exceeds it."
    },
    "aids": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "PubChem Assay IDs."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "blank_target_query",
                "invalid_geneid_query",
                "target_query_rejected"
              ],
              "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 contains characters other than digits. `target_query_rejected`: PubChem refused the target lookup with HTTP 400 — its answer for a targetQuery carrying a line break, another C0 control character other than tab and NUL, or DEL. Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "shown": {
      "type": "number",
      "description": "AIDs returned on this page."
    },
    "notice": {
      "type": "string",
      "description": "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": {
      "type": "number",
      "description": "Zero-based index of the first AID returned."
    },
    "truncated": {
      "type": "boolean",
      "description": "True when matching AIDs remain past this page."
    },
    "nextOffset": {
      "type": "number",
      "description": "Offset to pass on the next call to continue past this page. Omitted when no further AIDs match."
    },
    "targetType": {
      "type": "string",
      "description": "Target identifier type used: genesymbol, proteinname, geneid, or proteinaccession."
    },
    "totalFound": {
      "type": "number",
      "description": "Total AIDs found for this target, across all pages."
    },
    "targetQuery": {
      "type": "string",
      "description": "Target identifier searched."
    },
    "cappedInputs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "input",
          "requested",
          "served"
        ],
        "properties": {
          "input": {
            "type": "string",
            "description": "Input name, e.g. \"maxResults\" or \"cids\"."
          },
          "served": {
            "type": "number",
            "description": "Value served: the per-call cap."
          },
          "requested": {
            "type": "number",
            "description": "Value requested: the page size, or the number of IDs in the batch."
          },
          "unprocessed": {
            "type": "number",
            "description": "ID batches only: IDs past the cap, listed in unprocessed in input order."
          }
        },
        "description": "One input served at its per-call cap.",
        "additionalProperties": false
      },
      "description": "Inputs that asked for more than their per-call cap, with the value requested and the value served. An ID batch lists the IDs past the cap in unprocessed. Omitted when every input was within its cap."
    }
  },
  "additionalProperties": false
}
pubchem_search_assays annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
pubchem_get_summary — Get Entity Summary
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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; identifiers past that are returned in unprocessed for a follow-up call.

pubchem_get_summary input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "entityType",
    "identifiers"
  ],
  "properties": {
    "entityType": {
      "enum": [
        "assay",
        "gene",
        "protein",
        "taxonomy"
      ],
      "type": "string",
      "description": "Entity type. Determines ID format and returned fields."
    },
    "identifiers": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Entity identifier, or several joined with commas."
      },
      "maxItems": 1000,
      "minItems": 1,
      "description": "Entity identifiers. A comma-joined string is split into one identifier per piece, with whitespace trimmed. The per-call cap is 10 pieces: the first 10 are looked up, and any past that are returned in unprocessed, in input order, and reported in cappedInputs. More than 1000 pieces in all fails the call. ID form depends on entityType:\n- assay: AID, a positive integer, e.g. [\"1000\"]\n- gene: NCBI Gene ID, a positive integer, e.g. [\"1956\"]\n- protein: UniProt accession, e.g. [\"P00533\"]\n- taxonomy: NCBI Taxonomy ID, a positive integer, e.g. [\"9606\"]\nFor assay, gene, and taxonomy, a piece that is not a positive integer up to 2147483647 written in digits is marked invalid and not looked up."
    }
  },
  "additionalProperties": false
}
pubchem_get_summary output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "entityType",
        "summaries",
        "requestedCount",
        "foundCount"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "too_many_identifiers",
                "invalid_identifier"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `too_many_identifiers`: Comma splitting yields more than 1000 identifier pieces. `invalid_identifier`: No identifier piece is usable: every piece is blank, or, for assay, gene, or taxonomy, not a positive integer up to 2147483647. Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "notice": {
      "type": "string",
      "description": "Recovery guidance when identifiers were invalid or not found."
    },
    "summaries": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "identifier",
          "found"
        ],
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "aid": {
                "type": "number",
                "description": "Assay ID — present on assay summaries."
              },
              "name": {
                "type": "string",
                "description": "Primary display name."
              },
              "rank": {
                "type": "string",
                "description": "Taxonomic rank (taxonomy summaries)."
              },
              "geneId": {
                "type": "number",
                "description": "NCBI Gene ID (gene summaries)."
              },
              "method": {
                "type": "string",
                "description": "Assay method as PubChem labels it (assay summaries): \"confirmatory\" (dose-response), \"screening\" (primary screen), \"summary\", or \"other\". Omitted when PubChem records none."
              },
              "symbol": {
                "type": "string",
                "description": "Gene symbol (gene summaries)."
              },
              "lineage": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "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."
              },
              "targets": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Target name."
                    },
                    "accession": {
                      "type": "string",
                      "description": "Target protein or gene accession."
                    }
                  },
                  "description": "Assay target.",
                  "additionalProperties": false
                },
                "description": "Assay targets, the first 25 PubChem lists (assay summaries); targetCount gives the full number."
              },
              "synonyms": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Known synonyms / other names."
              },
              "taxonomy": {
                "type": "string",
                "description": "Taxonomy scientific name (gene/protein summaries)."
              },
              "numActive": {
                "type": "number",
                "description": "Substances marked active (assay summaries)."
              },
              "commonName": {
                "type": "string",
                "description": "Common name (taxonomy summaries)."
              },
              "sourceName": {
                "type": "string",
                "description": "Data source attribution (assay summaries)."
              },
              "taxonomyId": {
                "type": "number",
                "description": "NCBI Taxonomy ID (gene/protein/taxonomy summaries)."
              },
              "description": {
                "type": "string",
                "description": "Descriptive text when available."
              },
              "targetCount": {
                "type": "number",
                "description": "Number of targets PubChem lists for the assay (assay summaries)."
              },
              "numCompounds": {
                "type": "number",
                "description": "Compounds (CIDs) tested (assay summaries). List them with pubchem_search_compounds searchType \"assay\" and activeOnly: false — its default lists only the actives."
              },
              "numSubstances": {
                "type": "number",
                "description": "Substances tested (assay summaries)."
              },
              "lastDataChange": {
                "type": "string",
                "description": "Date the assay's data last changed, YYYY-MM-DD (assay summaries)."
              },
              "scientificName": {
                "type": "string",
                "description": "Scientific name (taxonomy summaries)."
              },
              "proteinAccession": {
                "type": "string",
                "description": "Protein accession (protein summaries)."
              },
              "numActiveCompounds": {
                "type": "number",
                "description": "Compounds (CIDs) the assay marked active (assay summaries)."
              }
            },
            "description": "Entity summary data. Populated fields depend on entityType.",
            "additionalProperties": false
          },
          "found": {
            "type": "boolean",
            "description": "Whether the entity was found."
          },
          "invalid": {
            "type": "boolean",
            "description": "True when the identifier is not in the form entityType expects; it was not looked up. Omitted otherwise."
          },
          "identifier": {
            "anyOf": [
              {
                "type": "string",
                "description": "String identifier (e.g. UniProt accession)."
              },
              {
                "type": "number",
                "description": "Numeric identifier (e.g. AID, Gene ID, Tax ID)."
              }
            ],
            "description": "Queried identifier: a number for assay, gene, and taxonomy; the accession for protein; the piece as sent when invalid."
          }
        },
        "description": "Per-identifier summary result.",
        "additionalProperties": false
      },
      "description": "Summary results, one per identifier piece looked up, in input order."
    },
    "entityType": {
      "type": "string",
      "description": "Entity type queried."
    },
    "foundCount": {
      "type": "number",
      "description": "Identifiers resolved to a summary."
    },
    "unprocessed": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifier pieces past the per-call cap of 10, in input order, not looked up. Pass them in a follow-up call. Omitted when every piece was served."
    },
    "cappedInputs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "input",
          "requested",
          "served"
        ],
        "properties": {
          "input": {
            "type": "string",
            "description": "Input name, e.g. \"maxResults\" or \"cids\"."
          },
          "served": {
            "type": "number",
            "description": "Value served: the per-call cap."
          },
          "requested": {
            "type": "number",
            "description": "Value requested: the page size, or the number of IDs in the batch."
          },
          "unprocessed": {
            "type": "number",
            "description": "ID batches only: IDs past the cap, listed in unprocessed in input order."
          }
        },
        "description": "One input served at its per-call cap.",
        "additionalProperties": false
      },
      "description": "Inputs that asked for more than their per-call cap, with the value requested and the value served. An ID batch lists the IDs past the cap in unprocessed. Omitted when every input was within its cap."
    },
    "requestedCount": {
      "type": "number",
      "description": "Identifier pieces requested, counted after comma splitting."
    }
  },
  "additionalProperties": false
}
pubchem_get_summary annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}

Prompts

0 advertised

No prompt definitions available.

Resources

1 advertised

pubchem-guide

Advertised by the server during the last successful anonymous check.

Gates and identifier chains for the pubchem_* tools — salt vs parent CIDs, where Gene IDs and accessions come from, why gene-symbol, Gene ID, and accession searches disagree, and how to read PubChem activity labels, potency values, and GHS data without over-concluding. Use when answering a compound identity, hazard, mechanism, potency, or target-assay question through pubchem_*.

pubchem-guide URI
skill://pubchem-guide/SKILL.md

MIME type: text/markdown

pubchem-compound — pubchem-compound

Advertised by the server during the last successful anonymous check.

Core physicochemical properties for a PubChem compound by CID. Use pubchem_get_compound_details to select properties or add descriptions, synonyms, drug-likeness, and classification.

pubchem-compound URI template
pubchem://compound/{cid}

MIME type: application/json

pubchem-compound-safety — pubchem-compound-safety

Advertised by the server during the last successful anonymous check.

GHS hazard classification for a PubChem compound by CID — signal word, pictograms, hazard (H) and precautionary (P) statements merged across sources, plus each source's own classification (signal word, pictograms, H-codes with ECHA notifier agreement, notification counts) in ghs.classifications. status is "not_classified" when every deposited classification is an ECHA "Not Classified" verdict. Not every compound carries a deposited classification.

pubchem-compound-safety URI template
pubchem://compound/{cid}/safety

MIME type: application/json

pubchem-compound-image — pubchem-compound-image

Advertised by the server during the last successful anonymous check.

A 2D structure diagram (PNG, 300x300) for a PubChem compound by CID. Use pubchem_get_compound_image to choose the image size.

pubchem-compound-image URI template
pubchem://compound/{cid}/image

MIME type: image/png

pubchem-compound-xrefs — pubchem-compound-xrefs

Advertised by the server during the last successful anonymous check.

External cross-references for a PubChem compound by CID, up to 25 per type: RN (every registry number PubChem associates with the record, unranked — deprecated and related CAS RNs and EC numbers sit beside the compound's own), registry IDs, PubMed IDs (the 25 highest, most recently assigned, highest first), and CAS (the deposited CAS numbers, most-attested first, with sourceCounts aligned to ids — the number of source records that deposited each). Types with no IDs are left out; a type that failed to load is named in failedTypes. Use pubchem_get_compound_xrefs for the full set of xref types, a higher per-type cap, and to page through the rest with offset.

pubchem-compound-xrefs URI template
pubchem://compound/{cid}/xrefs

MIME type: application/json

pubchem-compound-bioactivity — pubchem-compound-bioactivity

Advertised by the server during the last successful anonymous check.

Bioassay activity profile for a PubChem compound by CID. Returns up to 25 assays, each with its assay type and the PubMed IDs it cites; use pubchem_get_bioactivity to filter by outcome, molecular target, or assay type, raise the cap, and page through the rest with offset.

pubchem-compound-bioactivity URI template
pubchem://compound/{cid}/bioactivity

MIME type: application/json

pubchem-assay — pubchem-assay

Advertised by the server during the last successful anonymous check.

Summary for a PubChem BioAssay by AID — name, description, source, protocol, and substance counts.

pubchem-assay URI template
pubchem://assay/{aid}

MIME type: application/json

io.modelcontextprotocol/skills

Advertised by the server during the last successful anonymous check.

io.modelcontextprotocol/skills URI template
skill://{+path}

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
587 ms
95th percentile latency
587 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 587 ms · metadata changed · 10 tool(s), 1 resource(s), 7 resource template(s), 0 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http pubchem-mcp-server-caseyjhand https://pubchem.caseyjhand.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add pubchem-mcp-server-caseyjhand --url https://pubchem.caseyjhand.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable pubchem-mcp-server-caseyjhand in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "pubchem-mcp-server-caseyjhand": {
      "url": "https://pubchem.caseyjhand.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "pubchem-mcp-server-caseyjhand": {
      "type": "streamableHttp",
      "url": "https://pubchem.caseyjhand.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start pubchem-mcp-server-caseyjhand and inspect its tools.
VS Code configuration
{
  "servers": {
    "pubchem-mcp-server-caseyjhand": {
      "type": "http",
      "url": "https://pubchem.caseyjhand.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http pubchem-mcp-server-caseyjhand https://pubchem.caseyjhand.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://pubchem.caseyjhand.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "pubchem-mcp-server-caseyjhand": {
      "serverUrl": "https://pubchem.caseyjhand.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like pubchem-mcp-server from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.