Skip to main content
Glama

connections

Read-only

Plant Ö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 (stufenfrei WheelchairRobust/WalkerComfort/PramComfort, dazu accessibility_unknown: refuse/admit; Fußweg-Hinweise in walkNotes, auch mit VisuallyImpaired), include_rental_bike, bike_carriage (true/allow_unknown), prefer_flat, mobility_profile, taxi_pickup (door/rank); verbosity, limit, render_payload. Zeiten: departs/arrives an Verbindung und Abschnitt, Ortszeit (Echtzeit: departsExpected/arrivesExpected); beginnt sie zu Fuß, steht die erste Fahrt in firstRide. 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. Barrierefreiheit je Halt: accessibilityBoarding/accessibilityAlighting am Ein-/Ausstiegs-Halt einer Fahrt gelten nur dort, nie für Zwischenhalte, andere Fahrten oder die ganze Verbindung. Unbekannt: unknown dort bzw. in bikeCarriage 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. Carsharing nur auf Wunsch (Carsharing, Leihauto, stadtmobil, Stadtflitzer): dann car:sharing in access_modes (zum ersten Halt) bzw. egress_modes (vom letzten); ein Stationsauto nur hin und zurück, mit stay_minutes (Aufenthalt am Ziel) neben car:sharing — ohne ihn erscheint es nicht; den Rückweg sagt roundTrip. Umstiege nur auf Wunsch: change_reliability: true nur bei Fragen nach sicheren Umstiegen, Puffer, „was, wenn der Zug zu spät ist" (ja: „mit sicherem Umstieg"; nein: „A nach B um 16:30", „wie oft umsteigen?" — die Zahl der Umstiege sagt jede Antwort); dann sagt change am Abschnitt, wie oft der Umstieg klappt, reliability das Risiko der Verbindung. max_miss_risk (Anteil 0–1, 0.1 = 10 %) fragt das ebenso ab und stellt neben eine Verbindung darüber die verlässlichere Alternative. 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, Gleise und Umstiegs-Chancen ausschließlich aus dem Output dieses Aufrufs.

Input Schema

