关于 bakom-mcp
bakom-mcp 是查询瑞士 BAKOM 电信、网络连接和媒体开放数据的 MCP 服务。它支持按地点查询覆盖情况、搜索数据集和查看电信统计,无需 API 密钥。
主要功能
- 01查询固定宽带与光纤可用性
- 02比较多个地点的网络连接
- 03查询 5G、4G 和 3G 覆盖
- 04查找移动通信与广播发射站
- 05搜索媒体数据集和电信统计
适用场景
- 01比较学校建筑的光纤接入情况
- 02查询某地点附近的移动网络覆盖
- 03查找附近的广播发射站
- 04探索瑞士广播、电视和电信统计
MCP 相关
向 MCP 客户端提供只读工具和资源,用于查询 geo.admin.ch、opendata.swiss 与 LINDAS 的公开数据。支持 stdio 和 HTTP 传输。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
12收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| params | any | 是 |
详细介绍
🇨🇭 属于 瑞士公共数据 MCP 项目集
📡 bakom-mcp
用于访问 BAKOM 开放数据的 MCP 服务——宽带、移动网络覆盖、媒体和瑞士电信统计数据。
概述
bakom-mcp 将 Claude 等 AI 助手连接到瑞士联邦通信办公室(BAKOM)的开放数据基础设施。它支持以自然语言查询宽带可用性、5G/4G 覆盖情况、移动天线位置、BAKOM 的广播电视数据集以及电信统计数据——全程无需 API 密钥。
所有数据均以开放政府数据(OGD)的形式发布在 opendata.swiss / geo.admin.ch 上,遵循 CC BY 4.0 许可协议——有关署名要求,请参阅下文的数据许可部分。
演示查询: “第 7 区哪些校舍尚未接入光纤?”
bakom_multi_standort_konnektivitaet会自动生成对比表。
范围
此服务的功能
✓ 只读查询三个公开的 BAKOM/联邦 API:
api3.geo.admin.ch/wms.geo.admin.ch(宽带、移动网络覆盖、天线)ckan.opendata.swiss(电信统计数据、数据集元数据)
✓ 返回汇总的匿名数据——不包含个人数据,也无法识别具体家庭。
✓ 通过 Pydantic 输入验证,将查询范围限制在瑞士 WGS84 坐标(纬度 45.8–47.9,经度 5.9–10.6)内。
✓ 出站流量受限于代码层允许列表,仅可访问六个已知数据源主机。
此服务不会执行的操作
✗ 向任何位置发送数据(只读,不提供写入工具)。
✗ 访问本地文件系统(不存在路径遍历风险)。
✗ 使用身份验证令牌(无需令牌——所有数据源都是公开的 OGD)。
✗ 缓存或跨调用持久保存用户输入。
✗ 执行 shell 命令或任意代码(不使用 subprocess/os.system/eval)。
功能
- 📶 宽带可用性——固定线路覆盖速度:30/100/300/500/1000 Mbit/s(250×250m 网格)
- 🔌 光纤状态——各地点的 FTTB/FTTH 可用性
- 📍 多地点对比——可同时检查最多 20 个地点的连接情况
- 📱 移动网络覆盖——5G/4G/3G 室外覆盖(100×100m 网格)
- 📡 天线搜索——在可配置半径内搜索移动通信和广播发射器
- 📺 广播电视数据集——在 opendata.swiss 上对 BAKOM 广播电视数据集进行全文搜索
- 🗞️ 媒体格局——BAKOM 媒体结构报告和数据集
- 📊 电信统计数据——通过 opendata.swiss 获取固定线路、移动通信和宽带市场数据
- 🗂️ 宽带地图集目录——包含直接 API 链接的所有 BAKOM 数据集图层
- 🔓 无需身份验证——所有数据均为开放政府数据(OGD)
前置条件
- Python 3.11+
- 使用
uv或pip安装 - 互联网连接(实时 API:geo.admin.ch、opendata.swiss)
安装
# Recommended: uvx (no permanent installation required)
uvx bakom-mcp
# Or install with pip
pip install bakom-mcp
# Development install
git clone https://github.com/malkreide/bakom-mcp
cd bakom-mcp
pip install -e ".[dev]"
快速开始
Claude Desktop
添加到 claude_desktop_config.json:
{
"mcpServers": {
"bakom": {
"command": "uvx",
"args": ["bakom-mcp"]
}
}
}
配置文件位置:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
云端 / HTTP 传输
python -m bakom_mcp.server --http
# Server running at http://localhost:8050/mcp
通过环境变量进行配置(参见 .env.example):
| 变量 | 默认值 | 用途 |
|---|---|---|
BAKOM_MCP_HOST | 127.0.0.1 | 绑定地址。仅在可信网络中设置为 0.0.0.0(会记录警告)。 |
BAKOM_MCP_PORT | 8050 | TCP 端口。 |
BAKOM_MCP_CORS_ORIGINS | (empty) | 允许的浏览器客户端来源,以逗号分隔。为空 = 禁用 CORS。 |
Docker
提供了经过加固的容器镜像。适用于部署在反向代理(Caddy、Traefik、nginx)之后的云环境。
# Build & run via compose (recommended)
docker compose up --build
# Or via docker run
docker build -t bakom-mcp:latest .
docker run --rm \
--read-only \
--cap-drop=ALL \
--security-opt=no-new-privileges \
--tmpfs /tmp:rw,size=16M \
-p 127.0.0.1:8050:8050 \
bakom-mcp:latest
镜像以非 root 用户(UID 10001)运行,使用只读文件系统,移除所有 Linux 功能并禁止权限提升。资源限制在 docker-compose.yml 中配置(256 MB 内存、0.5 CPU、64 个 PID)。默认端口映射仅绑定到 127.0.0.1——如需公开访问,请在反向代理处终止 TLS 并处理 CORS。
Cursor / VS Code / LibreChat
{
"bakom": {
"command": "uvx",
"args": ["bakom-mcp"],
"transport": "stdio"
}
}
💡 “开发者笔记本使用 stdio,浏览器使用 HTTP/SSE。”
可用工具(12)
宽带与连接
| 工具 | 说明 |
|---|---|
bakom_broadband_coverage | 指定坐标处的固网覆盖情况(30–1000 Mbit/s) |
bakom_glasfaser_verfuegbarkeit | FTTB/FTTH 光纤可用性 |
bakom_multi_standort_konnektivitaet | 最多比较 20 个地点的连接情况 |
移动通信与发射台
| 工具 | 说明 |
|---|---|
bakom_mobilfunk_abdeckung | 5G/4G/3G 室外覆盖情况 |
bakom_sendeanlagen_suche | 指定半径范围内的移动通信天线 |
bakom_frequenzdaten | 某地点附近的广播/电视发射台站点 |
媒体与 RTV
| 工具 | 说明 |
|---|---|
bakom_rtv_suche | 搜索 opendata.swiss 上的 BAKOM 广播/电视数据集 |
bakom_medienstruktur_info | 瑞士媒体格局数据集 |
bakom_aktuell | 某主题下最近更新的 BAKOM 数据集(目录,不含新闻稿) |
bakom_medien_statistik | 来自 LINDAS 上 BAKOM 数据立方体的市场份额、覆盖范围和节目结构 |
统计数据与目录
| 工具 | 说明 |
|---|---|
bakom_telekomstatistik_uebersicht | 来自 opendata.swiss 的电信统计数据 |
bakom_breitbandatlas_datensaetze | 宽带地图图层的完整目录 |
bakom_check_api_status | 🔍 检查所有已配置数据源的运行状况 |
示例提示词
What is the broadband situation at Schulhaus Leutschenbach (47.4148, 8.5654)?
Compare 5G and fibre coverage for these three school buildings: [coordinates]
Which radio stations are licensed in canton Zurich?
Show me the current BAKOM position on 5G frequency allocation.
List all Broadband Atlas datasets available via geo.admin.ch.
安全与限制
| 方面 | 详情 |
|---|---|
| 访问权限 | 只读(readOnlyHint: true)——服务无法修改或删除任何数据 |
| 个人数据 | 不涉及个人数据——所有数据源均为汇总后的公开开放数据 |
| 速率限制 | 内置每次查询上限(最多 50 个天线、最多 20 个地点、最多 50 条 RTV 结果) |
| 超时 | 每次 API 调用 20 秒 |
| 身份验证 | 无需 API 密钥——所有 3 个 API 均可公开访问 |
| 许可证 | 所有数据均采用 CC0 / 开放许可证(开放政府数据) |
| 服务条款 | 受相应数据源的服务条款约束:geo.admin.ch、opendata.swiss |
数据来源
| 来源 | 数据 | 身份验证 |
|---|---|---|
| geo.admin.ch | 宽带地图、移动通信覆盖、天线位置 | 无 |
| opendata.swiss | BAKOM 数据集、电信统计数据 | 无 |
| lindas.admin.ch | BAKOM 媒体统计数据立方体(SPARQL) | 无 |
所有数据均以开放许可证(CC0 / OGD)发布。
架构决策 — 媒体统计
bakom_medien_statistik 使用 架构 A(仅实时 API),已于 2026-08-13 进行实时验证:
- SPARQL 端点为
https://lindas.admin.ch/query;其他地方记录的/sparql路径会返回 404。 - OFCOM 数据立方体位于命名图
https://lindas.admin.ch/ofcom/cube中。如果没有显式指定FROM,查询会访问默认图,并看到来自所有联邦部门的 2010 个数据立方体,而不是 540 个。 - 只有 540 个数据立方体中的 137 个提供批量下载,因此以数据转储为优先的架构只能覆盖四分之一的数据。
- 对未知图的请求会返回 HTTP 200 和零行——这是无声的空结果,而不是错误。请求会采用指数退避重试;违反出口策略的请求不会重试。
**范围说明,已写入工具描述,因为 README 未向模型说明:**这些数据立方体涵盖的是已被调查的节目,而不是完整目录。LINDAS 自己的计数数据立方体报告称,2020 年有 199+39+17 个广播节目;而所有数据立方体中的 Programm 维度则显示 128 个标签——其中一些是同一电台的不同拼写(Energy BE / Energy Bern),还包括 Durchschnitt,它是汇总值,而不是电台。此工具是统计数据来源,而非广播机构名录;持牌广播机构列于 RTV 数据库,该数据库不提供机器可读接口。
与 MCP 组合的协同效应
bakom-mcp 可与组合中的其他服务结合,用于多维度查询:
zurich-opendata-mcp → school building addresses
+
bakom-mcp → fibre and 5G status
=
"Digital equity" dashboard for all school districts
其他组合:
srgssr-mcp+bakom-mcp→ 媒体覆盖范围与广播网络swiss-statistics-mcp+bakom-mcp→ 电信市场发展fedlex-mcp+bakom-mcp→ 监管背景(RTVG、FMG)
项目结构
bakom-mcp/
├── src/bakom_mcp/
│ ├── __init__.py # Package
│ ├── server.py # MCP server (12 tools, 2 resources)
│ └── py.typed # PEP 561 type marker
├── tests/
│ └── test_integration.py # Integration tests (live APIs)
├── assets/
│ └── demo.svg # Demo flow diagram
├── .github/workflows/
│ ├── ci.yml # CI: lint, syntax, import, tests
│ └── publish.yml # PyPI publish on release
├── .gitignore
├── pyproject.toml # Build config (hatchling)
├── CHANGELOG.md
├── CONTRIBUTING.md # Contribution guide (English)
├── CONTRIBUTING.de.md # Contribution guide (German)
├── SECURITY.md # Security policy (English)
├── SECURITY.de.md # Security policy (German)
├── LICENSE # MIT License
├── README.md # This file (English)
└── README.de.md # German version
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 时不会悄然更改其中任一个。握手上限通过已组装的 ASGI 堆栈对实时 initialize 请求进行测量,而不是读取某个常量名称。
请注意,SDK 的 LATEST_PROTOCOL_VERSION 是现代时代的别名,而不是握手时代的别名——仅针对它进行固定,会让当前客户端实际协商的时代仍可自由漂移。
在封套时代原生支持。 此服务不使用 2026-07-28 规范弃用的任何功能(SEP-2577:日志记录、采样、根目录)。bakom_multi_standort_konnektivitaet 的状态文本通过进度通知传递,而非使用 ctx.info()——在现代时代,只有当请求在 _meta 中选择了日志级别时才会传递日志;若未选择,该行就会被静默丢弃。serverInfo 在 initialize 和 server/discover 中都会携带软件包版本。调用工具既不需要握手,也不需要 Mcp-Session-Id。tests/test_modern_era.py 会在两个时代通过真实连接检查这些行为,并且测试套件会将每个 MCPDeprecationWarning 都视为错误。
服务声明的能力。 不发送变更通知:工具、资源和提示词在导入时即固定,因此服务在两个时代都将 listChanged 和 resources.subscribe 报告为 false,并拒绝 subscriptions/listen。没有 outputSchema:工具会在 content 中返回文本(Markdown 或 JSON 字符串)。这两项均由 tests/test_capabilities.py 检查。
更新策略。 门禁检查失败时,不要盲目编辑常量:请阅读两个修订版本之间的规范变更日志,确认服务仍然正常运行,然后同时更新常量、本节、README.de.md 和 CHANGELOG.md。
测试
# Unit tests (no network required)
PYTHONPATH=src pytest tests/ -m "not live"
# Integration tests (live APIs, internet required)
PYTHONPATH=src pytest tests/ -m "live"
更新日志
请参阅 CHANGELOG.md
贡献
欢迎贡献!请参阅 CONTRIBUTING.md(🇩🇪 Deutsch),了解如何报告错误、提出功能建议和提交拉取请求。
安全
如需报告漏洞,请参阅安全政策(🇩🇪 Deutsch)。请通过 GitHub Security Advisories 私下报告安全问题,而不要在公开问题中报告。
软件许可
MIT License — 请参阅 LICENSE。
数据许可
此服务提供的 BAKOM 开放数据依据 CC BY 4.0 发布。使用或再分发工具输出时,请注明来源:
来源:Federal Office of Communications(BAKOM),通过 opendata.swiss / geo.admin.ch 提供 · 许可:CC BY 4.0
工具输出已自动包含此页脚。Markdown 响应格式以归属说明行结尾;使用 JSON 格式的下游应用应将来源/许可元数据传递给最终用户。
作者
Hayal Oezkan · github.com/malkreide
致谢与相关项目
- 数据:BAKOM Open Data – 联邦通信办公室(OFCOM/BAKOM)
- 地理数据:geo.admin.ch – swisstopo / 联邦地理数据基础设施
- 协议:Model Context Protocol – Anthropic / Linux Foundation
- 相关项目:zurich-opendata-mcp – 用于苏黎世市开放数据的 MCP 服务
- 相关项目:swiss-transport-mcp – 瑞士公共交通 MCP 服务
- 作品集:Swiss Public Data MCP Portfolio
瑞士开放数据 MCP 作品集的一部分——公共数据值得拥有公共接口。
安装
通过 uv 的 uvx 运行——无需克隆或手动安装。将其添加到 MCP 客户端配置中(Claude Desktop、Cursor 和 Windsurf 使用 mcpServers;VS Code 在 .vscode/mcp.json 中使用顶层 servers 键):
{
"mcpServers": {
"bakom-mcp": {
"command": "uvx",
"args": [
"bakom-mcp"
]
}
}
}
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。