mcpField
B
bakom-mcp

bakom-mcp

ローカル
github.com法務・行政01 日前に更新

bakom-mcp について

bakom-mcpは、スイスBAKOMの通信、接続状況、メディアに関するオープンデータを調べるMCPサーバーです。APIキーなしで、場所ごとのカバレッジ確認、データセット検索、通信統計の参照ができます。

主な機能

  1. 01固定ブロードバンドと光回線の提供状況を確認
  2. 02複数地点の接続状況を比較
  3. 035G・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 キーなしで自然言語による問い合わせができます。

すべてのデータは 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_HOST127.0.0.1バインドアドレス。信頼できるネットワークでのみ 0.0.0.0 に設定してください(警告がログに記録されます)。
BAKOM_MCP_PORT8050TCP ポート。
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_verfuegbarkeitFTTB/FTTH 光ファイバーの利用可能状況
bakom_multi_standort_konnektivitaet最大 20 か所の接続性を比較
モバイル通信と送信設備
ツール説明
bakom_mobilfunk_abdeckung5G/4G/3G の屋外カバー状況
bakom_sendeanlagen_suche指定可能な半径内にある携帯電話アンテナ
bakom_frequenzdaten地点周辺のラジオ/テレビ送信所
メディアと RTV
ツール説明
bakom_rtv_sucheopendata.swiss の BAKOM ラジオ/テレビデータセットを検索
bakom_medienstruktur_infoスイスのメディア業界データセット
bakom_aktuell特定のトピックに関する最近更新された BAKOM データセット(プレスリリースではなくカタログ)
bakom_medien_statistikLINDAS 上の BAKOM キューブから取得する市場シェア、リーチ、番組構成
統計とカタログ
ツール説明
bakom_telekomstatistik_uebersichtopendata.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.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 がないクエリはデフォルトグラフを参照し、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-282026-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


クレジットと関連プロジェクト


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"
      ]
    }
  }
}

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。