@cyanheads/openfda-mcp-服务器
通过OpenFDA查询FDA关于药物,食物,设备的数据并召回. (原始内容存档于2012-10-12). STIO or Streamable HTTP.
概览
FDA关于药物,食品,设备的数据,并从openFDA公共API中召回. 搜索不良事件,召回,药品批准,设备审核;查询NDC代码和药品标签;跨越任何终点的汇总字段计数.
工具
| 工具 | 说明 |
|---|---|
openfda_drug_profile | 1个药品名称-林业发展局综合概况:身份、标签、不良事件、召回、批准、短缺 |
openfda_search_adverse_events | 各种药物、食品和器具的搜索不良事件报告 |
openfda_search_animal_events | 兽药和装置的搜索不良事件报告 |
openfda_search_drug_shortages | 按状况、供应情况、治疗类别、制造商分列的搜索FDA药物短缺记录 |
openfda_search_tobacco_reports | 烟草产品、电子香烟和蒸发装置的搜索问题报告 |
openfda_search_recalls | 搜查执法报告和跨毒品、食品和装置的召回行动 |
openfda_count_values | 所有打开的FDA端点上的任何字段的集合和计数独有值 |
openfda_describe_fields | 返回可搜索的已打开的 FDA 端点的字段路径, 按类别分组 |
openfda_get_drug_label | 查阅FDA药品标签(包装插入/SPL文件) |
openfda_search_drug_approvals | 为 NDA/ ANDA 申请批准搜索药物@ FDA 数据库 |
openfda_search_device_clearances | 搜索FDA设备预售通知:510(k)批准和PMA批准 |
openfda_lookup_ndc | 在《国家药品法典》目录中查找毒品 |
openfda_dataframe_describe | 列表表格和在 DataCanvas 上设置的列图 |
openfda_dataframe_query | 运行只读的 SQL 运行在 DataCanvas 上设置的结果集 |
openfda_dataframe_drop | 删除一个在 DataCanvas 上播放的表格( 默认关闭 ) |
能力参考
openfda_drug_profile 工具
- 一个
drug名称、品牌或通用名称,一次确定为身份(通用名称、NDC、RxCUI、SPL套用ID);召回、批准和短缺meta.fanOutKey- 当名称是已解决的通用名称的成分时,输入名称;meta.resolvedVia(单位:千美元)label, (中文(简体) ),ndc, (中文(简体) ),none) 命名源,并且偏好一种单一依赖性产品而不是组合 - 检索和核准还打开FDA从未统一过的搜索记录(
product_description, (中文(简体) ),products.active_ingredients.name(三);recalls_total给比对数,在最新的5个调用 - 节
label, (中文(简体) ),adverse_events, (中文(简体) ),recalls, (中文(简体) ),approval,以及shortage做最好的,回来null(或为空)recalls失事时;degraded[]命名上游未成功子干流的每个区域, 因此列表的区段未知而非缺失 - 权限、配置和取消失败, 整个调用失败, 而不是贬低一节
openfda_search_adverse_events 工具
category(单位:千美元)drug, (中文(简体) ),food, (中文(简体) ),device)选择终点及其记录计划;每页最多1000个记录- 可排序日期字段按类别不同:
receivedate(药物),date_created(粮食),date_received(device); 其它类的字段失败为query_error - 文本输出解码药物管理路线、反应结果和病人年龄组编码(原始值外)(
via oral (048), (中文(简体) ),fatal (5), (中文(简体) ),elderly (6));结构输出保存代码
openfda_search_animal_events 工具
- 可选
search超过兽医报告,例如:.animal.species, (中文(简体) ),drug.active_ingredients.name, (中文(简体) ),reaction.veddra_term_name, (中文(简体) ),serious_ae; 每页最多1000个记录 - 品牌和制造商名称被掩盖为
MSK在每一个记录上, 搜索的活性成分;drug.manufacturer.registration_number仅限一次核准 - 记录载有动物物种、品种、年龄和重量、药物和路线、VEDDRA反应术语和结果
openfda_search_drug_shortages 工具
- 可选
search结束status(单位:千美元)Current编号 :To Be Discontinued编号 :Resolved, (中文(简体) ),therapeutic_category, (中文(简体) ),generic_name,或company_name; 每页最多1000个记录 - 每张唱片
openfda块载brand_name, (中文(简体) ),product_ndc,以及rxcui用于链入openfda_get_drug_label或者说openfda_lookup_ndc
openfda_search_tobacco_reports 工具
- 可选
search结束tobacco_products, (中文(简体) ),reported_health_problems, (中文(简体) ),reported_product_problems,或nonuser_affected; 每页最多1000个记录 - 报告带有问题阵列
number_tobacco_products, (中文(简体) ),number_health_problems,以及number_product_problems计数
openfda_search_recalls 工具
category(单位:千美元)drug, (中文(简体) ),food, (中文(简体) ),device+) 加上 (中文(简体) )endpoint数字 :enforcement(默认,每类)或recall(只有设备;其他类别失效)recall_endpoint_non_device; 每页最多1000个记录- 执法记录携带
recall_number, (中文(简体) ),classification(第I/II/III类)和status; 设备召回记录携带product_res_number财务报告和审定财务报表recall_status相反,没有危险分类
openfda_count_values 工具
endpoint(20个开放FDA终点中的任何一个),acount字段表达式和可选search; 返回最多 1000 个顶名词( 默认 100), 按数排序; 一个日期字段返回每个不同的名词YYYYMMDD日期,排名相同truncated旗帜 更明确的术语过去limit,除1000个最长期限外,通知中说无法知道完整性(一个日期计数在任意限度上是准确的,因为openFDA每个日期发送);一个表达式 OpenFDA不能合并为:not_aggregatable(拿着countAs窗体从openfda_describe_fields(中文(简体) )- 总是运行在活的 API 上, 即使大宗镜像启用
openfda_describe_fields 工具
endpoint:相同的20个终点openfda_count_values接受- 按类别分组的字段路径,每条
type,描述,和countAs(经核实的计数表达式,或null),加queryTips引文和/或,.exact和日期范围
openfda_get_drug_label 工具
- 需求
search标签字段 (openfda.brand_name, (中文(简体) ),openfda.generic_name, (中文(简体) ),openfda.manufacturer_name, (中文(简体) ),set_id(三);limit默认为 5, 最大 1000 - 24 000字节内含预算回报的一页
kind: "outline"(区名和大小,最大第一)而不是标签文本;用sections: [...]获取这些章节加身份元数据(openfda, (中文(简体) ),set_id, (中文(简体) ),id, (中文(简体) ),effective_time, (中文(简体) ),version),即使超出预算,也全部返回 *_table区域在文本输出中渲染为 Markdown 表格; 结构化结果保留原始的 SPL 标记
openfda_search_drug_approvals 工具
- 可选
search结束openfda.brand_name, (中文(简体) ),sponsor_name(存储大写,所以小写引用的值与无匹配),submissions.submission_type,或submissions.review_priority; 每页最多1000个记录 - 记录携带
application_number, (中文(简体) ),sponsor_name, (中文(简体) ),products[],应用程序已满submissions[]历史
openfda_search_device_clearances 工具
pathway(单位:千美元)510k或者说pma)加上可选search结束applicant, (中文(简体) ),product_code, (中文(简体) ),advisory_committee_description,或openfda.device_name; 每页最多1000个记录- 510(k) 记录携带
k_number, (中文(简体) ),device_name,以及decision_date; PMA 记录携带pma_number, (中文(简体) ),trade_name,以及supplement_number
openfda_lookup_ndc 工具
- 需求
search结束product_ndc, (中文(简体) ),brand_name, (中文(简体) ),generic_name, (中文(简体) ),openfda.manufacturer_name,或active_ingredients.name; 每页最多1000个记录 - 记录携带
product_ndc, (中文(简体) ),labeler_name, (中文(简体) ),dosage_form, (中文(简体) ),route, (中文(简体) ),marketing_category, (中文(简体) ),active_ingredients[],以及packaging[]
openfda_dataframe_describe 工具
canvas_id; 列出每个表格的name, (中文(简体) ),kind,全阶段row_count,并带有 DuckDB 类型和无效性的列- 失败作为
canvas_disabled何时CANVAS_PROVIDER_TYPE=none,或canvas_not_found当canvas_id已经过期或从未存在
openfda_dataframe_query 工具
canvas_id加上一个只读SELECT; DDL, DML, COPY, 和文件读取功能被拒绝. Scalars 作为文本存储 (CAST作为 JSON 列)- 行被封在画布行限处,和
truncated: true表示与ORDER BY加号LIMIT编号 :OFFSET; 失败canvas_disabled, (中文(简体) ),canvas_not_found, (中文(简体) ),missing_table,或invalid_query
openfda_dataframe_drop 工具
- 默认关闭: 设置
OPENFDA_DATAFRAME_DROP_ENABLED=true使其具有调用性; 否则在登陆页上被列为已禁用, 不在tools/list canvas_id加减table名称来自openfda_dataframe_describe; 删除该表格或视图并返回remaining_tables,将帆布和其他表格留在原地- 失败的是
canvas_disabled, (中文(简体) ),canvas_not_found,或missing_table(已经投放、过期或打错)
特征
建造在 @cyanheads/mcp-ts-core: stdio和可流式的 HTTP 传输器,可插接式(none 编号 : jwt 编号 : oauth),可互换存储(in-memory, (中文(简体) ), filesystem, (中文(简体) ), Supabase, (中文(简体) ), Cloudflare KV/R2/D1),结构化记录,可选择的OpenTeleometry tracking.
打开FDA 特性 :
- 所有20个开通FDA端点都有一个客户端,在429和5xx上重试. 不需要 API 密钥 (1K 请求/ 天); 免费
OPENFDA_API_KEY涨到每天120K - 查询是
field:value超过由 AND/OR 加入的已点路径( URL 类)+(a) 将条款作为空间加以解释;openfda_describe_fields列出路径,一个错误的查询失败为malformed_search任何请求之前 - 呼号 :
limit不超过1 000人skip最高为25,000个记录的上限(pagination_limit_reached通过它);每页为24 000字节的预算 fields在任意openfda_search_*工具或设备openfda_lookup_ndc将每个记录修剪到您命名的被点的路径, 所以大型记录适合内置- 数据扫描(默认情况下);
CANVAS_PROVIDER_TYPE=none关了它)stage: true或一个canvas_id,以及可选的本地散装镜(OPENFDA_MIRROR_ENABLED=true在不花API预算的情况下解答精确的密钥检查
方便代理输出 :
- 已披露界限 :
page_omitted, (中文(简体) ),page_bytes, (中文(简体) ),page_largest_fields, (中文(简体) ),projected_fields标签outline,以及staged_rows报告每次剪接 - 已打入失败: 调用器分支打开
error.data.reason(单位:千美元)rate_limited, (中文(简体) ),query_error, (中文(简体) ),not_aggregatable,.)而不是解析信件 - 未知 vs 缺席 :
openfda_drug_profile返回时null没有林业发展局记录的科室,并列出失效科室degraded[] - 空结果引导: 无匹配搜索点
openfda_describe_fields和更广泛的术语
开始
连接到主机实例, 没有安装 :
claude mcp add --transport http openfda-mcp-server https://openfda.caseyjhand.com/mcp
或者在当地运行它:
claude mcp add openfda-mcp-server -- npx -y @cyanheads/openfda-mcp-server
对于其他客户端,请将此添加到 MCP 配置文件中 :
{
"mcpServers": {
"openfda-mcp-server": {
"command": "npx",
"args": ["-y", "@cyanheads/openfda-mcp-server"]
}
}
}
不需要 API 密钥 。 一个免费的 打开FDA API 密钥 设置为 OPENFDA_API_KEY 每天将限制从1K增加到120K。 对于 Docker 或源构建,请参见 运行服务器。 。 。 .
配置
| 变量 | 说明 | 默认 |
|---|---|---|
OPENFDA_API_KEY | 免费 API 密钥从 打开. fda.gov; 将每日限制从1K请求增加到120K请求. | 无 |
OPENFDA_BASE_URL | API 基础 URL 覆盖,用于代理或模拟. | https://api.fda.gov |
OPENFDA_MIRROR_ENABLED | 回答精确的密钥检查 本地散装镜像。 。 。 . | false |
OPENFDA_MIRROR_PATH | 目录按镜像数据集持有一个 SQLite 文件 . | ./data/openfda-mirror |
OPENFDA_MIRROR_REFRESH_CRON | 用于进程内镜像刷新(只有HTTP传输)的克龙表达式. | 无 |
OPENFDA_MIRROR_FALLBACK_LIVE | 倒回活API,当镜子冷了,错过了记录,或者失败了. | true |
OPENFDA_MIRROR_REFRESH_TIMEOUT_MS | 一次刷新时间的预算在中止前,以毫秒计. | 21600000 (6小时) |
OPENFDA_MIRROR_BASE_URL | 提供大宗下载单的东道主download.json) (中文(简体) ). | https://api.fda.gov |
CANVAS_PROVIDER_TYPE | Data Canvas 中转和 SQL. none 禁用它们; 保留数据框工具并返回 canvas_disabled。 。 。 . | duckdb |
OPENFDA_DATAFRAME_DROP_ENABLED | 启用 openfda_dataframe_drop,删除一个已上演的表格。 需求 CANVAS_PROVIDER_TYPE=duckdb。 。 。 . | false |
MCP_TRANSPORT_TYPE | 运输: stdio 或者说 http。 。 。 . | stdio |
MCP_HTTP_PORT | HTTP 服务器端口. | 3010 |
MCP_SESSION_MODE | HTTP 会话模式 : stateless, (中文(简体) ), stateful,或 auto。 。 。 . | stateless |
MCP_AUTH_MODE | 认证 : none, (中文(简体) ), jwt,或 oauth。 。 。 . | none |
MCP_LOG_LEVEL | 日志级别 (debug, (中文(简体) ), info, (中文(简体) ), warning, (中文(简体) ), error(见a/c.5/49/70,附件). | info |
LOGS_DIR | 日志文件目录(只有Node.js). | <app-root>/logs |
STORAGE_PROVIDER_TYPE | 存储后端 : in-memory, (中文(简体) ), filesystem, (中文(简体) ), supabase, (中文(简体) ), cloudflare-kv/r2/d1。 。 。 . | in-memory |
OTEL_ENABLED | 启用 打开几何。 。 。 . | false |
见 .env.example 用于完整可选覆盖列表.
Claude桌面 MCPB 捆绑禁用 DataCanvas ,因为它排除了特定平台 DuckDB 绑定. Npm 或 Docker 用于中和 SQL .
本地散装镜像
与 OPENFDA_MIRROR_ENABLED=true 服务器保存了四个开口FDA散装垃圾堆的本地SQLite副本(drug/label, (中文(简体) ), drug/ndc, (中文(简体) ), drug/enforcement, (中文(简体) ), drug/drugsfda) (中文(简体) ). 本地只回答精确的检查: 引用一次 field:"value" 任期 id, (中文(简体) ), set_id, (中文(简体) ), product_id, (中文(简体) ), product_ndc, (中文(简体) ), recall_number, (中文(简体) ), event_id,或 application_number,没有 count 或者说 sort, (中文(简体) ), skip 0,和一个匹配记录。 其他的都交给API.
初期收成分开进行,从不启动:
bun run mirror:init # all four datasets
bun run mirror:init drug/enforcement # one dataset
bun run mirror:status # sync state per dataset
bun run mirror:verify # integrity check + row counts
bun run mirror:refresh # re-harvest datasets whose dump has advanced
整个垃圾场都重新读过 设定 OPENFDA_MIRROR_REFRESH_CRON 在HTTP运输中运行; 在stdio上运行 bun run mirror:refresh 从东道. 镜像的反应 meta.lastUpdated 与现场API不同.
在节点上安装可选 better-sqlite3 端点依赖( Bun 使用内置 bun:sqlite) (中文(简体) ). OPENFDA_MIRROR_REFRESH_CRON 还需要可选的 node-cron 对等者依赖; 没有它, 服务器在启动时失败 .
运行服务器
地方发展
要求数 Bun v1.4.0 (英语) 或更高(或Node.js v24+).
-
克隆并安装 :
git clone https://github.com/cyanheads/openfda-mcp-server.git cd openfda-mcp-server && bun install cp .env.example .env # optionally set OPENFDA_API_KEY and the mirror or canvas options -
构建和运行 :
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
运行检查和测试 :
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
夹克
docker run --rm -p 3010:3010 ghcr.io/cyanheads/openfda-mcp-server:latest
图像默认为 HTTP 传输、 无国籍会话模式和日志到 /var/log/openfda-mcp-server运行到一个 MCP 客户端的 stdio,使用 "command": "docker" 与 "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/openfda-mcp-server:latest"]为了在当地建设, docker build -t openfda-mcp-server .; OpenTeleometry 端点依赖性默认安装——用 --build-arg OTEL_ENABLED=false 以略去他们。 为了保持镜像收成 整个集装箱更换, 挂出一卷 /usr/src/app/data/openfda-mirror。 。 。 .
项目结构
| 目录 | 目的 |
|---|---|
src/index.ts | createApp() 入站点:工具注册,服务设置,镜像刷新接线. |
src/config | 服务器特定环境变量与Zod解析并验证. |
src/mcp-server/tools/definitions | 工具定义*.tool.ts),共15个. |
src/mcp-server/tools | 共享工具帮助器:每端点字段目录,输入计和守护器,格式化器,SPL表渲染. |
src/services/openfda | openFDA API 客户端( 重试、 速率限制、 错误常态化), 内置页面预算, fields 记录投影,帆布中转. |
src/services/openfda/mirror | Opt-in 本地批量镜:数据集注册,垃圾阅读器,收割机,镜像-vs-live查询门,刷新时间表. |
src/services/canvas | 用于中转和SQL的数据扫描仪. |
scripts/openfda-mirror.ts | 镜像生命周期 CLI 后方 mirror:* 剧本. |
tests/ | 单位和综合测试,反映 src/ 结构. |
发展指南
见 CLAUDE.md 发展准则和建筑规则。 简本:
- 搬运工投掷,框架渔获量——否
try/catch在工具逻辑中 - 使用
ctx.log请求范围记录 - 将新工具登记在枪管内
src/mcp-server/tools/definitions/index.ts - 环绕外部 API 调用: 验证原始 = 规范到域类型 = 返回输出计划; 从未编织一个字段打开 FDA 没有返回
数据属性
数据来自 打开FDA一个美国食品药品管理局的服务。 在 打开 FDA 许可证 这些数据在CC0 1.0中专门用于公有领域,但有一个例外:GMDN 设备分类内容(术语代码、名称和术语定义)从GMDN机构获得许可证,再分配或利用它来培训AI需要从该机构获得单独的许可证.
这就是为什么本地镜像只覆盖药物数据集. device/classification 和所有其他设备的端点都被排除在其中,而ingester拒绝任何带有GMDN带场的记录,而不是将其写入磁盘.
林业发展局不赞同这个项目。 不依赖开放式FDA来决定医疗.
捐款
问题值得欢迎。 提交前进行检查和测试:
bun run devcheck
bun run test
许可证
这个项目根据Apache 2.0许可证获得许可. 见 自由主义 详细文件.