FDA MCP服务器
  
一 主控程序 通过LLM优化访问FDA数据的服务器 OpenFDA API 以及直接检索美国食品药品监督管理局的文件。涵盖所有21个OpenFDA终点和监管决定文件(510(k)摘要、De Novo决定、PMA批准函)。
快速开始
uvx fda-mcp就是这样。服务器在stdio上启动,并为任何MCP客户端做好准备。
使用Claude Desktop
添加到您的 claude_desktop_config.json:
{
"mcpServers": {
"fda": {
"command": "uvx",
"args": ["fda-mcp"],
"env": {
"OPENFDA_API_KEY": "your-key-here"
}
}
}
}配置文件位置:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - 视窗:
%APPDATA%\Claude\claude_desktop_config.json
使用Claude代码
直接从命令行添加:
claude mcp add fda -- uvx fda-mcp要包含API密钥以获得更高的速率限制,请执行以下操作:
claude mcp add fda -e OPENFDA_API_KEY=your-key-here -- uvx fda-mcp或者使用以下命令在Claude Code中交互式添加 /mcp 斜线命令。
API密钥(可选)
这 OPENFDA_API_KEY 环境变量是可选的。没有它,你每分钟会收到40个请求。使用免费密钥 open.fda.gov 你每分钟收到240个请求。
特性
- 4个MCP工具 --一个统一的搜索工具,计数/聚合、字段发现和文档检索
- 3 MCP资源 查询语法帮助、端点参考和字段发现
- 所有21个OpenFDA终点 通过单一途径访问
search_fda工具与adataset参数 - 服务器说明 --查询语法和常见错误会自动注入到每个LLM上下文中
- 可操作的错误消息 --内联语法帮助、故障排除提示,以及
.exact后缀警告 - 美国食品药品监督管理局决定文件 --从510(k)摘要、De Novo决策、PMA批准、SSED和补充中下载并提取文本
- OCR回退 用于扫描的PDF文档(较旧的FDA提交文件)
- 上下文高效响应 --汇总输出、按需字段发现、分页指导
工具
| 工具 | 目的 |
|---|---|
search_fda | 搜索21个OpenFDA数据集中的任何一个。这 dataset 参数选择端点(例如。, drug_adverse_events, device_510k, food_recalls).接受 search, limit, skip,以及 sort. |
count_records | 对任何端点进行聚合查询。返回值包括百分比和叙述性摘要。警告: .exact 文本字段上缺少后缀。 |
list_searchable_fields | 返回任何端点的可搜索字段名。如果不确定字段名称,请在搜索前致电。 |
get_decision_document | 获取FDA监管决定PDF文件并提取文本。支持510(k)、De Novo、PMA、SSED和补充文件。 |
数据集值 search_fda
| 类别 | 数据集 |
|---|---|
| 药物 | drug_adverse_events, drug_labels, drug_ndc, drug_approvals, drug_recalls, drug_shortages |
| 设备 | device_adverse_events, device_510k, device_pma, device_classification, device_recalls, device_recall_details, device_registration, device_udi, device_covid19_serology |
| 食物 | food_adverse_events, food_recalls |
| 其他 | historical_documents, substance_data, unii, nsde |
资源(3)
| URI | 内容 |
|---|---|
fda://reference/query-syntax | OpenFDA查询语法:AND/OR/NOT、通配符、日期范围、精确匹配 |
fda://reference/endpoints | 所有21个端点都有描述 |
fda://reference/fields/{endpoint} | 每个端点字段引用 |
查询示例
连接后,您可以问Claude以下问题:
- “搜索与OZEMPIC相关的不良事件”
- “查找2024年以来的所有I类设备召回”
- “LIPITOR最常见的不良反应是什么?”
- “获取K213456的510(k)摘要”
- “搜索心血管设备的PMA批准”
- “辉瑞公司召回了多少药品?按类别分列。”
- “查找二甲双胍的药物标签并总结警告”
- “雅培提交了哪些新冠肺炎血清学检测?”
配置
所有配置都是通过环境变量进行的:
| 变量 | 默认值 | 描述 |
|---|---|---|
OPENFDA_API_KEY | *(无)* | API键用于更高的速率限制(240和40请求/分钟) |
OPENFDA_TIMEOUT | 30 | HTTP请求超时(秒) |
OPENFDA_MAX_CONCURRENT | 4 | 最大并发API请求数 |
FDA_PDF_TIMEOUT | 60 | PDF下载超时(秒) |
FDA_PDF_MAX_LENGTH | 8000 | 从PDF中提取的默认最大文本字符数 |
OpenFDA查询语法
这 search 所有工具上的参数都使用OpenFDA查询语法:
# AND
patient.drug.openfda.brand_name:"ASPIRIN"+AND+serious:1
# OR (space = OR)
brand_name:"ASPIRIN" brand_name:"IBUPROFEN"
# NOT
NOT+classification:"Class III"
# Date ranges
decision_date:[20230101+TO+20231231]
# Wildcards (trailing only, min 2 chars)
device_name:pulse*
# Exact matching (required for count queries)
patient.reaction.reactionmeddrapt.exact:"Nausea"使用 list_searchable_fields 或 fda://reference/query-syntax 资源以获取完整参考。
安装选项
来自PyPI(推荐)
# Run directly without installing
uvx fda-mcp
# Or install as a persistent tool
uv tool install fda-mcp
# Or install with pip
pip install fda-mcp来源
git clone https://github.com/Limecooler/fda-mcp.git
cd fda-mcp
uv sync
uv run fda-mcp可选:扫描PDF的OCR支持
许多较旧的美国食品药品监督管理局文件(2010年之前)都是扫描图像。要从中提取文本,请执行以下操作:
# macOS
brew install tesseract poppler
# Linux (Debian/Ubuntu)
apt install tesseract-ocr poppler-utils没有这些,服务器仍然可以工作——当它遇到无法读取的扫描文档时,它会返回一条有用的消息。
发展
# Install with dev dependencies
git clone https://github.com/Limecooler/fda-mcp.git
cd fda-mcp
uv sync --all-extras
# Run unit tests (187 tests, no network)
uv run pytest
# Run integration tests (hits real FDA API)
OPENFDA_TIMEOUT=60 uv run pytest -m integration
# Run a specific test file
uv run pytest tests/test_endpoints.py -v
# Start the server directly
uv run fda-mcp项目结构
src/fda_mcp/
├── server.py # FastMCP server entry point
├── config.py # Environment-based configuration
├── errors.py # Custom error types
├── openfda/
│ ├── endpoints.py # Enum of all 21 endpoints
│ ├── client.py # Async HTTP client with rate limiting
│ └── summarizer.py # Response summarization per endpoint
├── documents/
│ ├── urls.py # FDA document URL construction
│ └── fetcher.py # PDF download + text extraction + OCR
├── tools/
│ ├── _helpers.py # Shared helpers (limit clamping)
│ ├── search.py # search_fda tool (all 21 endpoints)
│ ├── count.py # count_records tool
│ ├── fields.py # list_searchable_fields tool
│ └── decision_documents.py
└── resources/
├── query_syntax.py # Query syntax reference
├── endpoints_resource.py
└── field_definitions.py运作原理
LLM可用性
服务器的设计便于LLM正确使用:
- 服务器说明 --查询语法、工作流指导和常见错误通过MCP协议自动注入到每个LLM上下文中(约210个令牌)。
- 统一刀具表面 --单身
search_fda带有打字功能的工具dataset参数替换了9个单独的搜索工具,消除了工具选择的混乱。
- 可操作的错误 —
InvalidSearchError包括内联语法快速参考。NotFoundError包括故障排除步骤和使用的端点。不再引用不可见的MCP资源。
- 可见警告 --限位夹紧和缺失
.exact后缀产生可见的音符,而不是无声的回退。
- 响应总结 --每种端点类型都有一个自定义摘要器,用于提取关键字段并平铺嵌套结构。药品标签将部分截断为2000个字符。PDF文本默认为8000个字符。
- 通过工具进行现场发现 --与其在工具描述中列出所有可搜索的字段(这将花费约8000-11000个持久上下文令牌)
list_searchable_fields该工具按需提供。
- 智能分页 --默认页面大小较低(10条记录)。回应包括
total_results,showing,以及has_more当结果超过100时,建议使用count_records为了聚合。
美国食品药品监督管理局决策文件
这些文件是 不 可通过OpenFDA API获得。服务器构建URL并直接从 accessdata.fda.gov:
| 文档类型 | URL模式 |
|---|---|
| 510(k)摘要 | https://www.accessdata.fda.gov/cdrh_docs/reviews/{K_NUMBER}.pdf |
| De Novo裁决 | https://www.accessdata.fda.gov/cdrh_docs/reviews/{DEN_NUMBER}.pdf |
| PMA批准 | https://www.accessdata.fda.gov/cdrh_docs/pdf{YY}/{P_NUMBER}A.pdf |
| PMA-sed | https://www.accessdata.fda.gov/cdrh_docs/pdf{YY}/{P_NUMBER}B.pdf |
| PMA补充 | https://www.accessdata.fda.gov/cdrh_docs/pdf{YY}/{P_NUMBER}S{###}A.pdf |
文本提取用途 pdfplumber 对于机器生成的PDF,通过自动OCR回退 pytesseract + pdf2image 用于扫描文档。
许可证
麻省理工学院