NameRequiredDescriptionDefault
langNoDie Sprache der Namen: `'de'` (Vorgabe), `'it'`, `'fr'`, auch mit Region (`'de-CH'`).
timeNoISO 8601 timestamp (e.g. `"2026-06-15T08:30:00Z"`). Omit to plan from now. Resolve a spoken time with the time tool rather than computing one.
viasNoZwischenhalte in Reiserichtung, höchstens 4, statt `via_id`/`via_lat`/`via_lon`: je `id`+`type` (wie ein Endpunkt) oder `lat`+`lon`, dazu `kind`, `stay_minutes`.
limitNoMaximum number of journeys, at least 1. Default 5, values above 15 are served as 15.
modesNoTransport-mode restriction, not a preference: nothing outside the list is planned. The footpath always stays allowed — the way to, from and between stops goes on foot — while `["foot"]` on its own plans no ride at all. Entries: `"bike"`, `"bike_rental"`, `"foot"`, `"car"`, `"taxi"`, `"scooter"`, `"transit"`, `"bus"`, `"tram"`, `"rail"`, `"subway"`, `"ferry"`, `"air"` (flights); several combine. An entry outside that list is an argument error, not a dropped filter. Omitted or empty = all standard transit modes, the ferry included, and a flight where one arrives sooner; `"transit"` = the same without flights. Set only when the user insists on a mode; the guide has the vocabulary and the traps.
formatNoAnswer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.**
via_idNoIntermediate stop the route must pass through („über X"), as an id in the same form as `origin_id`. The route is then planned A → via → B.
not_viaNoHalt-Ids wie `origin_id`, die keine Verbindung berührt.
via_latNoVia latitude, for an intermediate address or POI without an id. Goes with `via_lon`.
via_lonNoVia longitude. Goes with `via_lat`.
extendedNo`true` keeps the map data in the text: every stop's coordinate, every leg's polyline, and the whole stop sequence with them — for an application that DRAWS the route, at two to three times the answer. A chat client leaves it off.
via_typeNoWhat `via_id` is. Same values as `origin_type`.
cancelledNo`exclude` (Default), `include` (dazu `broken_journeys` mit Grund) oder `mark` (dazu jeder Halt beurteilt und wo neu zu suchen ist).
origin_idNoOrigin id: the resolver's `main` id as handed out — for a stop a DHID (`de:NNNNN:NNN`, `at:…`, `ch:…`, `it:…`) or a station id (`Parentch:1:sloid:3000`), else the address or POI id. Resolve the place first — a name here is an argument error.
verbosityNoHow much of each journey comes back: `"compact"` (default — everything an answer is cited from) or `"full"` (adds the stops in between). A third word is an argument error, not the default.
only_linesNoLine whitelist. Entries are line tokens as printed on the vehicle (`"6"`, `"U3"`); a journey is kept only if every transit leg uses one of them.
origin_latNoOrigin latitude, WGS-84 decimal degrees — the fallback when no id is at hand, and the one retry worth making when resolved ids find nothing.
origin_lonNoOrigin longitude. Goes with `origin_lat`.
walk_speedNoWalking speed of the foot legs in metres/second, between 0.3 and 3 m/s — outside that it is an argument error. Default ≈1.33, slow ≈0.7, brisk ≈2.0. Overrides the walk speed of `accessibility_profile`.
origin_typeNoWhat `origin_id` is: `"stop"` (default), `"address"` or `"poi"`. The backend resolves an address or a POI to its real name from the id.
prefer_flatNo`true` plant die hügel-ärmste statt der sonst gewählten Rad-Route: die Suche gewichtet die Steigung und nimmt dafür Umwege in Kauf, nur auf Rad-Abschnitten. Keine Zusage — ohne flachere Alternative kommt dieselbe Route; die Höhenmeter der Antwort sagen es. Wann setzen: die Anleitung.
taxi_pickupNoWo das Taxi die Fahrten trifft: `door` (Default, am Halt) oder `rank` (am Taxistand).
access_modesNoWeg zur ersten Haltestelle: Einträge `fahrzeug[:own|sharing][:only|prefer]`, Fahrzeug `walk`, `bike`, `scooter`, `car`, `taxi`; `own`/`sharing` eigenes/geliehenes (sonst gleich wessen); `only` nur damit, `prefer` (Default) neben dem Fußweg.
egress_modesNoWie `access_modes`, für den Weg von der letzten Haltestelle.
no_change_atNoHalt-Ids wie `origin_id`, an denen keine Verbindung umsteigt.
stay_minutesNoAufenthalt am Ziel, 0–1440 Minuten: ein Leihfahrzeug mit fester Station fährt damit hin und zurück; ohne ihn keins.
bike_carriageNoDas Rad fährt auf jeder Fahrt mit: `true` nur auf Fahrten, die es bekanntlich mitnehmen, `'allow_unknown'` auch ohne Angabe.
cycling_speedNoRad-Tempo in Metern/Sekunde, 1 bis 12 — außerhalb ein Argument-Fehler. Überschreibt `cycling_profile`. Richtwerte: Familie ≈2.8, normal ≈5, Pedelec ≈6.5.
exclude_linesNoLine blacklist, same token form as `only_lines`. A journey is dropped if any transit leg uses one of them.
max_miss_riskNoAb welchem Risiko, einen Umstieg zu verpassen, eine verlässlichere Alternative daneben steht: ein Anteil von 0 bis 1 (`0.1` = 10 %), auch ohne `change_reliability`. Weggelassen: keine Alternative.
max_transfersNoUpper bound on interchanges: `0` = direct, up to `3`. Omit unless the user constrains transfers: the backend then derives the search depth from the trip's air-line distance and escalates it when the first attempt finds nothing, so omitting never loses a connection.
submodes_denyNoFine submode blacklist, same vocabulary as `submodes_allow`. A journey is dropped if any transit leg matches one.
destination_idNoDestination id. Same form as `origin_id`.
render_payloadNo`true` appends the same journeys again as raw JSON, addressed to the user rather than to the model — the map geometry an application draws from. A chat client leaves this off: it is the whole answer twice.
submodes_allowNoFine submode whitelist — finer than `modes`, which only separates bus/tram/rail/subway. Entries: `"sbahn"`, `"regionalbahn"`, `"ice"`, `"ic"`, `"ir"`, `"nj"`, `"fernverkehr"`, `"stadtbahn"`, `"ubahn"`, `"bus"`, `"regionalbus"`, `"stadtbus"`, `"flug"` (flights). A journey is kept only if every transit leg matches one.
cycling_profileNoWer auf dem Rad sitzt, und damit das Tempo der Rad-Abschnitte: `family` (mit kleinen Kindern), `normal` (Default, unverändert) oder `ebike` (Pedelec). Ein anderer Name ist ein Argument-Fehler.
destination_latNoDestination latitude. Same use as `origin_lat`.
destination_lonNoDestination longitude. Goes with `destination_lat`.
is_arrival_timeNo`true` reads `time` as the desired ARRIVAL time instead of the departure time.
max_walk_metersNoCap on the summed walking DISTANCE in metres. Works like `max_walk_minutes`, on the metres walked.
destination_typeNoWhat `destination_id` is. Same values as `origin_type`.
max_walk_minutesNoCap on the summed walking TIME in minutes: every journey of the answer keeps to it.
mobility_profileNoHow the first and the last mile may be covered, by name: `"transit"` (default — both ends on foot), `"transit_plus_sharing"` (a shared bike), `"door_to_door"` (being driven), `"park_and_ride"` or `"bike_and_ride"` (one's OWN car or bicycle, left where the transit leg starts). Another name is an argument error. It widens those two ends, restricts no ride and promises nothing. When to set which, and how it composes with `modes`, is in the usage guide.
change_reliabilityNo`true` nur, wenn der Nutzer nach der Verlässlichkeit der Umstiege fragt: dann sagen `change` und `reliability`, wie oft die Umstiege klappten. Weggelassen: nichts davon, außer mit `max_miss_risk`.
include_rental_bikeNo`true` adds a rental-bike leg (park-and-bike / station rental). Equivalent to naming `"bike"` in `modes` together with a transit mode.
max_walk_from_originNoHöchstens so weit zu Fuß vom Start zur ersten Haltestelle, Meter über die Straße: 500, 1000, 2000 oder 5000 — anderes ist ein Argument-Fehler.
accessibility_profileNoMobility profile by name: `"Standard"` (default), `"WheelchairRobust"`, `"WalkerComfort"`, `"PramComfort"`, `"VisuallyImpaired"` or `"IndividualComfort"`. Each bundles its accessibility constraints and walk speed; another name is an argument error. Where the step-free three (wheelchair, walker, pram) find no stated step-free ride, `accessibility_routing` says what the journeys beside it are; these three and `VisuallyImpaired` note on a walk what the map knows (`additionalInfos.walkNotes`). What each profile constrains is in the usage guide.
accessibility_unknownNoNur mit `WheelchairRobust`/`WalkerComfort`/`PramComfort`: `refuse` nimmt nur als stufenfrei Ausgewiesenes, `admit` auch, worüber nichts bekannt ist. Weggelassen: siehe Anleitung.
max_walk_to_destinationNoWie `max_walk_from_origin`, von der letzten Haltestelle zum Ziel.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / accessibility_profile / description
      Previous value: -"Mobility profile by name: `\"Standard\"` (default), `\"WheelchairRobust\"`,\n`\"WalkerComfort\"` or `\"IndividualComfort\"`. Each bundles its accessibility\nconstraints and walk speed; another name is an argument error. Where the\nwheelchair profiles find no stated step-free ride, `accessibility_routing`\nsays what the journeys beside it are. What each profile constrains is in the\nusage guide."New value: +"Mobility profile by name: `\"Standard\"` (default), `\"WheelchairRobust\"`,\n`\"WalkerComfort\"`, `\"PramComfort\"`, `\"VisuallyImpaired\"` or `\"IndividualComfort\"`.\nEach bundles its accessibility constraints and walk speed; another name is an argument\nerror. Where the step-free three (wheelchair, walker, pram) find no stated step-free\nride, `accessibility_routing` says what the journeys beside it are; these three and\n`VisuallyImpaired` note on a walk what the map knows (`additionalInfos.walkNotes`).\nWhat each profile constrains is in the usage guide."
    • changedInput schema / properties / accessibility_unknown / description
      Previous value: -"Nur mit `WheelchairRobust`/`WalkerComfort`: `refuse` nimmt nur als stufenfrei\nAusgewiesenes, `admit` auch, worüber nichts bekannt ist. Weggelassen: siehe Anleitung."New value: +"Nur mit `WheelchairRobust`/`WalkerComfort`/`PramComfort`: `refuse` nimmt nur als\nstufenfrei Ausgewiesenes, `admit` auch, worüber nichts bekannt ist. Weggelassen: siehe Anleitung."
  2. Changed1 schema field changed
    • addedInput schema / properties / stay_minutes
      Added value: +{
      +  "description": "Aufenthalt am Ziel, 0–1440 Minuten: ein Leihfahrzeug mit fester Station fährt damit hin\nund zurück; ohne ihn keins.",
      +  "format": "int64",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
  3. Changed2 schema fields changed
    • addedInput schema / properties / change_reliability
      Added value: +{
      +  "description": "`true` nur, wenn der Nutzer nach der Verlässlichkeit der Umstiege fragt: dann sagen `change`\nund `reliability`, wie oft die Umstiege klappten. Weggelassen: nichts davon, außer mit\n`max_miss_risk`.",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • changedInput schema / properties / max_miss_risk / description
      Previous value: -"Ab welchem Risiko, einen Umstieg zu verpassen, eine verlässlichere Alternative daneben steht:\nein Anteil von 0 bis 1 (`0.1` = 10 %). Weggelassen: nur die Chance jedes Umstiegs."New value: +"Ab welchem Risiko, einen Umstieg zu verpassen, eine verlässlichere Alternative daneben steht:\nein Anteil von 0 bis 1 (`0.1` = 10 %), auch ohne `change_reliability`. Weggelassen: keine\nAlternative."
  4. Changed1 schema field changed
    • addedInput schema / properties / max_miss_risk
      Added value: +{
      +  "description": "Ab welchem Risiko, einen Umstieg zu verpassen, eine verlässlichere Alternative daneben steht:\nein Anteil von 0 bis 1 (`0.1` = 10 %). Weggelassen: nur die Chance jedes Umstiegs.",
      +  "format": "double",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
  5. Changed2 schema fields changed
    • changedInput schema / properties / modes / description
      Previous value: -"Transport-mode restriction, not a preference: nothing outside the list is\nplanned. The footpath always stays allowed — the way to, from and between\nstops goes on foot — while `[\"foot\"]` on its own plans no ride at all.\nEntries: `\"bike\"`, `\"bike_rental\"`, `\"foot\"`, `\"car\"`, `\"taxi\"`, `\"scooter\"`,\n`\"transit\"`, `\"bus\"`, `\"tram\"`, `\"rail\"`, `\"subway\"`, `\"ferry\"`; several\ncombine. An entry outside that list is an argument error, not a dropped\nfilter. Omitted or empty = all standard transit modes, the ferry\nincluded. Set only when the user insists on a mode; the guide has the\nvocabulary and the traps."New value: +"Transport-mode restriction, not a preference: nothing outside the list is\nplanned. The footpath always stays allowed — the way to, from and between\nstops goes on foot — while `[\"foot\"]` on its own plans no ride at all.\nEntries: `\"bike\"`, `\"bike_rental\"`, `\"foot\"`, `\"car\"`, `\"taxi\"`, `\"scooter\"`,\n`\"transit\"`, `\"bus\"`, `\"tram\"`, `\"rail\"`, `\"subway\"`, `\"ferry\"`, `\"air\"`\n(flights); several combine. An entry outside that list is an argument\nerror, not a dropped filter. Omitted or empty = all standard transit\nmodes, the ferry included, and a flight where one arrives sooner;\n`\"transit\"` = the same without flights. Set only when the user insists on\na mode; the guide has the vocabulary and the traps."
    • changedInput schema / properties / submodes_allow / description
      Previous value: -"Fine submode whitelist — finer than `modes`, which only separates\nbus/tram/rail/subway. Entries: `\"sbahn\"`, `\"regionalbahn\"`, `\"ice\"`,\n`\"ic\"`, `\"ir\"`, `\"nj\"`, `\"fernverkehr\"`, `\"stadtbahn\"`, `\"ubahn\"`,\n`\"bus\"`, `\"regionalbus\"`, `\"stadtbus\"`. A journey is kept only if every\ntransit leg matches one."New value: +"Fine submode whitelist — finer than `modes`, which only separates\nbus/tram/rail/subway. Entries: `\"sbahn\"`, `\"regionalbahn\"`, `\"ice\"`,\n`\"ic\"`, `\"ir\"`, `\"nj\"`, `\"fernverkehr\"`, `\"stadtbahn\"`, `\"ubahn\"`,\n`\"bus\"`, `\"regionalbus\"`, `\"stadtbus\"`, `\"flug\"` (flights). A journey is\nkept only if every transit leg matches one."
  6. Changed1 schema field changed
    • addedInput schema / properties / lang
      Added value: +{
      +  "description": "Die Sprache der Namen: `'de'` (Vorgabe), `'it'`, `'fr'`, auch mit Region (`'de-CH'`).",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  7. Changed1 schema field changed
    • changedInput schema / properties / origin_id / description
      Previous value: -"Origin id: the resolver's `main` id as handed out — for a stop a DHID (`de:NNNNN:NNN`,\n`at:…`, `ch:…`) or a station id (`Parentch:1:sloid:3000`), else the address or POI id.\nResolve the place first — a name here is an argument error."New value: +"Origin id: the resolver's `main` id as handed out — for a stop a DHID (`de:NNNNN:NNN`,\n`at:…`, `ch:…`, `it:…`) or a station id (`Parentch:1:sloid:3000`), else the address or POI id.\nResolve the place first — a name here is an argument error."
  8. Changed1 schema field changed
    • changedInput schema / properties / origin_id / description
      Previous value: -"Origin id. A DHID (`de:NNNNN:NNN`; in Austria and Switzerland `at:…`/`ch:…`)\nfor a stop, otherwise the resolver's `main` id of the address or POI. Resolve the place first — a name here is\nan argument error."New value: +"Origin id: the resolver's `main` id as handed out — for a stop a DHID (`de:NNNNN:NNN`,\n`at:…`, `ch:…`) or a station id (`Parentch:1:sloid:3000`), else the address or POI id.\nResolve the place first — a name here is an argument error."
  9. Changed4 schema fields changed
    • addedInput schema / properties / max_walk_from_origin
      Added value: +{
      +  "default": null,
      +  "description": "Höchstens so weit zu Fuß vom Start zur ersten Haltestelle, Meter über die Straße:\n500, 1000, 2000 oder 5000 — anderes ist ein Argument-Fehler.",
      +  "enum": [
      +    500,
      +    1000,
      +    2000,
      +    5000,
      +    null
      +  ],
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • changedInput schema / properties / max_walk_minutes / description
      Previous value: -"Cap on the summed walking TIME in minutes. A post-filter drops journeys\nabove it; if that leaves nothing, the backend searches once more avoiding\nfootpaths before the answer is empty."New value: +"Cap on the summed walking TIME in minutes: every journey of the answer\nkeeps to it."
    • addedInput schema / properties / max_walk_to_destination
      Added value: +{
      +  "default": null,
      +  "description": "Wie `max_walk_from_origin`, von der letzten Haltestelle zum Ziel.",
      +  "enum": [
      +    500,
      +    1000,
      +    2000,
      +    5000,
      +    null
      +  ],
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • changedInput schema / properties / origin_id / description
      Previous value: -"Origin id. A DHID (`de:NNNNN:NNN`) for a stop, otherwise the resolver's\n`main` id of the address or POI. Resolve the place first — a name here is\nan argument error."New value: +"Origin id. A DHID (`de:NNNNN:NNN`; in Austria and Switzerland `at:…`/`ch:…`)\nfor a stop, otherwise the resolver's `main` id of the address or POI. Resolve the place first — a name here is\nan argument error."
  10. Changed1 schema field changed
    • changedInput schema / properties / origin_type / description
      Previous value: -"What `origin_id` is: `\"stop\"` (default), `\"address\"` or `\"poi\"`. A stop id\nis auto-prefixed `GTFS.de:`; the other two are forwarded verbatim so the\nbackend resolves the real name."New value: +"What `origin_id` is: `\"stop\"` (default), `\"address\"` or `\"poi\"`. The backend\nresolves an address or a POI to its real name from the id."
  11. Changed1 schema field changed
    • addedInput schema / properties / taxi_pickup
      Added value: +{
      +  "description": "Wo das Taxi die Fahrten trifft: `door` (Default, am Halt) oder `rank` (am Taxistand).",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  12. Changed10 schema fields changed
    • addedInput schema / $defs
      Added value: +{
      +  "BikeCarriageArgument": {
      +    "anyOf": [
      +      {
      +        "type": "boolean"
      +      },
      +      {
      +        "type": "string"
      +      }
      +    ]
      +  },
      +  "ViaRequest": {
      +    "description": "Ein Zwischenhalt.",
      +    "properties": {
      +      "id": {
      +        "description": "Id wie `origin_id`.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "kind": {
      +        "description": "`through` (Default: durchfahren genügt) oder `stopover` (dort umsteigen).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "lat": {
      +        "description": "Breite eines Orts ohne Id, mit `lon`.",
      +        "format": "double",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "lon": {
      +        "description": "Länge, mit `lat`.",
      +        "format": "double",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "stay_minutes": {
      +        "description": "Mindest-Aufenthalt, 0–1440 Minuten; macht den Halt zum Umstieg.",
      +        "format": "int64",
      +        "type": [
      +          "integer",
      +          "null"
      +        ]
      +      },
      +      "type": {
      +        "description": "Wie `origin_type`.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  }
      +}
    • addedInput schema / properties / access_modes
      Added value: +{
      +  "description": "Weg zur ersten Haltestelle: Einträge `fahrzeug[:own|sharing][:only|prefer]`, Fahrzeug\n`walk`, `bike`, `scooter`, `car`, `taxi`; `own`/`sharing` eigenes/geliehenes (sonst\ngleich wessen); `only` nur damit, `prefer` (Default) neben dem Fußweg.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • changedInput schema / properties / accessibility_profile / description
      Previous value: -"Mobility profile by name: `\"Standard\"` (default), `\"WheelchairRobust\"`,\n`\"WalkerComfort\"` or `\"IndividualComfort\"`. Each bundles its accessibility\nconstraints and walk speed; another name is an argument error. The two\nwheelchair profiles find no ride at all today — the answer then carries\n`accessibility_routing` with `status: no_data` beside ordinary connections,\nwhich are to be reported as ordinary ones. What each profile constrains is\nin the usage guide."New value: +"Mobility profile by name: `\"Standard\"` (default), `\"WheelchairRobust\"`,\n`\"WalkerComfort\"` or `\"IndividualComfort\"`. Each bundles its accessibility\nconstraints and walk speed; another name is an argument error. Where the\nwheelchair profiles find no stated step-free ride, `accessibility_routing`\nsays what the journeys beside it are. What each profile constrains is in the\nusage guide."
    • addedInput schema / properties / accessibility_unknown
      Added value: +{
      +  "description": "Nur mit `WheelchairRobust`/`WalkerComfort`: `refuse` nimmt nur als stufenfrei\nAusgewiesenes, `admit` auch, worüber nichts bekannt ist. Weggelassen: siehe Anleitung.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / bike_carriage
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/BikeCarriageArgument"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Das Rad fährt auf jeder Fahrt mit: `true` nur auf Fahrten, die es bekanntlich\nmitnehmen, `'allow_unknown'` auch ohne Angabe."
      +}
    • addedInput schema / properties / cancelled
      Added value: +{
      +  "description": "`exclude` (Default), `include` (dazu `broken_journeys` mit Grund) oder `mark` (dazu\njeder Halt beurteilt und wo neu zu suchen ist).",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / egress_modes
      Added value: +{
      +  "description": "Wie `access_modes`, für den Weg von der letzten Haltestelle.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / no_change_at
      Added value: +{
      +  "description": "Halt-Ids wie `origin_id`, an denen keine Verbindung umsteigt.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / not_via
      Added value: +{
      +  "description": "Halt-Ids wie `origin_id`, die keine Verbindung berührt.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / vias
      Added value: +{
      +  "description": "Zwischenhalte in Reiserichtung, höchstens 4, statt `via_id`/`via_lat`/`via_lon`:\nje `id`+`type` (wie ein Endpunkt) oder `lat`+`lon`, dazu `kind`, `stay_minutes`.",
      +  "items": {
      +    "$ref": "#/$defs/ViaRequest"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
  13. First observed

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/openWorld/non-destructive, and the description piles on behavior the annotations cannot carry: `unknown` means neither accessible nor bike-allowed, `staySeated` must not be inferred when absent, `not_considered` must never be reported as satisfied, `broken_journeys` don't run, and an explicit anti-fabrication rule about lines/times/stops. This is exactly the extra context annotations leave open.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and the mandatory-endpoints rule, which is right, but the body becomes a dense run-on mixing routing rules, output-field semantics, filter enumerations and anti-fabrication advice into bold-separated clauses. For a 49-parameter tool length is justifiable, yet a fair share restates schema-documented parameters (`max_walk_from_origin` values, `verbosity` words) instead of earning new space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 49 parameters, no output schema, and the need to explain result fields (`departsExpected`, `firstRide`, `ascentInMeters`, `change`, `reliability`, `bikeCarriageConditions`), the description covers what an agent needs to both call and interpret the tool. It even points to `get_usage_guide` for the parts deliberately left out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter rules and intent that the schema does not: both endpoints are mandatory as id+type OR lat/lon, a name in an id field is an argument error, and several filters are gated on user intent (change_reliability, carsharing via access_modes, stay_minutes). It largely mirrors the schema rather than going beyond it, which keeps it out of 5 territory.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Plant ÖPNV-Verbindungen von A nach B") with geographic scope and real-time vs. timetable coverage, plus the distinctive framing "als Daten, für Ergebnisse, die du weiterverarbeitest". It explicitly distinguishes itself from the sibling `show_connections`, which it names as the human-facing entry point.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use routing against siblings (`show_connections` for a human question, `get_usage_guide` before filtering) and conditions for optional features: `change_reliability` only on reliability questions with explicit example phrasings, carsharing only on request, `cycling_profile` only for a bike ride. It also names when-not cases ("nein: 'A nach B um 16:30'") rather than only positive triggers.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources