关于 bag-epl-mcp
bag-epl-mcp 是用于查询瑞士 BAG 电子福利平台清单的 MCP 服务,涵盖药品、先天性疾病用药和医疗器械。它提供只读监管信息与法律依据,适用于保险覆盖查询。
主要功能
- 01搜索 Spezialitätenliste
- 02查询 GGSL 覆盖信息
- 03搜索 MiGeL 器械与辅助用品
- 04提供法律背景和来源链接
适用场景
- 01查询药品是否列入强制保险清单
- 02查找先天性疾病用药的覆盖信息
- 03确认轮椅或辅助用品是否列于 MiGeL
MCP 相关
向 MCP 客户端提供查询瑞士 BAG ePL 数据的只读工具、资源和提示词。支持 stdio 与 Streamable HTTP 传输。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
💊 bag-epl-mcp
瑞士联邦公共卫生局(BAG)电子福利平台(ePL)的 MCP 服务 — Spezialitaetenliste、GGSL、MiGeL
演示
概览
bag-epl-mcp 可帮助 AI 模型以自然语言回答有关瑞士强制医疗保险承保范围的问题,答案基于真实数据。
| 列表 | 用途 | 法律依据 |
|---|---|---|
| Spezialitaetenliste (SL) | 强制保险承保的药品 | KVG 第 52 条 |
| GGSL | 先天性疾病药品(IV) | IVG 附录 |
| MiGeL | 医疗器械和辅助用品 | KLV 第 20 条 |
示例查询: “这种药品是否由强制医疗保险承保?”
→ epl_sl_suche:实时查询 Spezialitaetenliste (SL)
→ 按受众划分的更多用例 →
功能
- 💊 6 个工具、2 个资源、2 个提示词,用于瑞士医疗保险数据
- 🔍
epl_sl_suche— 搜索 Spezialitaetenliste 中的药品 - ⚖️
epl_rechtskontext— 提供法律背景信息及 Fedlex 链接 - 🔓 无需 API 密钥 — 所有数据均可公开访问
- ☁️ 双传输方式 — stdio(Claude Desktop)+ Streamable HTTP(云端)
- 📚 提示词模板,用于保险承保范围查询和学校健康咨询
前提条件
- Python 3.11+
- uv(推荐)或 pip
安装
# Clone the repository
git clone https://github.com/malkreide/bag-epl-mcp.git
cd bag-epl-mcp
# Install
pip install -e .
# or with uv:
uv pip install -e .
或使用 uvx(无需永久安装):
uvx bag-epl-mcp
快速开始
# stdio (for Claude Desktop) — default, opens no network ports
python -m bag_epl_mcp.server
# Streamable HTTP (cloud) — transport selected via env var
MCP_TRANSPORT=streamable-http MCP_HOST=0.0.0.0 MCP_PORT=8000 \
pip install -e ".[http]" && python -m bag_epl_mcp.server
传输方式和主机仅通过环境变量配置 (
MCP_TRANSPORT、MCP_HOST、MCP_PORT)。默认值为stdio,且不绑定任何地址;MCP_HOST的默认值为127.0.0.1,仅应在容器或云环境中设置为0.0.0.0。
立即在 Claude Desktop 中试用:
“哌甲酯(Ritalin)是否由强制医疗保险承保?” “哪些法律规定了药品纳入 Spezialitaetenliste 的条件?” “轮椅是否由强制保险承保?”
配置
Claude Desktop
编辑 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows):
{
"mcpServers": {
"bag-epl": {
"command": "python",
"args": ["-m", "bag_epl_mcp.server"]
}
}
}
或使用 uvx:
{
"mcpServers": {
"bag-epl": {
"command": "uvx",
"args": ["bag-epl-mcp"]
}
}
}
云端部署(供浏览器访问的 Streamable HTTP)
Render.com(推荐):
- 将代码库推送到 GitHub 或复刻到 GitHub
- 在 render.com 上:New Web Service → 连接 GitHub 代码库
- 构建命令:
pip install -e ".[http]" - 设置以下环境变量:
MCP_TRANSPORT=streamable-httpMCP_HOST=0.0.0.0(必须设置,容器才能接受外部流量)MCP_PORT=8000(或 Render 的$PORT)- (可选)
MCP_CORS_ORIGINS='["https://claude.ai"]',扩展浏览器 CORS 允许列表 - (可选) OpenTelemetry 跟踪默认开启,但如果未安装跟踪依赖,则不会执行任何操作——使用
pip install -e ".[http,otel]"构建,并将OTEL_EXPORTER_OTLP_ENDPOINT指向你的收集器。设置MCP_OTEL_ENABLED=0可禁用。
- 启动命令:
python -m bag_epl_mcp.server - 在 claude.ai 的 Settings → MCP Servers 中,添加:
https://your-app.onrender.com/mcp
**安全说明:**该服务仅公开只读数据,不使用身份验证。有关威胁模型(出口允许列表、主机绑定、Lethal-Trifecta 评估),请参阅
docs/SECURITY.md。
可用工具
| 工具 | 描述 |
|---|---|
epl_sl_suche | 搜索 Spezialitaetenliste 中的强制保险药品 |
epl_ggsl_abfrage | 查询先天性疾病的 GGSL 保障范围 |
epl_migel_suche | 搜索 MiGeL 中的医疗器械和辅助用品 |
epl_gesuchseingaenge | 列出待处理的 SL 收录申请(透明度) |
epl_rechtskontext | 有关保障范围问题的法律背景(WZW 标准) |
epl_server_info | 服务状态和 API 阶段信息 |
使用示例
| 查询 | 工具 |
|---|---|
| “Ritalin 是否在保险保障范围内?” | epl_sl_suche |
| “针对先天性疾病 GG-313 的药物有哪些?” | epl_ggsl_abfrage |
| “轮椅是否在保险保障范围内?” | epl_migel_suche |
| “哪些法律规定了 SL?” | epl_rechtskontext |
架构
数据流(阶段 1):
bag-epl-mcp (FastMCP)
┌────────────┐ MCP ┌───────────────────────────────┐ HTTPS GET ┌──────────────────┐
│ MCP Client │◀───────▶│ tools (read-only) │─────────────▶│ sl.bag.admin.ch │
│ (Claude │ stdio / │ ├─ epl_sl_suche │ egress │ www.bag.admin.ch │
│ Desktop, │ Stream- │ ├─ epl_ggsl_abfrage │ allow-list │ www.fedlex... │
│ claude.ai)│ able │ ├─ epl_migel_suche │◀─────────────│ (public OGD) │
│ │ HTTP │ ├─ epl_gesuchseingaenge │ (no auth) └──────────────────┘
│ │ │ ├─ epl_rechtskontext │
│ │ │ └─ epl_server_info │ structured JSON logs → stderr
└────────────┘ │ resources: epl://uebersicht …│
│ prompts: epl_kassenpflicht…│
└───────────────────────────────┘
阶段路线图(详情见 docs/ROADMAP.md):
Phase 1 (current) → legal context + entry points, no data retrieval
Phase 2 (planned) → FHIR/IDMP API, once publicly accessible
Phase 3 (vision) → MiGeL + AL via ePL-FHIR
**阶段 1 的功能与限制。**六个工具中有五个完全不会发起网络请求——整个模块中只有一次对外 HTTP 调用。它们会返回法律依据和入口点,现在也会明确说明这一点。此前的表述“XML/XLSX 下载 + SL 网站访问”宣传了实际上没有代码路径支持的功能;2026-08-08,由于底层来源无法通过机器读取,该功能被移除,而非实现。
这唯一一次 HTTP 调用会访问 sl.bag.admin.ch/api/search,并收到 HTTP 200,内容类型为 text/html——即 51 KB 的 Angular 外壳。在同一前缀下随意编造的路径会返回完全相同的响应,逐字节一致:该地址并不存在 API。此前,产生的 JSON 解析错误被宽泛的 except Exception 捕获,并转化为“SL 数据库 API 未公开记录”的说法——这是根据解析错误推断出的 BAG 发布做法。现在,该工具会报告实际测得的结果。
SL 前端实际调用的是另一个主机上的 https://epl.bag.admin.ch/api/sl/。该主机在未通过身份验证时会返回 401——但对编造的路径也会返回 401,因此这不能证明任何特定路由存在。该主机被刻意排除在出口允许列表之外:在无法验证访问权限的情况下,加入它就等于基于猜测授予权限。
**MCP 协议版本:**原生支持 2026-07-28,initialize 握手的最高版本为 2025-11-25。epl_server_info 会报告调用方连接实际协商的版本——该版本取自请求,而非在此处重复写明。两个时期的详情请参阅 MCP 协议版本。SDK 更新每月通过 Dependabot 提议;每次 mcp SDK 升级时都会审查协议版本——请参阅 docs/ROADMAP.md 中的版本控制政策。
安全与限制
- 只读: 所有工具仅执行 HTTP GET 请求,不会写入、修改或删除任何数据。
- 不处理个人数据: 服务会访问公开的监管清单(SL、GGSL、MiGeL)。不会处理或存储任何个人身份信息(PII)。
- 不提供医疗建议: 本服务仅提供监管数据查询信息。涉及医疗或法律决策时,请务必咨询 BAG 官方来源和合格的专业人士。
- 速率限制: SL 网站(sl.bag.admin.ch)是一个公开的 Angular SPA;服务对每个请求强制执行 30s 超时。请谨慎使用
limit参数。 - 数据时效性: Phase 1 工具链接到 BAG 实时来源。本服务不执行缓存。
- 链接经过核验,而非凭空假设:
scripts/record_fixtures.py每次运行时都会重新检查提供的“官方来源”地址,并同时发送一个指向虚构路径的对照请求。此前提供的两个 BAG 页面(.../Arzneimittel/geburtsgebrechen-spezialitaetenliste.html和.../Arzneimittel/gesuchseingaenge.html)于 2026-08-08 返回 HTTP 404,因此已替换为经核验可访问的入口页面,而不是猜测替代 URL。 - 法律参考信息会与登记簿核对: 服务输出的每个 SR 编号都会通过 Fedlex SPARQL 端点解析为其 ELI。之所以需要绕行,是因为 Fedlex 网页前端是单页应用,对任何 ELI(包括虚构的 ELI)都会以相同字节数返回 HTTP 200。正因如此,错误的 GgV 链接(
eli/cc/1986/40_40_40,无登记记录)曾未被发现;正确的 ELI 是eli/cc/1986/46_46_46。 - 数据许可(OGD-CH): 底层 BAG/Fedlex 数据属于瑞士开放政府数据,采用 CC BY 4.0 许可。工具输出包含
source/provenance块(JSON),或来源与许可页脚(Markdown),以保留署名信息。 - 结构化输出: 每个工具都会返回一个面向用户的 Markdown/JSON 块(
content),以及根据各工具输出架构验证过的类型化structuredContent,因此 MCP 客户端无需解析散文即可通过程序使用结果。 - 服务条款: 数据受 sl.bag.admin.ch、bag.admin.ch 和 fedlex.admin.ch 的服务条款约束。
- 不作保证: 这是一个社区项目,与 BAG 或任何政府实体均无关联。服务可用性取决于上游来源。
MCP 协议版本
此服务在同一端点上支持两个协议时期。客户端在连接上的首次请求决定适用哪个时期;之后若声称属于另一时期,则会被拒绝。
| 时期 | 修订版本 | 适用客户端 |
|---|---|---|
initialize 握手 | 2024-11-05 … 2025-11-25 | 当前客户端使用的协议。服务会返回请求指定的修订版本;如果请求的是更新版本,则返回 2025-11-25 这一上限。 |
| 逐请求封装 | 2026-07-28 | 携带 2026-07-28 _meta 封装的请求会建立现代连接。 |
这两个修订版本都固定在
tests/test_protocol_version.py 中,并与已安装的 SDK 进行断言,因此 Dependabot 更新 mcp 不会在不知情的情况下更改其中任何一个版本。除了这些常量之外,同一文件还会通过组装后的 HTTP 应用发送真实的 initialize 和 2026-07-28 请求(server/discover、tools/call),并断言实际响应。
请注意,SDK 的 LATEST_PROTOCOL_VERSION 是现代时期的别名,而不是握手时期的别名——如果只针对它固定版本,当前客户端实际协商使用的时期仍可能悄然变化。
更新策略。 当检查失败时,不要盲目编辑常量:请阅读两个修订版本之间的规范变更日志,确认服务行为仍然正常,然后一并更新常量、本节、README.de.md 和
CHANGELOG.md。
测试
# Unit + contract tests (no network) — this is what CI runs
PYTHONPATH=src pytest tests/ -m "not live"
# Live tests against the real BAG/Fedlex sources
PYTHONPATH=src pytest tests/ -m "live"
# Re-record the measurements (writes tests/fixtures/ + PROVENANCE.md)
PYTHONPATH=src python scripts/record_fixtures.py
100 项测试——88 项离线测试,12 项针对实时数据源的测试。
为什么既有契约测试文件,也有实时测试
截至 2026-08-08,八项实时测试中有六项无法通过。它们将字符串与工具的返回值进行比较:
assert "BAG ePL MCP Server" in result # result is a CallToolResult
CallToolResult 是一个 Pydantic 模型;in 会遍历 (field, value) 对,因此比较结果始终为 false。没人注意到这一点,因为 CI 会排除 -m live——一项只在 CI 之外运行且在那里总是失败的测试,不会向任何人报告。
即使修复了其中四项,也无法证明任何事情:针对一个会把自身输入写入模板的工具执行 assert "313" in result,以及类似的 assert "Rollstuhl" in result。它们断言工具会回显输入——而这恰恰就是这些工具所做的事。
因此,必须始终成立的内容都放在 tests/test_quellen_vertrag.py 中,该文件会在 CI 中针对 tests/fixtures/ 下记录的测量结果运行。PROVENANCE.md 记录了每项测量的来源、日期、选择规则和 SHA-256。
四项记录的测量结果是对照项——sl.bag.admin.ch/api/ 下的一条虚构路径、BAG 门户中的一条虚构路径、一条虚构 ELI,以及一个虚构 SR 编号。没有这些对照项,每项测量都只能说明我们收到了什么,而不是数据源实际包含什么。如果对照项失去区分能力、实时入口失效、已失效的页面重新出现,或法律引用与登记册不一致,记录器就会中止。
更新日志
参见 CHANGELOG.md
贡献
安全
有关安全状况和漏洞报告方式,请参见 SECURITY.md(Deutsch)。
许可证
MIT License——参见 LICENSE
作者
Hayal Oezkan · malkreide
致谢与相关项目
- BAG Spezialitaetenliste: sl.bag.admin.ch — 瑞士联邦公共卫生局
- KVG: SR 832.10 — 医疗保险法
- KLV: SR 832.112.31 — 医疗保健福利条例
- 协议: Model Context Protocol — Anthropic / Linux Foundation
- 相关项目: fedlex-mcp — 瑞士联邦法律
- 相关项目: swiss-cultural-heritage-mcp — 文化遗产数据
- 项目集: Swiss Public Data MCP Portfolio
安装
通过 uv 的 uvx 运行——无需克隆或手动安装。将其添加到 MCP 客户端配置中(Claude Desktop、Cursor 和 Windsurf 使用 mcpServers;VS Code 在 .vscode/mcp.json 中使用顶层 servers 键):
{
"mcpServers": {
"bag-epl-mcp": {
"command": "uvx",
"args": [
"bag-epl-mcp"
]
}
}
}
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。