openFDA MCP by usefulapi
Search openFDA drug, device, food and adverse-event datasets.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"openfda": {
"url": "https://openfda.usefulapi.io/mcp"
}
}
}Remote endpoints
https://openfda.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (14)
🟢search_drug_events(search, sort, limit, skip)
Search the FDA Adverse Event Reporting System (FAERS): reports of drug side effects, adverse reactions and medication errors submitted to the FDA. Returns individual case reports. openFDA drug/event endpoint.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Lucene-style query over this dataset's fields: 'field:term', AND with '+AND+', OR with a space, exact phrase via a '.exact' field suffix with quotes, ranges as '[low+TO+high]' (dates like '[20040101+TO+20081231]'). Example: patient.drug.medicinalproduct:\"aspirin\"",
"type": "string"
},
"sort": {
"description": "Sort order, as `field:asc` or `field:desc`, e.g. 'receivedate:desc'.",
"type": "string"
},
"limit": {
"description": "Max number of records to return (1–1000). Omit for the API default of 1.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"description": "Number of records to skip, for pagination (0–25000; skip+limit reaches up to ~26000 records).",
"type": "integer",
"minimum": 0,
"maximum": 25000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢search_drug_labels(search, sort, limit, skip)
Search Structured Product Labeling (SPL): the official prescribing information for drugs — indications, warnings, dosage, adverse reactions, drug interactions and more. openFDA drug/label endpoint.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Lucene-style query over this dataset's fields: 'field:term', AND with '+AND+', OR with a space, exact phrase via a '.exact' field suffix with quotes, ranges as '[low+TO+high]' (dates like '[20040101+TO+20081231]'). Example: openfda.brand_name:\"tylenol\"",
"type": "string"
},
"sort": {
"description": "Sort order, as `field:asc` or `field:desc`, e.g. 'receivedate:desc'.",
"type": "string"
},
"limit": {
"description": "Max number of records to return (1–1000). Omit for the API default of 1.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"description": "Number of records to skip, for pagination (0–25000; skip+limit reaches up to ~26000 records).",
"type": "integer",
"minimum": 0,
"maximum": 25000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢search_drug_ndc(search, sort, limit, skip)
Search the National Drug Code (NDC) directory: every drug product's code, name, dosage form, route, active ingredients, marketing status and labeler. openFDA drug/ndc endpoint.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Lucene-style query over this dataset's fields: 'field:term', AND with '+AND+', OR with a space, exact phrase via a '.exact' field suffix with quotes, ranges as '[low+TO+high]' (dates like '[20040101+TO+20081231]'). Example: finished:true+AND+dosage_form:\"tablet\"",
"type": "string"
},
"sort": {
"description": "Sort order, as `field:asc` or `field:desc`, e.g. 'receivedate:desc'.",
"type": "string"
},
"limit": {
"description": "Max number of records to return (1–1000). Omit for the API default of 1.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"description": "Number of records to skip, for pagination (0–25000; skip+limit reaches up to ~26000 records).",
"type": "integer",
"minimum": 0,
"maximum": 25000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢search_drug_recalls(search, sort, limit, skip)
Search drug recall enforcement reports: recalled drug products with the reason, classification (Class I/II/III), recalling firm, distribution and status. openFDA drug/enforcement endpoint.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Lucene-style query over this dataset's fields: 'field:term', AND with '+AND+', OR with a space, exact phrase via a '.exact' field suffix with quotes, ranges as '[low+TO+high]' (dates like '[20040101+TO+20081231]'). Example: classification:\"Class I\"",
"type": "string"
},
"sort": {
"description": "Sort order, as `field:asc` or `field:desc`, e.g. 'receivedate:desc'.",
"type": "string"
},
"limit": {
"description": "Max number of records to return (1–1000). Omit for the API default of 1.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"description": "Number of records to skip, for pagination (0–25000; skip+limit reaches up to ~26000 records).",
"type": "integer",
"minimum": 0,
"maximum": 25000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢search_drugsfda(search, sort, limit, skip)
Search Drugs@FDA: FDA-approved drug products and their applications (NDA/ANDA/BLA), sponsors, approval dates, products and submissions. openFDA drug/drugsfda endpoint.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Lucene-style query over this dataset's fields: 'field:term', AND with '+AND+', OR with a space, exact phrase via a '.exact' field suffix with quotes, ranges as '[low+TO+high]' (dates like '[20040101+TO+20081231]'). Example: openfda.brand_name:\"humira\"",
"type": "string"
},
"sort": {
"description": "Sort order, as `field:asc` or `field:desc`, e.g. 'receivedate:desc'.",
"type": "string"
},
"limit": {
"description": "Max number of records to return (1–1000). Omit for the API default of 1.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"description": "Number of records to skip, for pagination (0–25000; skip+limit reaches up to ~26000 records).",
"type": "integer",
"minimum": 0,
"maximum": 25000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢search_drug_shortages(search, sort, limit, skip)
Search current and resolved drug shortages: the affected product, status, reason, availability and related dates. openFDA drug/shortages endpoint.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Lucene-style query over this dataset's fields: 'field:term', AND with '+AND+', OR with a space, exact phrase via a '.exact' field suffix with quotes, ranges as '[low+TO+high]' (dates like '[20040101+TO+20081231]'). Example: status:\"Current\"",
"type": "string"
},
"sort": {
"description": "Sort order, as `field:asc` or `field:desc`, e.g. 'receivedate:desc'.",
"type": "string"
},
"limit": {
"description": "Max number of records to return (1–1000). Omit for the API default of 1.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"description": "Number of records to skip, for pagination (0–25000; skip+limit reaches up to ~26000 records).",
"type": "integer",
"minimum": 0,
"maximum": 25000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢search_device_events(search, sort, limit, skip)
Search the MAUDE database: medical device adverse events — reported injuries, deaths and malfunctions involving medical devices. openFDA device/event endpoint.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Lucene-style query over this dataset's fields: 'field:term', AND with '+AND+', OR with a space, exact phrase via a '.exact' field suffix with quotes, ranges as '[low+TO+high]' (dates like '[20040101+TO+20081231]'). Example: device.generic_name:\"pacemaker\"",
"type": "string"
},
"sort": {
"description": "Sort order, as `field:asc` or `field:desc`, e.g. 'receivedate:desc'.",
"type": "string"
},
"limit": {
"description": "Max number of records to return (1–1000). Omit for the API default of 1.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"description": "Number of records to skip, for pagination (0–25000; skip+limit reaches up to ~26000 records).",
"type": "integer",
"minimum": 0,
"maximum": 25000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢search_device_510k(search, sort, limit, skip)
Search 510(k) premarket notification clearances: devices cleared for market as substantially equivalent to a predicate, with applicant, decision, product code and dates. openFDA device/510k endpoint.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Lucene-style query over this dataset's fields: 'field:term', AND with '+AND+', OR with a space, exact phrase via a '.exact' field suffix with quotes, ranges as '[low+TO+high]' (dates like '[20040101+TO+20081231]'). Example: openfda.device_name:\"catheter\"",
"type": "string"
},
"sort": {
"description": "Sort order, as `field:asc` or `field:desc`, e.g. 'receivedate:desc'.",
"type": "string"
},
"limit": {
"description": "Max number of records to return (1–1000). Omit for the API default of 1.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"description": "Number of records to skip, for pagination (0–25000; skip+limit reaches up to ~26000 records).",
"type": "integer",
"minimum": 0,
"maximum": 25000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢search_device_recalls(search, sort, limit, skip)
Search medical device recalls: recalled devices with the reason, recalling firm, classification, product code and status. openFDA device/recall endpoint.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Lucene-style query over this dataset's fields: 'field:term', AND with '+AND+', OR with a space, exact phrase via a '.exact' field suffix with quotes, ranges as '[low+TO+high]' (dates like '[20040101+TO+20081231]'). Example: product_res_number:\"Z-1234-2019\"",
"type": "string"
},
"sort": {
"description": "Sort order, as `field:asc` or `field:desc`, e.g. 'receivedate:desc'.",
"type": "string"
},
"limit": {
"description": "Max number of records to return (1–1000). Omit for the API default of 1.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"description": "Number of records to skip, for pagination (0–25000; skip+limit reaches up to ~26000 records).",
"type": "integer",
"minimum": 0,
"maximum": 25000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢search_device_classification(search, sort, limit, skip)
Search the FDA device classification database: a device type's product code, device class (I/II/III), regulation number, medical specialty and submission requirements. openFDA device/classification endpoint.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Lucene-style query over this dataset's fields: 'field:term', AND with '+AND+', OR with a space, exact phrase via a '.exact' field suffix with quotes, ranges as '[low+TO+high]' (dates like '[20040101+TO+20081231]'). Example: medical_specialty_description:\"Cardiovascular\"",
"type": "string"
},
"sort": {
"description": "Sort order, as `field:asc` or `field:desc`, e.g. 'receivedate:desc'.",
"type": "string"
},
"limit": {
"description": "Max number of records to return (1–1000). Omit for the API default of 1.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"description": "Number of records to skip, for pagination (0–25000; skip+limit reaches up to ~26000 records).",
"type": "integer",
"minimum": 0,
"maximum": 25000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢search_food_events(search, sort, limit, skip)
Search the CFSAN Adverse Event Reporting System (CAERS): adverse events and product complaints for foods, dietary supplements and cosmetics. openFDA food/event endpoint.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Lucene-style query over this dataset's fields: 'field:term', AND with '+AND+', OR with a space, exact phrase via a '.exact' field suffix with quotes, ranges as '[low+TO+high]' (dates like '[20040101+TO+20081231]'). Example: products.industry_name:\"Dietary Conventional Foods/Meal Replacements\"",
"type": "string"
},
"sort": {
"description": "Sort order, as `field:asc` or `field:desc`, e.g. 'receivedate:desc'.",
"type": "string"
},
"limit": {
"description": "Max number of records to return (1–1000). Omit for the API default of 1.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"description": "Number of records to skip, for pagination (0–25000; skip+limit reaches up to ~26000 records).",
"type": "integer",
"minimum": 0,
"maximum": 25000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢search_food_recalls(search, sort, limit, skip)
Search food recall enforcement reports: recalled food products with the reason, classification (Class I/II/III), recalling firm, distribution state and status. openFDA food/enforcement endpoint.
Input Schema
{
"type": "object",
"properties": {
"search": {
"description": "Lucene-style query over this dataset's fields: 'field:term', AND with '+AND+', OR with a space, exact phrase via a '.exact' field suffix with quotes, ranges as '[low+TO+high]' (dates like '[20040101+TO+20081231]'). Example: state:\"CA\"",
"type": "string"
},
"sort": {
"description": "Sort order, as `field:asc` or `field:desc`, e.g. 'receivedate:desc'.",
"type": "string"
},
"limit": {
"description": "Max number of records to return (1–1000). Omit for the API default of 1.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"description": "Number of records to skip, for pagination (0–25000; skip+limit reaches up to ~26000 records).",
"type": "integer",
"minimum": 0,
"maximum": 25000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢count(endpoint, field, search, limit)
openFDA's most valuable feature: aggregate over any dataset by a field to get a top-terms histogram (returns `results: [{term, count}]` instead of records). Use the '.exact' field suffix to count whole phrases. Example: endpoint 'drug/event', field 'patient.reaction.reactionmeddrapt.exact', search 'patient.drug.medicinalproduct:"aspirin"' → the most common reactions reported for aspirin.
Input Schema
{
"type": "object",
"properties": {
"endpoint": {
"type": "string",
"enum": [
"drug/event",
"drug/label",
"drug/ndc",
"drug/enforcement",
"drug/drugsfda",
"drug/shortages",
"drug/orangebook",
"device/event",
"device/510k",
"device/classification",
"device/enforcement",
"device/pma",
"device/recall",
"device/registrationlisting",
"device/udi",
"device/covid19serology",
"food/enforcement",
"food/event",
"other/nsde",
"other/substance",
"tobacco/problem"
],
"description": "The openFDA endpoint to query, e.g. 'drug/event', 'device/510k', 'food/enforcement'."
},
"field": {
"type": "string",
"description": "The field to count/aggregate on (required), e.g. 'patient.reaction.reactionmeddrapt.exact' or 'classification'. Add '.exact' to count whole phrases rather than tokens."
},
"search": {
"description": "Optional Lucene filter applied before aggregation (same syntax as the search tools).",
"type": "string"
},
"limit": {
"description": "Max number of distinct terms to return (1–1000).",
"type": "integer",
"minimum": 1,
"maximum": 1000
}
},
"required": [
"endpoint",
"field"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢openfda_query(endpoint, search, sort, count, limit, ...)
Generic escape hatch to query ANY supported openFDA endpoint with the full parameter set — covers the less-common datasets (device/pma, device/registrationlisting, device/udi, device/covid19serology, drug/orangebook, other/nsde, other/substance, tobacco/problem, etc.). Use the named search tools for the common datasets; use this for everything else or for advanced queries. openFDA REST API.
Input Schema
{
"type": "object",
"properties": {
"endpoint": {
"type": "string",
"enum": [
"drug/event",
"drug/label",
"drug/ndc",
"drug/enforcement",
"drug/drugsfda",
"drug/shortages",
"drug/orangebook",
"device/event",
"device/510k",
"device/classification",
"device/enforcement",
"device/pma",
"device/recall",
"device/registrationlisting",
"device/udi",
"device/covid19serology",
"food/enforcement",
"food/event",
"other/nsde",
"other/substance",
"tobacco/problem"
],
"description": "The openFDA endpoint to query, e.g. 'drug/event', 'device/510k', 'food/enforcement'."
},
"search": {
"description": "Lucene-style query over this dataset's fields: 'field:term', AND with '+AND+', OR with a space, exact phrase via a '.exact' field suffix with quotes, ranges as '[low+TO+high]' (dates like '[20040101+TO+20081231]'). Example: e.g. brand_name:\"x\" (fields vary by endpoint)",
"type": "string"
},
"sort": {
"description": "Sort order, as `field:asc` or `field:desc`, e.g. 'receivedate:desc'.",
"type": "string"
},
"count": {
"description": "Optional field to aggregate on (returns `results: [{term, count}]`); add '.exact' for whole phrases.",
"type": "string"
},
"limit": {
"description": "Max number of records to return (1–1000). Omit for the API default of 1.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"skip": {
"description": "Number of records to skip, for pagination (0–25000; skip+limit reaches up to ~26000 records).",
"type": "integer",
"minimum": 0,
"maximum": 25000
}
},
"required": [
"endpoint"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence