openFDA Regulatory Metadata

com.blackswancausallabsPublished by blackswancausallabs.comv0.1.0Updated Oct 24, 2026

Resolve FDA application numbers and product names to regulatory metadata (CDER, CBER, CDRH).

The publisher's own server: DAG Studio MCP

VerifiedSTDIODesktop onlyKnowledge & MemoryData & Analytics

Overview

AI-generated overview

A local MCP server that resolves FDA application numbers and product names to regulatory metadata for drugs, biologics and medical devices via the openFDA API.

What you can do
Search drug label text and look up Drugs@FDA records for NDA, BLA and ANDA numbers, and resolve brand or generic names to application numbers, plus an experimental label sweep for RWE signals (drugs and biologics). Look up device submissions by K, DEN, P or H number, map product codes to device class and specialty, and run the full number-to-classification chain (devices). Distinguish genuine not-found results from transient failures, which are retried and raised rather than cached.
When to use it
Useful when you need to turn FDA application or submission numbers, or product names, into authoritative regulatory metadata, especially for CDRH device classification where the number-to-product-code-to-class chain matters. Also suited to research workflows that want a pinned, reproducible resolution layer.
Requirements
Runs as a local process installed from PyPI (pip install openfda-mcp) and configured in an MCP client. Network access to the openFDA API is required. An openFDA API key is optional via the OPENFDA_API_KEY environment variable; without it, limits are 40 requests per minute and 1,000 per day.
Before you install
The screen_for_rwe_signals tool is explicitly unvalidated; treat its output as candidates for human review, not findings or counts. Device class for HDE numbers is inferred rather than retrieved, and medical specialty stays null for them. Without an API key, rate limits are low, so bulk sweeps may hit transient errors. Pin the version for reproducible research results.

Installation

In SourceWeft

  1. Open openFDA Regulatory Metadata in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

openFDA MCP

An MCP server exposing FDA regulatory metadata (drugs, biologics, and medical devices) through the openFDA API.

Built by Black Swan Causal Labs as the identifier-resolution layer for a real-world-evidence (RWE) case roster: given an FDA application number or a product name, resolve it to authoritative regulatory metadata.

Why this exists

There are other openFDA MCP servers, and several are broader. This one is narrow on purpose: it is the instrument that resolved the application numbers in a specific published RWE dataset, and it exists so that dataset can name the tool that produced it.

That matters more than it might sound. Whether BLA 125123/2058 resolves to a particular product, or DEN160026 to a particular device class, is a decision made by a piece of software — and a different wrapper can yield a different roster. "We used openFDA" is not a sufficient methods statement; "openfda-mcp v0.1.0" is. If you use this in research, pin the version.

Its practical edge over a general openFDA client is the device half: resolving a CDRH submission number to a risk class takes a three-hop chain (number → product code → classification) with two non-obvious traps, both handled here.

Tools

Drugs and biologics (/drug/* — CDER, CBER)

ToolPurpose
search_drug_labelSearch SPL label text, optionally scoped to a section
lookup_drugsfda_applicationDrugs@FDA record for an NDA/BLA/ANDA number
resolve_drug_to_applicationBrand or generic name → application number(s)
screen_for_rwe_signalsExperimental. Sweep labels for RWE signals

Devices (/device/* — CDRH)

ToolPurpose
lookup_device_submissionK / DEN / P / H number → device record
classify_device_product_codeProduct code → device class + medical specialty
validate_device_applicationFull chain: number → class, specialty, category

Install

bash
pip install openfda-mcp

Add to your MCP client config:

json
{  "mcpServers": {    "openfda": {      "command": "openfda-mcp",      "env": { "OPENFDA_API_KEY": "${OPENFDA_API_KEY:-}" }    }  }}

The API key is optional. Without one, openFDA allows 40 requests/min and 1,000/day, which is enough for interactive use. A free key raises it to 240/min and 120,000/day — worth having for bulk sweeps.

Two findings worth knowing

Both were established empirically and are not obvious from FDA's docs.

De Novo grants live in the 510(k) endpoint. DEN###### numbers are stored in the k_number field of /device/510k. There is no De Novo endpoint, and looking for one leads to the wrong conclusion that De Novo numbers can't be resolved. They can.

HDE numbers are not in openFDA at all. Neither the 510(k) nor the PMA endpoint carries H######, so no product code — and therefore no classification — is retrievable. This server still reports device_class: "III" for them, by regulatory inference: HDE is by definition the pathway for devices that would otherwise require a PMA. medical_specialty stays null, because that one really is unavailable, and device_class_source says which is which.

Transient failures are never silent

A genuine absence and a failed request are different things, and this package keeps them different:

  • not found (HTTP 404, or 200 with no results) → returns None; safe to cache
  • transient failure (timeout, connection error, 429, 5xx) → retried with backoff, then raises OpenFDATransientError; never cache this
  • rejected request (other 4xx) → raises OpenFDARequestError

This is a direct response to a real defect: an earlier version swallowed every exception and returned None, so a single read timeout on one application number was cached as a real miss and silently blanked two fields on that record for weeks. Cached failures are indistinguishable from real absences, which makes them the worst kind of silent data loss.

On screen_for_rwe_signals

It is unvalidated. There is no ground-truth oracle for a discovery sweep, and below the strongest hits the results are dominated by applications whose labels use "registry" in an unrelated sense. Treat its output as candidates for human review — not as a finding, and not as a count to report. Establishing recall against a held-out set of known cases is open work.

Development

bash
pip install -e ".[dev]"pytest              # unit tests, offlinepytest -m live      # live checks against api.fda.gov

Live tests assert against known-good fixtures (K203571 → class II Ophthalmic, DEN160026 → class II Immunology, BLA761180 → LEO Pharma) so a change on FDA's side surfaces as a test failure rather than as quietly wrong data.

License

MIT

Source: README.md at commit d952942

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.1.0LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

Other Blackswancausallabs integrations