fda-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FDA_PDF_TIMEOUT | No | PDF download timeout in seconds | 60 |
| OPENFDA_API_KEY | No | API key for higher rate limits (240 vs 40 req/min) | |
| OPENFDA_TIMEOUT | No | HTTP request timeout in seconds | 30 |
| FDA_PDF_MAX_LENGTH | No | Default max text characters extracted from PDFs | 8000 |
| OPENFDA_MAX_CONCURRENT | No | Max concurrent API requests | 4 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_fdaA | Search any of the 21 OpenFDA datasets. Returns individual records. When to use: Finding specific records — adverse events, drug labels, device submissions, recalls, etc. For aggregation/statistics, use count_records instead. If unsure which fields to search, call list_searchable_fields first. Args: dataset: Which FDA dataset to search. Options by category: Examples: Drug adverse events: dataset="drug_adverse_events", search='patient.drug.openfda.brand_name:"ASPIRIN"' Drug labels: dataset="drug_labels", search='openfda.brand_name:"LIPITOR"' Device 510(k) clearances: dataset="device_510k", search='device_name:"pulse+oximeter"' De Novo grants (also in device_510k): dataset="device_510k", search='decision_code:"DENG"+AND+advisory_committee:"DE"' Food recalls: dataset="food_recalls", search='classification:"Class I"' Device classification lookup: dataset="device_classification", search='device_name:"oximeter"+AND+device_class:2' |
| count_recordsA | Count/aggregate records by field across any OpenFDA endpoint. Returns top values with counts, percentages, and a narrative summary. When to use: Getting statistics, distributions, or "top N" lists. For individual records, use search_fda instead. Args: endpoint: One of the 21 OpenFDA endpoint paths (e.g., "drug/event", "device/510k"). Call list_searchable_fields to see valid endpoints. count_field: Field to aggregate on. IMPORTANT: You MUST add .exact suffix for text fields (e.g., "patient.reaction.reactionmeddrapt.exact"). Without .exact, text fields are tokenized and counts will be wrong. Numeric and date fields do NOT need .exact. search: Optional search filter to narrow records before counting. limit: Number of top values to return (default 10, max 1000). Examples: Top adverse reactions for a drug: endpoint="drug/event", count_field="patient.reaction.reactionmeddrapt.exact", search='patient.drug.openfda.brand_name:"ASPIRIN"' Device recalls by classification: endpoint="device/enforcement", count_field="classification.exact" Food recall reasons: endpoint="food/enforcement", count_field="reason_for_recall.exact", limit=5 |
| list_searchable_fieldsA | List searchable fields for any OpenFDA endpoint. Returns field names, types, and descriptions. When to use: Call this BEFORE searching if you're unsure which field names to use in a search query. Field names vary between endpoints. Args: endpoint: One of the 21 OpenFDA endpoint paths: Drug: drug/event, drug/label, drug/ndc, drug/drugsfda, drug/enforcement, drug/shortage Device: device/event, device/510k, device/pma, device/classification, device/enforcement, device/recall, device/registrationlisting, device/udi, device/covid19serology Food: food/event, food/enforcement Other: other/historicaldocument, other/substance, other/unii, other/nsde category: "common" for the most frequently used fields (default), "all" for the complete field listing. |
| get_decision_documentA | Fetch FDA regulatory decision documents (not available via OpenFDA API). Downloads the PDF from FDA servers and extracts text content. When to use: After finding a device submission via search_fda (e.g., dataset="device_510k" or "device_pma"), use the submission number from those results to retrieve the full decision document. Args: document_type: Type of document to retrieve. submission_number: FDA identifier. Formats: 510k_summary: "K" + 6 digits (e.g., "K213456") denovo_decision: "DEN" + 6 digits (e.g., "DEN200001") pma_approval/pma_ssed/pma_supplement: "P" + 6 digits (e.g., "P200001") supplement_number: Required for pma_supplement only (e.g., "013"). max_length: Max text characters to return (default 8000). Increase for longer documents. Examples: document_type="510k_summary", submission_number="K213456" document_type="pma_approval", submission_number="P200001" document_type="pma_supplement", submission_number="P200001", supplement_number="013" |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| get_query_syntax | OpenFDA query syntax reference with operators, wildcards, date ranges, and examples. |
| get_endpoints | List of all 21 OpenFDA API endpoints with descriptions. |
TDQS
Scored across 4 tools
Each tool has a clearly distinct role: search_fda returns individual records, count_records provides aggregate statistics, list_searchable_fields shows schema metadata, and get_decision_document fetches FDA decision documents. There is no overlap or ambiguity between them.
All tool names follow a consistent verb_noun pattern with lowercase underscores: search_fda, count_records, list_searchable_fields, get_decision_document. This makes tool selection predictable and easy.
With 4 tools, the server is well-scoped for the OpenFDA data domain. Each tool earns its place and the count falls comfortably within the ideal 3-15 range.
The tool set covers the full workflow: exploring searchable fields, querying individual records, aggregating counts, and retrieving FDA decision documents. No obvious gaps exist for the stated domain.