mcpField
B
bag-epl-mcp

bag-epl-mcp

本地服务
github.com健康医疗04 周前更新

关于 bag-epl-mcp

bag-epl-mcp 是用于查询瑞士 BAG 电子福利平台清单的 MCP 服务,涵盖药品、先天性疾病用药和医疗器械。它提供只读监管信息与法律依据,适用于保险覆盖查询。

主要功能

  1. 01搜索 Spezialitätenliste
  2. 02查询 GGSL 覆盖信息
  3. 03搜索 MiGeL 器械与辅助用品
  4. 04提供法律背景和来源链接

适用场景

  1. 01查询药品是否列入强制保险清单
  2. 02查找先天性疾病用药的覆盖信息
  3. 03确认轮椅或辅助用品是否列于 MiGeL

MCP 相关

向 MCP 客户端提供查询瑞士 BAG ePL 数据的只读工具、资源和提示词。支持 stdio 与 Streamable HTTP 传输。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"malkreide-bag-epl": {
"command": "uvx",
"args": [
"bag-epl-mcp"
]
}
}
}
启动命令uvx bag-epl-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypibag-epl-mcp1.0.4

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

🇨🇭 属于 Swiss Public Data MCP Portfolio

💊 bag-epl-mcp

Version License: MIT Python 3.11+ MCP No Auth Required CI

瑞士联邦公共卫生局(BAG)电子福利平台(ePL)的 MCP 服务 — Spezialitaetenliste、GGSL、MiGeL

🇩🇪 德文版

演示

演示:Claude 使用 epl_sl_suche 和 epl_rechtskontext


概览

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(推荐):

  1. 将代码库推送到 GitHub 或复刻到 GitHub
  2. 在 render.com 上:New Web Service → 连接 GitHub 代码库
  3. 构建命令:pip install -e ".[http]"
  4. 设置以下环境变量:
    • MCP_TRANSPORT=streamable-http
    • MCP_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 可禁用。
  5. 启动命令:python -m bag_epl_mcp.server
  6. 在 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


贡献

参见 CONTRIBUTING.md


安全

有关安全状况和漏洞报告方式,请参见 SECURITY.md(Deutsch)。


许可证

MIT License——参见 LICENSE


作者

Hayal Oezkan · malkreide


致谢与相关项目

安装

通过 uv 的 uvx 运行——无需克隆或手动安装。将其添加到 MCP 客户端配置中(Claude Desktop、Cursor 和 Windsurf 使用 mcpServers;VS Code 在 .vscode/mcp.json 中使用顶层 servers 键):

{
  "mcpServers": {
    "bag-epl-mcp": {
      "command": "uvx",
      "args": [
        "bag-epl-mcp"
      ]
    }
  }
}

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。