protogrid

Search / eu.projektionisten/mobility

MobilityMCP

R2· OAuth, once

Public transport in Germany (ÖPNV, Fahrplan): journeys, departures, disruptions, nearby sharing.

v0.3.1 · active · website · descriptor JSON · versions

An agent can connect after a one-time OAuth consent by a human.Remote endpoint behind OAuth 2. Tokens stay with the agent; the registry only exposes the authorization metadata.
Quality75good
Trust83of 100
Uptime, 30 days100%
Latency p50733 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "mobility": {
      "type": "http",
      "url": "https://ai.projektionisten.eu/mmcp"
    }
  }
}
claude mcp add --transport http mobility https://ai.projektionisten.eu/mmcp
[mcp_servers.mobility]
url = "https://ai.projektionisten.eu/mmcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mobility": {
      "type": "remote",
      "url": "https://ai.projektionisten.eu/mmcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "mobility": {
      "type": "http",
      "url": "https://ai.projektionisten.eu/mmcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=mobility&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vYWkucHJvamVrdGlvbmlzdGVuLmV1L21tY3AifQ%3D%3D"
}
{
  "servers": {
    "mobility": {
      "type": "http",
      "url": "https://ai.projektionisten.eu/mmcp"
    }
  }
}
{
  "mcpServers": {
    "mobility": {
      "httpUrl": "https://ai.projektionisten.eu/mmcp"
    }
  }
}
extensions:
  "mobility":
    enabled: true
    name: "mobility"
    type: streamable_http
    uri: "https://ai.projektionisten.eu/mmcp"
    timeout: 300

Quality 75 / 100good

protocoln/a · weight 25
  • n/a
    protocol.modern, protocol.stateless, protocol.transport, protocol.list_ttlno remote answered a protocol handshake (not probed yet, unreachable, or local-only)
authorization83 · weight 15
  • pass
    auth.prmProtected Resource Metadata (RFC 9728) published
  • pass
    auth.as_metadataauthorization server metadata reachable
  • warn
    auth.cimdonly Dynamic Client Registration, deprecated in 2026-07-28 in favour of CIMD
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene71 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • warn
    tools.description_length13 tools have descriptions over 1,024 characters, which crowds the context
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations33 of 33 tools declare readOnlyHint or destructiveHint
  • warn
    tools.directory_hints1 of 33 tools declare all four hints; missing: get_usage_guide (idempotentHint); search_place (idempotentHint); connections (idempotentHint); …
  • fail
    tools.token_costabout 27,594 tokens to load every tool, a large share of an agent's context
  • pass
    tools.api_dumptools are not a one-to-one API dump
stabilityn/a · weight 15
  • n/a
    stability.changes, stability.rug_pulltool history recorded for 0 of the 7 days needed
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

33 tools, about 27,594 tokens to load them all · tool set 3d90c62649ae · tools last changed 2026-10-20 · checked 2026-10-20 19:42 UTC

Tool changes

  • widget_probe_g4added

    **Sprosse g4 der Form-Leiter** — Sprosse g0, und als einziger Unterschied nennen die beiden Zeiger verschiedene Adressen, wie die Zeiger dieses Endpunkts es heute tun. Wird g0 gezeichnet und g4 nicht, folgt der Wirt einem Zeiger, dessen Adresse er nicht einhängen kann. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.

  • widget_probe_g3added

    **Sprosse g3 der Form-Leiter** — Sprosse g0, und als einziger Unterschied sind die beiden Rahmen-Richtlinien leer, wie sie es an den Ansichten dieses Endpunkts sind, die nichts nachladen. Wird g0 gezeichnet und g3 nicht, liest der Wirt eine leere Liste nicht als „nichts nötig". Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.

  • widget_probe_g2added

    **Sprosse g2 der Form-Leiter** — Sprosse g0, und als einziger Unterschied steht ein zweiter Eintrag derselben Ansicht in der Liste, im zweiten Inhaltstyp, wie dieser Endpunkt seine Ansichten listet. Wird g0 gezeichnet und g2 nicht, stört den Wirt der zweite Eintrag selbst. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.

  • widget_probe_g1added

    **Sprosse g1 der Form-Leiter** — Sprosse g0, und als einziger Unterschied endet die Adresse der Ansicht nicht auf `.html`, so wie die Adressen dieses Endpunkts es nicht tun. Wird g0 gezeichnet und g1 nicht, war die Endung die Ursache. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.

  • widget_probe_g0added

    **Sprosse g0 der Form-Leiter, die Kontrolle** — die Ansicht in der Form eines Endpunkts dieses Hauses, der bei einem Wirt mit Ansichten nachweislich zeichnet: ein einziger Eintrag im Inhaltstyp der Anwendungserweiterung, eine Adresse mit Datei-Endung, beide Zeiger auf dieselbe Adresse, eine gefüllte Rahmen-Richtlinie mit dem eigenen Host, keine Bildschirm-Beschreibung daneben. Wird schon sie nicht gezeichnet, liegt der Unterschied außerhalb von allem, was verglichen wurde. Diagnose-Werkzeug des Entwicklungsstands: die Sprossen g0 bis g4 der Reihe nach aufrufen; die erste, die NICHT gezeichnet wird, benennt die Eigenschaft, auf die es ankam. Die Sprosse trägt keine Fahrplan-Daten.

  • widget_probe_r3added

    **Sprosse r3 der Anmelde-Leiter** — die Anmeldung, unter der zuletzt nachweislich gezeichnet wurde: ein einziger Eintrag, im gezeichneten Inhaltstyp, und beide Zeiger darauf. Zeichnet r3 als einzige, stört den Wirt der zweite Eintrag selbst — und nicht sein Name und nicht der Zeiger. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.

  • widget_probe_r2added

    **Sprosse r2 der Anmelde-Leiter** — Sprosse r0, und als einziger Unterschied trägt jeder der beiden Einträge einen eigenen Namen. Zeichnet r2 und r0 nicht, hat der Wirt seine Ressourcen-Liste über den Namen entdoppelt und dabei einen der beiden Einträge verloren. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.

  • widget_probe_r1added

    **Sprosse r1 der Anmelde-Leiter** — Sprosse r0, und als einziger Unterschied zeigt auch der Standard-Zeiger auf die Adresse, die im gezeichneten Inhaltstyp ausgeliefert wird. Zeichnet r1 und r0 nicht, war der Zeiger die Ursache. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.

  • widget_probe_r0added

    **Sprosse r0 der Anmelde-Leiter, die Kontrolle** — dieselbe Ansicht wie auf allen Sprossen dieser Leiter, angemeldet wie zu dem Zeitpunkt, an dem kein Wirt mehr gezeichnet hat: der Standard-Zeiger auf die Erweiterungs-Adresse, der flache Zeiger auf die gezeichnete Adresse, beide Einträge gelistet, beide unter demselben Namen. Wird sie gezeichnet, liegt es an keiner der drei Eigenschaften, die diese Leiter durchspielt. Diagnose-Werkzeug des Entwicklungsstands: die Sprossen r0 bis r3 der Reihe nach aufrufen; die erste gezeichnete benennt die Eigenschaft, auf die es ankam. Die Sprosse trägt keine Fahrplan-Daten.

  • widget_probe_v4added

    **Sprosse 4 der Mount-Leiter, die Kontrolle** — die bestehende Abfahrtstafel dieses Endpunkts, unverändert, aber ohne Daten und darum als leere Tafel. Sie ist die Ansicht, um die es geht: was sie von Sprosse 3 trennt, ist die Anwendung selbst, nicht mehr die Bauart darunter. **Ruft keinen Fahrplan ab und zeigt keine Abfahrten** — wer Abfahrten braucht, nimmt `show_departures`. Diagnose-Werkzeug des Entwicklungsstands.

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 83 / 100

