bakom-mcp について
bakom-mcpは、スイスBAKOMの通信、接続状況、メディアに関するオープンデータを調べるMCPサーバーです。APIキーなしで、場所ごとのカバレッジ確認、データセット検索、通信統計の参照ができます。
主な機能
- 01固定ブロードバンドと光回線の提供状況を確認
- 02複数地点の接続状況を比較
- 035G・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 キーなしで自然言語による問い合わせができます。
すべてのデータは CC BY 4.0 の下、opendata.swiss/geo.admin.ch でオープンガバメントデータ(OGD)として公開されています。帰属表示の要件については、以下のデータライセンスセクションをご覧ください。
デモ用の質問: 「第7区で、まだ光ファイバー接続が利用できない学校の建物はどこですか?」
bakom_multi_standort_konnektivitaetが比較表を自動で作成します。
対象範囲
このサーバーが行うこと
✓ 3つの公開 BAKOM/連邦 API に対する読み取り専用の問い合わせ:
api3.geo.admin.ch/wms.geo.admin.ch(ブロードバンド、モバイル通信のカバレッジ、アンテナ)ckan.opendata.swiss(通信統計、データセットのメタデータ)
✓ 集計済みの匿名データを返します。個人データや世帯単位での識別情報は扱いません。
✓ Pydantic による入力検証を通じて、スイスの WGS84 座標(緯度 45.8~47.9、経度 5.9~10.6)に限定されます。
✓ 外部への通信先は、既知のデータソースホスト6つを指定したコード層の許可リストに限定されます。
このサーバーが行わないこと
✗ データを外部に送信しません(読み取り専用で、書き込みツールはありません)。
✗ ローカルファイルシステムにアクセスしません(パストラバーサルの攻撃対象となる箇所はありません)。
✗ 認証トークンを使用しません(認証不要。すべてのデータソースが公開 OGD です)。
✗ 呼び出しをまたいでユーザー入力をキャッシュまたは保存しません。
✗ シェルコマンドや任意のコードを実行しません(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 経由の固定回線、モバイル通信、ブロードバンド市場データ
- 🗂️ ブロードバンドアトラスのカタログ – すべての BAKOM データセットレイヤーと、API への直接リンク
- 🔓 認証不要 – すべてのデータはオープンガバメントデータ(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 | (空) | ブラウザクライアントで許可するオリジンをカンマ区切りで指定します。空の場合、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、CPU 0.5、PID 64)。デフォルトのポートマッピングは 127.0.0.1 のみにバインドします。外部に公開する場合は、リバースプロキシで TLS を終端し、CORS を処理してください。
Cursor / VS Code / LibreChat
{
"bakom": {
"command": "uvx",
"args": ["bakom-mcp"],
"transport": "stdio"
}
}
💡 「開発者のノート PC には 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 か所、RTV 結果最大 50 件) |
| タイムアウト | 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がないクエリはデフォルトグラフを参照し、540 件ではなく、すべての連邦機関の 2010 年のキューブを取得します。 - 一括ダウンロードが利用できるのは 540 件中 137 件のキューブのみであるため、ダンプ優先のアーキテクチャではデータの 4 分の 1 しかカバーできません。
- 不明なグラフは HTTP 200 と 0 行を返します。これはエラーではなく、気づきにくい空の結果です。リクエストは指数バックオフで再試行します。エグレスポリシー違反は再試行しません。
スコープ(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 プロトコルのバージョン
このサーバーは同じエンドポイントで2 つのプロトコル時代に対応しています。接続時のクライアントからの最初のリクエストによって、どちらを適用するかが決まり、後から別の時代を申告しても拒否されます。
| 時代 | リビジョン | 対応するクライアント |
|---|---|---|
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 で検証されます。
更新方針。 チェックに失敗した場合、定数を安易に編集しないでください。2 つのリビジョン間の仕様変更履歴を確認し、サーバーが引き続き正しく動作することを検証してから、定数、このセクション、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)を参照してください。セキュリティ上の問題は公開 issue ではなく、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
Swiss Open Data 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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。