norway-location-transport-mcp について
EnturとKartverket / GeonorgeのAPIを使い、ノルウェーの交通や地理情報を扱うエージェント向けMCPサーバーです。住所検索、経路計画、リアルタイム交通情報、地形照会を一つのサービスで提供します。
主な機能
- 01住所・地名の検索と検証
- 02経路計画と停留所検索
- 03リアルタイムの発車・車両・運行状況
- 04シェア車両と駐車ステーションの検索
- 05標高・標高プロファイル・座標変換
- 06行政区と地籍情報の照会
活用シーン
- 01ノルウェー国内の公共交通経路を計画
- 02発車時刻や運行遅延を確認
- 03ハイキング経路の標高変化を調査
- 04座標から行政区や近隣住所を特定
MCP 対応
MCPクライアントにEnturの交通データとKartverket / Geonorgeの地理データを扱うツールを提供します。stdioとStreamable HTTPに対応します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://norway-location-transport-mcp.met-mcp-worker.workers.dev/mcpclaude mcp add --transport http trondbjoroy-norway-location-transport https://norway-location-transport-mcp.met-mcp-worker.workers.dev/mcp{"mcpServers":{"trondbjoroy-norway-location-transport":{"type":"http","url":"https://norway-location-transport-mcp.met-mcp-worker.workers.dev/mcp"}}}Cursor で開く{"servers":{"trondbjoroy-norway-location-transport":{"type":"http","url":"https://norway-location-transport-mcp.met-mcp-worker.workers.dev/mcp"}}}VS Code で開く{"mcpServers":{"trondbjoroy-norway-location-transport":{"type":"http","url":"https://norway-location-transport-mcp.met-mcp-worker.workers.dev/mcp"}}}{"mcpServers":{"trondbjoroy-norway-location-transport":{"serverUrl":"https://norway-location-transport-mcp.met-mcp-worker.workers.dev/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
21| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| query | string | いいえ | 自由入力の住所(例:'Karl Johans gate 1, Oslo')。`*` ワイルドカードに対応しています。 |
| number | integer | いいえ | 番地(nummer) |
| street | string | いいえ | 通り名(adressenavn)。`*` ワイルドカードに対応しています。 |
| max_results | integer | いいえ | 返す一致項目の最大数 |
| postal_code | string | いいえ | 郵便番号(postnummer、例:'0155') |
| municipality_number | string | いいえ | 4 桁の自治体コード(kommunenummer、例:オスロは '0301') |
詳細
norway-location-transport-mcp
無料の Entur API と Kartverket / Geonorge API を通じて、AI エージェントがノルウェーの公共交通機関および地理空間データに構造化された形でアクセスできるようにする MCP サーバーです。
2つのデータソースは相互に補完します。経路検索にはジオコーディングが必要で、高度を調べるには住所の解決が必要です。また、行政区の検索では座標を場所と結び付けます。このサーバーは、「ここからベルゲンへはどう行けばよいですか?」「このハイキングコースの高度はどうなっていますか?」「この住所はどの kommune にありますか?」「近くに電動キックボードはありますか?」といった、実用的な地域に関する質問に答えます。
どちらのデータソースも無料で、追加料金のプランや API キーはありません。Entur では、識別情報を含む ET-Client-Name ヘッダーのみが必要です(下記参照)。Kartverket では何も必要ありません。
ツール
場所と地理データ(Kartverket)
search_address(query?, street?, number?, postal_code?, municipality_number?, max_results)— 自由入力テキストまたはフィールドを使って公式住所を検索します。*ワイルドカードに対応しています。座標と地籍番号を返します。find_addresses_near(latitude, longitude, radius_m, max_results)— 指定した地点から一定の半径内にあるすべての住所を、距離とともに返します。validate_address(address)— 自由入力された住所を検証して正規化します(あいまい検索)。valid、正規化された一致結果、候補を返します。search_place_names(query, max_results)— 公式地名を検索します。地物の種類(Fjell、Innsjø、…)、自治体、県、座標を返します。*に対応しています。find_place_names_near(latitude, longitude, radius_m, max_results)— 指定した地点に近い、名称のある地物を距離とともに返します。get_elevation(latitude, longitude)— 全国標高モデル(DTM)から地形の標高を取得します。get_elevation_profile(path, samples)— 経路に沿って標高をサンプリングします。標高プロファイルに加え、総距離、累積上昇量、累積下降量を返します。transform_coordinates(x, y, from_epsg, to_epsg)— 測地系間で変換します(例:WGS84 4326 → UTM33 25833)。lookup_admin_unit(latitude?, longitude?, address?)— 座標または住所が属する kommune と fylke を、公式コードとともに返します。lookup_property(address?, latitude?, longitude?, max_results)— オープン住所レジスターを通じて地籍(matrikkel)識別子(kommune / gnr / bnr / fnr)を取得します。
公共交通機関(Entur)
resolve_stop_place(query, max_results)— 場所または住所を Entur Stop Place ID に解決します。find_stops_near(latitude, longitude, radius_m, max_results)— 座標を逆ジオコーディングし、最寄りの停留所を検索します。plan_trip(from_place?/from_latitude/from_longitude, to_place?/to_latitude/to_longitude, date_time?, arrive_by?, transport_modes?, walk_speed?, num_trip_patterns)— 2地点間の経路を検索します。交通手段と歩行速度で絞り込めます。区間、交通手段、所要時間、リアルタイム時刻を含む経路パターンを返します。get_departures(stop_place_id, count)— 停留所からの次の出発便を、リアルタイムの遅延、運休、乗り場情報とともに返します。get_realtime_status(stop_place_id? | line_id?)— リアルタイム運行状況を返します。停留所の場合は定時・遅延・運休の便数、路線の場合は運行中の車両数と遅延状況を示します。get_stop_accessibility(stop_place_id)— 各乗降場の車椅子対応状況と概要を返します。(下記のアクセシビリティに関する注記を参照してください。)list_quays(stop_place_id)— 停留所のすべての乗降場(プラットフォーム)を、コードと座標とともに返します。get_fare_zones(stop_place_id)— 停留所が属する運賃(料金)ゾーンを返します。find_shared_vehicles(latitude, longitude, range_m, form_factors?, count)— すべての事業者を対象に、自由に利用できるシェア車両(自転車、電動キックボード、自動車、モペッド)を検索します。find_docking_stations(latitude, longitude, range_m, count)— 利用可能な車両数と空きドック数を含む、ドッキングステーションを検索します。get_vehicle_positions(codespace_id?, line_id?, max_results)— 方位、速度、遅延を含む車両のリアルタイム位置を返します。
ツール定義は src/kartverket.ts と src/entur.ts にあり、src/tools.ts で統合されています。stdio と HTTP の両エントリーポイントから共有されます。
セットアップ
npm install
npm run build
npm test
npm test は stdio 経由でサーバーを起動し、稼働中の API に対してすべてのツールを呼び出します。
実行方法
stdio 経由(ほとんどの MCP クライアント向け):
node dist/index.js
Streamable HTTP 経由(HTTP ベースのクライアント向け):
node dist/http.js
# listens on http://localhost:3000/mcp (override with PORT)
Entur のクライアント名要件
Entur の利用規約では、すべてのリクエストに識別用の ET-Client-Name ヘッダーを付ける必要があります。形式は company-app のようになります。このサーバーは、すべての Entur リクエストにこのヘッダーを付けます。ET_CLIENT_NAME 環境変数で任意の値を設定できます:
ET_CLIENT_NAME="acme-travelbot" node dist/index.js
未設定の場合は、パッケージのデフォルト値が使用されます。Kartverket ではヘッダーもキーも必要ありません。
Claude Code での使用
claude mcp add norway -- node C:\Users\trond\norway-location-transport-mcp\dist\index.js
たとえば、「Oslo S から Bergen までの移動を計画して、Galdhøpiggen の標高を教えてください」と尋ねてみましょう。
リモート版(Cloudflare Workers)
worker/ にはリモートデプロイ用の構成が含まれています。MCP Streamable HTTP 経由で同じ 21 個のツールを提供するため、サーバーを claude.ai コネクターとして追加できます。ツール定義はローカルサーバーと共有されています(src/tools.ts は z をパラメーターとして受け取るため、ローカルの MCP SDK v1/zod 3 と worker の SDK v2/zod 4 の両方で動作します)。
cd worker
npm install
npm run dev # local test at http://127.0.0.1:8787/mcp
node test-http.mjs
デプロイします(Cloudflare アカウントと wrangler login が必要です):
cd worker
npm run deploy
Entur のクライアント名を worker の変数として設定します:
cd worker
npx wrangler secret put ET_CLIENT_NAME
デプロイ後、workers.dev の URL を指定した remotes エントリーを server.json に追加します。
呼び出し例
Oslo S からの次の出発便を取得します:
{ "name": "get_departures", "arguments": { "stop_place_id": "NSR:StopPlace:59872", "count": 5 } }
歩行速度を指定して、バス/トラムのみを使う移動を計画します:
{ "name": "plan_trip", "arguments": {
"from_place": "NSR:StopPlace:59872",
"to_latitude": 59.95, "to_longitude": 10.78,
"transport_modes": ["bus", "tram"], "walk_speed": 1.4
} }
短い経路の標高プロファイル:
{ "name": "get_elevation_profile", "arguments": {
"path": [{ "latitude": 61.636, "longitude": 8.312 }, { "latitude": 61.64, "longitude": 8.32 }],
"samples": 20
} }
WGS84 座標を UTM33 に変換します:
{ "name": "transform_coordinates", "arguments": { "x": 10.7461, "y": 59.9127, "from_epsg": 4326, "to_epsg": 25833 } }
注意事項と制限
- 座標は、すべて WGS84 の緯度/経度です。数値が一致するよう、Kartverket の API には EPSG 4326 を指定して問い合わせます。ノルウェーでは EUREF89(4258)との差は 1 メートルを大きく下回ります。
- アクセシビリティ:Entur の無料の JourneyPlanner では、乗降場ごとに車椅子での利用可否を確認できます。エレベーターや点字ブロックなどの詳細な設備情報は、認証が必要な Entur の Stop Register API でのみ確認できるため、ここでは利用できません。このツールはその旨を伝えます。
- いずれかのデータソースによるレート制限は、エージェントに再試行を促す明確なエラーとして返されます。
- 出典表示:Kartverket/Geonorge および Entur のデータは NLOD に基づいています。データを表示する際は、出典を明記してください。
仕組み
src/index.tsは stdio 経由で MCP(stdin/stdout 上の JSON-RPC)を処理します。src/http.tsはセッション管理を行いながら、Streamable HTTP 経由で MCP を処理します。どちらもsrc/server.tsを通じて同じサーバーを構築します。- 各ツールは Zod 入力スキーマを宣言し、LLM が直接読み取る説明を記載しています。ツールを呼び出すための外部ドキュメントは必要ありません。
- 結果は、上流 API の生のペイロードではなく、エージェントに必要な情報に絞った JSON テキストです。
console.logで stdout に書き込まないでください。stdio プロトコルが壊れます。ログは stderr に出力してください。
ライセンス
MIT © Trond Bjørøy。データ © Kartverket および Entur、NLOD に基づきます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。