Skip to main content
Glama

chembl-get-drug-info

chembl_get_drug_info
Read-onlyIdempotent

Pharmacology for a drug (molecule): mechanism(s) of action, the molecular target(s) it acts on, action type (inhibitor / agonist / …), first-approval year, and clinical indications with the max phase reached for each. Supply molecule_chembl_id (from chembl_search_molecules). Distinct from the openfda server's label/adverse-event view — this is the curated mechanism-and-indication record. A mechanism's target_chembl_id chains into chembl_get_bioactivities for compounds hitting the same target. Each list carries its own retrieval state: an empty mechanisms or indications array means the molecule has none recorded only when the matching mechanisms_status / indications_status is "complete" — "failed" means the upstream request was rejected and the array says nothing about the molecule, and "truncated" means the page cap bounded the list at fewer rows than the matching *_total_count.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
molecule_chembl_idYesChEMBL molecule ID (from chembl_search_molecules), e.g. "CHEMBL939" for gefitinib.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
errorNoPresent when the call failed. Absent on success.
noticeNoDisclosure of anything the two lists do not say for themselves: a list whose upstream fetch failed (so its emptiness means nothing), a list the page cap bounded, or — only when both lists came back complete and empty — that the molecule may be a research compound rather than a drug.
max_phaseNoMax clinical phase across indications: 4 = marketed. Null when unknown.
pref_nameNoPreferred drug name, e.g. "GEFITINIB". Null when unnamed.
mechanismsNoMechanisms of action. Empty is authoritative only when mechanisms_status is "complete".
indicationsNoClinical indications. Empty is authoritative only when indications_status is "complete".
first_approvalNoYear of first approval, e.g. 2003. Null when unapproved or unknown.
mechanisms_statusNoRetrieval state of the mechanism list. "complete" = every row ChEMBL records is present, so an empty array is a fact about the molecule. "truncated" = the single-request page cap bounded the list, so the array is a prefix of mechanisms_total_count rows. "failed" = the upstream request was rejected, so the empty array is unknown data, NOT evidence that none exist — re-call chembl_get_drug_info to retry.
indications_statusNoRetrieval state of the indication list. "complete" = every row ChEMBL records is present, so an empty array is a fact about the molecule. "truncated" = the single-request page cap bounded the list, so the array is a prefix of indications_total_count rows. "failed" = the upstream request was rejected, so the empty array is unknown data, NOT evidence that none exist — re-call chembl_get_drug_info to retry.
molecule_chembl_idNoThe ChEMBL molecule ID queried.
mechanisms_total_countNoTotal mechanism rows ChEMBL holds for this molecule (upstream page_meta.total_count). Exceeds the returned array length exactly when the status is "truncated". Null when the fetch failed — the count is unknown, never 0.
indications_total_countNoTotal indication rows ChEMBL holds for this molecule (upstream page_meta.total_count). Exceeds the returned array length exactly when the status is "truncated". Null when the fetch failed — the count is unknown, never 0.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: ChEMBL has no record for the requested identifier or structure. `rate_limited`: ChEMBL rate-limits the upstream request. Other values are possible when a failure originates below the handler."
    • addedOutput schema / properties / error / properties / data / properties / reason / examples
      Added value: +[
      +  "not_found",
      +  "rate_limited"
      +]
  2. Changed22 schema fields changed
    • removedOutput schema / properties / first_approval / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / first_approval / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / indications / items / properties / efo_term / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / indications / items / properties / efo_term / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / indications / items / properties / max_phase_for_ind / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / indications / items / properties / max_phase_for_ind / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / indications / items / properties / mesh_heading / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / indications / items / properties / mesh_heading / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / indications_total_count / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / indications_total_count / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / max_phase / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / max_phase / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / mechanisms / items / properties / action_type / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / mechanisms / items / properties / action_type / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / mechanisms / items / properties / mechanism_of_action / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / mechanisms / items / properties / mechanism_of_action / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / mechanisms / items / properties / target_chembl_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / mechanisms / items / properties / target_chembl_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / mechanisms_total_count / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / mechanisms_total_count / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / pref_name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / pref_name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  3. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "molecule_chembl_id",
      +      "pref_name",
      +      "max_phase",
      +      "first_approval",
      +      "mechanisms",
      +      "mechanisms_total_count",
      +      "mechanisms_status",
      +      "indications",
      +      "indications_total_count",
      +      "indications_status"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode.",
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "molecule_chembl_id",
      -  "pref_name",
      -  "max_phase",
      -  "first_approval",
      -  "mechanisms",
      -  "mechanisms_total_count",
      -  "mechanisms_status",
      -  "indications",
      -  "indications_total_count",
      -  "indications_status"
      -]
  4. Changed8 schema fields changed
    • changedOutput schema / properties / indications / description
      Previous value: -"Clinical indications. Empty when none are recorded."New value: +"Clinical indications. Empty is authoritative only when indications_status is \"complete\"."
    • addedOutput schema / properties / indications_status
      Added value: +{
      +  "description": "Retrieval state of the indication list. \"complete\" = every row ChEMBL records is present, so an empty array is a fact about the molecule. \"truncated\" = the single-request page cap bounded the list, so the array is a prefix of indications_total_count rows. \"failed\" = the upstream request was rejected, so the empty array is unknown data, NOT evidence that none exist — re-call chembl_get_drug_info to retry.",
      +  "enum": [
      +    "complete",
      +    "truncated",
      +    "failed"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / indications_total_count
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Total indication rows ChEMBL holds for this molecule (upstream page_meta.total_count). Exceeds the returned array length exactly when the status is \"truncated\". Null when the fetch failed — the count is unknown, never 0."
      +}
    • changedOutput schema / properties / mechanisms / description
      Previous value: -"Mechanisms of action. Empty when none are recorded."New value: +"Mechanisms of action. Empty is authoritative only when mechanisms_status is \"complete\"."
    • addedOutput schema / properties / mechanisms_status
      Added value: +{
      +  "description": "Retrieval state of the mechanism list. \"complete\" = every row ChEMBL records is present, so an empty array is a fact about the molecule. \"truncated\" = the single-request page cap bounded the list, so the array is a prefix of mechanisms_total_count rows. \"failed\" = the upstream request was rejected, so the empty array is unknown data, NOT evidence that none exist — re-call chembl_get_drug_info to retry.",
      +  "enum": [
      +    "complete",
      +    "truncated",
      +    "failed"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / mechanisms_total_count
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Total mechanism rows ChEMBL holds for this molecule (upstream page_meta.total_count). Exceeds the returned array length exactly when the status is \"truncated\". Null when the fetch failed — the count is unknown, never 0."
      +}
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance when no pharmacology was found — the molecule may be a research compound, not a drug."New value: +"Disclosure of anything the two lists do not say for themselves: a list whose upstream fetch failed (so its emptiness means nothing), a list the page cap bounded, or — only when both lists came back complete and empty — that the molecule may be a research compound rather than a drug."
    • changedOutput schema / required
      Previous value: -[
      -  "molecule_chembl_id",
      -  "pref_name",
      -  "max_phase",
      -  "first_approval",
      -  "mechanisms",
      -  "indications"
      -]New value: +[
      +  "molecule_chembl_id",
      +  "pref_name",
      +  "max_phase",
      +  "first_approval",
      +  "mechanisms",
      +  "mechanisms_total_count",
      +  "mechanisms_status",
      +  "indications",
      +  "indications_total_count",
      +  "indications_status"
      +]
  5. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark this as read-only, open-world, and idempotent, so the bar is lower, but the description adds valuable behavior: each list has a retrieval state, and empty arrays only mean 'none recorded' when the corresponding status is 'complete', while 'failed' and 'truncated' have distinct meanings. This prevents serious misinterpretation of outputs and does not contradict any annotation.

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

Conciseness5/5

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

The description is front-loaded with its core purpose and then adds only high-value details: source, differentiation, chaining to bioactivities, and status semantics. While dense, every sentence earns its place and there is no filler or repetitive content.

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

Completeness5/5

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

For a single-parameter read-only tool with a rich output schema and strong annotations, the description is complete. It covers what is returned, where the input comes from, how to distinguish this tool from related views, and how to interpret partial or failed retrievals.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already provides the ChEMBL ID source and an example. The main description repeats 'from chembl_search_molecules' and adds no new parameter semantics beyond what the schema already documents, so the baseline 3 is appropriate.

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

Purpose5/5

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

The first sentence names a specific verb and resource: it retrieves pharmacology for a drug, listing mechanisms of action, molecular targets, action type, approval year, and indications. It also differentiates itself from the openfda label/adverse-event view and from chembl_get_bioactivities, so an agent can tell it apart from siblings.

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

Usage Guidelines5/5

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

The description explicitly says to supply molecule_chembl_id from chembl_search_molecules, giving a clear prerequisite. It also contrasts itself with the openfda server's label/adverse-event view, and explains that target_chembl_id chains into chembl_get_bioactivities, giving the agent context for related alternatives.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.