swiss-road-mobility-mcp について
swiss-road-mobility-mcpは、スイスのシェアモビリティ、EV充電、道路交通、Park & Rail、公共交通のデータをまとめ、移動検索や計画に役立ちます。場所ごとの概要に加え、自動車、駐車、公共交通を組み合わせた経路を作成できます。
主な機能
- 01近くのシェア車両を検索
- 02充電器とリアルタイム空き状況の確認
- 03事故・工事・渋滞の照会
- 04SBB Park & Rail施設の検索
- 05自動車と公共交通の経路計画
- 06住所のジオコーディングと道路分類
活用シーン
- 01チューリッヒHB付近のシェア自転車を検索
- 02ベルン付近のEV充電器を検索
- 03A1の交通事故情報を確認
- 04Dietikonからベルンへの車と列車の経路を計画
MCP 対応
スイスのシェアモビリティ、充電施設、交通情報、交通量計測所、Park & Rail、住所、道路データのツールをMCPクライアントに公開します。stdioとHTTP/SSEに対応し、DATEX II交通ツールには無料のAPIキーが必要です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
15掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| params | any | はい |
詳細
🇨🇭 スイス公共データ MCP ポートフォリオの一部です
🚗 スイス道路・モビリティ MCP サーバー
スイスの道路モビリティ向け MCP サーバー — 共有車両、EV 充電、交通情報、Park & Rail、マルチモーダルな旅行計画に対応します
デモ
概要
swiss-road-mobility-mcp は、スイスの道路・モビリティデータソースへの AI ネイティブなアクセスを提供します。
| ソース | データ | API | 認証 |
|---|---|---|---|
| sharedmobility.ch | 自転車、電動キックボード、自動車(GBFS) | REST/JSON | なし |
| ich-tanke-strom.ch | EV 充電ステーション | GeoJSON | なし |
| opentransportdata.swiss | 交通イベント、交通量計測ステーション | DATEX II / SOAP+XML | 無料のキー |
| data.sbb.ch | Park & Rail 施設 | REST/JSON (Opendatasoft) | なし |
| transport.opendata.ch | 公共交通機関の接続情報 | REST/JSON | なし |
| geo.admin.ch | 住所のジオコーディング、道路分類 | REST/JSON | なし |
Swiss Transport MCP が鉄道の GA パスなら、このサーバーは道路向けの高速道路ステッカー、Park & Rail カード、シェアリングサブスクリプションに相当します。これらを組み合わせれば、スイスのモビリティをマルチモーダルに把握できます。
デモの基本クエリ: 「車で Dietikon にいます。Bern まで行きたいです。どこに駐車できますか?どの列車に乗ればよいですか?」
機能
- 6 つのデータソースにまたがる 15 個のツール(フェーズ 1~4)
road_mobility_snapshot— 任意の場所のモビリティ概要を集約road_multimodal_plan— 自動車、Park & Rail、公共交通機関を組み合わせたプランを作成- 15 個のツールのうち 12 個は API キー不要
- stdio(Claude Desktop)と SSE(クラウド)のデュアルトランスポート
- すべてのエンドポイントでレート制限とキャッシュを適用
前提条件
- Python 3.11+
- uv(推奨)または pip
インストール
# Clone the repository
git clone https://github.com/malkreide/swiss-road-mobility-mcp.git
cd swiss-road-mobility-mcp
# Install
pip install -e .
# or with uv:
uv pip install -e .
または uvx を使う場合(永続的なインストールは不要):
uvx swiss-road-mobility-mcp
クイックスタート
# stdio (for Claude Desktop)
swiss-road-mobility-mcp
# or:
python -m swiss_road_mobility_mcp.server
# Streamable HTTP (for cloud / Render.com) — serves MCP 2026-07-28 at /mcp
# and keeps the legacy SSE routes alongside.
MCP_TRANSPORT=http MCP_PORT=8001 swiss-road-mobility-mcp
Claude Desktop ですぐに試せます:
「Zurich HB のモビリティ関連情報をすべて表示して。」 「Bern Bahnhof の近くでシェア自転車を探して。」 「Lucerne の近くで EV を充電できる場所はどこ?」
→ 利用者別のユースケース →
設定
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json(macOS)または %APPDATA%\Claude\claude_desktop_config.json(Windows)を編集します。
{
"mcpServers": {
"swiss-road-mobility": {
"command": "uvx",
"args": ["swiss-road-mobility-mcp"],
"env": {
"OPENTRANSPORTDATA_API_KEY": "<your-token>"
}
}
}
}
または python を使います:
{
"mcpServers": {
"swiss-road-mobility": {
"command": "python",
"args": ["-m", "swiss_road_mobility_mcp.server"],
"env": {
"OPENTRANSPORTDATA_API_KEY": "<your-token>"
}
}
}
}
シェアモビリティ、EV 充電、Park & Rail、マルチモーダルプランナーは、
OPENTRANSPORTDATA_API_KEYがなくても動作します。このキーが必要なのは DATEX II 交通情報ツールのみです。
設定ファイルの場所:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
クラウドへのデプロイ(ブラウザーアクセス用 SSE)
ブラウザーの claude.ai 経由で使用する場合(例:ローカルソフトウェアを使えない管理対象ワークステーション):
Render.com(推奨):
- リポジトリを GitHub にプッシュするか、フォークします
- render.com で「New Web Service」を選択し、GitHub リポジトリを接続します
- 起動コマンドを設定します:
MCP_TRANSPORT=http MCP_PORT=8001 swiss-road-mobility-mcp - claude.ai の「Settings」->「MCP Servers」で、
https://your-app.onrender.com/mcpを追加します — または、SSE トランスポートを使用するクライアントには.../sseを指定します。httpは両方を提供します。
SSE のセキュリティ(SEC-009)
公開 SSE エンドポイントには誰でもアクセスできます。エンドポイント(および上流 API の利用枠)を保護するには、ホストで次の環境変数を設定してください。
| 変数 | 効果 |
|---|---|
MCP_AUTH_TOKEN | 設定すると、すべての SSE リクエストで Authorization: Bearer <token> の送信が必要になります。未設定の場合は認証されません(起動時にサーバーが警告をログに記録します)。公開環境にデプロイする場合は、強く推奨します。 |
MCP_RATE_LIMIT | クライアント IP ごとのウィンドウ内の最大リクエスト数(デフォルトは 60、0 で無効)。 |
MCP_RATE_WINDOW | ウィンドウの長さ(秒、デフォルトは 60)。 |
ALLOWED_ORIGINS | ブラウザークライアント用の、カンマ区切りの CORS オリジン。デフォルトは空で、クロスオリジンアクセスはできません。 * はすべてのオリジンを許可し、警告としてログに記録されます。stdio や、ブラウザー以外のクライアントには影響しません。 |
ローカルの stdio トランスポートでは、これらの設定は不要です。ユーザーの信頼されたコンテキストで実行されます。
オブザーバビリティ(OBS-003 / OBS-006)
| 変数 | 効果 |
|---|---|
MCP_LOG_LEVEL | ログレベル:DEBUG / INFO(デフォルト) / WARNING / ERROR。 |
MCP_LOG_FORMAT | 構造化ログには text(デフォルト)または json を指定します。すべてのログは stderr に出力されます。 |
MCP_TRACING_ENABLED | true を指定すると、OpenTelemetry トレーシングが有効になります(デフォルトでは無効)。 |
OTEL_EXPORTER_OTLP_ENDPOINT | OTLP コレクターの URL。この変数を設定すると、トレーシングも有効になります。SDK は標準の OTEL_* 変数を使用します。 |
トレーシングにはオプションの追加パッケージが必要です:pip install 'swiss-road-mobility-mcp[tracing]'。
有効にすると、すべての上流 API 呼び出しが自動的にトレースされ(httpx の計装)、SSE リクエストには W3C トレースコンテキストの伝播に対応したサーバースパンが設定されます。
利用可能なツール
シェアモビリティと EV 充電(API キー不要)
| ツール | 説明 | キャッシュ |
|---|---|---|
road_find_sharing | 近隣のシェアモビリティ(自転車、電動スクーター、自動車) | 60s |
road_search_sharing | 名前でシェアリングステーションを検索 | 5min |
road_sharing_providers | スイス国内のすべてのシェアリング事業者 | 1h |
road_find_charger | 近隣の EV 充電ステーション | 5min |
road_charger_status | 充電ステーションのリアルタイム空き状況 | 1min |
road_check_status | サーバーと API のヘルスチェック | - |
交通(無料の API キーが必要)
| ツール | 説明 | キャッシュ |
|---|---|---|
road_traffic_situations | ASTRA/VMZ-CH による事故、道路工事、渋滞 | 2min |
road_traffic_counters | 位置周辺の観測所における車両数/時 + km/h | 1min |
road_counter_sites | 近隣の観測所一覧 | 24h |
パーク&レール + マルチモーダル(API キー不要)
| ツール | 説明 | キャッシュ |
|---|---|---|
road_park_rail | 近隣の SBB Park+Rail 施設を検索 | 5min |
road_mobility_snapshot | 指定場所の総合的なモビリティ概要 | - |
road_multimodal_plan | 自動車 -> パーク&レール -> 公共交通機関 -> 目的地の経路を計画 | - |
地理情報と住所 — フェーズ 4(API キー不要)
| ツール | 説明 | キャッシュ |
|---|---|---|
road_geocode_address | スイスの住所 -> GPS(公式建物住所登録簿) | - |
road_reverse_geocode | GPS -> EGID/EGAID を含む公式住所(GWR) | - |
road_classify_road | swissTLM3D による道路分類 | - |
使用例
| クエリ | ツール |
|---|---|
| 「Zurich HB の近くでシェア自転車を探して」 | road_find_sharing |
| 「Bern の近くで EV を充電できる場所は?」 | road_find_charger |
| 「A1 で交通事故は発生している?」 | road_traffic_situations |
| 「Winterthur 駅の近くに駐車できる場所は?」 | road_park_rail |
| 「自動車と電車で Dietikon から Bern までの移動を計画して」 | road_multimodal_plan |
交通ツール用 API キー
- 登録します:https://api-manager.opentransportdata.swiss
- 新しいアプリケーションを作成し、「Strassenverkehr」API を購読します
- トークンをコピーします
export OPENTRANSPORTDATA_API_KEY=<your-token>
キーがない場合、交通ツールは正確な登録リンクを含む説明的なエラーメッセージを返します。クラッシュすることはありません。
アーキテクチャ
swiss_road_mobility_mcp/
├── server.py # FastMCP server, 15 tools
├── api_infrastructure.py # Rate limiter, cache, HTTP client, geo utilities
├── shared_mobility.py # sharedmobility.ch
├── ev_charging.py # ich-tanke-strom.ch
├── traffic_situations.py # DATEX II traffic alerts (SOAP/XML)
├── traffic_counters.py # DATEX II counting stations (SOAP/XML)
├── park_rail.py # SBB Open Data Park & Rail
├── multimodal.py # Snapshot + trip planner (cross-source)
└── geo_admin.py # geo.admin.ch geocoding + road classification
データソースの特性
| ソース | プロトコル | 対象範囲 | 認証 |
|---|---|---|---|
| sharedmobility.ch | REST/JSON (GBFS) | スイスのすべてのシェアリング事業者 | なし |
| ich-tanke-strom.ch | GeoJSON | すべての公共EV充電器 | なし |
| opentransportdata.swiss | DATEX II / SOAP+XML | ASTRAの交通データ | 無料キー |
| data.sbb.ch | REST/JSON (Opendatasoft) | SBBのパーク&レール | なし |
| transport.opendata.ch | REST/JSON | 公共交通機関の時刻表 | なし |
| geo.admin.ch | REST/JSON | 公式の住所、道路 | なし |
詳細なドキュメント: docs/ARCHITECTURE.md(MCPプリミティブ、
ツールの名前空間、ユースケースカタログ、フェーズロードマップ)・
docs/SECURITY.md(認証情報モデル、送信先許可リスト、認証、
MCP適合性表)・docs/OPERATIONS.md(リソース制限、再起動ポリシー、ヘルス状態)。
プロジェクト構成
swiss-road-mobility-mcp/
├── src/swiss_road_mobility_mcp/
│ ├── __init__.py # Package
│ ├── server.py # FastMCP server, 15 tools
│ ├── api_infrastructure.py # Rate limiter, cache, HTTP client
│ ├── shared_mobility.py # Shared vehicles
│ ├── ev_charging.py # EV charging stations
│ ├── traffic_situations.py # Traffic events
│ ├── traffic_counters.py # Vehicle counting
│ ├── park_rail.py # Park & Rail
│ ├── multimodal.py # Snapshot + trip planning
│ └── geo_admin.py # Geocoding + roads
├── tests/
│ ├── test_integration.py # Live API tests
│ └── test_phase3.py # Park & Rail + multimodal tests
├── .github/workflows/ci.yml # GitHub Actions (Python 3.11/3.12/3.13)
├── pyproject.toml
├── 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
├── README.md # This file (English)
└── README.de.md # German version
既知の制限事項
- シェアードモビリティ:
sharedmobility.chAPIでは厳密な半径フィルタリングが行われません。指定された半径をわずかに超える車両が表示される場合があります - EV充電: 駅名の命名規則は事業者によって異なります。詳細な名前が表示されない駅もあります
- 交通情報(DATEX II): 無料のAPIキーが必要です。キーがない場合、交通情報ツールは分かりやすいエラーメッセージを返します
- パーク&レール: SBBはエンドポイントの名前を変更することがあります。サーバーにはフォールバックチェーンが含まれています
- マルチモーダルプランナー: 応答時間は、問い合わせたソースのうち最も遅いものによって決まります
MCPプロトコルのバージョン
このサーバーは2つのプロトコル時代に対応しています。接続上でクライアントが最初に送信するリクエストによって、適用される時代が決まります。後から別の時代を指定しても拒否されます。
| 時代 | リビジョン | 接続するクライアント |
|---|---|---|
initialize ハンドシェイク | 2024-11-05 … 2025-11-25 | 現在のクライアントが使用するものです。サーバーは要求されたリビジョンで応答します。要求がそれより新しい場合は、上限の 2025-11-25 で応答します。 |
| リクエストごとのエンベロープ | 2026-07-28 | 2026-07-28 の _meta エンベロープを含むリクエストによって、モダン接続が開始されます。 |
時代はリクエストだけでなく、トランスポートによっても決まります。 この節の以前のバージョンには「同じエンドポイントで」と記載されていましたが、これは見過ごされていた誤りでした。モダンな単一交換方式の配信は StreamableHTTPSessionManager の背後にあり、Streamable HTTPアプリからのみアクセスできます。提供されていたトランスポートはSSEでしたが、SSEにはセッションが必要であり、モダンなリクエストは仕様上セッションレスです。
MCP_TRANSPORT | エンドポイント | ハンドシェイク時代 | 2026-07-28 |
|---|---|---|---|
stdio(デフォルト) | – | はい | はい |
http | /mcp、および併設される /sse + /messages/ | はい | はい |
sse(レガシー) | /sse + /messages/ | はい | いいえ |
MCP_TRANSPORT=http では両方に対応します。SSEルートは /mcp に置き換えられるのではなく、併設されるため、サーバーに新しいリビジョンが追加されても既存のクライアントは影響を受けません。コンテナ(Dockerfile、docker-compose.yml、render.yaml)では http が提供されます。
どちらのリビジョンも tests/test_protocol_version.py で固定され、インストール済みSDKに対して検証されます。そのため、Dependabotによる mcp の更新でどちらかのリビジョンがひそかに変更されることはありません。このゲートではSDK定数しか読み取れないため、tests/test_spec_2026_07_28.py が並んで配置されており、実際の通信内容を検証します。組み立て済みのASGIアプリに対して実際の 2026-07-28 エンベロープを送り、対照確認として同じエンベロープをSSEにも送信します。
SDKの LATEST_PROTOCOL_VERSION はハンドシェイク時代ではなく、モダン時代の別名であることに注意してください。これだけを基準に固定すると、現在のクライアントが実際にネゴシエートする時代が変更されても検出できません。
更新ポリシー。 ゲートが失敗した場合、定数を確認せずに変更しないでください。2つのリビジョン間の仕様変更履歴を読み、サーバーが引き続き正常に動作することを確認してから、定数、この節、README.de.md、CHANGELOG.md をまとめて更新してください。
テスト
# All tests
pytest tests/ -v
# Quick check (without pytest)
python tests/test_phase3.py
安全性と制限事項
- 読み取り専用: すべてのツールは HTTP GET リクエストのみを実行します。上流システムのデータが書き込み、変更、削除されることはありません。
- 個人データなし: ツールの入力として渡される位置座標は、保存、記録されたり、直近の API リクエスト以外に転送されたりすることはありません。API のレスポンスに PII は含まれず、車両数、充電器の利用状況、交通イベント、地理情報メタデータのみが含まれます。
- レート制限: 上流 API を保護するため、サーバーはクライアント側のレート制限(シェアドモビリティ:30 req/60s、EV 充電:10 req/60s)を適用します。DATEX II キーには、opentransportdata.swiss のフェアユース規約が適用されます。
- キャッシュ: レスポンスはプロセス内にキャッシュされます(シェアリング:60s・EV:5 min・Park+Rail:5 min・交通:1~2 min)。リアルタイムデータはキャッシュの経過時間を反映しており、必ずしも現在の時刻のデータとは限りません。
- 利用規約: データには、各上流ソースの利用規約(ToS)が適用されます。sharedmobility.ch、ich-tanke-strom.ch、opentransportdata.swiss、data.sbb.ch(CC BY)、geo.admin.ch(BGDI)。
- 保証なし: このサーバーは独立したコミュニティプロジェクトであり、SBB、ASTRA、sharedmobility.ch、またはいずれかの API プロバイダーとは提携していません。利用可能かどうかは上流サービスに依存します。
変更履歴
CHANGELOG.md を参照してください。
コントリビューション
CONTRIBUTING.md を参照してください。
セキュリティ
セキュリティ対策と脆弱性の報告については、SECURITY.md を参照してください。
ライセンス
MIT ライセンス — LICENSE を参照してください。
作者
Hayal Oezkan · malkreide
クレジットと関連プロジェクト
- sharedmobility.ch: sharedmobility.ch — スイスのシェアドモビリティプラットフォーム
- ich-tanke-strom.ch: ich-tanke-strom.ch — スイスの EV 充電ネットワーク
- ASTRA / opentransportdata.swiss: opentransportdata.swiss — 連邦交通データ
- SBB オープンデータ: data.sbb.ch — スイス連邦鉄道
- geo.admin.ch: geo.admin.ch — 連邦地理空間サービス
- プロトコル: Model Context Protocol — Anthropic / Linux Foundation
- 関連: swiss-transport-mcp — 公共交通機関(列車、バス、路面電車)
- 関連: zurich-opendata-mcp — チューリッヒ市の 900 件以上のデータセット
- ポートフォリオ: スイス公共データ MCP ポートフォリオ
インストール
uv の uvx で実行します。クローンや手動インストールは不要です。MCP クライアントの設定に追加してください(Claude Desktop、Cursor、Windsurf では mcpServers を使用し、VS Code では .vscode/mcp.json 内の最上位キー servers を使用します)。
{
"mcpServers": {
"swiss-road-mobility-mcp": {
"command": "uvx",
"args": [
"swiss-road-mobility-mcp"
]
}
}
}
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。