Skip to main content
Glama

🚇 Metro MCP

米国交通システム(DCメトロ&NYC地下鉄)向けModel Context Protocolサーバー

MCP Metro MCP Cloudflare Workers OAuth 2.1 License

複数の米国交通システムをサポートする統合リモートModel Context Protocol(MCP)サーバーです。現在、ワシントンDCメトロ(WMATA)とニューヨーク市地下鉄(MTA)をサポートしています。Claude Desktop、Cursor、Codex、およびStreamable HTTP MCPサーバーをサポートする任意のクライアントとのシームレスな統合を目的として構築されています。

クイックリンク: クイックスタート • できること • Transit Board • デプロイ • クライアント統合


できること

Claude DesktopまたはMCP互換クライアントで、DCメトロまたはNYC地下鉄について自然言語で質問できます。

🚆 リアルタイム交通情報

ワシントンDC:

  • 「Dupont Circleの次のRed Lineの電車はいつ来ますか?」

  • 「利用可能なバス路線は何ですか?」

  • 「Dupont Circleの近くのバス停を探してください」

  • 「今、30Nバスはどこにいますか?」

  • 「停留所1001195の次のバスはいつ来ますか?」

  • 「メトロシステムで現在運行中のすべての電車を表示してください」

  • 「今、Blue Lineに遅延はありますか?」

  • 「Union Stationのエレベーターはすべて稼働していますか?」

ニューヨーク市:

  • 「Times Squareの次の1番線の電車はいつ来ますか?」

  • 「A/C線に遅延はありますか?」

  • 「Grand Centralに到着する電車は何ですか?」

  • 「Aトレインとは何ですか、どこへ行きますか?」

  • 「Times Squareから徒歩で行ける近くの駅はどこですか?」

  • 「Times Squareのホーム間の徒歩移動時間はどのくらいですか?」

🗺️ 駅情報とナビゲーション

ワシントンDC:

  • 「Smithsonianメトロ駅はどこですか?」

  • 「Green Lineのすべての駅を表示してください」

ニューヨーク市:

  • 「Union Square駅はどこですか?」

  • 「NYC地下鉄の全496駅を表示してください」

  • 「Times Squareに接続する駅はどれですか?」

  • 「急行と各駅停車の違いを説明してください」

♿ アクセシビリティ

ワシントンDC(エレベーター停止):

  • 「ここからNational Airportまでの間にエレベーターの停止はありますか?」

  • 「現在、エレベーターが稼働しているDCメトロの駅はどこですか?」

🔔 サービス監視

両都市:

  • 「今、NYCで交通遅延はありますか?」

  • 「DCメトロのOrange Lineは正常に運行していますか?」

  • 「DCメトロとNYC地下鉄のサービス品質を比較してください」

📊 システム情報

ワシントンDC:

  • 座標付きの全メトロ駅の完全なリスト

  • 6つのメトロ線(Red、Blue、Orange、Silver、Green、Yellow)すべてに関する情報

ニューヨーク市:

  • 完全なカバレッジ: 座標付きのNYC地下鉄全496駅

  • 乗り換え情報: 接続駅間の徒歩時間(乗り換えのある87駅)

  • 路線説明: 全29路線の詳細な運行パターン(急行と各駅停車、運行時間)

  • プラットフォームの明確さ: 方向別プラットフォームの説明(例:「127N」= Times Squareの北行き)


Related MCP server: marta-mcp

クイックスタート

公開サーバーの利用

最も早い開始方法は、ホストされているインスタンスを使用することです。

  1. MCPクライアントを開く

  2. このURLを追加: https://metro-mcp.anuragd.me/mcp

  3. 「接続」をクリックし、GitHubで認証する

  4. DCメトロまたはNYC地下鉄について質問を始める

自分でデプロイする

独自のインスタンスを実行したいですか? デプロイセクションを参照してください。


デプロイ

前提条件

環境設定

bun.lockが記録するものを正確にインストールします。

bun install --frozen-lockfile

ローカル開発では、コールバックが正確にhttp://localhost:8787/callbackである専用のGitHub OAuthアプリを作成します。次に、正規の.dev.vars.exampleテンプレートをコピーし、すべてのreplace-with-...プレースホルダーを置き換えて、Wranglerを起動します。

cp .dev.vars.example .dev.vars
bun run dev

テンプレートのhttp://localhost:8787オリジン、localhostホスト/オリジン許可リスト、コールバック、およびENVIRONMENT=developmentの値を一緒に保持します。Wranglerのデフォルトのローカルモードでは、設定されたOAUTH_KVバインディングは.wranglerの下のローカル非本番ストレージを使用します。デプロイされた本番またはプレビューの名前空間を読み書きしません。通常のローカル開発では--remoteを追加しないでください。

