protogrid

Search / io.github.cyanheads/openfda-mcp-server

openfda-mcp-server

R0· no sign-in

Query FDA data on drugs, food, devices, and recalls via openFDA. STDIO or Streamable HTTP.

v0.8.1 · active · repository · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality81good
Trust94of 100
Uptime, 30 days99%
Latency p50178 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "openfda-mcp-server": {
      "type": "http",
      "url": "https://openfda.caseyjhand.com/mcp"
    }
  }
}
claude mcp add --transport http openfda-mcp-server https://openfda.caseyjhand.com/mcp
[mcp_servers.openfda-mcp-server]
url = "https://openfda.caseyjhand.com/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "openfda-mcp-server": {
      "type": "remote",
      "url": "https://openfda.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "openfda-mcp-server": {
      "type": "http",
      "url": "https://openfda.caseyjhand.com/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=openfda-mcp-server&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vb3BlbmZkYS5jYXNleWpoYW5kLmNvbS9tY3AifQ%3D%3D"
}
{
  "servers": {
    "openfda-mcp-server": {
      "type": "http",
      "url": "https://openfda.caseyjhand.com/mcp"
    }
  }
}
{
  "mcpServers": {
    "openfda-mcp-server": {
      "httpUrl": "https://openfda.caseyjhand.com/mcp"
    }
  }
}
extensions:
  "openfda-mcp-server":
    enabled: true
    name: "openfda-mcp-server"
    type: streamable_http
    uri: "https://openfda.caseyjhand.com/mcp"
    timeout: 300

Quality 81 / 100good

protocol88 · weight 25
  • pass
    protocol.modernsupports 2026-07-28 (server/discover)
  • pass
    protocol.statelessanswers without a session
  • pass
    protocol.transportstreamable HTTP
  • warn
    protocol.list_ttltools/list declares ttlMs 0, so clients re-fetch it on every use
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene79 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations14 of 14 tools declare readOnlyHint or destructiveHint
  • fail
    tools.directory_hintsno tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: openfda_search_animal_events (destructiveHint, idempotentHint, openWorldHint); openfda_search_drug_shortages (destructiveHint, idempotentHint, openWorldHint); openfda_count_values (destructiveHint, idempotentHint, openWorldHint); …
  • warn
    tools.token_costabout 11,821 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability75 · weight 15
  • warn
    stability.changes10 tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependenciesn/a · weight 15

14 tools, about 11,821 tokens to load them all · tool set fcd4ea0a532d · tools last changed 2026-10-13 · checked 2026-10-20 03:37 UTC

Tool changes

  • openfda_drug_profilechangedoutput schema
  • openfda_lookup_ndcchangedinput schema, output schema
  • openfda_search_device_clearanceschangedinput schema, output schema
  • openfda_search_drug_approvalschangedinput schema, output schema
  • openfda_get_drug_labelchangedinput schema
  • openfda_search_tobacco_reportschangedinput schema, output schema
  • openfda_search_recallschangedinput schema, output schema
  • openfda_search_drug_shortageschangedinput schema, output schema
  • openfda_search_animal_eventschangeddescription, input schema, output schema
    before

    Search adverse event reports for veterinary drugs and devices submitted to the FDA Center for Veterinary Medicine. Records include animal species, breed, age, weight, drug name and route, adverse reactions (using VeDDRA terminology), and outcome. Use to investigate safety signals for veterinary products, find reports by animal species or drug, or explore reaction patterns. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.

    after · 58% of words in common

    Search adverse event reports for veterinary drugs and devices submitted to the FDA Center for Veterinary Medicine. Records include animal species, breed, age, weight, drug name and route, adverse reactions (using VeDDRA terminology), and outcome. Use to investigate safety signals for veterinary products, find reports by animal species or drug, or explore reaction patterns. Brand and manufacturer names are masked as "MSK" on every record (the FDA null flavor for withheld data), so find a product by active ingredient on drug.active_ingredients.name, unsuffixed. An ingredient search spans every product containing it and cannot attribute reports to one brand; drug.manufacturer.registration_number (the full value, e.g. "USA-USFDACVM-N141426") narrows it to one approval. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.

  • openfda_search_adverse_eventschangedinput schema, output schema

Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 94 / 100

provenance80
liveness100
freshness100
hygiene100

+repository +namespace-matches-repo +reachable +uptime-99% +updated-7d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Dependencies

@cyanheads/[email protected] npmthis version is not known to the dependency resolver

@cyanheads/[email protected] npmthis version is not known to the dependency resolver

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0. The graph is what a clean install of this version resolves today; nothing was installed or run. How it is checked.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://openfda.caseyjhand.com/mcp streamable-httpnoneyes99%178 ms2026-07-282026-10-20
packageregistryversionruntimesecrets
@cyanheads/openfda-mcp-servernpm0.8.1npx
@cyanheads/openfda-mcp-servernpm0.8.1npx

Tools (14)

