sbb-opendata-mcp について
sbb-opendata-mcpは、OpenDataSoft API経由でスイス連邦鉄道の公開データをAIアプリケーションやMCP対応クライアントに提供します。運行、駅、インフラ、不動産のデータを扱い、読みやすい出力と構造化データを返します。
主な機能
- 01駅ごとの旅客数
- 02鉄道の運行障害情報
- 03インフラ・不動産プロジェクト
- 04列車数とホームデータ
- 05駅の比較と停留所検索
- 06データセットカタログの参照
活用シーン
- 01スイス鉄道の現在の運行障害の確認
- 02主要駅の旅客数の比較
- 03ホーム情報や周辺停留所の検索
MCP 対応
SBBのオープンデータを読み取るMCPツールを提供し、stdioとStreamable HTTPに対応します。結果には構造化コンテンツが含まれ、MarkdownまたはJSONで出力できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
9掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| params | any | はい |
詳細
🚆 sbb-opendata-mcp
🇨🇭 スイス公共データ MCP ポートフォリオの一部です
AI モデルをスイス連邦鉄道(SBB)のオープンデータに接続する MCP サーバーです。乗客数、リアルタイムの鉄道運行障害、インフラおよび不動産プロジェクト、列車数、ホームデータ、車両、駅検索を data.sbb.ch から取得できます。API キーは不要です。
デモ
概要
sbb-opendata-mcp を使うと、Claude などの AI アシスタントが SBB の公開データに直接アクセスできます。コピー&ペーストや手動での API 呼び出しは不要です。「2024年にチューリッヒ中央駅を毎日何人の乗客が利用しましたか?」 といった質問に、実測データを使って回答します。
SBB のオープンデータポータルは OpenDataSoft REST API(v2.1)を提供しています。このサーバーはデータを AI モデル向けの整った Markdown および JSON に変換し、人間が読みやすいテキストとともに MCP の structuredContent も追加します。これにより、プログラムで利用するクライアントは、再解析することなく基盤となるレコードを利用できます。このサーバーはモデルに依存せず、MCP 互換のあらゆるクライアントで動作します。
デモの代表的なクエリ: 「チューリッヒ中央駅、ベルン、バーゼル SBB の乗客数とホーム収容力を比較してください。」 → 利用者別のその他のユースケース →
特長
- 📊 乗客数 – 駅別・年別の乗車/降車人数(日平均)
- 🚨 リアルタイムの鉄道運行障害 – 運行情報を5分ごとに更新
- 🏗️ インフラプロジェクト – 駅や路線の建設
- 🏢 不動産プロジェクト – SBB の不動産開発(日次更新)
- 🚆 区間別の列車数 – 路線ごとの列車数(SBB、BLS、SOB など)
- 🛤️ ホームデータ – 長さ、種類、面積、段差のないアクセス
- 🚃 車両 – 定員と製造年
- 🔁 駅の比較 – 複数のデータセットで最大10駅を比較
- 🔍 停留所検索 – スイス全域の DiDok 登録簿
- 📦 データセットカタログ – SBB の約89件のオープンデータセットを一覧表示
- 🔑 API キー不要 – すべてのデータは公開され、無料で利用できます
- ☁️ 2種類のトランスポート – Claude Desktop 向けの stdio、クラウドデプロイ向けの Streamable HTTP
前提条件
- Python 3.11+
- API キー不要 — すべてのデータは公開されている data.sbb.ch ポータルから取得します
uv をインストールします(推奨):
curl -LsSf https://astral.sh/uv/install.sh | sh
インストール
PyPI から:
pip install sbb-opendata-mcp
または uvx を使います(恒久的なインストールは不要):
uvx sbb-opendata-mcp
ローカル開発の場合は、クローンしたリポジトリから編集可能モードでインストールします:
git clone https://github.com/malkreide/sbb-opendata-mcp.git
cd sbb-opendata-mcp
pip install -e ".[dev]"
クイックスタート
# Start the server (stdio mode for Claude Desktop)
sbb-opendata-mcp
Claude Desktop ですぐに試せます:
「2024年にチューリッヒ中央駅で毎日何人が乗車しましたか?」 「スイスの鉄道網で現在、運行障害は発生していますか?」
設定
環境変数
stdio 経由で実行する場合、サーバーの設定は不要です。以下の変数で、オプションの Streamable HTTP トランスポート、ロギング、可観測性を調整できます。
| 変数 | 効果 | デフォルト |
|---|---|---|
MCP_HOST | HTTP トランスポートのバインド先ホストです。ローカルでは 127.0.0.1 のままにし、制御されたコンテナー/クラウド環境内でのみ 0.0.0.0 にバインドしてください。 | 127.0.0.1 |
MCP_PORT | HTTP トランスポートのポートです。 | 8000 |
MCP_ALLOWED_HOSTS | DNS リバインディング保護のための、カンマ区切りの許可ホストリストです(例:your-app.onrender.com,your-app.onrender.com:*)。 | localhost のみ |
MCP_ALLOWED_ORIGINS | カンマ区切りのブラウザーオリジン許可リストです(例:https://your-app.onrender.com)。 | (なし) |
LOG_LEVEL | ログの詳細度です(DEBUG/INFO/WARNING/…)。 | INFO |
LOG_FORMAT | 構造化ログには json を、それ以外には人が読みやすいテキスト形式を指定します。常に stderr に書き込まれます。 | text |
🔒 DNS リバインディング/Origin 保護は常に有効です。localhost は許可リストに含まれているため、ローカル HTTP 開発をすぐに始められます。ログはstderrに出力されます。stdout は stdio JSON-RPC チャネル専用です。
Claude Desktop の設定
{
"mcpServers": {
"sbb-opendata": {
"command": "uvx",
"args": ["sbb-opendata-mcp"]
}
}
}
設定ファイルの場所:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Claude Desktop を再起動してください。初回使用時にサーバーが自動的にダウンロードされます。
その他の MCP クライアント
Cursor、Windsurf、VS Code + Continue、LibreChat、Cline、および mcp-proxy 経由のセルフホストモデルで動作します。設定は上記と同じです。
クラウドへのデプロイ(Streamable HTTP)
ブラウザー版の claude.aiまたはリモートサーバー(例:Render.com)経由で使用します。クラウドトランスポートはStreamable HTTP(エンドポイント /mcp)です。
Docker(推奨):
# Build + run with explicit resource limits (see docker-compose.yml)
docker compose up --build
# → http://127.0.0.1:8000/mcp
このイメージは、root 以外のユーザーとして実行するマルチステージビルドです。docker-compose.yml では read_only、no-new-privileges、メモリ/CPU/PID の制限を追加しています。
手動/Render.com:
pip install -e .
# Bind publicly (behind a rate-limiting reverse proxy) and configure
# DNS-rebinding / Origin protection for your hostname:
export MCP_HOST=0.0.0.0
export MCP_ALLOWED_HOSTS="your-app.onrender.com,your-app.onrender.com:*"
export MCP_ALLOWED_ORIGINS="https://your-app.onrender.com"
python -m sbb_opendata_mcp.server --http --port 8000
⚠️ バインド: ネットワークトランスポートでは、サーバーはデフォルトで
127.0.0.1にバインドされるため、ローカルで起動したサーバーがネットワーク全体に公開されることはありません。すべてのインターフェースへのバインドが意図されているコンテナー/クラウド環境でのみMCP_HOST=0.0.0.0を設定してください(Docker イメージでは設定済みです)。また、レート制限を適用するリバースプロキシの背後にサーバーを配置してください(エンドポイントを公開しない場合は、認証も適用してください)。SECURITY.mdを参照してください。
利用可能なツール
| ツール | 説明 | データ更新 |
|---|---|---|
sbb_get_passenger_frequency | 駅別・年別の乗降客数(日平均) | 年次 |
sbb_get_rail_disruptions | 鉄道交通のリアルタイム情報 | 5 分ごと |
sbb_get_real_estate_projects | SBB の不動産開発プロジェクト | 毎日 |
sbb_get_trains_per_segment | 路線区間ごとの列車数(SBB、BLS、SOB …) | 年次 |
sbb_get_platform_data | ホームデータ(長さ、種類、面積) | 継続的 |
sbb_get_rolling_stock | 車両データ(定員、製造年) | 継続的 |
sbb_compare_stations | 最大 10 駅を比較(複数データセット) | – |
sbb_search_stations | 停留所を検索(スイス DiDok 登録簿、スイス全域) | 継続的 |
sbb_list_datasets | SBB の全約 89 件のオープンデータセットを一覧表示 | – |
すべてのツールで response_format: "markdown"(人が読みやすい形式)と "json"(機械可読形式)、およびページネーションを利用できます。また、すべてのツールはレンダリング済みテキストとともに、MCP の structuredContent(基礎となるレコード/メタデータ)を返し、その形式を outputSchema として宣言します。エラー結果では、代わりに isError: true と {error, upstream_unavailable} が返されます。
使用例
| クエリ | ツール |
|---|---|
| 「2024年にZürich HBで1日に乗車した人数は何人ですか?」 | sbb_get_passenger_frequency |
| 「スイスの鉄道網で現在、運行障害は発生していますか?」 | sbb_get_rail_disruptions |
| 「Zürich HB、Bern、Basel SBBを比較してください」 | sbb_compare_stations |
| 「SBBの不動産建設プロジェクトで進行中のものはどれですか?」 | sbb_get_real_estate_projects |
| 「Zürich–Winterthur間の路線では、年間に何本の列車が運行していますか?」 | sbb_get_trains_per_segment |
| 「Wädenswilにはどの停留所がありますか?」 | sbb_search_stations |
→ 対象者別の使用例
アーキテクチャ
┌─────────────────┐ ┌───────────────────────────┐ ┌──────────────────────────┐
│ Claude / AI │────▶│ SBB Open Data MCP │────▶│ data.sbb.ch │
│ (MCP Host) │◀────│ (MCP Server) │◀────│ │
└─────────────────┘ │ │ │ OpenDataSoft REST v2.1 │
│ 9 Tools │ │ (public, no API key) │
│ Stdio | Streamable HTTP │ │ │
│ │ │ passagierfrequenz │
│ Shared httpx client │ │ rail-traffic-information │
│ (pooled, lifespan-managed)│ │ construction-projects │
│ ODSQL escaping + Pydantic │ │ perron · rollmaterial │
│ validation │ │ zugzahlen · dienststellen│
└───────────────────────────┘ └──────────────────────────┘
プロジェクト構成
sbb-opendata-mcp/
├── src/sbb_opendata_mcp/
│ ├── __init__.py
│ └── server.py # FastMCP server, all 10 tool definitions
├── tests/
│ └── test_server.py # Unit + live API smoke tests
├── audits/ # MCP best-practice audit evidence
├── docs/assets/demo.svg # README demo asset
├── .github/workflows/ci.yml # GitHub Actions (Python 3.11/3.12/3.13)
├── Dockerfile # Multi-stage, non-root runtime image
├── docker-compose.yml # Local run with resource limits
├── claude_desktop_config.json # Example Claude Desktop config
├── pyproject.toml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── SECURITY.md
├── EXAMPLES.md
├── LICENSE
├── README.md # This file (English)
└── README.de.md # German version
安全性と制限事項
- 読み取り専用: 9つのツールはすべて、読み取り専用のHTTP GETリクエストを実行します。上流のデータが書き込まれたり、変更されたり、削除されたりすることはありません。
- 個人データなし: クエリは一時的に処理され、保存されません。ポータルが返すのは、集計統計、インフラストラクチャおよび運用に関するメタデータです。個人を特定できる情報(PII)は処理も保持もされません。
- APIキー不要: データは公開されており、無料です。認証は不要で、管理が必要なシークレットもありません。
- インジェクション対策済み:
year/cantonは正規表現で検証され、ODSQLのwhere句に挿入されるすべての値は、共通ヘルパーを介してエスケープされます。 - データの鮮度: リアルタイムツール(運行障害)はクエリ時点の上流ソースを反映します。統計データセットは年次/日次で更新されます(ツール一覧を参照)。
- 利用規約: データはdata.sbb.chのライセンス(NonCommercialAllowed-CommercialAllowed-ReferenceRequired)のもとで公開されています。
- 保証なし: このサーバーはコミュニティプロジェクトであり、SBBとは提携していません。利用可能かどうかは上流APIに依存します。
セキュリティ対策の詳細については、SECURITY.mdを参照してください。
既知の制限事項
- 乗客数: 年次更新のため、最新の通年データの反映が数か月遅れる場合があります。
- 鉄道の運行障害: スイス国内の現在の鉄道メッセージをすべて返します。→
limitとページネーションを使用してください。 - 区間別の列車本数: 本数は年間の集計値であり、リアルタイムの値ではありません。
- 駅検索: SBBだけでなく、スイスのDiDok登録簿全体(すべての事業者)を対象とします。
- 独自のレート制限なし: 公開HTTPデプロイメントは、レート制限に対応したリバースプロキシの背後に配置してください。
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 の更新で、どちらかが気づかないうちに変わることはありません。2 つのワイヤーテストでは、mcp.streamable_http_app()(--http が提供するアプリ)を通して各時代の実際のリクエストを送り、応答からリビジョンを読み取ります。セッションなしの 2026-07-28 server/discover POST と、2026-07-28 を要求し、2025-11-25 に制限されて返される initialize です。
SDK が単独で行う処理に加えて、このサーバーが 2026-07-28 向けに提供する内容は
tests/test_spec_2026_07_28.pyで固定されています。具体的には、完全な serverInfo(最新の時代ではすべての結果に付与されます。version がないと "" と読み取られていました)、すべてのツールのトップレベルの title、サーバーと SDK クライアントの両方が照合するツールごとの outputSchema、そして一覧表示メソッドの ttlMs/cacheScope です。
SDK の LATEST_PROTOCOL_VERSION はハンドシェイク時代ではなく、最新の時代を示すエイリアスです。これだけを基準に固定すると、現在のクライアントが実際にネゴシエーションする時代が変更されても検出できません。
更新ポリシー。 検査に失敗しても、定数を安易に編集しないでください。2 つのリビジョン間の仕様変更履歴を読み、サーバーが引き続き正しく動作することを確認してから、定数、このセクション、README.de.md、CHANGELOG.mdをまとめて更新してください。
テスト
API キーは不要です。
# Unit tests (no network required)
PYTHONPATH=src pytest tests/ -m "not live"
# Live API smoke tests (require network access to data.sbb.ch)
PYTHONPATH=src pytest tests/ -m live
# Re-record the fixtures from data.sbb.ch (writes tests/fixtures/PROVENANCE.md)
python scripts/record_fixtures.py
ユニットテストのペイロードは創作ではなく、記録されたものです。各ファイルのソース、取得日、選択ルール、SHA-256 は
tests/fixtures/PROVENANCE.mdに記載されています。
tests/fixtures/dataset_fields.jsonはデータの抜粋ではなく、契約です。Explore v2.1 API では各データセットのフィールド名が定義されており、存在しないフィールドを指定した select または order_by には、列数を減らすのではなくHTTP 400が返されます。TestFieldContractは、サーバーが使用するすべてのフィールド名をその定義と照合するため、次に名前を変更すると、ユーザーのリクエストではなくテストが失敗します。2026-08-08 まで、10 個のツールのうち 3 個がまさにこの理由で恒久的に動作しなくなっていました。
ライブテストは CI では実行されません(
-m "not live")。動作しなかった 3 つのツールのうち 2 つには、それらを対象とするライブテストがありました。対象範囲はありましたが、実行されていませんでした。
変更履歴
CHANGELOG.mdを参照してください。
貢献
CONTRIBUTING.mdを参照してください。
セキュリティ
セキュリティ上の方針と脆弱性の報告方法については、SECURITY.md(Deutsch)を参照してください。
ライセンス
MIT License — LICENSEを参照してください。
作者
Hayal Oezkan · github.com/malkreide
クレジットと関連プロジェクト
- データ: data.sbb.ch – スイス連邦鉄道(SBB)のオープンデータ、OpenDataSoft REST API v2.1
- プロトコル: Model Context Protocol – Anthropic / Linux Foundation
- 関連プロジェクト:
- swiss-transport-mcp – リアルタイムの時刻表、移動経路、運行障害(opentransportdata.swiss)
- swiss-road-mobility-mcp – マイクロモビリティとEV充電
- zurich-opendata-mcp – チューリッヒ市のオープンデータ用MCPサーバー
- ポートフォリオ: Swiss Public Data MCP Portfolio
インストール
uv の uvx 経由で実行できます。クローンや手動インストールは不要です。MCP クライアントの設定に追加してください(Claude Desktop、Cursor、Windsurf では mcpServers を使用し、VS Code の .vscode/mcp.json ではトップレベルの servers キーを使用します)。
{
"mcpServers": {
"sbb-opendata-mcp": {
"command": "uvx",
"args": [
"sbb-opendata-mcp"
]
}
}
}
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。