デプロイされた各環境に対して1つのOAuth Provider名前空間を作成し、そのIDを対応するOAUTH_KVバインディングに配置します。

bunx wrangler kv namespace create OAUTH_KV
bunx wrangler kv namespace create OAUTH_KV_preview

本番とプレビューでは、異なるGitHub OAuthアプリも使用する必要があります。各コールバックを${MCP_PUBLIC_ORIGIN}/callbackとして設定します。本番アプリまたはOAuth KVをプレビューに再利用しないでください。各環境は以下を設定します。

  • MCP_PUBLIC_ORIGIN、MCP_ALLOWED_HOSTNAMES、およびMCP_ALLOWED_ORIGIN_HOSTNAMES

  • OAUTH_REDIRECT_URIと環境の公開GitHub GITHUB_CLIENT_ID

  • ENVIRONMENT(production、preview、またはdevelopment)

  • OAUTH_KV(環境専用の名前空間を指す)

本番シークレットを対話的に設定します。MCP_REQUEST_STATE_KEYは、署名付きMRTR状態にのみ使用される安定した環境固有の32バイト以上のキーです。JWT_SECRETは、レガシー/mcpオーディエンスブリッジのために一時的に残ります。

bunx wrangler secret put MCP_REQUEST_STATE_KEY
bunx wrangler secret put GITHUB_CLIENT_SECRET
bunx wrangler secret put WMATA_API_KEY
bunx wrangler secret put JWT_SECRET

プレビュー用に同じ4つのシークレット名を独立して設定します。名前付きWrangler環境は本番シークレットを継承しません。

bunx wrangler secret put MCP_REQUEST_STATE_KEY --env preview
bunx wrangler secret put GITHUB_CLIENT_SECRET --env preview
bunx wrangler secret put WMATA_API_KEY --env preview
bunx wrangler secret put JWT_SECRET --env preview

Wranglerにはnodejs_compatとglobal_fetch_strictly_publicの両方を含める必要があります。承認されたデプロイの前に両方の形状を検証します。

bunx wrangler deploy --dry-run --outdir /tmp/metro-mcp-production
bunx wrangler deploy --dry-run --env preview --outdir /tmp/metro-mcp-preview

MCPクライアント統合

Claude

Claude Codeで正規のStreamable HTTPエンドポイントを使用します。

claude mcp add --transport http metro-mcp https://metro-mcp.anuragd.me/mcp

次に/mcpを開き、metro-mcpを選択して、GitHubログインと同意を完了します。Claude.ai/Desktopユーザーは、プランとワークスペースポリシーで許可されている場合、同じURLをリモートカスタムコネクタとして追加できます。

Codex

codex mcp add metro-mcp --url https://metro-mcp.anuragd.me/mcp
codex mcp login metro-mcp --scopes transit:read

チェックインされたmcp-config.jsonは、同等の汎用リモートHTTP構成を示しています。アクセストークンとリフレッシュトークンはクライアントの資格情報ストアに残ります。プロジェクト構成に貼り付けないでください。

トランスポート互換性

  • MCP 2026-07-28リクエストはステートレスであり、initializeを必要としません。

  • 通常のツール、リソース、プロンプトは、MCP 2025ステートレスクライアントでも引き続き利用できます。

  • POST /sseおよびOPTIONS /sseは、認証前に正規の/mcpに書き換えられるURLエイリアスです。

  • レガシーHTTP+SSEは削除されました。/sseまたは/mcpでのGETおよびDELETE、セッションメッセージURL、および/sse/は405を返します。

  • OAuthオーディエンスとディスカバリは常にhttps://metro-mcp.anuragd.me/mcpを使用します。/sseはOAuthリソースになることはありません。

OAuthエンドポイント

Workers OAuth Providerは、PKCEを備えたOAuth 2.1を実装しています。

  • ディスカバリ: /.well-known/oauth-authorization-server

  • 登録: 最初にCIMD、一時的なDynamic Client Registrationフォールバックとして/register

  • 認可: /authorize(GitHub OAuth統合)

  • トークン: /token(PKCE検証付き認可コード交換)

  • コールバック: /callback(GitHub OAuthコールバック)

クライアントには明示的なtransit:read同意画面が表示されます。許可は正規の/mcpリソースにバインドされます。アクセストークンは最大60分、リフレッシュトークンは最大30日間有効で、使用時にローテーションされます。ベアラートークンはAuthorizationヘッダーでのみ受け入れられます。DCRフォールバックは2027-06-30に廃止されます。

バージョン5.0では、オーディエンスのないトークン、/sseにバインドされたトークン、および古いDCRストアに登録されたクライアントの再認証が必要です。/mcpにバインドされた既存の互換性のあるレガシーJWTは、埋め込まれた有効期限と2026-11-30T00:00:00Zのいずれか早い方で動作を停止します。