openfda_count_valuesread-onlyAggregate 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.
openfda_dataframe_describeread-onlyList 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.
openfda_dataframe_queryread-onlyRun 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.
openfda_describe_fieldsread-onlyReturn 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.
openfda_drug_profileread-onlyResolve 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.
openfda_get_drug_labelread-onlyLook 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_lookup_ndcread-onlyLook up drugs in the NDC (National Drug Code) Directory. Identify drug products by NDC code, find active ingredients, packaging details, or manufacturer info. Pair with openfda_get_drug_label using the returned brand_name or set_id to read the package insert. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.
openfda_search_adverse_eventsread-onlySearch adverse event reports across drugs, food, and devices. Use to investigate safety signals, find reports for a specific product, or explore reactions by demographics. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.
openfda_search_animal_eventsread-onlySearch adverse event reports for veterinary drugs and devices submitted to the FDA Center for Veterinary Medicine. Records include animal species, breed, age, weight, drug name and route, adverse reactions (using VeDDRA terminology), and outcome. Use to investigate safety signals for veterinary products, find reports by animal species or drug, or explore reaction patterns. Brand and manufacturer names are masked as "MSK" on every record (the FDA null flavor for withheld data), so find a product by active ingredient on drug.active_ingredients.name, unsuffixed. An ingredient search spans every product containing it and cannot attribute reports to one brand; drug.manufacturer.registration_number (the full value, e.g. "USA-USFDACVM-N141426") narrows it to one approval. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.
openfda_search_device_clearancesread-onlySearch FDA device premarket notifications — 510(k) clearances and PMA approvals. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.
openfda_search_drug_approvalsread-onlySearch the Drugs@FDA database for drug application approvals (NDAs and ANDAs). Returns application details, sponsor info, and full submission history. Pair with openfda_get_drug_label to read the approved label, or openfda_count_values to aggregate by sponsor_name, product_type, or route. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.
openfda_search_drug_shortagesread-onlySearch FDA drug shortage records. Returns per-product shortage status, availability, therapeutic category, dosage form, manufacturer, and dates. Use to check whether a drug is currently in shortage, find all oncology drugs with supply issues, or retrieve the openfda block (brand_name, product_ndc, rxcui) to chain into openfda_get_drug_label or openfda_lookup_ndc. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.
openfda_search_recallsread-onlySearch enforcement reports and recall actions across drugs, food, and devices. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.
openfda_search_tobacco_reportsread-onlySearch problem reports submitted to the FDA for tobacco products, including e-cigarettes, vaping products, cigarettes, and smokeless tobacco. Reports capture product type, reported health problems (e.g. seizure, chest pain), product problems (e.g. exploding battery), whether a non-user was affected, and submission date. Use to investigate safety signals, find reports by product type, or analyze health effects. With stage=true, call openfda_dataframe_describe for the staged columns, then openfda_dataframe_query for SQL.

Schemas: list_tools.

Similar MCP servers

More from io.github.cyanheads

And 139 more from this publisher.

