wsdot-mcp-server について
wsdot-mcp-serverは、ワシントン州の道路・フェリー情報を提供し、路況、運航時刻、船舶位置、通行料金、国境の待ち時間を調べられます。WSDOTの交通情報とWSFのフェリー情報を1つのMCPサーバーにまとめています。
主な機能
- 01峠の路況と道路アラート
- 02区間所要時間と通行料金
- 03国境の待ち時間とカメラ情報
- 04フェリー路線・時刻・ターミナル空き状況
- 05船舶のリアルタイム位置と運航アラート
活用シーン
- 01運転前に峠の路況を確認
- 02道路の所要時間と料金を比較
- 03フェリーを計画し車両スペースを確認
- 04交通アラートと国境の待ち時間を確認
MCP 対応
MCPクライアント向けに、WSDOTの交通情報とWSFのフェリー情報を照会する12個のツールを公開します。STDIOとStreamable HTTPに対応し、公開ホスト型エンドポイントもあります。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://wsdot.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-wsdot https://wsdot.caseyjhand.com/mcp{"mcpServers":{"cyanheads-wsdot":{"type":"http","url":"https://wsdot.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-wsdot":{"type":"http","url":"https://wsdot.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-wsdot":{"type":"http","url":"https://wsdot.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-wsdot":{"serverUrl":"https://wsdot.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
12このツールにパラメーターはありません。
詳細
@cyanheads/wsdot-mcp-server
MCP を介して、ワシントン州の高速道路の状況、フェリーの時刻表、船舶の位置、通行料金、国境での待ち時間、アラートを照会できます。STDIO または Streamable HTTP に対応しています。
概要
WSDOT が提供するワシントン州の道路とフェリーの情報を利用できます。山道の状況、所要時間、通行料金、国境での待ち時間、アラート、交通カメラを確認できるほか、フェリーの時刻表、船舶の位置、ターミナルの空き状況を追跡できます。
ツール
| ツール | 説明 |
|---|---|
wsdot_get_mountain_passes | WA の全山岳峠の現在の状況:ステータス、道路状況、滑り止め規制、気温、標高。 |
wsdot_search_alerts | 有効な高速道路アラート(事故、工事、通行止め)。州道、WSDOT 地域、キロポスト範囲で絞り込めます。 |
wsdot_get_travel_times | WA の名称付き高速道路区間(I-5、I-90、SR 520 など)の現在と平均の所要時間、および渋滞による遅延。 |
wsdot_get_toll_rates | WA のエクスプレスレーンおよび有料施設(SR 99、SR 167 HOT、I-405 Express、SR 509、SR 520)の変動料金。路線で絞り込めます。 |
wsdot_get_border_waits | WA とカナダのすべての陸路国境検問所における、現在の車両待ち時間。 |
wsdot_search_cameras | 高速道路カメラのメタデータと画像 URL。州道、地域、キロポスト範囲、タイトルの単語で絞り込めます。 |
wsdot_get_ferry_terminals | 時刻表と空き状況の照会に必要な数値 ID、および座標を含む、WSF の全フェリーターミナル。 |
wsdot_get_ferry_routes | 指定日に運航する WSF の航路。航路の検出、時刻表の照会、フェリーアラートの相互参照に使える航路 ID、略称、説明、および航路が運航するターミナルの組み合わせ。 |
wsdot_get_ferry_schedule | 特定の WSF 航路の出航時刻。今日の残りまたは将来の終日モードに対応し、各便の船舶、積載ルール、注記を含みます。 |
wsdot_get_vessel_locations | 運航中の全 WSF 船舶のリアルタイム AIS 位置、速度、進行方向、到着予定時刻、停泊状況。 |
wsdot_get_terminal_space | WSF ターミナルで、今後の便に利用できる乗船順の車両スペースおよび予約可能な車両スペース。 |
wsdot_get_ferry_alerts | 影響を受ける航路 ID を含む、現在有効な WSF の運航障害および告知。 |
機能リファレンス
wsdot_get_mountain_passes ツール
- 入力不要です。1 回の呼び出しで、WA の全 16 山岳峠(Snoqualmie、Stevens、White、Blewett、Cayuse など)の現在の状況を取得します。
- 各峠の道路状況、天候、気温、標高、および方向別の滑り止め/通行規制を最大 2 件取得できます。
wsdot_search_alerts ツール
stateRoute、region(Northwest、Olympic、Southwest、South Central、North Central、Eastern)、startMilepost/endMilepostは任意です。アラートの対象範囲が指定範囲と重なる場合に一致します。すべて省略すると、州全体のすべてのアラートが対象になります。alertId順に並べられ、ページ分けされます(デフォルト 20、最大 500)。- 不明な地域を指定すると
invalid_region、開始値が終了値を超えるとinvalid_milepost_rangeが返され、それぞれ復旧のヒントが示されます。
wsdot_get_travel_times ツール
routeは任意です。路線("I-5"、"SR 520")を指定すると、その路線で計測されているすべての区間が返されます。それ以外のテキストは区間名と照合されます("Everett")。ページ分けされます(デフォルト 50、最大 500)。- 各区間では現在と平均の所要時間が分単位で報告されます。現在の所要時間が平均を上回る場合は渋滞しており、その差が遅延時間です。照会した方向で可逆式エクスプレスレーンの区間が閉鎖されている場合、その数値はゼロとして報告されず、省略されます。
wsdot_get_toll_rates ツール
- SR 99(WSDOT Tunnel)、SR 167 HOT Lanes、I-405 Express Lanes、SR 509 の有料区間、SR 520 Bridge が対象です。
stateRouteは標識上の路線名("I-405"、"SR 520")と照合されます。有料施設のない路線では、対象の有料路線を示す通知付きで空のページが返されます。ページ分けされます(デフォルト 50、最大 500)。 - 各行の先頭には
startLocationName → endLocationNameの区間が表示されます。stateRouteはフィードの先頭ゼロ付き番号("099")で、travelDirectionはフィードのコードです。SR 99、SR 509、SR 520 では施設ごとに方向が固定されているため、区間の始点と終点から方向を確認してください。
wsdot_get_border_waits ツール
- 入力なし — I-5(Peace Arch)、SR 543(Pacific Highway)、SR 539(Lynden)、SR 9(Sumas)の
crossings[]に11件のレーン情報を返します。各地点に一般レーンとNexusレーンがあり、SR 539とSR 543にはトラックレーンもあります crossingNameはルートコード(I5、SR543Trucks)、location.descriptionは読みやすい名称です。最新データのないレーンではwaitTimeInMinutesが省略されます
wsdot_search_cameras ツール
stateRoute、regionコード(NW、SW、OL、ER、SC、NC、OSはOregon TripCheckのカメラ、WAは空港カメラ)、startMilepost/endMilepost、およびtitleContains(語順を問わず、すべての単語に一致)を任意で指定できます。cameraId順に並び、ページ分割されます(デフォルト50件、最大500件)- 画像データではなく、メタデータと画像URLを返します(カメラ画像の著作権はWSDOTにあります)。不明な地域を指定すると
invalid_region、範囲の開始地点が終了地点より後の場合はinvalid_milepost_rangeエラーになります
wsdot_get_ferry_terminals ツール
- 入力なし — WSFの全20ターミナルと、それぞれの数値ID、略称、緯度・経度を返します
- 「Bainbridge Island」や「Seattle」などの名称を、
wsdot_get_ferry_scheduleとwsdot_get_terminal_spaceが受け取るIDに対応付けます
wsdot_get_ferry_routes ツール
tripDate(YYYY-MM-DD、デフォルトは今日)を任意で指定できます。WSFが公開している範囲外の日付を指定すると、その範囲を示すinvalid_dateエラーになります- 各ルートには、ID(
wsdot_get_ferry_alertsのimpactedRouteIds)、略称、説明、およびterminalPairsが含まれます。terminalPairsは、その日にwsdot_get_ferry_scheduleが受け付ける出発地 → 到着地の組み合わせです
wsdot_get_ferry_schedule ツール
departingTerminalIdとarrivingTerminalId(wsdot_get_ferry_routesのterminalPairsにある組み合わせ)が必須です。tripDate(デフォルトは今日)とremainingOnly(今日の今後の出航のみ)を任意で指定できます- 各便には、ISO 8601形式のUTCによる
departureTime/arrivalTime(tripDateは太平洋時間の運航日)、vesselId、loadingRule、およびその組み合わせのannotationsへのインデックスが含まれます。キャンセルフラグはありません。WSFはキャンセルされた便を削除するため、wsdot_get_ferry_alertsを確認してください - 指定日のスケジュールがない組み合わせは
invalid_terminal_pair、便が1便もない日付はinvalid_dateエラーになります。空のスケジュールが返されることはありません
wsdot_get_vessel_locations ツール
- 入力なし — 運航中のWSF船舶すべての位置、速度、進行方向、到着予定時刻、着岸状況を返します
- 位置情報には30~60秒の遅延が生じる場合があります。運航中でない船舶では多くのフィールドが欠落し、任務の割り当てがない船舶では
opRouteAbbrevがnone reportedになります
wsdot_get_terminal_space ツール
departingTerminalId(wsdot_get_ferry_terminalsから取得)を任意で指定できます。指定しない場合は全ターミナルが対象です。ターミナル単位でページ分割され(デフォルト5件、最大20件)、返された各ターミナルのすべての便が含まれます- 重要なフィールドは
driveUpSpaceCountです。ゼロは自動車用レーンが満車であることを意味し、定員超過の便では、上流の負の台数はゼロに切り下げられます。arrivingTerminalIdsはwsdot_get_ferry_scheduleに渡して連携できます
wsdot_get_ferry_alerts ツール
- 入力なし — WSFの有効な運航障害、遅延、お知らせを返します。それぞれに
alertTitle、1行のalertDescription、全文のbulletinTextが含まれます(代替便などの詳細は本文にのみ記載されます) impactedRouteIdsはwsdot_get_ferry_routesのルートに対応します。affectsAllRoutes: trueは全船隊に影響するお知らせを示し、その場合、ルートの一覧が空であればすべてのルートが対象です
機能
@cyanheads/mcp-ts-core を基盤としています。stdio と Streamable HTTP のトランスポート、プラグイン可能な認証(none / jwt / oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレーシングに対応した構造化ログを備えています。
WSDOT 固有の機能:
- 2 つの API を連携 — WSDOT Traffic API と WSF Ferry API は、単一の
WSDOT_ACCESS_CODEを共有します - ツールの説明にツール間の連携を組み込み — フェリーツールは、検索前に ID を解決するため、
wsdot_get_ferry_terminals/wsdot_get_ferry_routesを案内します - 両 API でレスポンス形式を統一 — 上流 API で欠落しているフィールドは、省略やデフォルト値ではなくオプションとして示されます
- 安定したページネーション — 上流 API ではアラートとカメラのフィードが複数の行順で同じ項目を返すため、ID でソートして、指定したオフセットで再現可能な結果を保ちます
- ページ分割されたリストツールは
offset/limitを受け取り、レスポンスが 24,000 バイトの上限に達した場合もページを早期終了します。その際、通知に次のオフセットが示されます - ルートフィルターでは、実際に使われる形式(
"I-90"、"90"、"090"、"SR 520")を受け付けます。また、すべてのテキストフィルターは最大 200 文字です
エージェントに適した出力:
- 型付きエラー —
invalid_access_codeおよびapi_unavailableエラーには、設定上の問題と一時的な上流 API の問題を区別する、明示的な復旧ヒントが含まれます driveUpSpaceCount: 0と渋滞の差分フィールド(delayInMinutes)により、文字列を解析しなくてもエージェントが実用的な情報を得られます- HTML をプレーンテキストに変換 — 上流 API から HTML で届くアラートの説明、航行情報、速報はテキストで返され、リンクは
リンクテキスト (url)の形式でインライン表示されます - 部分データを保持 — 上流 API のペイロードにデータがない場合、合成されたデフォルト値ではなく
null/undefinedとして示されます(例:waitTimeInMinutesが省略されている場合や、arrivalTimeが存在しない場合) content[]とstructuredContentはフィールド名だけでなく、同じ値を保持します。falseのフラグ、空のリスト、座標ペアの片方だけに値がある場合も、一部のクライアントが読み取る Markdown 表示から欠落せずに出力されます。空文字列または空白のみの上流文字列は両方から除外され、値がある場合はトリミングされて届きます
はじめに
公開ホストインスタンス
https://wsdot.caseyjhand.com/mcp で公開インスタンスを利用できます。インストールは不要です。Streamable HTTP を提供しており、クライアントごとに設定形式が異なります。
Claude Code の場合:
claude mcp add --transport http wsdot-mcp-server https://wsdot.caseyjhand.com/mcp
Cline(cline_mcp_settings.json)の場合:
{
"mcpServers": {
"wsdot-mcp-server": {
"type": "streamableHttp",
"url": "https://wsdot.caseyjhand.com/mcp"
}
}
}
Cursor(mcp.json)の場合:
{
"mcpServers": {
"wsdot-mcp-server": {
"url": "https://wsdot.caseyjhand.com/mcp"
}
}
}
Claude Desktop では、Settings → Connectors からリモートサーバーを追加します。
セルフホスト / ローカル
以下を MCP クライアントの設定ファイルに追加してください。WSDOT Traveler API のアクセスコードが必要です。wsdot.wa.gov/Traffic/api/ で登録してください。
{
"mcpServers": {
"wsdot-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/wsdot-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"WSDOT_ACCESS_CODE": "your-access-code"
}
}
}
}
または、npx を使用します(Bun は不要です)。
{
"mcpServers": {
"wsdot-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/wsdot-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"WSDOT_ACCESS_CODE": "your-access-code"
}
}
}
}
または、Docker を使用します。
{
"mcpServers": {
"wsdot-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"-e", "WSDOT_ACCESS_CODE=your-access-code",
"ghcr.io/cyanheads/wsdot-mcp-server:latest"
]
}
}
}
Streamable HTTP を使用するには、トランスポートを設定してサーバーを起動します。
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 WSDOT_ACCESS_CODE=your-access-code bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
- Bun v1.4.0 以降(または Node.js v24 以降)。
- WSDOT Traveler API のアクセスコード。wsdot.wa.gov/Traffic/api/ で登録してください。登録は無料です。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/wsdot-mcp-server.git
- ディレクトリに移動します:
cd wsdot-mcp-server
- 依存関係をインストールします:
bun install
- 環境を設定します:
cp .env.example .env
# edit .env and set WSDOT_ACCESS_CODE
設定
設定はすべて、起動時に src/config/server-config.ts の Zod スキーマで検証されます。主な環境変数は次のとおりです。
| 変数 | 説明 | デフォルト |
|---|---|---|
WSDOT_ACCESS_CODE | 必須。 WSDOT Traveler API のアクセスコードです。wsdot.wa.gov/Traffic/api/ で登録してください。 | — |
MCP_TRANSPORT_TYPE | トランスポート:stdio または http。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポートです。 | 3010 |
MCP_HTTP_HOST | HTTP サーバーのホスト名です。 | 127.0.0.1 |
MCP_HTTP_ENDPOINT_PATH | HTTP エンドポイントのパスです。 | /mcp |
MCP_PUBLIC_URL | TLS を終端するリバースプロキシ環境で使用する公開オリジンです。 | — |
MCP_SESSION_MODE | セッション処理:auto、stateful、または stateless。スキーマのデフォルト値 auto は stateful に解決されます。このサーバーでは stateless を明示的に設定しています。 | stateless |
MCP_AUTH_MODE | 認証:none、jwt、または oauth。 | none |
MCP_LOG_LEVEL | ログレベル(debug、info、notice、warning、error)。 | info |
LOGS_DIR | ログファイルのディレクトリ(Node.js のみ)。 | <project-root>/logs |
STORAGE_PROVIDER_TYPE | ストレージバックエンド:in-memory、filesystem、supabase、cloudflare-kv/r2/d1。 | in-memory |
LOG_TOOL_FAILURE_PAYLOADS | 失敗した各ツール呼び出しの引数と結果を記録します(キー名のみをマスキング)。 | false |
OTEL_ENABLED | OpenTelemetry の計装(スパン、メトリクス、完了ログ)を有効にします。 | false |
OTEL_EXPORTER_OTLP_ENDPOINT | OTLP のベース URL。トレースは /v1/traces に、メトリクスは /v1/metrics に送信されます。 | — |
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT | オプトイン方式の OTLP ログエクスポートです。ベースエンドポイントを設定しても有効にはなりません。 | — |
オプションの上書き設定の一覧については、.env.example を参照してください。
サーバーの実行
ローカル開発
-
ビルドして実行:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
チェックとテストを実行:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t wsdot-mcp-server .
docker run --rm -e WSDOT_ACCESS_CODE=your-access-code -p 3010:3010 wsdot-mcp-server
Dockerfile のデフォルトは HTTP トランスポート、stateless セッションモードで、ログは /var/log/wsdot-mcp-server に出力されます。OpenTelemetry のピア依存関係はデフォルトでインストールされます。省略するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。
プロジェクト構成
| ディレクトリ | 用途 |
|---|---|
src/index.ts | createApp() のエントリーポイントです。12 個すべてのツールを登録し、サービスを初期化します。 |
src/config | サーバー固有の環境変数の解析と、Zod による検証を行います。 |
src/mcp-server/tools | ツール定義(*.tool.ts)です。交通関連ツール 6 個、フェリー関連ツール 6 個があります。 |
src/services/traffic | WSDOT Traffic API サービス(峠、アラート、所要時間、料金、国境での待ち時間、カメラ)。 |
src/services/ferry | WSF Ferry API サービス(ターミナル、ルート、スケジュール、船舶の位置、空き状況、アラート)。 |
tests/ | src/ の構成に対応した単体テストと統合テストです。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジックでは
try/catchを使用しないでください - リクエスト単位のログには
ctx.logを、テナント単位のストレージにはctx.stateを使用してください - 新しいツールは
src/index.tsのcreateApp()配列に登録してください - 外部 API 呼び出しをラップします。生データを検証し、ドメイン型に正規化してから出力スキーマに合う形で返してください。不足しているフィールドを捏造しないでください
コントリビューション
Issue の報告を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
Apache-2.0 — 詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。