Skip to main content
Glama
trondbjoroy

norway-location-transport-mcp

by trondbjoroy

norway-location-transport-mcp

Ein MCP-Server, der KI-Agenten strukturierten Zugriff auf norwegische öffentliche Verkehrs- und Geodaten bietet, über die kostenlosen Entur- und Kartverket / Geonorge-APIs.

Die beiden Quellen ergänzen sich: Reiseplanung benötigt Geokodierung, Höhenangaben benötigen Adressauflösung, und Verwaltungssuchen verbinden Koordinaten mit Orten. Ein Server beantwortet praktische lokale Fragen – „Wie komme ich von hier nach Bergen?“, „Wie hoch ist die Höhe entlang dieser Wanderung?“, „In welcher Kommune liegt diese Adresse?“, „Gibt es E-Scooter in der Nähe?“.

Beide Datenquellen sind kostenlos, ohne kostenpflichtige Stufen und ohne API-Schlüssel. Entur erfordert nur einen selbstidentifizierenden ET-Client-Name-Header (siehe unten); Kartverket erfordert nichts.

Tools

Standort & Geodaten (Kartverket)

  • search_address(query?, street?, number?, postal_code?, municipality_number?, max_results) — durchsucht offizielle Adressen nach Freitext oder Feldern; unterstützt den *-Platzhalter. Gibt Koordinaten und Katasternummern zurück.

  • find_addresses_near(latitude, longitude, radius_m, max_results) — alle Adressen innerhalb eines Radius um einen Punkt, mit Entfernungen.

  • validate_address(address) — validiert und normalisiert eine Freitext-Adresse (fuzzy). Gibt valid, die normalisierte Übereinstimmung und Alternativen zurück.

  • search_place_names(query, max_results) — durchsucht offizielle Ortsnamen; gibt Feature-Typ (Fjell, Innsjø, …), Kommune, Fylke und Koordinaten zurück. Unterstützt *.

  • find_place_names_near(latitude, longitude, radius_m, max_results) — nächste benannte Features zu einem Punkt, mit Entfernungen.

  • get_elevation(latitude, longitude) — Geländehöhe aus dem nationalen Höhenmodell (DTM).

  • get_elevation_profile(path, samples) — Höhenprofil entlang eines Pfads; gibt das Profil plus Gesamtdistanz, Aufstieg und Abstieg zurück.

  • transform_coordinates(x, y, from_epsg, to_epsg) — konvertiert zwischen Referenzsystemen (z. B. WGS84 4326 → UTM33 25833).

  • lookup_admin_unit(latitude?, longitude?, address?) — in welcher Kommune und welchem Fylke eine Koordinate oder Adresse liegt, mit offiziellen Codes.

  • lookup_property(address?, latitude?, longitude?, max_results) — Kataster- (matrikkel) Identifikatoren (kommune / gnr / bnr / fnr) über das offene Adressregister.

Öffentlicher Verkehr (Entur)

  • resolve_stop_place(query, max_results) — löst einen Ort oder eine Adresse in Entur-Stopp-Orts-IDs auf.

  • find_stops_near(latitude, longitude, radius_m, max_results) — Reverse-Geokodierung einer Koordinate zu den nächsten Stopp-Orten.

  • 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) — plant eine Punkt-zu-Punkt-Reise; filtert nach Verkehrsmittel und Gehgeschwindigkeit. Gibt Reisemuster mit Etappen, Verkehrsmitteln, Dauern und Echtzeitzeiten zurück.

  • get_departures(stop_place_id, count) — nächste Abfahrten von einem Stopp, mit Echtzeitverspätungen, Stornierungen und Bahnsteig.

  • get_realtime_status(stop_place_id? | line_id?) — Echtzeit-Status: für einen Stopp, pünktlich/verspätet/storniert Zählungen; für eine Linie, aktive Fahrzeuge und Verspätungen.

  • get_stop_accessibility(stop_place_id) — Rollstuhlzugang pro Bahnsteig und eine Zusammenfassung. (Siehe Hinweis zur Barrierefreiheit unten.)

  • list_quays(stop_place_id) — alle Bahnsteige (Plattformen) an einem Stopp, mit Codes und Koordinaten.

  • get_fare_zones(stop_place_id) — die Tarifzone(n), zu denen ein Stopp gehört.

  • find_shared_vehicles(latitude, longitude, range_m, form_factors?, count) — frei schwebende geteilte Fahrzeuge (Fahrräder, E-Scooter, Autos, Mopeds) über alle Betreiber.

  • find_docking_stations(latitude, longitude, range_m, count) — Dockingstationen mit verfügbaren Fahrzeugen und freien Docks.

  • get_vehicle_positions(codespace_id?, line_id?, max_results) — Live-Fahrzeugpositionen mit Peilung, Geschwindigkeit und Verspätung.

Tool-Definitionen befinden sich in src/kartverket.ts und src/entur.ts, kombiniert in src/tools.ts und werden von beiden Einstiegspunkten (stdio und HTTP) gemeinsam genutzt.