Official server.json
{
  "name": "io.github.cyanheads/openfda-mcp-server",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://openfda.caseyjhand.com/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "0.8.1",
  "packages": [
    {
      "version": "0.8.1",
      "transport": {
        "type": "stdio"
      },
      "identifier": "@cyanheads/openfda-mcp-server",
      "runtimeHint": "npx",
      "registryType": "npm",
      "registryBaseUrl": "https://registry.npmjs.org",
      "environmentVariables": [
        {
          "name": "OPENFDA_API_KEY",
          "format": "string",
          "description": "Free API key from open.fda.gov — increases daily limit from 1K to 120K requests."
        },
        {
          "name": "CANVAS_PROVIDER_TYPE",
          "format": "string",
          "default": "none",
          "description": "Set to 'duckdb' to enable DataCanvas staging: stage=true or a canvas_id on an openfda_search_* tool or openfda_lookup_ndc stages the matched records as a SQL table, and the openfda_dataframe_* tools are listed. The DuckDB binding ships with the server."
        },
        {
          "name": "OPENFDA_DATAFRAME_DROP_ENABLED",
          "format": "string",
          "default": "false",
          "description": "Enable openfda_dataframe_drop, which deletes a table staged on a DataCanvas. Off by default; applies only when DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb)."
        },
        {
          "name": "OPENFDA_MIRROR_ENABLED",
          "format": "string",
          "default": "false",
          "description": "Serve exact-key lookups for drug/label, drug/ndc, drug/enforcement, and drug/drugsfda from a local bulk mirror instead of the API. Off by default; the initial harvest runs out-of-band via the mirror:init script."
        },
        {
          "name": "OPENFDA_MIRROR_PATH",
          "format": "string",
          "default": "./data/openfda-mirror",
          "description": "Directory holding one SQLite file per mirrored dataset."
        },
        {
          "name": "OPENFDA_MIRROR_REFRESH_CRON",
          "format": "string",
          "description": "Cron expression for the in-process mirror refresh. HTTP transport only; stdio operators run mirror:refresh from the host. Requires the optional node-cron peer dependency."
        },
        {
          "name": "OPENFDA_MIRROR_FALLBACK_LIVE",
          "format": "string",
          "default": "true",
          "description": "Fall back to the live API when the mirror is cold, missing the record, or failing. Disable to fail loudly instead."
        },
        {
          "name": "OPENFDA_MIRROR_REFRESH_TIMEOUT_MS",
          "format": "string",
          "default": "21600000",
          "description": "Wall-clock budget for one scheduled refresh before it is aborted. Raise it for drug/label, the only multi-partition dataset."
        },
        {
          "name": "OPENFDA_MIRROR_BASE_URL",
          "format": "string",
          "default": "https://api.fda.gov",
          "description": "Host serving the openFDA bulk download manifest. Override only to harvest from a private mirror of the dumps."
        },
        {
          "name": "MCP_LOG_LEVEL",
          "format": "string",
          "default": "info",
          "description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn')."
        }
      ]
    },
    {
      "version": "0.8.1",
      "transport": {
        "url": "http://localhost:3010/mcp",
        "type": "streamable-http"
      },
      "identifier": "@cyanheads/openfda-mcp-server",
      "runtimeHint": "npx",
      "registryType": "npm",
      "registryBaseUrl": "https://registry.npmjs.org",
      "environmentVariables": [
        {
          "name": "OPENFDA_API_KEY",
          "format": "string",
          "description": "Free API key from open.fda.gov — increases daily limit from 1K to 120K requests."
        },
        {
          "name": "MCP_TRANSPORT_TYPE",
          "value": "http",
          "format": "string",
          "description": "Selects the HTTP transport."
        },
        {
          "name": "MCP_HTTP_HOST",
          "format": "string",
          "default": "127.0.0.1",
          "description": "The hostname for the HTTP server."
        },
        {
          "name": "MCP_HTTP_PORT",
          "format": "string",
          "default": "3010",
          "description": "The port to run the HTTP server on."
        },
        {
          "name": "MCP_HTTP_ENDPOINT_PATH",
          "format": "string",
          "default": "/mcp",
          "description": "The endpoint path for the MCP server."
        },
        {
          "name": "MCP_AUTH_MODE",
          "format": "string",
          "default": "none",
          "description": "Authentication mode to use: 'none', 'jwt', or 'oauth'."
        },
        {
          "name": "CANVAS_PROVIDER_TYPE",
          "format": "string",
          "default": "none",
          "description": "Set to 'duckdb' to enable DataCanvas staging: stage=true or a canvas_id on an openfda_search_* tool or openfda_lookup_ndc stages the matched records as a SQL table, and the openfda_dataframe_* tools are listed. The DuckDB binding ships with the server."
        },
        {
          "name": "OPENFDA_DATAFRAME_DROP_ENABLED",
          "format": "string",
          "default": "false",
          "description": "Enable openfda_dataframe_drop, which deletes a table staged on a DataCanvas. Off by default; applies only when DataCanvas is enabled (CANVAS_PROVIDER_TYPE=duckdb)."
        },
        {
          "name": "OPENFDA_MIRROR_ENABLED",
          "format": "string",
          "default": "false",
          "description": "Serve exact-key lookups for drug/label, drug/ndc, drug/enforcement, and drug/drugsfda from a local bulk mirror instead of the API. Off by default; the initial harvest runs out-of-band via the mirror:init script."
        },
        {
          "name": "OPENFDA_MIRROR_PATH",
          "format": "string",
          "default": "./data/openfda-mirror",
          "description": "Directory holding one SQLite file per mirrored dataset."
        },
        {
          "name": "OPENFDA_MIRROR_REFRESH_CRON",
          "format": "string",
          "description": "Cron expression for the in-process mirror refresh. HTTP transport only; stdio operators run mirror:refresh from the host. Requires the optional node-cron peer dependency."
        },
        {
          "name": "OPENFDA_MIRROR_FALLBACK_LIVE",
          "format": "string",
          "default": "true",
          "description": "Fall back to the live API when the mirror is cold, missing the record, or failing. Disable to fail loudly instead."
        },
        {
          "name": "OPENFDA_MIRROR_REFRESH_TIMEOUT_MS",
          "format": "string",
          "default": "21600000",
          "description": "Wall-clock budget for one scheduled refresh before it is aborted. Raise it for drug/label, the only multi-partition dataset."
        },
        {
          "name": "OPENFDA_MIRROR_BASE_URL",
          "format": "string",
          "default": "https://api.fda.gov",
          "description": "Host serving the openFDA bulk download manifest. Override only to harvest from a private mirror of the dumps."
        },
        {
          "name": "MCP_LOG_LEVEL",
          "format": "string",
          "default": "info",
          "description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn')."
        }
      ]
    }
  ],
  "repository": {
    "url": "https://github.com/cyanheads/openfda-mcp-server",
    "source": "github"
  },
  "description": "Query FDA data on drugs, food, devices, and recalls via openFDA. STDIO or Streamable HTTP."
}