mcpField
B
bakom-mcp

bakom-mcp

本地服务
github.com法律与政务01 天前更新

关于 bakom-mcp

bakom-mcp 是查询瑞士 BAKOM 电信、网络连接和媒体开放数据的 MCP 服务。它支持按地点查询覆盖情况、搜索数据集和查看电信统计,无需 API 密钥。

主要功能

  1. 01查询固定宽带与光纤可用性
  2. 02比较多个地点的网络连接
  3. 03查询 5G、4G 和 3G 覆盖
  4. 04查找移动通信与广播发射站
  5. 05搜索媒体数据集和电信统计

适用场景

  1. 01比较学校建筑的光纤接入情况
  2. 02查询某地点附近的移动网络覆盖
  3. 03查找附近的广播发射站
  4. 04探索瑞士广播、电视和电信统计

MCP 相关

向 MCP 客户端提供只读工具和资源,用于查询 geo.admin.ch、opendata.swiss 与 LINDAS 的公开数据。支持 stdio 和 HTTP 传输。

配置

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

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

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

安装包
pypibakom-mcp3.0.2

工具

12

收录的工具列表 · 更新于 2 周前

参数类型必填说明
paramsany是

详细介绍

🇨🇭 属于 瑞士公共数据 MCP 项目集

📡 bakom-mcp

Version License: MIT Python 3.11+ MCP Auth CI

用于访问 BAKOM 开放数据的 MCP 服务——宽带、移动网络覆盖、媒体和瑞士电信统计数据。

🇩🇪 德语版

演示:Claude 通过 MCP 工具调用查询光纤和 5G 覆盖情况


概述

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_HOST127.0.0.1绑定地址。仅在可信网络中设置为 0.0.0.0(会记录警告)。
BAKOM_MCP_PORT8050TCP 端口。
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_verfuegbarkeitFTTB/FTTH 光纤可用性
bakom_multi_standort_konnektivitaet最多比较 20 个地点的连接情况
移动通信与发射台
工具说明
bakom_mobilfunk_abdeckung5G/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.swissBAKOM 数据集、电信统计数据无
lindas.admin.chBAKOM 媒体统计数据立方体(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


致谢与相关项目


瑞士开放数据 MCP 作品集的一部分——公共数据值得拥有公共接口。

安装

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

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

评论

支持 Markdown

第一次接触 MCP?

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

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