Setup

npm install
npm run build
npm test

npm test startet den Server über stdio und ruft jedes Tool gegen die Live-APIs auf.

Ausführen

Über stdio (für die meisten MCP-Clients):

node dist/index.js

Über Streamable HTTP (für HTTP-basierte Clients):

node dist/http.js
# listens on http://localhost:3000/mcp  (override with PORT)

Die Entur-Client-Name-Anforderung

Enturs Bedingungen verlangen, dass jede Anfrage einen identifizierenden ET-Client-Name-Header trägt, formatiert wie company-app. Dieser Server sendet bei jeder Entur-Anfrage einen solchen. Setzen Sie Ihren eigenen Wert mit der Umgebungsvariable ET_CLIENT_NAME:

ET_CLIENT_NAME="acme-travelbot" node dist/index.js

Wenn nicht gesetzt, wird ein Paketstandard verwendet. Kartverket benötigt keinen Header oder Schlüssel.

Verwendung mit Claude Code

claude mcp add norway -- node C:\Users\trond\norway-location-transport-mcp\dist\index.js

Fragen Sie dann zum Beispiel: „Planen Sie eine Reise von Oslo S nach Bergen und nennen Sie mir die Höhe des Galdhøpiggen.“

Remote-Version (Cloudflare Workers)

worker/ enthält eine Remote-Bereitstellung: dieselben 21 Tools, bereitgestellt über MCP Streamable HTTP, sodass der Server als claude.ai-Connector hinzugefügt werden kann. Er teilt die Tool-Definitionen mit dem lokalen Server (src/tools.ts nimmt z als Parameter, funktioniert also sowohl mit dem lokalen MCP SDK v1 / zod 3 als auch mit dem SDK v2 / zod 4 des Workers).

cd worker
npm install
npm run dev     # local test at http://127.0.0.1:8787/mcp
node test-http.mjs

Bereitstellen (erfordert ein Cloudflare-Konto und wrangler login):

cd worker
npm run deploy

Setzen Sie Ihren Entur-Client-Namen als Worker-Variable:

cd worker
npx wrangler secret put ET_CLIENT_NAME

Nach der Bereitstellung fügen Sie den remotes-Eintrag mit Ihrer workers.dev-URL zu server.json hinzu.

Beispielaufrufe

Nächste Abfahrten von Oslo S abrufen:

{ "name": "get_departures", "arguments": { "stop_place_id": "NSR:StopPlace:59872", "count": 5 } }

Eine reine Bus-/Straßenbahn-Reise mit festgelegter Gehgeschwindigkeit planen:

{ "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
} }

Höhenprofil entlang eines kurzen Pfads:

{ "name": "get_elevation_profile", "arguments": {
  "path": [{ "latitude": 61.636, "longitude": 8.312 }, { "latitude": 61.64, "longitude": 8.32 }],
  "samples": 20
} }

Eine WGS84-Koordinate in UTM33 konvertieren:

{ "name": "transform_coordinates", "arguments": { "x": 10.7461, "y": 59.9127, "from_epsg": 4326, "to_epsg": 25833 } }

Hinweise und Grenzen

  • Koordinaten sind überall WGS84-Breitengrad/Längengrad. Die Kartverket-APIs werden mit EPSG 4326 abgefragt, damit die Zahlen übereinstimmen; EUREF89 (4258) weicht in Norwegen um deutlich weniger als einen Meter ab.

  • Barrierefreiheit: Enturs kostenloser JourneyPlanner bietet Rollstuhlzugang pro Bahnsteig. Detailliertere Ausstattungsinformationen (Aufzüge, taktile Leitsysteme) sind nur in der authentifizierten Stopp-Register-API von Entur verfügbar und hier nicht enthalten; das Tool weist darauf hin.

  • Ratenbegrenzung von einer der beiden Quellen wird als klarer Fehler angezeigt, der den Agenten auffordert, es erneut zu versuchen.

  • Namensnennung: Daten von Kartverket / Geonorge und Entur stehen unter NLOD. Nennen Sie die Quellen, wenn Sie die Daten anzeigen.

So funktioniert es

  • src/index.ts spricht MCP über stdio (JSON-RPC auf stdin/stdout). src/http.ts spricht MCP über Streamable HTTP mit Sitzungsverwaltung. Beide erstellen denselben Server über src/server.ts.

  • Jedes Tool deklariert ein Zod-Eingabeschema mit Beschreibungen, die das LLM direkt liest – keine externen Dokumente erforderlich, um ein Tool aufzurufen.

  • Ergebnisse sind JSON-Text, der auf das reduziert ist, was ein Agent benötigt, nicht die rohen Upstream-Payloads.

  • Schreiben Sie niemals mit console.log auf stdout; das beschädigt das stdio-Protokoll. Loggen Sie auf stderr.

Lizenz

MIT © Trond Bjørøy. Daten © Kartverket und Entur, unter NLOD.

-
license - not tested
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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.

View all MCP Connectors

Latest Blog Posts

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