Skip to main content
Glama

Openfda Drug Profile

openfda_drug_profile
Read-only

Resolve one drug name to its FDA identity, then fan out in parallel across the bounded per-drug openFDA endpoints and merge into one profile: identity, label highlights, adverse-event summary, recall history, Drugs@FDA approval, and shortage status. Replaces chaining openfda_get_drug_label, openfda_search_adverse_events, openfda_search_recalls, openfda_search_drug_approvals, and openfda_search_drug_shortages — and reconciles the identifier drift between endpoints that makes that chaining error-prone. Each section is best-effort: a miss returns null rather than failing the call. For deep dives into any one area, use the dedicated tool.

Input Schema

NameRequiredDescriptionDefault
drugYesDrug name to profile — brand or generic (e.g. "metformin", "Humira", "Glucophage"). Resolved once to an FDA identity; meta.fanOutKey reports the name the recall, approval, and shortage sub-queries searched.

Output Schema

NameRequiredDescriptionDefault
metaNoRequest metadata.
errorNoPresent when the call failed. Absent on success.
labelNoLabel highlights from drug/label, or null when no label matched.
noticeNoGuidance when the drug could not be resolved or upstream errors degraded the profile. Absent on a fully populated profile.
recallsNoThe newest 5 drug/enforcement recall actions whose openfda.generic_name or product_description matches meta.fanOutKey (may be empty); recalls_total counts every match.
approvalNoBest-matching Drugs@FDA application whose openfda.generic_name or products.active_ingredients.name matches meta.fanOutKey, or null when none matched or the sub-query failed (listed in degraded).
degradedNoSub-queries that failed upstream, empty when every section resolved. A section listed here is unknown, not absent — a null section with no entry here genuinely has no FDA record.
identityNoIdentity resolved once and reused across every sub-query to avoid identifier drift.
shortageNoCurrent or most-recent drug shortage status, or null when none on record.
recalls_totalNoTotal drug/enforcement reports the recall search matched — recalls lists the newest 5 of them. Null when the recall sub-query failed (listed in degraded): unknown, not zero.
sectionsFoundNoHow many profile sections (label, adverse_events, recalls, approval, shortage) returned data.
adverse_eventsNoAdverse-event summary aggregated over drug/event, or null when unavailable.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changed
    • changedInput schema / properties / drug / description
      Previous value: -"Drug name to profile — brand or generic (e.g. \"metformin\", \"Humira\", \"Glucophage\"). Resolved once to canonical FDA identifiers, which then key every sub-query."New value: +"Drug name to profile — brand or generic (e.g. \"metformin\", \"Humira\", \"Glucophage\"). Resolved once to an FDA identity; meta.fanOutKey reports the name the recall, approval, and shortage sub-queries searched."
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "not": {
      -      "required": [
      -        "error"
      -      ]
      -    },
      -    "required": [
      -      "meta",
      -      "identity",
      -      "label",
      -      "adverse_events",
      -      "recalls",
      -      "approval",
      -      "shortage",
      -      "degraded",
      -      "sectionsFound"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "error"
      -    ]
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "meta",
      +      "identity",
      +      "label",
      +      "adverse_events",
      +      "recalls",
      +      "recalls_total",
      +      "approval",
      +      "shortage",
      +      "degraded",
      +      "sectionsFound"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • changedOutput schema / properties / approval / description
      Previous value: -"Drugs@FDA approval summary, or null when no application matched."New value: +"Best-matching Drugs@FDA application whose openfda.generic_name or products.active_ingredients.name matches meta.fanOutKey, or null when none matched or the sub-query failed (listed in degraded)."
    • changedOutput schema / properties / identity / properties / generic_name / description
      Previous value: -"Canonical generic name (openfda.generic_name) — the primary source for meta.fanOutKey."New value: +"Generic name (openfda.generic_name) of the resolved label or NDC record — it can name one product (e.g. \"ADALIMUMAB-AACF\"). meta.fanOutKey uses it unless the input term is whole words of it."
    • changedOutput schema / properties / meta / properties / fanOutKey / description
      Previous value: -"Canonical key the structured sub-queries (recall/enforcement, Drugs@FDA approval, shortage) ran against — the resolved generic name, falling back to a brand name, then the input term. The adverse-event sub-queries instead key off the raw input term to match heterogeneous reporter-entered values."New value: +"Name the structured sub-queries (recall/enforcement, Drugs@FDA approval, shortage) ran against — the input term when it is whole words of the resolved generic name (an ingredient such as \"metformin\" or \"adalimumab\", so one label's product-specific generic does not narrow them), otherwise the resolved generic name, falling back to a brand name, then the input term. The adverse-event sub-queries instead key off the raw input term to match heterogeneous reporter-entered values."
    • changedOutput schema / properties / recalls / description
      Previous value: -"Recent drug/enforcement recall actions (may be empty)."New value: +"The newest 5 drug/enforcement recall actions whose openfda.generic_name or product_description matches meta.fanOutKey (may be empty); recalls_total counts every match."
    • addedOutput schema / properties / recalls_total
      Added value: +{
      +  "description": "Total drug/enforcement reports the recall search matched — recalls lists the newest 5 of them. Null when the recall sub-query failed (listed in degraded): unknown, not zero.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
  2. Changed3 schema fields changed
    • changedOutput schema / properties / adverse_events / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "seriousCount": {
      -        "description": "Reports flagged serious (serious=1).",
      -        "type": "number"
      -      },
      -      "topReactions": {
      -        "description": "Most-frequent reported reactions, descending.",
      -        "items": {
      -          "additionalProperties": false,
      -          "description": "A reaction term paired with its report count.",
      -          "properties": {
      -            "count": {
      -              "description": "Reports citing this reaction.",
      -              "type": "number"
      -            },
      -            "term": {
      -              "description": "MedDRA reaction term.",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "term",
      -            "count"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "total": {
      -        "description": "Approximate total adverse-event reports naming this drug.",
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "total",
      -      "seriousCount",
      -      "topReactions"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "seriousCount": {
      +        "description": "Reports flagged serious (serious=1). total − seriousCount covers both non-serious reports and those with no seriousness recorded.",
      +        "type": "number"
      +      },
      +      "topReactions": {
      +        "description": "Most-frequent reported reactions, descending.",
      +        "items": {
      +          "additionalProperties": false,
      +          "description": "A reaction term paired with its report count.",
      +          "properties": {
      +            "count": {
      +              "description": "Reports citing this reaction.",
      +              "type": "number"
      +            },
      +            "term": {
      +              "description": "MedDRA reaction term.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "term",
      +            "count"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "total": {
      +        "description": "Adverse-event reports naming this drug — every matching report, including those with no seriousness recorded; equals openfda_search_adverse_events meta.total for the same medicinalproduct search.",
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "total",
      +      "seriousCount",
      +      "topReactions"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / meta / properties / fanOutKey / description
      Previous value: -"Canonical key the structured sub-queries (recall/enforcement, Drugs@FDA approval, shortage) ran against — the resolved generic name, falling back to a brand name, then the input term. The adverse-event sub-query instead keys off the raw input term to match heterogeneous reporter-entered values."New value: +"Canonical key the structured sub-queries (recall/enforcement, Drugs@FDA approval, shortage) ran against — the resolved generic name, falling back to a brand name, then the input term. The adverse-event sub-queries instead key off the raw input term to match heterogeneous reporter-entered values."
    • changedOutput schema / properties / shortage / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "availability": {
      -        "description": "Availability note (truncated).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "status": {
      -        "description": "Shortage status (Current/Resolved).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "status",
      -      "availability"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "availability": {
      +        "description": "Availability note (truncated).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "status": {
      +        "description": "Shortage status (Current, To Be Discontinued, or Resolved).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "status",
      +      "availability"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Changed19 schema fields changed
    • changedOutput schema / properties / approval / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "applicationNumber": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "NDA/ANDA application number."
      -      },
      -      "marketingStatus": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Derived marketing/approval status."
      -      },
      -      "sponsor": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Sponsor/applicant name."
      -      }
      -    },
      -    "required": [
      -      "applicationNumber",
      -      "sponsor",
      -      "marketingStatus"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "applicationNumber": {
      +        "description": "NDA/ANDA application number.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "marketingStatus": {
      +        "description": "Derived marketing/approval status.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "sponsor": {
      +        "description": "Sponsor/applicant name.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "applicationNumber",
      +      "sponsor",
      +      "marketingStatus"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / identity / properties / generic_name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / identity / properties / generic_name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / identity / properties / product_ndc / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / identity / properties / product_ndc / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / identity / properties / rxcui / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / identity / properties / rxcui / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / identity / properties / spl_set_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / identity / properties / spl_set_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / label / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "dosage": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Dosage and administration (truncated)."
      -      },
      -      "indications": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Indications and usage (truncated)."
      -      },
      -      "warnings": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Warnings (truncated) — boxed warning or warnings_and_cautions for Rx labels, falling back to the OTC-monograph warnings section."
      -      }
      -    },
      -    "required": [
      -      "indications",
      -      "warnings",
      -      "dosage"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "dosage": {
      +        "description": "Dosage and administration (truncated).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "indications": {
      +        "description": "Indications and usage (truncated).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "warnings": {
      +        "description": "Warnings (truncated) — boxed warning or warnings_and_cautions for Rx labels, falling back to the OTC-monograph warnings section.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "indications",
      +      "warnings",
      +      "dosage"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / recalls / items / properties / classification / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recalls / items / properties / classification / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / recalls / items / properties / date / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recalls / items / properties / date / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / recalls / items / properties / reason / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recalls / items / properties / reason / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / recalls / items / properties / recalling_firm / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recalls / items / properties / recalling_firm / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / shortage / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "availability": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Availability note (truncated)."
      -      },
      -      "status": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Shortage status (Current/Resolved)."
      -      }
      -    },
      -    "required": [
      -      "status",
      -      "availability"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "availability": {
      +        "description": "Availability note (truncated).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "status": {
      +        "description": "Shortage status (Current/Resolved).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "status",
      +      "availability"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  4. 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": [
      +      "meta",
      +      "identity",
      +      "label",
      +      "adverse_events",
      +      "recalls",
      +      "approval",
      +      "shortage",
      +      "degraded",
      +      "sectionsFound"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `blank_drug_name`: The drug name carries no searchable character — only quotes, backslashes, or whitespace. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "blank_drug_name"
      +          ],
      +          "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: -[
      -  "meta",
      -  "identity",
      -  "label",
      -  "adverse_events",
      -  "recalls",
      -  "approval",
      -  "shortage",
      -  "degraded",
      -  "sectionsFound"
      -]
  5. Changed3 schema fields changed
    • addedInput schema / properties / drug / pattern
      Added value: +"\\S"
    • addedOutput schema / properties / degraded
      Added value: +{
      +  "description": "Sub-queries that failed upstream, empty when every section resolved. A section listed here is unknown, not absent — a null section with no entry here genuinely has no FDA record.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "One failed sub-query and why it failed.",
      +    "properties": {
      +      "message": {
      +        "description": "Upstream failure message for this section, truncated.",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "Machine-readable failure reason (e.g. rate_limited, upstream_error, query_error).",
      +        "type": "string"
      +      },
      +      "section": {
      +        "description": "Profile section whose sub-query failed.",
      +        "enum": [
      +          "identity",
      +          "label",
      +          "adverse_events",
      +          "recalls",
      +          "approval",
      +          "shortage"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "section",
      +      "reason",
      +      "message"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "meta",
      -  "identity",
      -  "label",
      -  "adverse_events",
      -  "recalls",
      -  "approval",
      -  "shortage",
      -  "sectionsFound"
      -]New value: +[
      +  "meta",
      +  "identity",
      +  "label",
      +  "adverse_events",
      +  "recalls",
      +  "approval",
      +  "shortage",
      +  "degraded",
      +  "sectionsFound"
      +]
  6. Changed1 schema field changed
    • changedOutput schema / properties / label / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "dosage": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Dosage and administration (truncated)."
      -      },
      -      "indications": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Indications and usage (truncated)."
      -      },
      -      "warnings": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Warnings (truncated)."
      -      }
      -    },
      -    "required": [
      -      "indications",
      -      "warnings",
      -      "dosage"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "dosage": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Dosage and administration (truncated)."
      +      },
      +      "indications": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Indications and usage (truncated)."
      +      },
      +      "warnings": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Warnings (truncated) — boxed warning or warnings_and_cautions for Rx labels, falling back to the OTC-monograph warnings section."
      +      }
      +    },
      +    "required": [
      +      "indications",
      +      "warnings",
      +      "dosage"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  7. Changed3 schema fields changed
    • changedOutput schema / properties / identity / properties / generic_name / description
      Previous value: -"Canonical generic name (openfda.generic_name) — the key used for fan-out."New value: +"Canonical generic name (openfda.generic_name) — the primary source for meta.fanOutKey."
    • addedOutput schema / properties / meta / properties / fanOutKey
      Added value: +{
      +  "description": "Canonical key the structured sub-queries (recall/enforcement, Drugs@FDA approval, shortage) ran against — the resolved generic name, falling back to a brand name, then the input term. The adverse-event sub-query instead keys off the raw input term to match heterogeneous reporter-entered values.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / meta / required
      Previous value: -[
      -  "drug",
      -  "resolvedVia"
      -]New value: +[
      +  "drug",
      +  "resolvedVia",
      +  "fanOutKey"
      +]
  8. Added

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true; the description adds substantial behavior: parallel fan-out across bounded per-drug endpoints, per-section best-effort semantics where a miss returns null instead of failing the call, identifier-drift reconciliation between endpoints, and the meta.fanOutKey reporting mechanism. These are exactly the failure-mode details an agent needs to interpret partial results.

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 with the core action and output shape, then the sibling substitution, then the caveats. Every sentence carries information, though the 'Replaces chaining...' sentence is long and could be split for 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?

For a single-parameter aggregation tool with an output schema (so return shape needn't be described), the description covers the aggregation scope, partial-failure behavior, and the escape hatch to single-purpose tools. Nothing needed to invoke it correctly 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?

Only one parameter and schema coverage is 100%, with the schema already explaining brand/generic acceptance and meta.fanOutKey. The description restates the single-resolution-then-fan-out behavior but adds no format, normalization, or disambiguation guidance beyond what the schema field says, 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?

States a specific verb and resource ('Resolve one drug name to its FDA identity') and then enumerates exactly what the merged profile contains: identity, label highlights, adverse events, recalls, approvals, shortages. It distinguishes itself from siblings by naming the five single-purpose tools it replaces, so an agent can route without opening any schema.

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

Usage Guidelines5/5

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

Explicitly frames this as a replacement for chaining openfda_get_drug_label, openfda_search_adverse_events, openfda_search_recalls, openfda_search_drug_approvals, and openfda_search_drug_shortages, and states the inverse case: 'For deep dives into any one area, use the dedicated tool.' Both the when and the when-not are present with named 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.