サポートされている都市

サーバーは現在、次の交通システムをサポートしています。

都市

システム

リアルタイムデータ

サービスアラート

エレベーター状況

ワシントンDC

WMATA(メトロ)

✅

✅

✅

ニューヨーク市

MTA(地下鉄)

✅

✅

❌

利用可能なMCPツール

サーバーはMCPプロトコルを通じて次のツールを公開します。

ツール

説明

サポートされる都市

get_station_predictions

駅のリアルタイムの列車到着予測を取得します

DC、NYC

search_stations

名前またはコードで駅を検索します

DC、NYC

get_stations_by_line

特定の路線のすべての駅を取得します

DC、NYC

get_incidents

現在のサービス中断と勧告を確認します

DC、NYC

get_all_stations

座標付きのすべての駅の完全なリストを取得します

DC、NYC

get_station_transfers 🆕

近くの駅間の乗り換え接続と徒歩時間を取得します

NYCのみ

get_route_info 🆕

詳細な路線情報(急行/各駅停車、運行パターン、時間)を取得します

NYCのみ

get_elevator_incidents

エレベーターとエスカレーターの停止を見つけます

DCのみ

get_bus_predictions

リアルタイムのバス到着予測を取得します(7桁の停留所ID)

DCのみ

get_bus_routes

利用可能なすべてのバス路線のリストを取得します

DCのみ

get_bus_stops

場所でバス停を検索するか、すべての停留所を取得します

DCのみ

get_bus_positions

すべてのバスの現在位置を取得します(オプションで路線でフィルタリング)

DCのみ

get_train_positions

システム上のすべての列車の現在位置を取得します

DCのみ

合計: 13のMCPツール(11のコア+2つの新しいNYC固有ツール)

MCPアプリ: Transit Board

上記の13のツールはすべて、自己完結型のTransit Board MCPアプリを参照しています。Apps対応ホストは、各結果を専用の到着、サービス、駅/ネットワーク、路線、または車両ビューとしてレンダリングできます。Appsをサポートしないホストは、同じcontentテキストフォールバックとstructuredContentコントラクトを受け取ります。この拡張機能はツールを追加したり、交通機関の呼び出しを変更したりしません。

コンパイルされたアプリはpublic/apps/transit-board.htmlにコミットされています。この公開アセットにはアプリケーションコードのみが含まれています。交通結果、ID、トークン、シークレット、構成値は埋め込まれていません。サンドボックス化されたビューは、ブラウザのネットワークリクエストを直接行わず、ブラウザストレージを使用せず、ブラウザの権限を要求しません。更新は唯一のサーバーインタラクションであり、ホストを介して元の許可されたツールに元の引数で送信されます。

決定論的なローカルApps受け入れスイートをビルドして実行します。

bun run build:apps
bun run test:apps

正確なホスト境界、13すべてのビューマッピング、Chromiumカバレッジ、Appsレンダリングとフォールバッククライアント受け入れの違いについては、docs/mcp-apps-verification.mdを参照してください。このリリースでは、CodexはフォールバッククライアントとしてMCPディスカバリと通常のツール結果を検証します。CodexでのインラインAppsレンダリングは主張されていません。

技術詳細

MCPプロトコル

  • バージョン: MCP 2026-07-28、通常のMCP 2025ステートレス互換性を備える

  • トランスポート: リクエストごとに新しいSDK v2サーバーを使用するステートレスStreamable HTTP。JSONおよびリクエストスコープのSSEレスポンスをサポート。プロトコルセッション、再開可能性、サーバープッシュはアドバタイズされない。

  • 認証: Cloudflare Workers OAuth Providerが、ディスカバリ、CIMD/DCR検証、PKCE、RFC 9207発行者識別子、RFC 8707リソースバインディング、RFC 9728保護リソースメタデータ、リフレッシュローテーション、失効、Providerトークンストレージを管理する。

  • ツール結果の形状: すべてのツールは、後方互換性のためにレガシーなcontent[0].text(シリアライズされたJSON)と並んで、structuredContent(outputSchemaに一致する型付きオブジェクト)を出力する。

  • ツールアノテーション: すべてのツールはreadOnlyHint、idempotentHint、openWorldHintを宣言し、クライアントが安全なアクションのアフォーダンスをレンダリングできるようにする。

  • 公開される機能:

    • tools — 13のトランジットクエリツール(DC + NYC)

    • resources — 3つのtransit:// URIテンプレート(stations、routes、incidents)

    • prompts — 3つの定型テンプレート(service-briefing、commute-planner、accessibility-check)

    • MRTR入力 — 最新クライアントは曖昧な駅に対してinput_requiredを受け取る。MCP 2025クライアントは正確な駅IDを含む決定的な再試行ガイダンスを受け取る。

    • 進捗通知: クライアントがparams._meta.progressToken経由でオプトインした場合、get_all_stationsに対して発行される。

