关于 Ema Article57
Ema Article57 是面向药品监管与市场授权查询的 MCP 服务,覆盖欧洲经济区各国获批产品,并按产品与授权国家分别记录。它提供搜索、产品记录、数据集信息及基于快照的变更比较;数据来自预先处理的 EMA 数据集,而非实时抓取。
主要功能
- 01按药品、成分、持有人或国家搜索
- 02查询产品的各国授权记录
- 03比较日期快照中的新增与移除产品
- 04查看字段、国家名称和数据快照信息
- 05返回 EMA 来源文档链接
适用场景
- 01核查某药品在哪些 EEA 国家获批
- 02查找特定国家的上市许可持有人
- 03查看公司在 EEA 的产品授权
- 04检查有快照可比时的登记变化
MCP 相关
向 MCP 客户端提供 EMA Article 57 产品登记搜索、详情、数据集信息和快照变更工具,可通过 Pipeworx 网关连接或作为本地 stdio MCP 服务运行。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://gateway.pipeworx.io/ema-article57/mcpclaude mcp add --transport http pipeworx-io-ema-article57 https://gateway.pipeworx.io/ema-article57/mcp{"mcpServers":{"pipeworx-io-ema-article57":{"type":"http","url":"https://gateway.pipeworx.io/ema-article57/mcp"}}}在 Cursor 中打开{"servers":{"pipeworx-io-ema-article57":{"type":"http","url":"https://gateway.pipeworx.io/ema-article57/mcp"}}}在 VS Code 中打开{"mcpServers":{"pipeworx-io-ema-article57":{"type":"http","url":"https://gateway.pipeworx.io/ema-article57/mcp"}}}{"mcpServers":{"pipeworx-io-ema-article57":{"serverUrl":"https://gateway.pipeworx.io/ema-article57/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
@pipeworx/ema-article57
EMA Article 57 产品数据——涵盖欧洲经济区内所有持有有效上市许可的药品(包括集中审批、相互认可、分散审批和纯国家审批),每个产品与授权国家组合占一行,并列出各自的上市许可持有人和药物警戒系统所在地。无需密钥。
属于 Pipeworx——一个将 AI Agent 连接到 1683+ 个实时数据源的 MCP 网关。
这是 EMA 的广覆盖注册库。姊妹数据包 ema-medicines 仅涵盖欧盟集中审批程序的药品(每种药品约 1 行,字段更丰富——状态、适应症、批准日期)。Article 57 则取舍相反:字段较少,但也涵盖所有 EEA 国家的国家审批产品,而 ema-medicines 明确不包含这些产品。
工具
ema_article57_search(query?, active_substance?, holder?, country?, route?, limit?, offset?)— 支持自由文本和筛选条件的搜索,提供真正的 offset+limit 分页以及total_matches计数。可回答“X 在哪些 EEA 国家获批”“X 在 Y 国的上市许可持有人是谁”“Z 公司在 EEA 持有哪些产品”。ema_article57_product(name, country?)— 按名称查找某种产品的所有授权国家记录(优先精确匹配,否则回退到子串匹配,并标记match_type)。Article 57 不包含适应症文本,也不提供单个产品的 URL,因此此工具返回 EMA 权威来源文档 URL,而不是转述适应症。ema_article57_recent_changes(since)— 返回自指定日期以来新增到注册库或从中移除的产品,通过对比此数据包自身带日期的快照计算(来源完全没有变更日期列——详见注意事项)。如果没有快照涵盖所请求的时间范围,则返回comparable: false并说明原因,而不是猜测并返回空差异。ema_article57_dataset_info()— 返回 EMA 权威批量下载 URL、当前行数、此数据包记录的快照日期,以及所有不同的授权国家值(按country筛选前可用于确认准确拼写)。
身份验证
无需密钥。
数据源
- https://www.ema.europa.eu/en/documents/other/article-57-product-data_en.xlsx — Article 57 数据库导出文件,链接自 EMA 的“Article 57 数据库公开数据”页面。2026-09-25 实时验证:HTTP 200,
Last-Modified: Thu, 24 Sep 2026 13:38:24 GMT,7,870,020 字节,164,314 条数据行。页面说明该文件标注“EMA/518502/2018 Rev. 88”,并“定期”更新——未公布更新频率,因此Last-Modified是唯一真实的时效性信号。
架构 — 此工具包不会实时获取 EMA 数据
在 2026-09-25 使用实际文件测得:7.87 MB 的压缩文件解压后,sheet1.xml 为 63.0 MB,sharedStrings.xml 为 4.7 MB(164,314 行 × 8 列)。使用相同的正则扫描方法解析一个小得多的 EMA 导出文件(ema-medicines 的约 0.9 MB 报告),测得的 V8 堆内存占用已经达到 123 MB;此文件大约大 9 倍,无法装入 Cloudflare Worker 的 128 MB 上限。因此,此工具包从共享的 pipeworx-datasets R2 存储桶读取预构建、预压缩的数据集,而不是逐个请求调用 EMA。scripts/ingest-ema-article57.mjs 执行实际的数据获取和 XLSX 解析(离线运行,不在 Worker 中),并写入:
-
ema-article57/latest.json.gz— 包含全部 164,314 行,采用字典编码(架构 2:每列是唯一字符串表,每行对应一个整数索引),原始大小 6.35 MB / gzip 压缩后 1.42 MB,每个隔离实例读取一次。为何采用列而非行对象: 架构 1 为每行存储一个对象(JSON 大小为 29 MB),2026-09-25,四个工具中有三个在网关隔离实例内因资源限制而触发 Cloudflare 错误 1102。每列中重复值很多 — 值共 15.9M 个字符,其中有 2.8M 个唯一值、32 个国家/地区和约 4,000 个持有人 — 因此,筛选条件只针对每个唯一值判定一次,然后按行索引查找。使用实际文件进行本地测量:搜索峰值内存比基准值高约 33 MB,recent_changes(两个快照)高约 59 MB,缓存后仅占用 15 MB。工具包会拒绝任何其他架构,以免误读数据。
-
ema-article57/snapshots/YYYY-MM-DD.json.gz— 每次数据导入运行都会保存一个带日期的副本,供ema_article57_recent_changes进行差异比较。 -
ema-article57/snapshots-index.json— 记录在案的快照日期列表,文件较小且未压缩。 -
ema-article57/meta.json— 生成元数据。
定期重新运行数据导入(node scripts/ingest-ema-article57.mjs),以跟踪 EMA 自身的更新,并为 ema_article57_recent_changes 提供多个快照进行差异比较 — 当前发布版本仅记录了 2026-09-25 的快照,因此 recent_changes 目前无法回答任何更早 since 日期的问题,并会明确说明这一点,而不是猜测结果为零。
如果没有网关的 _r2 绑定(即直接对本软件包运行 npm install),每个工具都会返回 {reason: "dataset_unavailable", hint: ...},其中会指出可直接获取数据的上游 URL — 没有实时回退方案,因为本架构说明解释的正是为何无法进行逐请求实时获取和解析。
许可 — EMA 的法律声明明确允许此操作
EMA 的法律声明:“EMA 网页上提供的信息和文件均为公开内容,可出于非商业或商业目的,无论采用何种方式和/或格式,全部或部分进行复制和/或分发,但必须始终注明 EMA 为材料来源。” 这是明确授予的再利用许可,并非未作说明 — 在此构建副本无需依赖仅适用于代理服务的 mirror-needs-grant-proxy-does-not 回退方案。
架构 — 八列,仅此而已
第 20 行是表头(第 1 至 19 行是来源说明横幅和空行,结构与 medicines-output-* 报告相同),第 21 行起为数据。列顺序为:产品名称、活性物质、给药途径、授权国家、上市许可持有人、药物警戒系统主文件所在地、药物警戒咨询邮箱、药物警戒咨询电话。
我们只保留前六列,在存储任何内容之前删除药物警戒邮箱和电话。 这些是联系方式——对于小型持有人,它们往往是具名个人的私人地址。这个数据包提供的是副本,而非实时代理,因此 CLAUDE.md 中关于个人数据的例外条款适用。ema_article57_dataset_info 在 fields_withheld 中列出了这些字段。未经裁定,不得将其添加回来。
没有日期字段、单个产品 ID,也没有单个产品 URL。 第 57 条是一项简要的监管交叉索引(谁持有什么、在哪里),不是临床登记册。不要期待有适应症文本、批准日期或状态字段;ema_article57_dataset_info 准确列出了存在和不存在的内容(fields / fields_not_present)。
数据粒度 — 按设计,每个产品 × 每个国家一行
同一产品名称会在其获准销售的每个 EEA 国家各出现一行,这完全合理(例如,“Helixor A”在拉脱维亚和立陶宛各有一行,且各自有独立的持有人/药物警戒联系人——本例中持有人相同,但并非每种产品都如此)。ema_article57_product 会返回每个匹配行,而不是合并后的单条记录,countries_found 会列出这些国家。
国家名称采用 EMA 自己使用的英文拼写,而非 ISO 代码
country 值是 EMA 发布的自由文本,例如 "Germany"、"United Kingdom (Northern Ireland)"、"Czech Republic"、"European Union"(没错,这确实是 country 列中的真实值,与更广义 EEA 中的 "Iceland"、"Liechtenstein"、"Norway" 并列)。ema_article57_search 的 country 筛选器会进行精确匹配(不区分大小写),因此请先从 ema_article57_dataset_info 的 distinct_countries 获取拼写,不要猜测 ISO 代码或缩写。
ema_article57_recent_changes 至少需要两个快照——随包发布时只有一个
来源完全不提供逐行变更日期,因此“发生了哪些变更”只能通过比较此数据包自身两个带日期的快照来回答。随包发布时恰好只有一个快照(2026-09-25),所以目前每个 since 请求都会返回 comparable: false, reason: "no_snapshot_at_or_before_since"——这是正确行为,不是错误;工具会明确说明这一点,而不会返回虚构的空差异。定期重新运行摄取脚本,才能让此工具真正回答问题;请参见上文的“架构”。
add-pack.mjs 的自动冒烟测试对由 R2 支持的数据包存在已知缺陷
scripts/lib/pack-smoke.mjs(由 scripts/add-pack.mjs 的第 3 步使用)只会使用 smoke.json 中的参数调用各个工具——它没有注入 _r2 绑定的机制,因此记录的此数据包(以及所有其他 injectR2 数据包:court-listener、crs-reports、esef-filings、fda-drug-competition)的冒烟测试结果,是如实返回的“无绑定”(dataset_unavailable),而非真实数据。根据 payload-emptiness.mjs 的启发式判断,该负载并非字面意义上的空(其中有非数组键),因此自动检查会机械地通过,却从未实际测试真实数据路径。发布前,我们已使用手工构建的绑定模拟层,针对线上生产 R2 数据集独立验证了此数据包的工具(基于 164,314 条真实记录,实际调用了 search/product/dataset_info/recent_changes)——对话记录请参见 fleet #2421 的关闭说明。以后值得在 pack-smoke.mjs 中普遍修复此问题;但这不属于此数据包单独处理的范围。
快速开始
添加到你的 MCP 客户端(Claude Desktop、Cursor、Windsurf 等):
{
"mcpServers": {
"ema-article57": {
"url": "https://gateway.pipeworx.io/ema-article57/mcp"
}
}
}
此端点实际提供的内容
tools/list 在 https://gateway.pipeworx.io/ema-article57/mcp 返回上表中的工具,以及 Pipeworx 共享元工具——ask_pipeworx、
discover_tools、search_within、remember/recall,以及网关范围内的其他工具。因此,你看到的工具数量会多于此表中的数量:目前,单个工具包端点除了自身工具包的工具外,还会列出大约 30 个共享工具。连接的 initialize 响应会说明其确切范围,并且是当天情况的权威依据。
这是有意为之,并非意外进行了多路复用。元工具可以让限定范围的连接回答此工具包无法涵盖的问题——通过 ask_pipeworx 跨整个目录进行路由——而无需添加第二个 MCP 服务。目前无法挂载不含这些工具的工具包端点;如果额外的 schema 消耗的上下文多于路由带来的价值,请连接完整网关一次,而不是连接多个工具包端点。
或者,连接完整的 Pipeworx 网关,直接列出每个工具包的所有工具,而不只是此工具包的工具:
{
"mcpServers": {
"pipeworx": {
"url": "https://gateway.pipeworx.io/mcp"
}
}
}
两个 URL 都连接到同一个网关和相同的 1683+ 个数据源。唯一的区别是哪些工具包的工具会被直接列出;通过任一 URL,ask_pipeworx 都可以访问所有工具。
没有 MCP 客户端?通过 HTTP 调用
curl -X POST https://gateway.pipeworx.io/v1/tools/ema_article57_search \
-H 'Content-Type: application/json' \
-d '{"query":"Helixor","limit":5}'
首次调用无需账户。查看任意工具:GET https://gateway.pipeworx.io/v1/tools/ema_article57_search。查找工具:使用 {"query":"..."} 调用 POST https://gateway.pipeworx.io/v1/tools/search_packs。
独立运行(无需网关账户)
此软件包也可以作为本地 stdio MCP 服务运行——无需 Pipeworx 账户,也无需经由网关往返:
{
"mcpServers": {
"ema-article57": {
"command": "npx",
"args": ["-y", "@pipeworx/mcp-ema-article57"]
}
}
}
或者直接运行它,确认服务可以启动:
npx -y @pipeworx/mcp-ema-article57
它通过 stdin/stdout 使用 MCP 通信,并响应 initialize/tools/list/tools/call,但只提供此工具包的工具——不包含上述网关连接额外提供的任何共享元工具。来源相同,工具相同,但没有 ask_pipeworx 路由。
使用 ask_pipeworx
你可以用简单英语提问,而不是直接调用工具——这既适用于上面的工具包端点,也适用于完整网关:
ask_pipeworx({ question: "your question about Ema Article57 data" })
网关会自动选择合适的工具并填入参数。
更多信息
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。