openFDA MCP by usefulapi

Search openFDA drug, device, food and adverse-event datasets.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
91%
Naming quality
100%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,374Tokens (tool definitions)
~2.6 KBTypical response size
Significant attention impact (3.42% of 128k context)

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-http

What it can do

Tool inventory

Tools (14)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded14 tools
verifiedversion not recorded14 tools