トランジットAPI

WMATA(DCメトロ):

サーバーは公式のWMATA REST APIとインターフェースする。詳細はWMATAの開発者ドキュメントを参照:

  • 駅予測: リアルタイムの列車到着情報

  • 駅情報: 駅名、コード、位置

  • インシデント: 運行障害と注意報

  • エレベーター/エスカレーターの停止: アクセシビリティ情報

MTA(NYC地下鉄):

サーバーはMTAのGTFS-Realtimeフィードを使用する。公開APIエンドポイント(APIキー不要):

  • リアルタイムフィード: 30秒間隔で更新されるProtocol Buffers形式

  • 8つの個別フィード: すべての地下鉄路線(1-7、A/C/E、B/D/F/Mなど)をカバー

  • NYCT拡張: 列車ID、軌道割り当て、方向情報

  • サービスアラート: GTFS-Realtimeアラートエンティティに埋め込まれる

ホスティング

  • プラットフォーム: Cloudflare Workers

  • 静的アセット: public/はCloudflare Workers Static Assetsを通じてデプロイされ、env.ASSETSとしてバインドされる。WorkerはAPI/OAuth/MCPルートを先に処理し、ランディングページ、ドキュメント、画像、アイコンのリクエストをアセットバインディングに委任する。

  • ストレージ:

    • 環境固有のCloudflare KV OAUTH_KV — OAuth Providerのグラント、トークン、登録情報

    • アクティブなプロトコルセッションストレージなし。旧MetroMcpAgentエクスポートと元のv1マイグレーションは、ロールバックのためだけに非アクティブのまま残されている。

  • ランタイム: グローバルエッジデプロイを備えたV8アイソレート

ソース構造

コードベースは、関心事の明確な分離を備えた多都市トランジットサポート向けに構成されている:

src/
├── index.ts              # Outer route normalization and Provider composition
├── public-handler.ts     # /info, OAuth UI, and static assets
├── route-normalizer.ts   # Exact /mcp admission and /sse URL alias
├── oauth/                # Provider configuration, GitHub consent, legacy bridge
├── mcp/                  # Stateless server factory, tools, resources, and prompts
├── mcp-agent.ts          # Inactive 4.x rollback class only
└── transit/              # WMATA and MTA clients with request cancellation

主要なアーキテクチャ上の決定:

  • トランジット抽象化: 共通のTransitAPIClientインターフェースにより、新しい都市(BART、MBTAなど)の追加が容易になる

  • 都市ルーティング: 単一のサーバーがMCPツール呼び出しのcityパラメータを通じてすべての都市を処理する

  • 正規化されたレスポンス: すべてのトランジットクライアントは標準化されたTransitStation、TransitPrediction、TransitIncident型を返す

  • 拡張性: 新しい都市の追加は抽象クライアントクラスの実装のみで済む

検証とロールバック

bun run testで完全なローカルスイートを実行する。認証済みコンフォーマンスランナーは、プロセス環境内のオペレーター取得による短期間のProviderアクセストークンを必要とする。トークンを保存したり、コマンド引数に含めたりすることはない:

export MCP_CONFORMANCE_TARGET_URL=https://metro-mcp-preview.anuragd.me/mcp
export MCP_CONFORMANCE_ALLOW_REMOTE=1
read -rsp 'Short-lived MCP token: ' MCP_CONFORMANCE_TOKEN && export MCP_CONFORMANCE_TOKEN
./scripts/run-conformance.sh
unset MCP_CONFORMANCE_TOKEN

コアプロトコル受理記録についてはdocs/mcp-2026-verification.mdを、Transit Boardブラウザ境界についてはdocs/mcp-apps-verification.mdを参照。

ロールバックは以前のWorkerバージョンとその以前のバインディングを復元する。安定化期間中は、元のMetroMcpAgent Durable Object名前空間を削除したり、削除マイグレーションを追加したりしないこと。プロトコルセッション状態は使い捨て可能だが、クラスと元のv1マイグレーションを保持することでロールバックが可能になる。

Transit Boardのロールバックは、Appsメタデータ/リソース、ブラウザソース、ビルド依存関係を削除し、トランジットプロバイダー、OAuth、ルーティング、バインディング、バージョンは変更しない。

コントリビューション

コントリビューションを歓迎します!以下のことが可能です:

  • GitHub Issuesでバグを報告したり機能をリクエストしたりする

  • 改善を含むプルリクエストを送信する

  • MCP実装に関するフィードバックを共有する

ライセンス

MITライセンス — 詳細はLICENSEファイルを参照。


ワシントンDCメトロコミュニティへの❤️を込めて作られました

Related MCP Connectors

Related MCP Servers