no-repository
provenance55
liveness100
freshness100
hygiene80

+dns-namespace +website +reachable +uptime-100% +updated-27d-ago -no-repository

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://ai.projektionisten.eu/mmcp streamable-httpoauth2 AS: https://ai.projektionisten.eu/auth/realms/mobilitymcpyes100%733 ms–2026-10-20

Tools (33)

buy_ticketKauft EIN Ticket im angebundenen Ticketshop. Der Kauf ist verbindlich und wird auf Rechnung des angebundenen Kontos ausgeführt — frag den Nutzer vorher mit Produkt UND Preis, und kauf erst auf seine Zusage. **Pflicht** sind `offer_token` (der Beleg aus der Preisauskunft `ticket_offers` mit `product`), `product` (aus deren Katalog) und `payment_method` (Name oder Id eines Zahlungsmittels aus derselben Preisauskunft). Optional `area`, `from_zone`, `to_zone`, `passenger`, `valid_from` — dieselben Angaben wie bei der Preisauskunft — sowie `format`. Vor dem Kauf wird der Beleg geprüft: Echtheit, Alter, Übereinstimmung dieser Angaben und der jetzt erneut beim Ticketshop erfragte Preis. Weicht eines ab, wird OHNE Kauf abgelehnt und gesagt, was — dann ruf `ticket_offers` erneut auf und hol die Zusage des Nutzers zum neuen Preis. Was das Konto danach hält, wird aus seiner Ticketliste zurückgelesen. **Anleitung**: `get_usage_guide` mit `tool='buy_ticket'` — die Schritte eines Kaufs und was eine abgelehnte Antwort bedeutet. **Anti-Fab**: Was gekauft wurde, steht in `outcome`, `ticket` und `offer` dieser Antwort — nenne Ticket, Preis und Gültigkeit nur so, wie sie dort stehen.
connectionsread-onlyPlant ÖPNV-Verbindungen von A nach B in Deutschland, Österreich, der Schweiz und Südtirol (Echtzeit in Deutschland, der Schweiz und Südtirols Bussen; sonst Fahrplan), Fernrouten eingeschlossen — **als Daten, für Ergebnisse, die du weiterverarbeitest**. Steht `show_connections` in deinem Werkzeug-Satz, ist das der Vordereingang für die Frage eines Menschen. Für „wie komme ich von X nach Y" kommt die Auskunft aus diesen Werkzeugen. **Pflicht sind BEIDE Endpunkte**: `origin_id` UND `destination_id` aus einer Ortsauflösung, mit `origin_type`/`destination_type` — ODER `origin_lat`+`origin_lon`+`destination_lat`+`destination_lon`; ein NAME in einem Id-Feld ist ein Argument-Fehler. **Optional**: `time`, `is_arrival_time`; `via_id` bzw. `via_lat`+`via_lon` mit `via_type`, oder bis zu vier `vias` (`through`/`stopover`); `not_via`, `no_change_at`; je Ende `access_modes`/`egress_modes` (`only`/`prefer`); `cancelled` (`include`/`mark`); die hart einschränkenden Filter `modes`, `only_lines`/`exclude_lines`, `submodes_allow`/`submodes_deny`, `max_transfers`, `max_walk_minutes`/`max_walk_meters`, `max_walk_from_origin`/`max_walk_to_destination` (500/1000/2000/5000 m), `walk_speed`, `accessibility_profile` (dazu `accessibility_unknown`: `refuse`/`admit`), `include_rental_bike`, `bike_carriage` (`true`/`allow_unknown`), `prefer_flat`, `mobility_profile`, `taxi_pickup` (`door`/`rank`); `verbosity`, `limit`, `render_payload`. **Höhenmeter**: nur Fuß-/Rad-Abschnitte tragen `ascentInMeters`/`descentInMeters`. **Durchbindung**: `staySeated: true` an einem Abschnitt heißt, der Fahrgast bleibt aus dem vorigen sitzen — kein Umstieg, also auch keinen zählen. Fehlt das Feld, ist nichts gesagt; nie selbst herleiten. **Flug**: `mot.type` `air`, Linie = Flugnummer, Halte = Flughäfen; ohne Flüge `submodes_deny: ['flug']`. **Rad-Tempo**: Bei einer Radfahrt setzt `cycling_profile` das Tempo des Fahrers und damit die gemeldete Dauer — `family` bei kleinen Kindern, `ebike` bei E-Bike/Pedelec; sonst weglassen (= `normal`). **Fahrradmitnahme**: Geht es um ein Rad, sprich je Abschnitt `bikeCarriageConditions` aus (Bedingungen des Verbunds zur Abfahrtszeit); `bikesAllowed`/`bikeCarriageNote` sind nur die Grundregel, `bikeCarriageCoverage` die Wissensgrenze. **Unbekannt**: `unknown` in `additionalInfos.accessibility` bzw. `bikeCarriage` eines Abschnitts ist weder barrierefrei noch Rad erlaubt. **Genannter Wunsch**: Nennt jemand, was ihn stört ("nicht in der Innenstadt parken"), hol die Option, die das löst, als EIGENEN Aufruf (`mobility_profile`) und empfiehl sie aus ihrem Nutzen — mit dem Nachteil, den die Antwort ihr gibt. **Nicht umgesetzt**: was `not_considered` nennt, blieb unberücksichtigt — nie als erfüllt ausgeben; `broken_journeys` fahren nicht. **Namen** in `lang` (Vorgabe `'de'`), der Name vor Ort daneben in `localName` — „Meran (Merano)". **Anleitung**: `get_usage_guide` mit `tool='connections'` — lies sie, bevor du filterst. **Anti-Fab**: Linien, Zeiten, Halte, Anlagen und Gleise ausschließlich aus dem Output dieses Aufrufs.
departuresread-onlyAbfahrten oder Ankünfte für EINE Haltestelle — **als Daten, für Ergebnisse, die du weiterverarbeitest**. Steht `show_departures` in deinem Werkzeug-Satz, ist das der Vordereingang für die Frage eines Menschen. Für „wann fährt von X", „letzte Stadtbahn von X" kommt die Auskunft aus diesen Werkzeugen; für eine A→B-Frage aus `connections`. **Pflicht** ist eine konkrete Stop-`id` aus einer vorhergehenden Ortsauflösung (z.B. `'de:03241:57'`); ein Haltestellen-NAME in `id` ist ein Argument-Fehler, keine leere Tafel. **Optional**: `time` und `is_arrival_time`; `modes` (Flüge `['air']`, ohne sie `['transit']`); `direction` (Halt-Name, in dessen Richtung gefahren wird) bzw. für eine weiche Angabe `target_bearing` mit `bearing_tolerance`; `lines` (Linie oder Linie@Richtung, wie die Tafel sie an `mot.line.direction.ids` nennt); `arrival_departure`; ein Fenster `time_range_seconds` mit `last_of_window`; und für den Umfang `verbosity`, `limit` sowie `render_payload`. Für „letzte Bahn heute", „erste S-Bahn morgen" statt der Tafel `first_last`: je Linie und Richtung erste und letzte Fahrt des Tages (`time` wählt den Tag). Für „hat X einen Aufzug zur U-Bahn?" statt der Tafel `facilities`: Aufzüge, Rolltreppen, Rampen des Halts. `modes`, `lines` und `direction` schränken hart ein. **Eine leere Tafel ist keine Auskunft**: blieb sie mit `['tram']` („Straßenbahn") leer, mit `['tram','subway']` nachfassen — sonst ohne den Filter. **Namen** in `lang` (Vorgabe `'de'`), der Name vor Ort daneben in `localName` — „Meran (Merano)". **Anleitung**: `get_usage_guide` mit `tool='departures'` — erste und letzte Fahrt, Aufzüge, die Echtzeit-, Ausfall- und Zitier-Felder. **Anti-Fab**: Linien, Richtungen, Zeiten, Gleise, Verspätung, Ausfall und Aufzüge ausschließlich aus dem Output dieses Aufrufs.
disruptionsread-onlyAktuelle Störungen, Baustellen und Liniensperrungen im ÖPNV. Für „gibt es Störungen", „Ausfälle in X" ist dieses Werkzeug die Auskunft. **Datenlage — wichtig**: Störungsmeldungen liegen derzeit für Niedersachsen, Bremen, Hamburg und die Schweiz vor; nur dort ist eine leere Antwort eine Entwarnung. (Verbindungen und Abfahrten sind davon nicht betroffen — die gelten für Deutschland, Österreich, die Schweiz und Südtirol.) Eine leere Antwort ist deshalb nur dann eine Entwarnung, wenn das Feld `coverage` sie als solche ausweist; außerhalb der abgedeckten Gebiete heißt sie, dass du es nicht weißt. **Keine Pflicht-Args** — ohne Filter kommen die aktiven Meldungen, gekappt auf `limit`. Optional: `line` (Liniennummer/-token, z.B. `'6'`, `'U3'`) und `stop` (Haltestellen-Name) verknüpfen UND; `area` (Stadt/Gemeinde) bestimmt das `coverage` und sortiert die unverorteten Meldungen — es unterdrückt sie nicht: die kommen getrennt in `unplaced` zurück, auch ohne `area`. Nenne nur Filter, die der Nutzer wirklich nannte. **Format**: kompakter Einrück-Text (TOON), kein JSON; die Schreibweise steht in der Anleitung. **Anleitung**: `get_usage_guide` mit `tool='disruptions'` — die sieben `coverage`-Werte, die beiden Listen, die Felder einer Meldung und woran eine gekappte Antwort zu erkennen ist. **Anti-Fab**: nur zurückgegebene Meldungen nennen; eine Meldung ohne betroffene Linie und ohne betroffenen Halt ist eine allgemeine Störung und wird keiner Linie zugeschrieben, eine Meldung aus `unplaced` keinem Ort.
get_usage_guideread-onlyDie ausführliche Anleitung zu den Werkzeugen dieses Katalogs: wofür ein Werkzeug da ist, wogegen es abzugrenzen ist, was seine Argumente bewirken, was zurückkommt und was daraus zitiert werden darf. Die `description` eines Werkzeugs ist die Kurzform, dieser Text die vollständige. **Optional** `tool` — der Name genau eines Werkzeugs, dessen Abschnitt du lesen willst; weggelassen kommt die ganze Anleitung. Lies den Abschnitt eines Werkzeugs, bevor du dessen Filter setzt oder ein leeres Ergebnis als Antwort weitergibst. **Der Abruf ohne `tool` ist teuer**: er bringt die Abschnitte ALLER Werkzeuge dieses Katalogs auf einmal, ein Vielfaches eines einzelnen. Setze `tool`, sobald feststeht, um welches Werkzeug es geht; ohne Argument nur für den Überblick über den ganzen Katalog.
journey_map_imageread-only**Der Vordereingang für eine Verbindungsfrage in einem Client, der keine Ansicht zeichnet, aber Bilder zeigt** (z.B. eine Kommandozeile): plant die Fahrt wie `connections` und liefert zusätzlich EIN Kartenbild des Verlaufs — die Fahrt auf die echten Gleise und Straßen gelegt, mit der Herkunftsangabe der Kartendaten im Bild. **Zeichnet dein Client Ansichten (MCP-Apps/Widgets), nimm `show_connections`**; brauchst du die Daten zum Weiterverarbeiten, `connections`. **Pflicht sind BEIDE Endpunkte**, wie dort: `origin_id` UND `destination_id` — oder die vier Koordinaten-Felder; `render_payload` entfällt. **Optional** ist `index`: die wievielte Verbindung der Antwort gezeichnet wird, ab 0, ohne Angabe die erste. Der Antwort-Text ist der von `connections`; daneben steht das Bild und ein Satz dazu, welche Verbindung es zeigt. Der ganze Verlauf ist in EINER Farbe gezeichnet — eine Linie im Bild ist also kein Verkehrsmittel. Gibt es zu einem Bein keinen Verlauf, kommt kein Bild, und der Satz daneben sagt warum; die Fahrtdaten stehen dann unverändert im Text. **Anleitung**: `get_usage_guide` mit `tool='connections'`. **Anti-Fab**: Linien, Zeiten, Halte und Gleise ausschließlich aus dem Text dieses Aufrufs — **nie aus dem Bild abgelesen**.
line_courseread-onlyLinienverlauf: die Halte-Folge einer ÖPNV-LINIE und ihre gezeichnete Strecke für die Karte — „wo fährt die Y entlang", „welche X-Linien gibt es". Für Linien-Fragen ist dieses Werkzeug die Auskunft. **Pflicht ist EINES**: `query` — Name/Nummer, wie ein Mensch sie schreibt (`'Heide-Shuttle'`, `'HS 2'`); ODER `id` aus einer früheren Antwort = GENAU EINE Linie. Sonst frag nach. **Optional**: `area` — der Ort, in dem die Linie fährt (`'Hannover'`; Dutzende Linien heißen `'100'`), `limit` (Default 8), `render_payload`, `format`. **Die Antwort**: je Fahrtrichtung ein Verlauf mit `headsign`, den `halts` als Namen und `pathOnMap` — der Strecke im Text, auf max. ~50 m vereinfacht; volle Auflösung: `render_payload: true`. **Mehrdeutig**: meint die Frage mehr Linien als eine Antwort ganz liest, kommt statt `lines` die Liste `candidates` (Nummer, Betreiber, Id) — ungezeichnet; dann den Ort erfragen oder mit `id` nachfassen. **Grenzen**: `geometryDegraded: true` heißt Luftlinien-Kette statt Straßenverlauf, `note` sagt es. Je Richtung EIN Fahrtmuster; ist `patternsTotal` größer, fährt sie üblicherweise so. `matchedTotal` über der Zahl der Linien heißt Ausschnitt. Unbekannter Ort: `note` sagt es, nichts wurde eingegrenzt. **Nicht dafür**: A→B (`connections`), Abfahrten (`departures`), Störungen (`disruptions`). **Anleitung**: `get_usage_guide` mit `tool='line_course'`. **Anti-Fab**: Linien, Halte, Reihenfolge, Strecke nur aus diesem Aufruf; findet sich keine, sag das.
link_datetimeread-onlyLöst eine Zeit-Nennung in einen absoluten ISO-8601-Zeitpunkt auf — „morgen früh", „heute Abend um 18 Uhr", „in zwei Stunden", „um 8:30". Auch „jetzt"/„now"/„aktuell" wird aufgelöst: nutze das als kanonische Quelle für die aktuelle Zeit, statt dir selbst ein Datum auszudenken. Das Ergebnis (`candidates[].datetime_range.start`) geht direkt als `connections.time` bzw. `departures.time` weiter. Nennt der Nutzer bereits eine vollständige ISO-8601-Zeit mit Offset, ist kein Aufruf nötig. **Pflicht**: `text` — die Nennung, so wie der Nutzer sie schrieb. **Optional**: `lang` (`'de'` Default, `'en'`, `'fr'`) und `tz` (IANA-Name; ohne ihn wird die Lokalzeit als `Europe/Berlin` gelesen und als korrekter UTC-Instant zurückgegeben). **Was zurückkommt**: EIN Zeitpunkt, kein Fenster — `start` und `end` sind derselbe Instant. Eine nicht auflösbare Phrase liefert `candidates: []`; dann nachfragen, statt selbst zu rechnen. **Anleitung**: `get_usage_guide` mit `tool='link_datetime'` — insbesondere, auf welche Stunde eine vage Tageszeit fällt und was dann zu tun ist. **Anti-Fab**: Datum und Uhrzeit sind Fakten wie eine Liniennummer und stammen aus diesem Werkzeug — kein selbst-erfundenes Datum, keine eigene Datums-Arithmetik. Returns `candidates[].datetime_range:{start,end}`.
list_active_ticketsread-onlyDie Tickets, die das angebundene Ticketshop-Konto derzeit hält — Deutschlandticket und Abos ebenso wie Tages- und Einzeltickets. **Keine Pflicht-Args.** Optional `format`. **Anleitung**: `get_usage_guide` mit `tool='list_active_tickets'` — woher die Angaben kommen und was sie nicht enthalten. **Anti-Fab**: Namen, Preise und Gültigkeiten ausschließlich aus dem Output dieses Aufrufs; ein Ticket, das hier nicht steht, hält das Konto nicht.
live_vehiclesread-onlyZeigt die Fahrzeuge, die im Umkreis eines Punktes gerade unterwegs sind — je Fahrzeug die Linie und ihre Position, mit Fahrtrichtung, soweit die Quelle sie kennt. **Pflicht sind `longitude` und `latitude`** (WGS84, Längengrad zuerst) — Koordinaten aus `search_place`, `nearby`, `reverse_geocode` oder `resolve_location`, kein Ortsname. **Optional** ist `radius_km`: der Umkreis in Kilometern, ohne Angabe 2, höchstens 10. Die Antwort trägt `recordedAt` — den Zeitpunkt der Aufnahme — und `vehicles` mit `line`, `lon`, `lat` und, wo die Quelle sie kennt, `bearing`: die Fahrtrichtung in Grad ab Nord, −180 bis 180, positiv im Uhrzeigersinn. **Die Positionen sind aus Fahrplan und Verspätung gerechnet, nicht geortet, und sie veralten in Sekunden**: nenne sie nie ohne den Stand aus `recordedAt`, und nimm keine Position aus einem früheren Aufruf. Datengrundlage ist die Region Hannover; anderswo antwortet die Quelle mit einer leeren Aufnahme. Eine fehlgeschlagene Antwort heißt „nicht abrufbar", nicht „dort fährt nichts". **Anti-Fab**: Linien und Positionen ausschließlich aus dem Output dieses Aufrufs.
nearbyread-onlyFindet Haltestellen, POIs und Adressen im Radius um eine KOORDINATE (Schwerpunkt Hannover/Niedersachsen) — „was ist in der Nähe von <lat,lon>", „welche Haltestellen liegen um diesen Punkt". Liegt nur ein Name vor, kommt erst eine Auflösung: `search_place` für eine Stadt oder Region, sonst die Ortsauflösung. **Pflicht**: `latitude`, `longitude`, `radius_m`. **Optional**: `limit` (Default 10); `node_types` — EIN String, mehrere Arten mit Komma: `'stop'`, `'address'`, `'poi'`, die Sharing-Angebote `'bike_rental'`, `'scooter_rental'`, `'car_sharing'`, `'taxi_stand'`, die Abstellanlagen `'park_and_ride'`, `'bike_and_ride'`, in Südtirol Ladesäulen `'charging_station'` und fahrende Taxis `'taxi'`, oder `'any'` (`'stop,bike_rental'`); `include_mots` (legt die bedienenden Linien über die Haltestellen-Treffer); `only_available` (nur Sharing-Treffer, Ladesäulen und Taxis, die gerade als frei gemeldet sind — UNBEKANNTE Verfügbarkeit gilt nicht als frei). **Format**: kompakter Einrück-Text (TOON), kein JSON. **Anleitung**: `get_usage_guide` mit `tool='nearby'` — die Werte im Einzelnen, was `'any'` nicht abdeckt, und was ein Treffer trägt (`category`, `modality`, `parking`, `charging`, `taxi`, `contactInfo`). **Anti-Fab**: nur die zurückgegebenen Namen, Typen, Distanzen und Verfügbarkeiten nennen; fehlt ein Feld, war es in der Quelle nicht getaggt — Öffnungszeiten und Preise stehen hier NICHT.
resolve_locationread-onlyLöst Freitext in die Id auf, mit der gefahren wird — die Haltestelle, die Adresse oder den POI hinter „von <X> nach <Y>", „erzähl mir was über <POI>". Wo Routing, Abfahrtstafel oder POI-Steckbrief eine Id brauchen, steht es davor — auch wenn der Nutzer die Stadt dazu nennt („Hauptbahnhof Hannover"). Ein GEBIET (Stadt/Region) verortet `search_place`. **Pflicht**: `query` — nur der Name: `'Kelsterbach Bahnhof'`, NICHT `'für Kelsterbach Bahnhof'`. Wegzulassen sind `für`, `vom`, `von`, `nach`, `bis`; ein führendes `am`/`an`/`in`/`zur`/`auf` bleibt stehen — so heißen echte Halte („Am Wehrhahn"). **Optional**: `lat`/`lon` (Ranking-Bias), `limit`, `node_types` (`'stop'`/`'address'`/`'poi'`/`'any'`, mehrere mit Komma in EINEM String; eine andere Art ist ein Argument-Fehler), `city_station` (Query = ganze Stadt → deren (Haupt-)Bahnhof). **Art-Wort in `node_types`, nicht in den Namen**: „Haltestelle X" → `'stop'`, „Adresse X" → `'address'`, „POI X"/„Sehenswürdigkeit X" → `'poi'`, `query` je ohne das Wort. **A→B: zweimal rufen** — Start, Ziel. Jeder Treffer trägt `type` und `location`; NUR ein `stop` hat eine fahrbare DH-Id, nie eine erfinden. Ein `stop` nennt in `modes`, was dort hält (`['tram','bus']`) — so ist „die Stadtbahn-Haltestelle" unter Namensvettern zu erkennen. Nennt `name` den Ort in der Sprache der Frage, steht der Name vor Ort in `localName`. **Anleitung**: `get_usage_guide` — Abgrenzung, Argumente, Rangfolge. **Anti-Fab**: nur die Treffer aus dem Output dieses Aufrufs verwenden.
reverse_geocoderead-onlyBenennt, was an einer KOORDINATE liegt — der Ort („was liegt bei <lat,lon>"), mit `level` eine bestimmte Ebene davon, mit `level='street'` die Straße samt nächster Hausnummer (der Lookup für eine GPS-Startposition). **Abgrenzung**: den Weg zurück (Name → Koordinate und OSM-Ids) geht `search_place`, die fahrbare Halte-Id liefert die Ortsauflösung, und `nearby` listet auf, was UM eine Koordinate liegt, statt den Punkt selbst zu benennen. **Pflicht**: `lat` und `lon` — geschrieben auch `latitude`/`longitude`, so wie `nearby` die Koordinate nimmt; je Aufruf nur eine der beiden Schreibweisen. **Optional**: `radius_m` (Suchradius in METERN; ein Ort, IN dem die Koordinate liegt, hat Abstand 0 und ist in jedem noch so engen Radius dabei — ohne `radius_m` die nächstgelegenen Treffer), `limit` (Höchstzahl Treffer, Default 10, Maximum 50) und `level` — `'place'` (Default: die ganze Ortshierarchie, feinste Ebene zuerst), `'city'` (die Stadt/Gemeinde), `'suburb'` (der Stadtteil) oder `'street'`. Kennt der Datensatz die gewünschte Ebene hier nicht, antwortet die nächst-gröbere, erkennbar am `place_type`; ein unbekannter Wert wirkt wie `'place'`. **Anleitung**: `get_usage_guide` mit `tool='reverse_geocode'`. **Anti-Fab**: nur die zurückgegebenen Orts- und Straßen-Namen verwenden, einschließlich der Hausnummer aus dem Datensatz — nie eine erfinden.
search_placeread-onlyLöst den NAMEN einer Stadt, Region oder eines Bezirks in Koordinaten und OSM-Ids auf — der erste Schritt, wenn ein GEBIET verortet werden muss („was kann ich in <REGION> unternehmen", „wie ist das Wetter in <CITY>"). **Für eine HALTESTELLE ist dieses Werkzeug fast immer falsch**: es kennt Gebiete, keine Bahnsteige — auf einen Bahnhofs-Namen antwortet es mit dem Stadtteil, und die Id, die es liefert, ist eine OSM-Id und keine fahrbare Halte-Id. **Trägt die Anfrage `Bahnhof`, `Hauptbahnhof`, `Hbf` oder `Bf`, gehört sie an die Ortsauflösung** — „Köln Hauptbahnhof" und „Hannover Bahnhof" also dorthin, nicht hierher: auf das erste antwortet dieses Werkzeug mit einem gleichnamigen Ortsteil (einem in Potsdam), auf das zweite mit der Stadt Hannover. Dasselbe für Adresse und POI — alles, was Start, Ziel oder Abfahrtsort einer Fahrt sein kann; eine Stadt als Fahrt-Endpunkt („von Hannover nach Celle") ebenfalls. Von einer Koordinate zurück zum Namen geht `reverse_geocode`, die Umgebung einer Koordinate listet `nearby`. **Pflicht**: `name`. **Optional**: `lang` (derzeit ohne Wirkung). **`score`**: 1 = derselbe Name, ab 0,5 als ganzes Wort; liegt der erste Treffer darunter, kennt der Index keinen Ort dieses Namens → Ortsauflösung. **Anleitung**: `get_usage_guide` mit `tool='search_place'` — Abgrenzung, Ketten, `score`, mehrdeutige Namen. **Anti-Fab**: nur die zurückgegebenen Namen und Ids nutzen, keine Bauch-Geographie.
show_connectionsread-only**Der Vordereingang für jede Verbindungsfrage eines Menschen**, auch wenn er nur nach Zeiten fragt: plant die Fahrt wie `connections` und liefert sie zusätzlich als Ansicht aus, die ein Wirt mit Ansichten dem Nutzer zeigt — je Verbindung eine Karte mit Zeiten, Dauer, Umstiegen und Echtzeit-Lage. **Beantwortest du einem Menschen eine Verbindungsfrage, ruf dies statt `connections`**, das für Ergebnisse ist, die du weiterverarbeitest. **Pflicht sind BEIDE Endpunkte**, wie dort: `origin_id` UND `destination_id` — oder die vier Koordinaten-Felder; `render_payload` entfällt. Der Antwort-Text ist der von `connections`; die Rohdaten daneben tragen nur die Felder, die die Ansicht zeichnet, ihr Kartenverlauf davon im `_meta`. **Anleitung**: `get_usage_guide` mit `tool='connections'`. **Anti-Fab**: Linien, Zeiten, Halte und Gleise ausschließlich aus dem Output dieses Aufrufs.
show_connections_slimread-only**Dieselbe Verbindungs-Ansicht wie `show_connections`, nur schlank ausgeliefert**: das Kartenwerk lädt die Ansicht als Skript, statt es mitzubringen. **Nimm dies nur, wenn ausdrücklich nach der schlanken Auslieferung gefragt wird** — sonst `show_connections`. Sonst unverändert: plant die Fahrt wie `connections` und liefert sie zusätzlich als Ansicht aus. **Pflicht sind BEIDE Endpunkte**, wie dort: `origin_id` UND `destination_id` — oder die vier Koordinaten-Felder; `render_payload` entfällt. Der Antwort-Text ist der von `connections`; die Rohdaten daneben tragen nur die Felder, die die Ansicht zeichnet, ihr Kartenverlauf davon im `_meta`. **Anleitung**: `get_usage_guide` mit `tool='connections'`. **Anti-Fab**: Linien, Zeiten, Halte und Gleise ausschließlich aus dem Output dieses Aufrufs.
show_departuresread-only**Der Vordereingang für jede Abfahrtsfrage eines Menschen**: liest die Tafel einer Haltestelle wie `departures` und liefert sie zusätzlich als Ansicht aus, die ein Wirt mit Ansichten dem Nutzer zeigt — je Abfahrt Linie, Ziel, Gleis/Steig, Zeit und Echtzeit-Lage. **Beantwortest du einem Menschen eine Abfahrtsfrage, ruf dies statt `departures`**, das für Ergebnisse ist, die du weiterverarbeitest. **Pflicht ist die Halte-Id**, wie dort: `id` — eine Id aus `resolve_location`, kein Haltestellen-Name; `render_payload` entfällt. Der Antwort-Text ist der von `departures`; die Rohdaten daneben tragen nur die Felder, die die Ansicht zeichnet. **Anleitung**: `get_usage_guide` mit `tool='departures'`. **Anti-Fab**: Linien, Ziele, Zeiten und Gleise ausschließlich aus dem Output dieses Aufrufs.
ticket_control_viewread-onlyEin einzelnes Ticket des Kontos zum VORZEIGEN bei einer Fahrscheinkontrolle: seine Angaben und, wo der Ticketshop einen führt, sein Nachweis. **Pflicht** ist `ticket_id` — eine Id aus `list_active_tickets`; ruf das zuerst auf. Optional `format`. Der Nachweis selbst (Barcode, Sicherheitsbild) geht an die Ansicht, die der Client zeichnet, nicht in diese Antwort: hier steht unter `proof` nur, OB der Ticketshop einen führt. Nimm dieses Werkzeug, wenn der Nutzer sein Ticket herzeigen will — für die Übersicht reicht `list_active_tickets`. **Anleitung**: `get_usage_guide` mit `tool='ticket_control_view'`. **Anti-Fab**: Kein Nachweis wird erzeugt, gezeichnet oder aus der Id abgeleitet. Führt der Ticketshop keinen, sagt die Antwort genau das — dann ist das Ticket hier nicht vorzeigbar.
ticket_offersread-onlyDas Tarifangebot der Region und was ein einzelnes Produkt darin kostet — beides aus dem Ticketshop selbst. **Ohne Argumente** kommt der Katalog: alle verkauften Produkte mit ihren Tarifbereichen, dazu die Tarifzonen der Region. **Mit `product`** kommt der Preis für genau dieses Produkt, dazu die Zahlungsmittel, mit denen das Konto es zahlen kann. Optional dabei `area` (Tarifbereich), `from_zone`/`to_zone` (für Tarife, die nach Zonen berechnet werden — daraus errechnet der Ticketshop auch den Bereich), `passenger` (Reisenden-Art), `valid_from` (ab wann) und `format`. Die Preisauskunft trägt zusätzlich `offer_token`: den Beleg genau dieses Preises, den `buy_ticket` verlangt. Kurz gültig, nur für die genannten Angaben, und nicht selbst herstellbar — unverändert weiterreichen. Alle Werte stammen aus dem Katalog: ein Produkt, ein Bereich oder eine Zone, die es dort nicht gibt, wird abgelehnt — mit der Liste dessen, was es gibt. Rate nicht, ruf erst ohne `product` auf. **Anleitung**: `get_usage_guide` mit `tool='ticket_offers'`. **Anti-Fab**: Preise, Namen und Gültigkeiten ausschließlich aus dem Output dieses Aufrufs — kein „üblicherweise", kein Preis aus eigener Rechnung.
widget_probe_g0read-only**Sprosse g0 der Form-Leiter, die Kontrolle** — die Ansicht in der Form eines Endpunkts dieses Hauses, der bei einem Wirt mit Ansichten nachweislich zeichnet: ein einziger Eintrag im Inhaltstyp der Anwendungserweiterung, eine Adresse mit Datei-Endung, beide Zeiger auf dieselbe Adresse, eine gefüllte Rahmen-Richtlinie mit dem eigenen Host, keine Bildschirm-Beschreibung daneben. Wird schon sie nicht gezeichnet, liegt der Unterschied außerhalb von allem, was verglichen wurde. Diagnose-Werkzeug des Entwicklungsstands: die Sprossen g0 bis g4 der Reihe nach aufrufen; die erste, die NICHT gezeichnet wird, benennt die Eigenschaft, auf die es ankam. Die Sprosse trägt keine Fahrplan-Daten.
widget_probe_g1read-only**Sprosse g1 der Form-Leiter** — Sprosse g0, und als einziger Unterschied endet die Adresse der Ansicht nicht auf `.html`, so wie die Adressen dieses Endpunkts es nicht tun. Wird g0 gezeichnet und g1 nicht, war die Endung die Ursache. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.
widget_probe_g2read-only**Sprosse g2 der Form-Leiter** — Sprosse g0, und als einziger Unterschied steht ein zweiter Eintrag derselben Ansicht in der Liste, im zweiten Inhaltstyp, wie dieser Endpunkt seine Ansichten listet. Wird g0 gezeichnet und g2 nicht, stört den Wirt der zweite Eintrag selbst. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.
widget_probe_g3read-only**Sprosse g3 der Form-Leiter** — Sprosse g0, und als einziger Unterschied sind die beiden Rahmen-Richtlinien leer, wie sie es an den Ansichten dieses Endpunkts sind, die nichts nachladen. Wird g0 gezeichnet und g3 nicht, liest der Wirt eine leere Liste nicht als „nichts nötig". Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.
widget_probe_g4read-only**Sprosse g4 der Form-Leiter** — Sprosse g0, und als einziger Unterschied nennen die beiden Zeiger verschiedene Adressen, wie die Zeiger dieses Endpunkts es heute tun. Wird g0 gezeichnet und g4 nicht, folgt der Wirt einem Zeiger, dessen Adresse er nicht einhängen kann. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.
widget_probe_r0read-only**Sprosse r0 der Anmelde-Leiter, die Kontrolle** — dieselbe Ansicht wie auf allen Sprossen dieser Leiter, angemeldet wie zu dem Zeitpunkt, an dem kein Wirt mehr gezeichnet hat: der Standard-Zeiger auf die Erweiterungs-Adresse, der flache Zeiger auf die gezeichnete Adresse, beide Einträge gelistet, beide unter demselben Namen. Wird sie gezeichnet, liegt es an keiner der drei Eigenschaften, die diese Leiter durchspielt. Diagnose-Werkzeug des Entwicklungsstands: die Sprossen r0 bis r3 der Reihe nach aufrufen; die erste gezeichnete benennt die Eigenschaft, auf die es ankam. Die Sprosse trägt keine Fahrplan-Daten.
widget_probe_r1read-only**Sprosse r1 der Anmelde-Leiter** — Sprosse r0, und als einziger Unterschied zeigt auch der Standard-Zeiger auf die Adresse, die im gezeichneten Inhaltstyp ausgeliefert wird. Zeichnet r1 und r0 nicht, war der Zeiger die Ursache. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.
widget_probe_r2read-only**Sprosse r2 der Anmelde-Leiter** — Sprosse r0, und als einziger Unterschied trägt jeder der beiden Einträge einen eigenen Namen. Zeichnet r2 und r0 nicht, hat der Wirt seine Ressourcen-Liste über den Namen entdoppelt und dabei einen der beiden Einträge verloren. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.
widget_probe_r3read-only**Sprosse r3 der Anmelde-Leiter** — die Anmeldung, unter der zuletzt nachweislich gezeichnet wurde: ein einziger Eintrag, im gezeichneten Inhaltstyp, und beide Zeiger darauf. Zeichnet r3 als einzige, stört den Wirt der zweite Eintrag selbst — und nicht sein Name und nicht der Zeiger. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.
widget_probe_v0read-only**Sprosse 0 der Mount-Leiter** — das leerste Dokument, das dieser Endpunkt ausliefern kann: eine Beschriftung und der Pflicht-Handschlag in einem klassischen Skript, ohne Modul, ohne Bündel, ohne Schaltfläche, ohne Netz. Wird sie gezeichnet, ist an der Auslieferung der Ansichten nichts kaputt und die Ursache kommt mit einer höheren Sprosse dazu; wird sie es nicht, liegt es an keinem Inhalt. Diagnose-Werkzeug des Entwicklungsstands: die Sprossen 0 bis 4 der Reihe nach aufrufen, die erste nicht gezeichnete benennt den Baustein.
widget_probe_v1read-only**Sprosse 1 der Mount-Leiter** — Sprosse 0 und eine Schaltfläche, die den Wirt um Vollbild bittet, weiterhin aus einem klassischen Skript. Trennt „das Dokument tut etwas" von der Bauart, in der es das tut. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.
widget_probe_v2read-only**Sprosse 2 der Mount-Leiter** — dasselbe Dokument wie Sprosse 1, Zeichen für Zeichen dasselbe Skript, nur als inline ES-Modul ausgeliefert statt als klassisches Skript. Das ist die einzige Bauart-Eigenschaft, die die echten Ansichten dieses Endpunkts mit einem vergleichbaren, gezeichneten Endpunkt nicht teilen. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.
widget_probe_v3read-only**Sprosse 3 der Mount-Leiter** — dieselbe Schaltfläche wie Sprosse 2, diesmal als React-Komponente aus dem Bündler dieses Projekts und in der Dokument-Form, die alle echten Ansichten dieses Endpunkts haben. Trennt unsere Bauart von der Anwendung, die sonst darauf steht. Diagnose-Werkzeug des Entwicklungsstands; die Sprosse trägt keine Fahrplan-Daten.
widget_probe_v4read-only**Sprosse 4 der Mount-Leiter, die Kontrolle** — die bestehende Abfahrtstafel dieses Endpunkts, unverändert, aber ohne Daten und darum als leere Tafel. Sie ist die Ansicht, um die es geht: was sie von Sprosse 3 trennt, ist die Anwendung selbst, nicht mehr die Bauart darunter. **Ruft keinen Fahrplan ab und zeigt keine Abfahrten** — wer Abfahrten braucht, nimmt `show_departures`. Diagnose-Werkzeug des Entwicklungsstands.

Schemas: list_tools.

Similar MCP servers

More from eu.projektionisten

Official server.json
{
  "name": "eu.projektionisten/mobility",
  "title": "MobilityMCP",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://ai.projektionisten.eu/mmcp",
      "type": "streamable-http"
    }
  ],
  "version": "0.3.1",
  "websiteUrl": "https://ai.projektionisten.eu/mcp-landingpage/",
  "description": "Public transport in Germany (ÖPNV, Fahrplan): journeys, departures, disruptions, nearby sharing."
}