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) — a parent or any of its salts and other alternate forms gives the same answer: ChEMBL often records a drug's mechanisms and approved indications on a salt, so both lists cover the whole family under parent_molecule_chembl_id. Each mechanism names the form it is recorded on, and each indication is listed once per MeSH/EFO pair at the highest phase any form reached, with the forms it is recorded on, each at its own phase. 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 list was not retrieved (the request ran out of time or ChEMBL answered with an error, as the matching *_failure says) and the array says nothing about the molecule, and "truncated" means the page cap fetched fewer rows than ChEMBL holds, which the matching *_total_count reports.

Input Schema

NameRequiredDescriptionDefault
molecule_chembl_idYesChEMBL molecule ID (from chembl_search_molecules), e.g. "CHEMBL939" for gefitinib, or the molecule's standard InChIKey, e.g. "XGALLCVXEZPNRQ-UHFFFAOYSA-N". A salt or other alternate form answers with its parent's family, the same as the parent.

Output 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 timed out or 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 = approved, 3–1 = trial phase, 0.5 = early phase 1, −1 = clinical with the phase unknown. Null when ChEMBL records no clinical development.
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". When "truncated", each indication's max_phase_for_ind and forms are lower bounds: rows past the page cap can raise a phase or add a form.
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 for the molecule and its alternate forms 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 list was not retrieved (the request ran out of time or ChEMBL answered with an error, as mechanisms_failure says), 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 for the molecule and its alternate forms is present, so an empty array is a fact about the molecule. "truncated" = the single-request page cap bounded the list, so the array holds the indications of the rows fetched (indications_rows_fetched, fewer than indications_total_count). "failed" = the list was not retrieved (the request ran out of time or ChEMBL answered with an error, as indications_failure says), so the empty array is unknown data, NOT evidence that none exist — re-call chembl_get_drug_info to retry.
mechanisms_failureNoWhy the mechanism list failed, when mechanisms_status is "failed": "timeout" = the request ran out of time before ChEMBL returned the list; "upstream_error" = ChEMBL answered with an error (a rate limit, a server error, a rejected request) or could not be reached. Null when the list did not fail.
molecule_chembl_idNoThe ChEMBL molecule ID queried, as the molecule's own record writes it.
indications_failureNoWhy the indication list failed, when indications_status is "failed": "timeout" = the request ran out of time before ChEMBL returned the list; "upstream_error" = ChEMBL answered with an error (a rate limit, a server error, a rejected request) or could not be reached. Null when the list did not fail.
mechanisms_total_countNoTotal mechanism rows ChEMBL holds for the molecule and its alternate forms. Exceeds the returned array length exactly when the status is "truncated". Null when the fetch failed — the count is unknown, never 0.
indications_total_countNoWhen the status is "complete", the number of distinct indications — the returned array length, rows recorded on several forms counted once. When "truncated", the indication rows ChEMBL holds for the molecule and its alternate forms, an upper bound on the distinct indications. Null when the fetch failed — the count is unknown, never 0.
indications_rows_fetchedNoIndication rows fetched from ChEMBL for the molecule and its alternate forms, before rows recorded on several forms merge. When the status is "truncated", each row not fetched (indications_total_count minus this) can add at most one indication, so that difference bounds the indications missing. Null when the fetch failed.
parent_molecule_chembl_idNoThe parent of the queried molecule's family — the molecule itself when it is the parent or ChEMBL records no hierarchy for it. Both lists cover this parent and every alternate form ChEMBL files under it (salts, isotope-labelled and deuterated analogs).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedOutput schema / properties / indications / items / properties / max_phase_for_ind / description
      Previous value: -"Max clinical phase reached for THIS indication (1–4), the highest across the forms it is recorded on. Null when unknown."New value: +"Max clinical phase reached for THIS indication (4 = approved, 3–1 = trial phase, 0.5 = early phase 1, −1 = phase unknown), the highest across the forms it is recorded on. Null when unknown."
    • changedOutput schema / properties / max_phase / description
      Previous value: -"Max clinical phase across indications: 4 = marketed. Null when unknown."New value: +"Max clinical phase across indications: 4 = approved, 3–1 = trial phase, 0.5 = early phase 1, −1 = clinical with the phase unknown. Null when ChEMBL records no clinical development."
  2. Changed21 schema fields changed
    • changedInput schema / properties / molecule_chembl_id / description
      Previous value: -"ChEMBL molecule ID (from chembl_search_molecules), e.g. \"CHEMBL939\" for gefitinib."New value: +"ChEMBL molecule ID (from chembl_search_molecules), e.g. \"CHEMBL939\" for gefitinib, or the molecule's standard InChIKey, e.g. \"XGALLCVXEZPNRQ-UHFFFAOYSA-N\". A salt or other alternate form answers with its parent's family, the same as the parent."
    • changedOutput schema / anyOf
      Previous 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"
      -    ]
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "molecule_chembl_id",
      +      "parent_molecule_chembl_id",
      +      "pref_name",
      +      "max_phase",
      +      "first_approval",
      +      "mechanisms",
      +      "mechanisms_total_count",
      +      "mechanisms_status",
      +      "mechanisms_failure",
      +      "indications",
      +      "indications_total_count",
      +      "indications_rows_fetched",
      +      "indications_status",
      +      "indications_failure"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • changedOutput schema / properties / indications / description
      Previous value: -"Clinical indications. Empty is authoritative only when indications_status is \"complete\"."New value: +"Clinical indications. Empty is authoritative only when indications_status is \"complete\". When \"truncated\", each indication's max_phase_for_ind and forms are lower bounds: rows past the page cap can raise a phase or add a form."
    • changedOutput schema / properties / indications / items / description
      Previous value: -"One clinical indication with the phase reached for it."New value: +"One clinical indication, listed once per MeSH/EFO pair across the drug and its alternate forms, with the highest phase reached for it and the phase each form reached."
    • addedOutput schema / properties / indications / items / properties / efo_id
      Added value: +{
      +  "description": "EFO ontology ID, e.g. \"EFO:0003060\". Null when absent.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / indications / items / properties / forms
      Added value: +{
      +  "description": "The forms of the drug the indication is recorded on, each with its own highest phase for it. Empty when ChEMBL names none.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "One form the indication is recorded on, at its own phase.",
      +    "properties": {
      +      "max_phase_for_ind": {
      +        "description": "Max clinical phase THIS form reached for the indication — a deuterated analog can sit lower than its parent. Null when unknown.",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "molecule_chembl_id": {
      +        "description": "A form of the drug the indication is recorded on — the parent, or one of its salts or other alternate forms.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "molecule_chembl_id",
      +      "max_phase_for_ind"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / indications / items / properties / max_phase_for_ind / description
      Previous value: -"Max clinical phase reached for THIS indication (1–4). Null when unknown."New value: +"Max clinical phase reached for THIS indication (1–4), the highest across the forms it is recorded on. Null when unknown."
    • addedOutput schema / properties / indications / items / properties / mesh_id
      Added value: +{
      +  "description": "MeSH descriptor ID, e.g. \"D002289\". Null when absent.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / indications / items / required
      Previous value: -[
      -  "mesh_heading",
      -  "efo_term",
      -  "max_phase_for_ind"
      -]New value: +[
      +  "mesh_id",
      +  "mesh_heading",
      +  "efo_id",
      +  "efo_term",
      +  "max_phase_for_ind",
      +  "forms"
      +]
    • addedOutput schema / properties / indications_failure
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "timeout",
      +        "upstream_error"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Why the indication list failed, when indications_status is \"failed\": \"timeout\" = the request ran out of time before ChEMBL returned the list; \"upstream_error\" = ChEMBL answered with an error (a rate limit, a server error, a rejected request) or could not be reached. Null when the list did not fail."
      +}
    • addedOutput schema / properties / indications_rows_fetched
      Added value: +{
      +  "description": "Indication rows fetched from ChEMBL for the molecule and its alternate forms, before rows recorded on several forms merge. When the status is \"truncated\", each row not fetched (indications_total_count minus this) can add at most one indication, so that difference bounds the indications missing. Null when the fetch failed.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / indications_status / description
      Previous value: -"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."New value: +"Retrieval state of the indication list. \"complete\" = every row ChEMBL records for the molecule and its alternate forms is present, so an empty array is a fact about the molecule. \"truncated\" = the single-request page cap bounded the list, so the array holds the indications of the rows fetched (indications_rows_fetched, fewer than indications_total_count). \"failed\" = the list was not retrieved (the request ran out of time or ChEMBL answered with an error, as indications_failure says), so the empty array is unknown data, NOT evidence that none exist — re-call chembl_get_drug_info to retry."
    • changedOutput schema / properties / indications_total_count / description
      Previous value: -"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."New value: +"When the status is \"complete\", the number of distinct indications — the returned array length, rows recorded on several forms counted once. When \"truncated\", the indication rows ChEMBL holds for the molecule and its alternate forms, an upper bound on the distinct indications. Null when the fetch failed — the count is unknown, never 0."
    • addedOutput schema / properties / mechanisms / items / properties / molecule_chembl_id
      Added value: +{
      +  "description": "The form of the drug the mechanism is recorded on — the parent, or one of its salts or other alternate forms. Null when ChEMBL names none.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / mechanisms / items / required
      Previous value: -[
      -  "target_chembl_id",
      -  "mechanism_of_action",
      -  "action_type"
      -]New value: +[
      +  "target_chembl_id",
      +  "mechanism_of_action",
      +  "action_type",
      +  "molecule_chembl_id"
      +]
    • addedOutput schema / properties / mechanisms_failure
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "timeout",
      +        "upstream_error"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Why the mechanism list failed, when mechanisms_status is \"failed\": \"timeout\" = the request ran out of time before ChEMBL returned the list; \"upstream_error\" = ChEMBL answered with an error (a rate limit, a server error, a rejected request) or could not be reached. Null when the list did not fail."
      +}
    • changedOutput schema / properties / mechanisms_status / description
      Previous value: -"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."New value: +"Retrieval state of the mechanism list. \"complete\" = every row ChEMBL records for the molecule and its alternate forms 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 list was not retrieved (the request ran out of time or ChEMBL answered with an error, as mechanisms_failure says), so the empty array is unknown data, NOT evidence that none exist — re-call chembl_get_drug_info to retry."
    • changedOutput schema / properties / mechanisms_total_count / description
      Previous value: -"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."New value: +"Total mechanism rows ChEMBL holds for the molecule and its alternate forms. 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 / molecule_chembl_id / description
      Previous value: -"The ChEMBL molecule ID queried."New value: +"The ChEMBL molecule ID queried, as the molecule's own record writes it."
    • changedOutput schema / properties / notice / description
      Previous 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."New value: +"Disclosure of anything the two lists do not say for themselves: a list whose upstream fetch timed out or 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."
    • addedOutput schema / properties / parent_molecule_chembl_id
      Added value: +{
      +  "description": "The parent of the queried molecule's family — the molecule itself when it is the parent or ChEMBL records no hierarchy for it. Both lists cover this parent and every alternate form ChEMBL files under it (salts, isotope-labelled and deuterated analogs).",
      +  "type": "string"
      +}
  3. 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"
      +]
  4. 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"
      +]
  5. 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"
      -]
  6. 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"
      +]
  7. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the read-only/idempotent profile, and the description goes well beyond them by explaining the retrieval-state contract: empty arrays only mean 'none recorded' when mechanisms_status/indications_status is 'complete', 'failed' means unretrieved with a *_failure reason, and 'truncated' ties to *_total_count. That is exactly the context needed to avoid misreading an empty result as a negative finding.

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

Conciseness4/5

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

Front-loaded correctly: what the tool returns first, then ID sourcing, then family semantics, then status semantics. Every sentence is substantive, but the single dense paragraph packs three distinct topics (scope, ID handling, result-state semantics) into a run-on block, which slightly hurts scannability.

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

Completeness5/5

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

An output schema exists, so return-field explanation is rightly omitted, yet the description still covers the one thing the schema cannot: how to interpret empty arrays versus failed or truncated retrievals. Nothing an agent needs to call this correctly or read its result safely is missing.

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 coverage is 100% and the schema itself already documents the ID format, the InChIKey alternative and the salt-follows-parent behavior. The description restates the family behavior ('a parent or any of its salts ... gives the same answer') without adding syntax or format detail beyond what the parameter description carries, so the baseline 3 applies.

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

Purpose5/5

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

Opens with a precise verb+resource: 'Pharmacology for a drug (molecule)' followed by an enumeration of exactly what comes back (mechanisms, targets, action type, first-approval year, indications with max phase). It also explicitly distinguishes itself from the openfda label/adverse-event view and from the sibling used to obtain the ID, so an agent can place it without opening the schema.

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

Usage Guidelines5/5

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

Says where the ID comes from (chembl_search_molecules), states that parent and salt forms yield the same answer, and names the alternative (openfda server) plus the onward chaining path into chembl_get_bioactivities. Both when-to-use and when-to-use-something-else are spelled out.

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.