mcpField
S
sbb-opendata-mcp

sbb-opendata-mcp

ローカル
github.com地図・旅行25 週間前に更新

sbb-opendata-mcp について

sbb-opendata-mcpは、OpenDataSoft API経由でスイス連邦鉄道の公開データをAIアプリケーションやMCP対応クライアントに提供します。運行、駅、インフラ、不動産のデータを扱い、読みやすい出力と構造化データを返します。

主な機能

  1. 01駅ごとの旅客数
  2. 02鉄道の運行障害情報
  3. 03インフラ・不動産プロジェクト
  4. 04列車数とホームデータ
  5. 05駅の比較と停留所検索
  6. 06データセットカタログの参照

活用シーン

  1. 01スイス鉄道の現在の運行障害の確認
  2. 02主要駅の旅客数の比較
  3. 03ホーム情報や周辺停留所の検索

MCP 対応

SBBのオープンデータを読み取るMCPツールを提供し、stdioとStreamable HTTPに対応します。結果には構造化コンテンツが含まれ、MarkdownまたはJSONで出力できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"malkreide-sbb-opendata": {
"command": "uvx",
"args": [
"sbb-opendata-mcp"
]
}
}
}
起動コマンドuvx sbb-opendata-mcp

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypisbb-opendata-mcp0.4.0

ツール

9

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
paramsanyはい

詳細

🚆 sbb-opendata-mcp

🇨🇭 スイス公共データ MCP ポートフォリオの一部です

PyPI License: MIT Python 3.11+ MCP Data Source CI

AI モデルをスイス連邦鉄道(SBB)のオープンデータに接続する MCP サーバーです。乗客数、リアルタイムの鉄道運行障害、インフラおよび不動産プロジェクト、列車数、ホームデータ、車両、駅検索を data.sbb.ch から取得できます。API キーは不要です。

🇩🇪 ドイツ語版

デモ

デモ:Claude が SBB の乗客数を検索


概要

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_HOSTHTTP トランスポートのバインド先ホストです。ローカルでは 127.0.0.1 のままにし、制御されたコンテナー/クラウド環境内でのみ 0.0.0.0 にバインドしてください。127.0.0.1
MCP_PORTHTTP トランスポートのポートです。8000
MCP_ALLOWED_HOSTSDNS リバインディング保護のための、カンマ区切りの許可ホストリストです(例: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_projectsSBB の不動産開発プロジェクト毎日
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_datasetsSBB の全約 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-282026-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


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

インストール

uv の uvx 経由で実行できます。クローンや手動インストールは不要です。MCP クライアントの設定に追加してください(Claude Desktop、Cursor、Windsurf では mcpServers を使用し、VS Code の .vscode/mcp.json ではトップレベルの servers キーを使用します)。

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

コメント

MCP は初めてですか?

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

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