# Openfda (npm · @pipeworx/mcp-openfda)

FDA drug data via openFDA: adverse-event reports and safety-signal tools (FAERS search, event…

- Trust score: 81/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `gateway.pipeworx.io`: 86/100, [markdown](https://verifymcp.io/servers/pipeworx-io-openfda/openfda-mcp.md), [page](https://verifymcp.io/servers/pipeworx-io-openfda/openfda-mcp)
- npm · `@pipeworx/mcp-openfda`: 81/100 (this document), [markdown](https://verifymcp.io/servers/pipeworx-io-openfda/pipeworx-mcp-openfda.md), [page](https://verifymcp.io/servers/pipeworx-io-openfda/pipeworx-mcp-openfda)

## Channel facts

- Registry: `npm`
- Package: `@pipeworx/mcp-openfda`
- Version: `0.2.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - No production dependencies, so there is no dependency health to assess.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to pipeworx-io/mcp-openfda).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 1 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 63/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4282 tokens (~237/item across 18 items; 18 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 94/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 83% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 18 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 19 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Openfda MCP server?

Openfda runs locally as an npm package, launched with npx -y @pipeworx/mcp-openfda. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add pipeworx-io-openfda -- npx -y @pipeworx/mcp-openfda
```

### Cursor

```json
{
  "mcpServers": {
    "pipeworx-io-openfda": {
      "command": "npx",
      "args": [
        "-y",
        "@pipeworx/mcp-openfda"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "pipeworx-io-openfda": {
      "command": "npx",
      "args": [
        "-y",
        "@pipeworx/mcp-openfda"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add pipeworx-io-openfda -- npx -y @pipeworx/mcp-openfda
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "pipeworx-io-openfda": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@pipeworx/mcp-openfda"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add pipeworx-io-openfda --command npx --arg -y --arg @pipeworx/mcp-openfda
```

### Hermes

```yaml
mcp_servers:
  pipeworx-io-openfda:
    command: "npx"
    args: ["-y", "@pipeworx/mcp-openfda"]
```

### Netclaw

```json
{
  "McpServers": {
    "pipeworx-io-openfda": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@pipeworx/mcp-openfda"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add pipeworx-io-openfda -t stdio -c npx -a -y @pipeworx/mcp-openfda
```

### Other

```json
{
  "mcpServers": {
    "pipeworx-io-openfda": {
      "command": "npx",
      "args": [
        "-y",
        "@pipeworx/mcp-openfda"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 81, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-11-04 (score 66, −15)

- [security regression] Malware scan: pass → unverified
- [functional] Package version: 0.2.0 → 0.2.1

### 2026-11-03 (score 81, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-01 (score 80, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-30 (score 79, +1)

No change was recorded against any check on this day. Stability & Change Management went from 0 to 3. That category is still filling its 30-day observation window: 0 days of observed history at the previous scan, 1 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-29 (score 78)

First indexed and scored.

## MCP tools (18)

### `fda_drug_events` (~340 tokens)

Search FAERS adverse event reports by drug name, MedDRA reaction term, or date range. Returns report counts, reaction types, seriousness levels, and dates. Natural multi-word reaction phrasing is retried against MedDRA preferred-term word order before an empty result is reported. FAERS reports do not establish incidence or causality.

Input parameters:

- `limit` (number): Number of results (1-100, default 10)
- `query` (string, required): OpenFDA search query. FAERS stores a drug under FOUR different fields and no single one is complete: patient.drug.openfda.generic_name / .brand_name / .substance_name are enrichment (missing for some…
- `skip` (number): Offset for pagination (default 0)

### `fda_drug_approvals` (~634 tokens)

Find FDA-approved drugs by brand name, active ingredient, or application number. To find generic versions of a drug, search by active ingredient using products.active_ingredients.name (NOT openfda.generic_name — that field only works in the label endpoint). IMPORTANT: drug names in the FDA database are stored in UPPERCASE — always pass ingredient and brand names in uppercase (e.g. "APIXABAN" not "apixaban") or you will get 0 results. Returns approval status, sponsor, application number (ANDA = generic, NDA = brand), and application details. There is NO queryable "application_type" field — never add application_type:"ANDA" (it returns 0 results). To limit to generics, search by active ingredient and read the ANDA/NDA prefix on application_number in the results. This endpoint has NO indication/disease field — for "drugs approved to treat <condition>" use fda_drug_labels (which searches indications_and_usage); an indication phrase passed here is silently ignored and matches by drug name only. The response `total` can exceed the 100-row cap on a single page — use `skip` to page past it, and `sort` to get genuinely-newest-first ordering ("most recently approved" is not the default order).

Input parameters:

- `limit` (number): Number of results (1-100, default 10)
- `query` (string, required): OpenFDA drugsfda search query. Drug names MUST be UPPERCASE in quotes. To find all generics for a drug: 'products.active_ingredients.name:"APIXABAN"' (returns all ANDA + NDA approvals). By brand: 'op…
- `skip` (number): Offset for pagination (default 0). The reported `total` is often larger than one page — pass skip=100 to reach the 101st+ result of a large query instead of assuming the first page is everything.
- `sort` (string): Order results by each drug's original FDA approval date instead of openFDA's default (unordered/relevance) order. approval_date_desc puts the genuinely most-recently-approved drug first — needed for…

### `fda_applications_by_cik` (~365 tokens)

Find ALL Drugs@FDA applications for a company by SEC CIK, ticker, or company name — without needing to know its FDA sponsor_name spelling. Drugs@FDA has no company-ID field: sponsor_name is free text, and one company routinely files under several forms (e.g. Eli Lilly appears as "LILLY", "ELI LILLY AND CO", "ELI LILLY CO", "LILLY RES LABS" — its own SEC-registered name "ELI LILLY AND COMPANY" matches ZERO of them in fda_drug_approvals). This resolves the company via SEC (same identity as the edgar pack), derives its most distinctive name token, and searches Drugs@FDA for every sponsor_name variant containing it in one call — returning the combined application list plus a `sponsor_name_forms` breakdown showing exactly which spellings were found. Only sponsors containing the company's distinctive name word are returned (industry words like PHARMACEUTICALS never anchor the match, and `excluded_non_word_matches` counts substring-only hits that were dropped). Use this INSTEAD of guessing sponsor_name strings for fda_drug_approvals when you have (or can resolve) the company's CIK/ticker. For a subsidiary or operating name that isn't itself SEC-listed, resolve to the parent first with edgar's sponsor_to_filer, then pass that CIK here.

Input parameters:

- `cik_or_ticker` (string, required): SEC CIK (e.g. "59478"), stock ticker (e.g. "LLY"), or exact SEC-listed company name (e.g. "Eli Lilly and Co").
- `limit` (number): Max applications to return (1-200, default 100).

### `fda_novel_approvals` (~390 tokens)

Most recent NOVEL drug approvals, in FDA/CDER's own sense of the word: a new drug or biologic never before approved or marketed in the U.S. (read live from FDA's own published Novel Drug Approvals list). Use for "what is the most recent novel drug the FDA approved", "how many novel drugs has CDER approved this year", "latest FDA drug approvals". Excludes generics, reformulations of an already-approved ingredient, and biosimilars — these are NOT on FDA's novel list even though they are "original" NDA/BLA submissions. Returns approval date, drug name, active ingredient, and approved use, sorted newest-first; application numbers/sponsors are not published on FDA's novel-drug page. Pass include_generics:true for a different, broader count (every original NDA/BLA/ANDA approval reconstructed from Drugs@FDA, reformulations/biosimilars included) — that path says so in its own note. Not for label text (fda_drug_labels) or searching a specific known drug (fda_drug_approvals).

Input parameters:

- `days` (number): Look-back window in days (1-365, default 90)
- `include_generics` (boolean): When true, switch from FDA's own novel-drug list to a broader Drugs@FDA reconstruction that also includes original ANDA (generic) approvals, reformulations, and biosimilars (default false — the defau…
- `limit` (number): Max approvals to return (1-50, default 10)
- `skip` (number): Offset into the newest-first results (default 0). total_in_window can exceed the 50-result cap on one call — pass skip=50 to page further into the window instead of assuming the window is fully cover…

### `fda_drug_labels` (~228 tokens)

Get FDA drug labeling (SPL) by drug name OR by INDICATION. This is the tool for "what drugs are approved to treat <condition>" — it searches the indications_and_usage text, which the drugsfda approvals endpoint does NOT carry. Query by brand/generic name (openfda.brand_name:"HUMIRA"), or by indicated use (indications_and_usage:"rheumatoid arthritis"). Returns indications, boxed/other warnings, dosage, contraindications, and adverse reactions (each text field capped, set_id preserved for out-of-band full-label fetch). Note: FDA label publication trails approval by weeks, so a just-approved drug may not have a label yet.

Input parameters:

- `limit` (number): Number of results (1-100, default 5)
- `query` (string, required): OpenFDA search query. Examples: 'openfda.brand_name:"HUMIRA"', 'openfda.generic_name:"adalimumab"'
- `skip` (number): Pagination offset (default 0) — the reported total can exceed one page of 100.

### `fda_drug_recalls` (~201 tokens)

Search FDA drug recalls and enforcement actions by drug name or reason — returns recall classification, date, reason and enforcement status. A multi-word search is tried as ALL terms first and falls back to ANY term when nothing matches all of them; the response says which happened in match_mode, so a loose match is never mistaken for a precise one. Recall reasons are free narrative text and often name the contaminant rather than the harm ("NDMA impurity", not "cancer"), so search the substance when a symptom finds nothing.

Input parameters:

- `limit` (number): Number of results (1-100, default 10)
- `query` (string, required): OpenFDA search query. Examples: 'openfda.brand_name:"VALSARTAN"', 'classification:"Class I"', 'reason_for_recall:"contamination"'
- `skip` (number): Pagination offset (default 0) — the reported total can exceed one page of 100.

### `fda_drug_shortages` (~177 tokens)

Search the FDA Drug Shortages database by generic or brand name, manufacturer, status, or an advanced openFDA query. Returns national supply records and available FDA dates; reason and other details are sparse in the upstream data. This is not local pharmacy inventory or medical advice.

Input parameters:

- `drug` (string): Generic or proprietary drug name, e.g. "lisdexamfetamine".
- `limit` (number): Number of records (1-100, default 20).
- `manufacturer` (string): Company/manufacturer name.
- `query` (string): Optional raw openFDA shortage query for advanced filters. Combined with the structured filters using AND.
- `skip` (number): Pagination offset (default 0).
- `status` (string): FDA status filter: "Current", "Resolved", or "To Be Discontinued".

### `fda_shortage_changes` (~259 tokens)

FDA drug-shortage records ordered by update_date, newest first, then restricted to the requested look-back window. Use for recently updated, discontinued, or resolved national shortages; this does not imply availability at any specific pharmacy or hospital. Most rows in any window are "Reverified" (FDA re-checking a status it already had) — pass update_type to filter to the change kinds that actually matter, e.g. New/Discontinued/To Be Discontinued/Resolved, and exclude Reverified.

Input parameters:

- `days` (number): Look-back window in days (1-365, default 30).
- `limit` (number): Maximum records to return (1-100, default 25).
- `skip` (number): Pagination offset into the filtered, windowed result set (default 0).
- `status` (string): Optional FDA status: "Current", "Resolved", or "To Be Discontinued".
- `update_type`: Optional filter on the kind of change, applied before paging (e.g. "New", "Discontinued", "To Be Discontinued", "Resolved", "Updated"; exclude "Reverified" to skip routine re-checks). String or array…

### `fda_complete_response_letters` (~199 tokens)

Search FDA-disclosed Complete Response Letters for drug and biologic applications. Defaults to letter_type "COMPLETE RESPONSE"; optionally include other letter types in the same dataset. Returns the application’s current approval_status, letter metadata, an excerpt, and the official document URL.

Input parameters:

- `application_number` (string): NDA/BLA application number.
- `company` (string): Sponsor/company name.
- `from_date` (string): Optional start date, YYYY-MM-DD.
- `include_other_letter_types` (boolean): Include tentative approvals, rescissions, refusal-to-file letters, and other non-CRL records (default false).
- `limit` (number): Number of letters (1-100, default 20).
- `query` (string): Optional full-text term or raw openFDA CRL search expression.
- `skip` (number): Pagination offset (default 0).
- `to_date` (string): Optional end date, YYYY-MM-DD.

### `fda_crl_detail` (~87 tokens)

Retrieve one FDA Complete Response Letter by application number and optionally letter date. Returns the FDA-disclosed letter text and document URL. Confidential commercial and trade-secret material may be redacted by FDA.

Input parameters:

- `application_number` (string, required): Required NDA/BLA application number.
- `letter_date` (string): Optional exact letter date, YYYY-MM-DD, when an application has multiple CRLs.

### `fda_food_recalls` (~149 tokens)

Search FDA FOOD recall / enforcement reports (openFDA /food/enforcement) — product recalls, reasons, classification, recalling firm, distribution, and status. Use for food-safety / recall-history questions (distinct from fda_drug_recalls which covers drugs).

Input parameters:

- `limit` (number): Number of results (1-100, default 10)
- `query` (string): OpenFDA search query (optional — omit for most recent recalls). Examples: 'reason_for_recall:"Listeria"', 'state:"CA"', 'classification:"Class I"'.
- `skip` (number): Pagination offset (default 0) — the reported total can exceed one page of 100.

### `fda_event_counts` (~126 tokens)

Aggregate adverse events by reaction type, patient age, or outcome. Returns top reactions for a drug and event trends over time.

Input parameters:

- `count_field` (string, required): Field to count/aggregate by. Examples: "patient.reaction.reactionmeddrapt.exact" (top reactions), "receivedate" (timeline), "serious" (severity breakdown), "patient.drug.openfda.brand_name.exact" (co…
- `query` (string, required): OpenFDA search query to filter events before counting. Same syntax as fda_drug_events.

### `fda_warning_letters` (~378 tokens)

Search FDA WARNING LETTERS — official enforcement letters FDA sends firms for violations (CGMP, adulterated/misbranded products, unapproved claims). Answers "has <company> received an FDA warning letter", "recent FDA warning letters about supplements/devices". By default `search` matches the RECIPIENT company the letter was issued to, so the answer is about that firm's own enforcement history; set match:"fulltext" to search the whole letter record instead, which also finds letters that merely mention a firm. Every row reports matched_field so a caller can tell "issued to" from "mentions". Covers the 3,680 letters fda.gov publishes from 2021 onward — recipient company, posted and issued dates, issuing FDA office, subject and a link to the full letter text — and, for a firm with nothing in that window, falls back to the FDA compliance-actions archive of older letters back to 2010, which gives the firm, place, product type and issue date but no document. Every row says which of the two it came from. Live, no caller credential needed.

Input parameters:

- `limit` (number): Max letters to return, 1–50 (default 10). Newest first.
- `match` (string): How `search` is applied. "recipient" (default) keeps only letters whose addressed company matches. "fulltext" returns every record matching anywhere in its indexed text, including letters that only m…
- `search` (string): Company the letter was issued to (e.g. "Elanco", "Merck Sharp & Dohme") under the default match mode. Under match:"fulltext" this is a free-text query over the whole record — a product ("supplement")…

### `fda_faers_signal_summary` (~218 tokens)

Calculate report-level FAERS disproportionality routing metrics for one drug/reaction pair using a 2×2 reporting table. The reaction argument matches one whole MedDRA preferred term, so a broad word like "neuropathy" counts only reports filed under that exact term and not the specific terms containing it. Natural multi-word phrasing is resolved to MedDRA word order and disclosed; a term matching nothing is reported as unresolved rather than as zero reports. ROR/PRR are screening statistics—not incidence, causality, comparative drug safety, or an FDA safety conclusion.

Input parameters:

- `drug` (string, required): Brand or generic drug name.
- `from_date` (string): Optional YYYY-MM-DD.
- `reaction` (string, required): MedDRA preferred term, matched whole rather than as a substring. Natural English word order is accepted and corrected ("ischaemic optic neuropathy" resolves to "OPTIC ISCHAEMIC NEUROPATHY").
- `to_date` (string): Optional YYYY-MM-DD.

### `fda_faers_reaction_profile` (~154 tokens)

Summarize the most frequently co-reported FAERS reactions plus serious/non-serious report counts for a drug. Counts are spontaneous reports with duplicates, co-medications, and reporting bias—not event rates or proof of causation.

Input parameters:

- `drug` (string, required)
- `from_date` (string): Optional. YYYY-MM-DD. OMIT for all-time counts (the common case). Only specify if the question is about a specific date range — and never set from_date equal to to_date (a zero-width window returns 0…
- `limit` (number)
- `to_date` (string): Optional. YYYY-MM-DD. OMIT unless from_date is also set. Must be after from_date.

### `fda_faers_trend` (~153 tokens)

Aggregate daily FAERS report counts into calendar months for a drug and optional reaction over a bounded date window. The reaction argument matches one whole MedDRA preferred term, so a broad word like "neuropathy" counts only reports filed under that exact term and not the specific terms containing it. Natural multi-word phrasing is resolved to MedDRA word order and disclosed; a term matching nothing is reported as unresolved rather than as zero reports. Trends reflect reporting activity, publicity, utilization, duplicates, and database updates—not incidence or changing clinical risk.

Input parameters:

- `drug` (string, required)
- `from_date` (string, required)
- `reaction` (string)
- `to_date` (string, required)

### `fda_application_history` (~74 tokens)

Retrieve one Drugs@FDA NDA, ANDA, or BLA application and return its products and chronological submission-action history. Submission codes require regulatory interpretation and do not by themselves establish approval scope, exclusivity, or current marketing.

Input parameters:

- `application_number` (string, required): NDA, ANDA, or BLA followed by digits.

### `fda_postmarket_risk_profile` (~96 tokens)

Combine a drug’s FAERS reporting profile, label warning fields, and FDA recall records for review routing. This is not a validated safety comparison, causal assessment, incidence estimate, or substitute for FDA communications and clinical review.

Input parameters:

- `drug` (string, required)
- `from_date` (string)
- `reaction_limit` (number)
- `recall_limit` (number)
- `to_date` (string)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/pipeworx-io-openfda/pipeworx-mcp-openfda#diagnostics

## Score history

- 2026-11-05: 81
- 2026-11-04: 66
- 2026-11-03: 81
- 2026-11-02: 80
- 2026-11-01: 80
- 2026-10-31: 79
- 2026-10-30: 79
- 2026-10-29: 78

## Common questions

### What is the Openfda MCP server?

Openfda is an MCP server listed in the public MCP registry as io.github.pipeworx-io/openfda. FDA drug data via openFDA: adverse-event reports and safety-signal tools (FAERS search, event… This page covers its npm package (@pipeworx/mcp-openfda).

### Is the Openfda MCP server safe to use?

Openfda scores 81 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Openfda MCP server expose?

Openfda exposes 18 tools: fda_drug_events, fda_drug_approvals, fda_applications_by_cik, fda_novel_approvals, fda_drug_labels, and 13 more. Their descriptions and schemas cost roughly 4,228 tokens of context every time the server is loaded.

### Is the Openfda MCP server still maintained?

Openfda is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Openfda MCP server under?

Openfda declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/@pipeworx/mcp-openfda
- Socket report: https://socket.dev/npm/package/@pipeworx/mcp-openfda
- Repository: https://github.com/pipeworx-io/mcp-openfda
- Website: https://pipeworx.io/packs/openfda
- Changelog RSS feed: https://verifymcp.io/servers/pipeworx-io-openfda/pipeworx-mcp-openfda.xml
- Changelog JSON feed: https://verifymcp.io/servers/pipeworx-io-openfda/pipeworx-mcp-openfda.json
- HTML version of this page: https://verifymcp.io/servers/pipeworx-io-openfda/pipeworx-mcp-openfda
