Query FDA data on drugs, food, devices, and recalls via openFDA. STDIO or Streamable HTTP.
This server demonstrates strong tool design with well-structured parameter schemas, clear descriptions, and thoughtful composition. All 6 tools have explicit definitions with input schemas visible in source. Descriptions are detailed and context-aware (ranging 150-450 chars, within the 10-1024 baseline). Parameter types are consistently declared with enums where appropriate. However, there are gaps in output schema documentation, error handling guidance is minimal, and some parameters lack human-friendly alternatives to IDs. The tool set is well-composed (single responsibility per tool) and supports good chaining (canvas_id flow between describe/query tools). No security issues detected (read-only operations, no secret params). The primary weakness is incomplete output schema documentation and error recovery guidance.
Aggregate and tally unique values for any field across any openFDA endpoint. Returns ranked term-count pairs sorted by count descending. Pair with openfda_search_adverse_events, openfda_search_drug_approvals, openfda_search_device_clearances, openfda_search_recalls, openfda_get_drug_label, or openfda_lookup_ndc when sample records help interpret the aggregates.
List the tables and column schemas on a DataCanvas staged by an openFDA search tool. Call before openfda_dataframe_query to discover the exact table name, column names, and DuckDB types needed for valid SQL. row_count is the full staged result set, not the inline preview count. Columns typed JSON hold nested openFDA objects/arrays — query them with DuckDB json functions.
Run a read-only SQL SELECT against a DataCanvas table staged by an openFDA search tool (call one with stage=true; its response carries canvas_id + canvas_table). Enables GROUP BY, COUNT/SUM/AVG, time-series, and joins across the staged result set without re-paging the API. Call openfda_dataframe_describe first to get the exact table and column names. Results are capped at the canvas row limit — when truncated is true, page the rest with ORDER BY plus LIMIT/OFFSET. Scalar fields are stored as text (CAST for numeric math); nested objects/arrays are JSON columns — read them with DuckDB json functions, e.g. json_extract_string(openfda, '$.brand_name[0]'). Only SELECT is allowed — DDL, DML, COPY, and file-reading functions are blocked.
Return the searchable field paths for an openFDA endpoint, grouped by category with type and description. Use before constructing a search query to find the correct dotted field path — field names differ per endpoint and are not discoverable from the tool schema alone.
Output schemas are not documented for any tool. LLMs cannot plan downstream calls or extract fields without knowing result structure (e.g., openfda_count_values should document 'truncated' boolean and term-count pair array; openfda_drug_profile should list merged profile fields).
Error handling is largely absent. Tools do not provide actionable recovery guidance. E.g., openfda_drug_profile lacks error handling for unresolved drug names (should suggest alternatives); openfda_dataframe_query lacks guidance for invalid canvas_id or SQL syntax errors.
openfda_drug_profile parameter 'drug_name' lacks explicit type specification in schema. Inference from description is insufficient for strict validation.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 64 | 2026-07-28+ | v2 |
Composite tool that resolves one drug name to its FDA identity, then fans out in parallel to the bounded per-drug openFDA endpoints and merges the results into a single profile (identity, label highlights, adverse-event summary, recalls, approval, shortage).
Look up FDA drug labeling (package inserts / SPL documents). Check indications, warnings, dosage, contraindications, active ingredients, or any structured label section. A label runs to tens of thousands of tokens, so a page that exceeds the inline budget returns the list of available sections instead; re-call with sections to pull the ones you need.
openfda_get_drug_label 'sort' parameter lacks explicit format/pattern constraints. Description mentions restrictions (letters/digits/underscores/dots only) but these should be in schema as a pattern property.
No tool accepts human-readable identifiers where IDs are required. E.g., openfda_dataframe_describe/query require canvas_id; no tool accepts canvas alias or description. Users must always have system identifiers on hand.