norway-location-transport-mcp
norway-location-transport-mcp
AIエージェントにノルウェーの公共交通および地理空間データへの構造化アクセスを提供するMCPサーバーです。無料のEnturおよびKartverket / Geonorge APIを利用します。
2つのデータソースは相互補完的です。旅程計画にはジオコーディングが必要であり、標高には住所解決が必要であり、行政区域の検索は座標を場所に結び付けます。1つのサーバーで、実用的なローカルな質問に答えます。「ここからベルゲンまでの行き方は?」「このハイキングの標高は?」「この住所はどの自治体にある?」「近くに電動スクーターはある?」
どちらのデータソースも無料で、有料プランや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?)— 座標または住所がどの自治体・県に該当するかを公式コード付きで返します。lookup_property(address?, latitude?, longitude?, max_results)— 公開住所レジスタを介した地番(matrikkel)識別子(kommune / gnr / bnr / fnr)。
公共交通(Entur)
resolve_stop_place(query, max_results)— 場所または住所をEnturの停留所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)— 地点間の旅程を計画します。交通手段と徒歩速度でフィルタリング。区間、交通手段、所要時間、リアルタイム時刻を含む旅程パターンを返します。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)— 停留所が属する運賃(tariff)ゾーン。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 testnpm testはstdioでサーバーを起動し、すべてのツールをライブAPIに対して呼び出します。
実行
stdio経由(ほとんどのMCPクライアント向け):
node dist/index.jsStreamable HTTP経由(HTTPベースのクライアント向け):
node dist/http.js
# listens on http://localhost:3000/mcp (override with PORT)Enturのクライアント名要件
Enturの利用規約では、すべてのリクエストにcompany-app形式の自己識別用ET-Client-Nameヘッダーを含める必要があります。このサーバーはすべての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その後、例えば次のように尋ねます:「オスロSからベルゲンまでの旅程を計画して、ガルフピッゲンの標高を教えて。」
リモート版(Cloudflare Workers)
worker/にはリモートデプロイがあります。同じ21のツールをMCP Streamable HTTPで提供するため、claude.aiコネクタとしてサーバーを追加できます。ローカルサーバーとツール定義を共有します(src/tools.tsはzをパラメータとして受け取るため、ローカルのMCP SDK v1 / zod 3とワーカーの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 deployEnturクライアント名をワーカー変数として設定:
cd worker
npx wrangler secret put ET_CLIENT_NAMEデプロイ後、server.jsonにremotesエントリをworkers.dev URLで追加します。
呼び出し例
オスロ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を介して同じサーバーを構築します。各ツールは、LLMが直接読む説明付きのZod入力スキーマを宣言します。ツールを呼び出すために外部ドキュメントは不要です。
結果は、エージェントが必要とするものに切り詰められたJSONテキストであり、生のアップストリームペイロードではありません。
console.logでstdoutに書き込まないでください。stdioプロトコルを破損します。stderrにログを出力してください。
ライセンス
MIT © Trond Bjørøy。データは© KartverketおよびEntur、NLODの下にあります。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Entur MCP — Norway public transport, nationwide, all modes (developer.entur.org)
Real-world data for agents: air quality, geocoding, quakes, holidays, web search
US weather, alerts, earthquakes and elevation for AI agents, from NWS/NOAA and USGS. No API keys.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/trondbjoroy/norway-location-transport-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server