Skip to main content
Glama

Server Details

Journeys, departures, line courses, disruptions in Germany; nearby sharing as currently reported.

Ownership verified
Status
Healthy
Uptime
100.0% over 42 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.4/5.0

Scored across 13 tools

Disambiguation3/5

Most tools have clearly distinct purposes and the descriptions explicitly cross-reference each other (resolve_location vs search_place vs reverse_geocode vs nearby is genuinely well delineated). However, three tools — `connections`, `show_connections`, `show_connections_slim` — do the same routing job and are separated only by render mode, and `departures`/`show_departures` repeat this pattern, so an agent must read a lot of prose to pick correctly. The 'data vs. view' split is a real source of misselection risk rather than a cosmetic overlap.

Naming Consistency4/5

All names are lowercase snake_case with no style mixing, which keeps the set readable and predictable. The convention is only mostly consistent in verb usage: bare nouns (`connections`, `departures`, `disruptions`, `nearby`, `line_course`) sit alongside verb_noun names (`get_usage_guide`, `resolve_location`, `search_place`, `show_connections`). The `show_*` prefix does at least pair cleanly with its data counterpart.

Tool Count4/5

13 tools is a sensible size for a transit domain covering routing, boards, disruptions, line courses, geocoding and POI lookup. The count is slightly inflated by a near-duplicate (`show_connections_slim`) and by the parallel data/view pairs, which could be modelled as one tool with a render flag. Nothing here feels padded beyond that.

Completeness4/5

The surface covers the core lifecycle: locate (forward, reverse, nearby), plan (connections), monitor (departures, disruptions), inspect lines, and resolve relative times, plus a usage guide. Minor gaps remain — no fares/ticket prices (explicitly unavailable), no dedicated stop/facility lookup (folded into `departures.facilities`), and no operator or service-detail tools. Agents can work around these, so coverage is solid rather than complete.

Available Tools

13 tools
connectionsA
Read-only
Inspect

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.

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.

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.

departuresA
Read-only
Inspect

Abfahrten 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.

NameRequiredDescriptionDefault
idYesStop id to read the board of, as the resolver hands it out: a DHID (`"de:03241:57"`, `at:…`, `ch:…`, `it:…`) or a station id (`"Parentch:1:sloid:3000"`). Resolve the stop first — a name here is an argument error.
langNoDie Sprache der Namen: `'de'` (Vorgabe), `'it'`, `'fr'`, auch mit Region (`'de-CH'`).
timeNoISO 8601 timestamp (e.g. `"2026-06-15T08:30:00Z"`). Omit for now. Resolve a spoken time with the time tool rather than computing one.
limitNoMaximum number of departures, at least 1. Default 5, values above 15 are served as 15.
linesNoOnly the departures of these lines, by the ids a board writes: the line alone (either direction) as at `mot.line.id`, or line@direction as at `mot.line.direction.ids` (`"de:VBN-VH:6002:_3@0"`); several combine. A line NUMBER (`"9"`) is no id — read the id off a board first. An entry that is no line is an argument error.
modesNoTransport-mode filter; the board then shows nothing else. Entries: `"bus"`, `"tram"`, `"subway"`, `"train"`/`"rail"`, `"ferry"`, `"air"` (flights), `"transit"` (all of them but flights); several combine. Another entry — a street mode, a misspelling — is an argument error, not a dropped filter: a board lists scheduled services. Omitted or empty = all modes. A Stadtbahn or light-rail mention needs BOTH labels — `["tram","subway"]`: which of the two such a network carries depends on the dataset rather than on the vehicle. Set the filter only when the user really asks for a vehicle type; the guide has the rest of the vocabulary and the traps.
formatNoAnswer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.**
extendedNo`true` keeps the map data in the text: every stop's coordinate, the whole course of each run, and each departure's way (`pathOnMap`, `pathSource`, `additionalInfos.pathKind`) — for an application that DRAWS the board. It multiplies the answer. A chat client leaves it off.
directionNoName of a stop the user wants to head TOWARD („Richtung Wettbergen") — not a routing destination. The board keeps only departures heading that way, whether the named stop is the terminus or a stop downstream of the queried one. Matching is case-insensitive and area-prefix-tolerant.
verbosityNoHow much of each departure comes back: `"compact"` (default — everything an answer is cited from) or `"full"` (adds the onward stops of the run, and with them the per-stop cancellation marker). A third word is an argument error, not the default.
facilitiesNoInstead of the board, the stop's lifts, escalators and ramps („hat Kröpcke einen Aufzug zur U-Bahn?"): `"elevator"`, `"escalator"`, `"ramp"` or `"all"`; the guide has the fields.
first_lastNo`true` answers instead of the board, per line and direction, the first and the last ride of a day („letzte Bahn heute"): the day running now, or the calendar day of `time` in local time.
last_of_windowNoWhich end of a `time_range_seconds` window to read: omitted or `false` the FIRST departures, `true` the LAST ones (the end-of-service question). An answer carrying `window_truncated: true` beside its board did NOT reach the window's end — its last entry is then not the last departure. Without a window it has no effect.
render_payloadNo`true` appends the same board again as raw JSON, addressed to the user rather than to the model — for an application that draws a departure board. A chat client leaves this off: it is the whole answer twice.
target_bearingNoTarget bearing in degrees (0=N, 90=E, 180=S, 270=W) for a SOFT direction („Richtung Norden", „Richtung Stadt") instead of a stop name. The board keeps only departures whose course lies within `bearing_tolerance` of it. Mutually exclusive with `direction`.
is_arrival_timeNo`true` reads `time` as an ARRIVAL time — the same as `arrival_departure = "arrivals"`.
arrival_departureNo`"arrivals"` (when vehicles reach `id`) or `"departures"` (default) — a third value is an argument error. Wins over `is_arrival_time` when both are set.
bearing_toleranceNoAngular tolerance in degrees for `target_bearing`. Default ±60°.
time_range_secondsNoTime WINDOW in seconds, starting at `time`. Together with `last_of_window` it reads the last rides before the window ends: pick it so the window ENDS where the question does. The last ride of a day is `first_last`. Omit for a normal next-N lookup.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, destructiveHint=false, openWorldHint), and the description layers on real behavioural context: a mandatory pre-resolved stop id, that a name in `id` is an argument error rather than an empty board, that an empty board is not an answer, and an anti-fabrication rule. It does not describe pagination or response shape, but for a read-only tool this is well above the bar.

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

Conciseness4/5

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

Front-loaded with purpose and the required `id`, and bolds the load-bearing constraints (Pflicht, Optional, Anti-Fab). It is long and re-states some `lines`/`modes` detail the schema already carries, so it is dense rather than perfectly lean, but few sentences are pure filler.

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?

For a 19-parameter, single-required-parameter read tool with no output schema, the description covers the mandatory argument, the sibling routing for the two special modes, the empty-result fallback, and points to get_usage_guide for deeper vocabulary. Nothing an agent needs to call it correctly is missing.

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% and the schema itself is unusually detailed, so the baseline is 3. The description still adds cross-parameter meaning the schema does not: hard vs. soft direction, that `['tram','subway']` must be set together for light-rail networks, and when to suppress a mode filter entirely.

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?

Opens with a specific verb+resource+scope ("Abfahrten oder Ankünfte für EINE Haltestelle") and immediately frames it as structured data for downstream use rather than a human-readable board. It explicitly separates itself from show_departures, connections, first_last and facilities, so an agent can route without opening any schema.

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 explicit trigger phrases and the alternative each selects: "wann fährt von X"/"letzte Stadtbahn" → this tool, A→B → connections, "letzte Bahn heute" → first_last, "hat X einen Aufzug" → facilities. Hard-filter behaviour of modes/lines/direction and the empty-board retry path are also stated.

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

disruptionsA
Read-only
Inspect

Aktuelle 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.

NameRequiredDescriptionDefault
areaNoArea or city name (`"Hannover"`). Matches the municipality the affected stops lie in, and decides the `coverage` the answer reports. It never suppresses a report: the ones it cannot place come back in `unplaced`.
lineNoLine token as printed on the vehicle (`"6"`, `"169"`, `"U3"`). A disruption is kept only if it names that line — under one of its `affected_lines` or one of its `affected_line_refs`.
stopNoStop name (`"Kröpcke"`). Case-insensitive substring match against the disruption's `affected_stops`.
limitNoMaximum number of disruptions, at least 1. Default 5, values above 15 are served as 15. It shortens the answer, it does not choose better entries — an answer that had to leave something out says so (`truncated` + `total`).
formatNoAnswer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.**
include_unplacedNo`false` leaves the `unplaced` list out of the answer (default `true`). It only shortens the answer — `coverage` still counts what was left out, so it never turns into an all-clear.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already cover safety (readOnly, non-destructive, openWorld), yet the description adds the crucial semantic that an empty answer is only an all-clear inside coverage regions, lists which regions those are, discloses AND-combination of line+stop, truncation signalling (truncated/total), and anti-fabrication rules. This is behavioral context far beyond the annotation set.

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

Conciseness4/5

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

Dense but well front-loaded: purpose, data-coverage caveat, argument behaviour, format, guide pointer, then anti-fab rules in bold-labeled blocks. It is long, and some of the coverage/guide material is partly delegated, but nearly every sentence carries a distinct operational constraint.

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

Completeness4/5

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

With no output schema and six optional parameters, the description does the heavy lifting: it explains result shape at a high level (two lists, `coverage` values, truncation markers) and points to `get_usage_guide` for field-level detail. The reliance on an external guide for the seven coverage values and message fields is a minor gap but an intentional, disclosed one.

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 genuine meaning not in the schema: that `line` and `stop` combine with AND, that `area` decides coverage and routes unplaceable reports to `unplaced` rather than suppressing them, and that agents should omit `format`. It mostly reinforces rather than extends the schema, hence 4.

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?

Names a specific verb+resource in the first line ("Aktuelle Störungen, Baustellen und Liniensperrungen im ÖPNV") and immediately distinguishes itself from the sibling tools by stating that connections and departures are unaffected. An agent can tell this apart from departures/connections without opening any schema.

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

Usage Guidelines4/5

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

Gives concrete user phrasings that select this tool ("gibt es Störungen", "Ausfälle in X") and a hard filter rule ("Nenne nur Filter, die der Nutzer wirklich nannte"). It does not name a competing sibling tool to route away to, so it is strong context without explicit exclusions.

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

get_usage_guideA
Read-only
Inspect

Die 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.

NameRequiredDescriptionDefault
toolNoDer Name genau eines Werkzeugs aus diesem Katalog, dessen Abschnitt zurückkommen soll. Weglassen für die ganze Anleitung.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already indicate read-only and non-destructive behavior. The description adds valuable context: omitting `tool` returns all tool sections at once, supplying `tool` returns one section, and the full retrieval is costly. No contradiction with annotations exists.

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

Conciseness4/5

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

The description is dense and front-loaded with purpose, then explains parameter behavior and cost. Every sentence carries useful information, though it is slightly longer than strictly necessary.

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?

For a read-only guide tool with one optional parameter and no output schema, this description is complete: it explains purpose, when to use it, how the parameter behaves, what is returned, and cost implications. Nothing essential is missing.

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% and the parameter is already documented. The description adds decision guidance around when to supply `tool` versus omit it, including the cost trade-off, which goes beyond the schema. It does not enumerate valid tool names, but catalog context provides that.

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?

The description states the tool is the detailed guide to all catalog tools, covering purpose, delimitation, arguments, return values, and quotation rules. It clearly positions itself as a meta-tool distinct from the domain-data sibling tools.

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?

It explicitly says when to read a section (before setting filters or passing an empty result), when to omit the `tool` parameter, and when to set it. It also warns that calling without `tool` is expensive and should only be used for a full-catalog overview.

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

line_courseA
Read-only
Inspect

Linienverlauf: 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.

NameRequiredDescriptionDefault
idNoA line id out of an earlier answer (`"de:VBN-VH:6002:_3"`) — the one way to name exactly one line when a name means several.
areaNoThe town or city the line runs in (`"Hannover"`), where the user named one — the other way to make a line number mean ONE line. Beside `query`; no effect beside `id`, which already means one line.
limitNoMaximum number of lines, at least 1. Default 8, values above 15 are served as 15. Ignored beside `id`, which is one line.
queryNoLine name or number, as written on the vehicle or in the timetable (`"Heide-Shuttle"`, `"HS 2"`, `"U3"`). Matched against the beginning of both, without case and without separators.
formatNoAnswer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.**
render_payloadNo`true` appends the whole answer again, addressed to the user rather than to the model: the halts with their coordinates, and every course's line at the resolution it was drawn at rather than the simplified `pathOnMap` the text carries. For an application that needs the exact line; a client that draws the answer's own `pathOnMap` leaves this off.

TDQS

A4.8/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 goes well beyond them: it discloses the candidates fallback for ambiguous names, the geometryDegraded and patternsTotal/matchedTotal semantics, unknown-place behavior, and a hallucination guardrail. Rich behavioral context for a read tool.

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

Conciseness4/5

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

Front-loaded with purpose and then grouped into required/optional/response/limits/not-for sections. It is dense and long, but nearly every sentence carries distinct information; the bolding and structuring keep it navigable rather than padded.

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?

With no output schema, the description carries the full return-value burden and does so: it explains per-direction courses with headsign, halts, pathOnMap simplification, the candidates alternative, and the max ~50 m simplification with render_payload for full resolution. Nothing essential is missing.

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 already 100%, so the baseline is 3. The description still adds value by foregrounding the 'exactly one of query/id' obligation and the area/limit defaults, though it mostly reinforces rather than extends the schema wording.

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?

The opening states a specific resource (the halt sequence of an ÖPNV line and its drawn map path) and pairs it with concrete user questions ('wo fährt die Y entlang'). It also explicitly names the siblings it is not (connections, departures, disruptions), so an agent can route correctly without opening schemas.

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 an explicit when-to-use rule, the 'genau EINE Linie' constraint, the fallback when ambiguous (query by area or by id), and an explicit 'Nicht dafür' list mapping other needs to connections/departures/disruptions. Almost no inference is left.

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

nearbyA
Read-only
Inspect

Findet 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.

NameRequiredDescriptionDefault
limitNoMaximum number of results, at least 1. Default 10.
formatNoAnswer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.**
latitudeYesLatitude in WGS-84 decimal degrees.
radius_mYesSearch radius in metres.
longitudeYesLongitude in WGS-84 decimal degrees.
node_typesNoWhich kinds of place to answer with: the places the graph holds — `"stop"`, `"address"`, `"poi"` — plus the shared-mobility offers `"bike_rental"`, `"scooter_rental"`, `"car_sharing"` and `"taxi_stand"`, plus the places to leave a vehicle of one's own, `"park_and_ride"` and `"bike_and_ride"`, plus — in South Tyrol — the charging stations `"charging_station"` and the taxis on the road `"taxi"`, or `"any"` for all of them. Several combine in ONE comma-separated string — `"stop,bike_rental"`; an array of the same tokens is read as that string. A kind outside the twelve is an argument error, not a dropped filter. `"poi"` alone also switches on the non-tourism filter; omit (or `"any"`) for the mixed default, in which each requested kind gets its share of `limit` and the shared-mobility offers share one between them. The two park-and-ride kinds, the charging stations and the taxis are the exceptions `"any"` does NOT cover — ask for them by name; for the parking sites with a `radius_m` of a few kilometres, because they are sparse.
include_motsNo`true` overlays the serving transit lines on stop results. Default `false`, which keeps the answer small.
only_availableNoSet to `true` for „wo kann ich JETZT eines nehmen": of the shared-mobility offers, only those whose live feed reports at least one vehicle ready to be taken are answered with — and of the charging stations those with a point reported free, of the taxis those reported free. A place whose availability is unknown is NOT returned then, and neither is a taxi rank, which has no feed to report one. Omit (or `false`) to list every place in range. The other kinds — `"stop"`, `"address"`, `"poi"`, `"park_and_ride"`, `"bike_and_ride"` — are unaffected either way.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly/openWorld/destructive=false), but the description goes well beyond: it discloses the TOON text output format, the fact that opening hours and prices are absent, the fields a hit carries, and the special availability semantics (unknown availability is not treated as available). This is rich behavioral context an agent cannot get from the annotations alone.

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

Conciseness4/5

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

Front-loaded with purpose, then required/optional, then format, guide pointer and anti-fabrication rules, so the structure is easy to scan. It is long and partly duplicates the schema's own node_types enumeration, but nearly every sentence carries operational value.

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?

With no output schema and 8 parameters, the description covers what an agent needs: output format, what a result carries, availability caveats, and anti-fabrication rules, while delegating exhaustive detail to `get_usage_guide`. Nothing essential for a correct call is missing.

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; the description nonetheless adds real meaning — required vs optional split, the comma-string form of `node_types`, the fact that `'any'` does NOT cover park_and_ride/charging_station/taxi, and the distinction between unknown and unavailable for `only_available`. It slightly repeats schema text, which keeps it from a 5.

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: finds stops, POIs and addresses within a radius of a coordinate, with two concrete example queries. It also distinguishes itself from siblings by routing name-only inputs to `search_place` (city/region) or the place resolution, so an agent can tell it apart without opening another schema.

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?

Explicit when-to-use phrasing ("was ist in der Nähe von <lat,lon>") plus explicit alternatives (`search_place` for a city/region, otherwise the place resolution). It also directs the agent to `get_usage_guide` for the finer points and names the default serialisation, leaving little to inference.

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

resolve_locationA
Read-only
Inspect

Löst Freitext in die Id auf, mit der gefahren wird — die Haltestelle, die Adresse oder den POI hinter „von nach ", „erzähl mir was über ". 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.

NameRequiredDescriptionDefault
latNoOptional latitude (WGS-84) to bias ranking toward nearby stops.
lonNoOptional longitude (WGS-84) to bias ranking toward nearby stops.
limitNoMaximum number of results. Defaults to 5 if omitted.
queryYesFree-text query, e.g. "Hauptbahnhof Hannover" or "Linden Markt". Nur der reine Orts-/Haltename — ohne das Wort, das ihn im Satz ankündigt: `"Kelsterbach Bahnhof"`, nicht `"für Kelsterbach Bahnhof"`. Ein führendes `am`/`an`/`in`/`zur`/`auf` bleibt dagegen stehen, weil echte Haltestellen so heißen ("Am Wehrhahn", "In der Au").
formatNoAnswer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.**
node_typesNoWhich kinds of place to resolve to: `"stop"`, `"address"`, `"poi"` or `"any"`. Several combine in ONE comma-separated string — `"stop,poi"`; an array of the same tokens is read as that string. A kind outside the four is an argument error, not a dropped filter — the shared-mobility kinds among them: a rental station and a taxi rank are not in the place index this searches, they are answered by the radius search `nearby`. Forwarded to mobility-middleware as `journey_node_types`. `"poi"` alone additionally drops non-tourism POI names (Kindergarten, Apotheke, Schule, …) — use this for tourism queries. Nennt der Nutzer die Art selbst, gehört sie hierher statt in `query`: "Haltestelle X" → `"stop"`, "Adresse X" → `"address"`, "POI X"/"Sehenswürdigkeit X" → `"poi"` (und `query` dann ohne das Art-Wort).
city_stationNoWhen `Some(true)` AND the query is a whole CITY, resolve it to the city's (Haupt-)Bahnhof stop and return ONLY that stop (so „von Hannover nach Celle" routes Bahnhof→Bahnhof). Forwarded to mobility-middleware as `cityStation=true`. A no-op for non-city queries. The orchestrator routing-floor sets this deterministically per endpoint; the model never has to.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only cover the safety profile (readOnly/openWorld/non-destructive). The description adds real behavioral context well beyond them: A→B needs two calls, every hit carries `type` and `location`, only a `stop` has a rideable DH-ID that must never be invented, `modes` reveals what stops there, and `name`/`localName` disambiguate language. It also states that an invalid kind is an argument error rather than a dropped filter.

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

Conciseness4/5

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

Purpose is front-loaded and the rest is chunked under bold labels (Pflicht, Optional, Art-Wort, A→B, Anleitung, Anti-Fab), which makes it scannable. It is nevertheless long and partly duplicates the schema's parameter prose, so it is efficient but not maximally tight.

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

Completeness4/5

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

With no output schema, the description carries the return-value burden and does so (type, location, modes, localName vs name) plus an anti-fabrication rule. The remaining gap is what to do when nothing resolves — the no-match / empty-result behavior is not stated.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description restates the mandatory `query` hygiene rules and the `node_types`/`city_station` semantics, but these are already documented verbatim in the schema, so it adds little beyond the structured fields apart from emphasis.

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?

The opening sentence gives a precise verb+resource: it resolves free text into the ID that travel uses, and immediately names the situations (routing, departure board, POI profile). It explicitly differentiates from the sibling `search_place`, which handles an AREA (city/region) rather than a point. An agent can route between the two without opening either schema.

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?

States when it is needed ('where routing, departures board or POI profile requires an ID'), names the alternative for areas (`search_place`), and routes shared-mobility kinds (rental station, taxi rank) to `nearby`. It also prescribes the calling pattern for A→B ('call twice') and points to `get_usage_guide` for further distinctions.

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

reverse_geocodeA
Read-only
Inspect

Benennt, 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.

NameRequiredDescriptionDefault
latYesLatitude of the coordinate to reverse-geocode. Also accepted spelled `latitude`, the way the vicinity search takes it — one of the two spellings per call.
lonYesLongitude of the coordinate to reverse-geocode. Also accepted spelled `longitude`, the way the vicinity search takes it — one of the two spellings per call.
levelNoOptional resolution level. `"place"` (default) answers with the coordinate's whole admin hierarchy, finest first (suburb → town → county → state → country); `"city"` with the town/municipality it lies in; `"suburb"` with the suburb; `"street"` with the nearest STREET/ADDRESS (street name + nearest house number, e.g. `"Münzstraße 3-4"`) — the level needed to label a real GPS start position. Where the data has no place at the requested level, the next coarser one answers, recognisable by its `place_type`. Any other / omitted value behaves as `"place"`.
limitNoOptional maximum number of hits, nearest first. Default 10, upper bound 50; a larger value is served as 50 and `0` as the default. Applies to every level and with or without `radius_m`.
formatNoAnswer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.**
radius_mNoOptional radius in METRES. When set, returns the places inside the circle, sorted nearest-first and capped to `limit`. A place the coordinate LIES INSIDE is at distance 0 and is therefore in every radius, however tight. When omitted, returns the `limit` nearest places.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark readOnlyHint=true and openWorldHint=true, so the description does not need to repeat basic safety. It adds genuinely non-obvious behavior: fallback to a coarser level when the requested level is missing and the result is recognizable via place_type, distance-0 inclusion in any radius, limit clamping, and the anti-hallucination instruction to use only returned names. Nothing in the description contradicts the annotations.

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

Conciseness5/5

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

The description is dense but highly structured: purpose, boundary, required args, optional args, fallback behavior, instruction source, and anti-hallucination rule each get a clearly labeled section. Although it is longer than many descriptions, every sentence carries operational value; there is no filler or tautology.

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?

For a 6-parameter tool with no output schema, the description covers all parameters, defaults, edge cases, sibling-tool routing, and output interpretation (place_type fallback indicator). It also gives an anti-fabrication rule for returned names, which is critical practical guidance. The reference to get_usage_guide fills any remaining serialization detail without bloating the main description.

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, and the description goes beyond it by adding the one-spelling-per-call rule, explaining the nearest-hit behavior when radius_m is omitted, and clarifying that unknown level values behave like 'place'. It largely restates schema semantics for radius_m and limit, but it provides extra operational context that helps an agent invoke the tool correctly.

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 action and resource: names what lies at a coordinate, optionally at a chosen level, including street-level reverse geocoding. The first sentence alone tells an agent not just what the tool returns but that it is the lookup for a GPS start position. It also distinguishes itself from nearby and search_place, making sibling confusion unlikely.

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?

Explicitly gives when-to-use guidance: reverse geocoding a coordinate, street labeling for GPS positions, and the distinction from search_place (name → coordinate), nearby (what lies around), and another resolution tool. It also states required parameters, the mandatory spelling consistency rule, and points to get_usage_guide for further detail.

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

search_placeA
Read-only
Inspect

Lö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 unternehmen", „wie ist das Wetter in "). 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.

NameRequiredDescriptionDefault
langNoOptional ISO language code (e.g. "de", "en"). Currently advisory: the place names are the German ones the data carries, whatever is asked for. Kept in the signature so a multilingual answer needs no new argument.
nameYesName of the area to search for. Free-text fuzzy match against the place index behind this endpoint (e.g. "Hannover", "Linden", "Wangerland").
formatNoAnswer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.**

TDQS

A4.7/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, openWorld, non-destructive), and the description goes well beyond them: it discloses that a station name yields a same-named district (one in Potsdam) and that the returned id is an OSM id, not a drivable stop id. It also explains the score matching semantics (1 = exact, >=0.5 whole word) and adds an anti-fabrication instruction about only using returned names and ids.

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

Conciseness4/5

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

Front-loaded with the core purpose, then the critical exclusion, then parameters, then the usage guide and anti-fabrication note, with bold markers making sections scannable. It is dense rather than padded, but the single block is long and some parenthetical examples could be trimmed without loss.

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

Completeness4/5

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

For a read-only lookup with no output schema, it covers purpose, alternatives, required/optional params, matching behavior and what the returned id actually is. It stops short of describing the full response shape (e.g. whether coordinates and ids come as a list of candidates), so an agent still infers some of the return structure.

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 description coverage is 100%, so a 3 is the baseline. The description adds real signal on top: it restates name as mandatory and clarifies that lang has no current effect (the schema only says "advisory"), which is a genuine refinement. The format parameter is left to the schema and the reference to a `score` field is a bit ambiguous, keeping it from a full 5.

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 precise verb and resource: it resolves the NAME of a city, region or district into coordinates and OSM-Ids, and frames this as the first step for locating an area. It actively distinguishes itself from siblings by naming reverse_geocode and nearby for their respective jobs, so an agent can route without opening any schema.

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 explicit when-to-use (locating a region/city for questions like weather or activities) and explicit when-NOT-to-use (any request containing Bahnhof/Hbf/Bf or any stop/address/POI that could be a journey endpoint, which belongs to resolve_location). Concrete examples ("Köln Hauptbahnhof", "Hannover Bahnhof") show what goes wrong otherwise, and it points to get_usage_guide for deeper chaining.

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

show_connectionsA
Read-only
Inspect

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. Die Verlässlichkeit der Umstiege nur auf Wunsch, wie dort: change_reliability: true oder max_miss_risk. Carsharing nur auf Wunsch, wie dort: car:sharing in access_modes/egress_modes, ein Stationsauto dazu mit stay_minutes. Der Antwort-Text ist der von connections — Abfahrt und Ankunft aus departs/arrives, nach einem Fußweg die erste Fahrt aus firstRide; die Rohdaten daneben tragen nur die Felder, die die Ansicht zeichnet, in Ortszeit wie der Text, 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.

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`.
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.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/openWorldHint and non-destructive, so the safety profile is covered; the description adds genuinely non-obvious behaviour: both endpoints are mandatory (even though the schema lists zero required fields), `render_payload` is dropped, the answer text mirrors `connections`, and the raw payload carries only view-drawn fields in local time with the map course in `_meta`. It does not describe failure/empty responses, though the schema notes that unknown ids answer empty rather than erroring.

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

Conciseness4/5

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

Front-loaded correctly: identity and the call-instead-of-`connections` rule come first, then constraints, then output shape, then anti-fabrication. It is dense and mixes German prose with English parameter jargon, and the repeated 'wie dort' back-references pad it slightly, but almost every clause carries decision-relevant content for a 48-parameter tool.

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

Completeness4/5

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

For a 48-parameter tool with no output schema, the description covers the essentials an agent needs to call it correctly: the endpoint requirement, opt-in flags, the shape of the returned view versus raw data, and where to get parameter detail (usage guide, `tool='connections'`). The view payload's structure itself is only summarised, not specified, which is the remaining gap.

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% across 48 parameters, so baseline would be 3; the description earns above that by flagging the endpoint requirement the schema does not enforce, excluding `render_payload`, and pinning the two opt-in switches to their guarding parameters (`change_reliability`/`max_miss_risk`, `car:sharing` with `stay_minutes`). The remaining ~40 parameters are left entirely to the schema and the usage guide.

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?

The first two sentences state a specific verb and resource (plan a journey like `connections`, deliver it as a renderable view with one card per connection) and explicitly name the sibling this replaces. An agent can distinguish `show_connections` from `connections` and `show_connections_slim` without opening either schema.

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?

Explicit routing rule: 'Beantwortest du einem Menschen eine Verbindungsfrage, ruf dies statt `connections`' with the exclusion stated for `connections` (results you further process). It also states when optional behaviour should be switched on ('nur auf Wunsch' for change_reliability, max_miss_risk, car sharing) and points to `get_usage_guide` with `tool='connections'`.

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

show_connections_slimA
Read-only
Inspect

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. Die Verlässlichkeit der Umstiege nur auf Wunsch, wie dort: change_reliability: true oder max_miss_risk. Carsharing nur auf Wunsch, wie dort: car:sharing in access_modes/egress_modes, ein Stationsauto dazu mit stay_minutes. Der Antwort-Text ist der von connections — Abfahrt und Ankunft aus departs/arrives, nach einem Fußweg die erste Fahrt aus firstRide; die Rohdaten daneben tragen nur die Felder, die die Ansicht zeichnet, in Ortszeit wie der Text, 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.

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`.
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.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnlyHint, openWorldHint, destructiveHint false), yet the description still adds real behavioral content: render_payload is absent, the raw payload carries only the fields the view draws (in local time) and the map course lives in `_meta`, and the answer text is identical to `connections`. The anti-fabrication rule (lines, times, stops, tracks only from this call's output) is a genuinely useful constraint that no annotation or schema field conveys.

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

Conciseness4/5

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

The discriminator and the 'only when asked' rule are front-loaded in bold, and the rest is organized by concern (payload shape, opt-in features, response, guide, anti-fabrication). It is dense but not padded. Minor cost: a couple of long compound sentences (the raw-data/_meta sentence in particular) that a reader has to parse twice.

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

Completeness4/5

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

For a 48-parameter tool with no output schema, it covers the two things that matter most: what the input must contain regardless of `required: []`, and what the answer looks like (departs/arrives, firstRide after a walk, view-only raw fields in local time, map course in `_meta`). It delegates the remaining vocabulary to get_usage_guide with tool='connections', which is a legitimate strategy at this schema size, though it means an agent that skips the guide knows less about the other 40 params than it ideally should.

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

Parameters5/5

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

Schema coverage is 100% across 48 params, so the baseline would be 3 — but the description adds a crucial fact the schema does not: while `required` is empty, both endpoints are in practice obligatory (origin_id AND destination_id, or the four coordinate fields). It also states which schema knobs belong to conditional behaviour (change_reliability / max_miss_risk, car:sharing plus stay_minutes), which steers parameter choice rather than merely restating field docs.

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?

The description opens by naming the exact resource and its defining variant ('dieselbe Verbindungs-Ansicht wie show_connections, nur schlank ausgeliefert') and explains the mechanical difference: the map widget loads the view as a script rather than shipping it inline. It then names the sibling it must not be confused with, so an agent can route between show_connections_slim and show_connections without opening either schema.

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?

Explicit gating condition: 'Nimm dies nur, wenn ausdrücklich nach der schlanken Auslieferung gefragt wird — sonst show_connections.' That is a rare, unambiguous when/when-not plus the named alternative. It also repeats the opt-in conditions for the risky optional features (change_reliability only on request, carsharing only via car:sharing in access_modes/egress_modes), which prevents an agent from over-enabling parameters.

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

show_departuresA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
idYesStop id to read the board of, as the resolver hands it out: a DHID (`"de:03241:57"`, `at:…`, `ch:…`, `it:…`) or a station id (`"Parentch:1:sloid:3000"`). Resolve the stop first — a name here is an argument error.
langNoDie Sprache der Namen: `'de'` (Vorgabe), `'it'`, `'fr'`, auch mit Region (`'de-CH'`).
timeNoISO 8601 timestamp (e.g. `"2026-06-15T08:30:00Z"`). Omit for now. Resolve a spoken time with the time tool rather than computing one.
limitNoMaximum number of departures, at least 1. Default 5, values above 15 are served as 15.
linesNoOnly the departures of these lines, by the ids a board writes: the line alone (either direction) as at `mot.line.id`, or line@direction as at `mot.line.direction.ids` (`"de:VBN-VH:6002:_3@0"`); several combine. A line NUMBER (`"9"`) is no id — read the id off a board first. An entry that is no line is an argument error.
modesNoTransport-mode filter; the board then shows nothing else. Entries: `"bus"`, `"tram"`, `"subway"`, `"train"`/`"rail"`, `"ferry"`, `"air"` (flights), `"transit"` (all of them but flights); several combine. Another entry — a street mode, a misspelling — is an argument error, not a dropped filter: a board lists scheduled services. Omitted or empty = all modes. A Stadtbahn or light-rail mention needs BOTH labels — `["tram","subway"]`: which of the two such a network carries depends on the dataset rather than on the vehicle. Set the filter only when the user really asks for a vehicle type; the guide has the rest of the vocabulary and the traps.
formatNoAnswer serialisation: `"toon"` (default) or `"json"` — the detail is in `get_usage_guide`. **An agent leaves this out.**
extendedNo`true` keeps the map data in the text: every stop's coordinate, the whole course of each run, and each departure's way (`pathOnMap`, `pathSource`, `additionalInfos.pathKind`) — for an application that DRAWS the board. It multiplies the answer. A chat client leaves it off.
directionNoName of a stop the user wants to head TOWARD („Richtung Wettbergen") — not a routing destination. The board keeps only departures heading that way, whether the named stop is the terminus or a stop downstream of the queried one. Matching is case-insensitive and area-prefix-tolerant.
verbosityNoHow much of each departure comes back: `"compact"` (default — everything an answer is cited from) or `"full"` (adds the onward stops of the run, and with them the per-stop cancellation marker). A third word is an argument error, not the default.
last_of_windowNoWhich end of a `time_range_seconds` window to read: omitted or `false` the FIRST departures, `true` the LAST ones (the end-of-service question). An answer carrying `window_truncated: true` beside its board did NOT reach the window's end — its last entry is then not the last departure. Without a window it has no effect.
target_bearingNoTarget bearing in degrees (0=N, 90=E, 180=S, 270=W) for a SOFT direction („Richtung Norden", „Richtung Stadt") instead of a stop name. The board keeps only departures whose course lies within `bearing_tolerance` of it. Mutually exclusive with `direction`.
is_arrival_timeNo`true` reads `time` as an ARRIVAL time — the same as `arrival_departure = "arrivals"`.
arrival_departureNo`"arrivals"` (when vehicles reach `id`) or `"departures"` (default) — a third value is an argument error. Wins over `is_arrival_time` when both are set.
bearing_toleranceNoAngular tolerance in degrees for `target_bearing`. Default ±60°.
time_range_secondsNoTime WINDOW in seconds, starting at `time`. Together with `last_of_window` it reads the last rides before the window ends: pick it so the window ENDS where the question does. The last ride of a day is `first_last`. Omit for a normal next-N lookup.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/non-destructive, so the bar is lower, and the description still adds real behavior: the response text equals `departures`, the raw payload carries only view-drawn fields, the id must come from `resolve_location`, and an explicit anti-fabrication constraint. It stops short of describing pagination or view rendering mechanics, but the added context is meaningful.

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

Conciseness4/5

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

Purpose and the sibling-routing decision are front-loaded before the id requirement and the guide pointer, so an agent gets the critical selection signal first. The heavy bold markup and long compound sentences add some density, but nothing is truly redundant.

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

Completeness4/5

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

For a 16-parameter tool with no output schema, the description states what the answer contains (the `departures` text plus a view-shaped raw payload), the mandatory id source, and where to find further guidance. The safety profile is carried by annotations, so the remaining gap is only detail on the optional filters, which the schema covers.

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 baseline is 3, but the description adds genuinely new semantics: `render_payload` is dropped here, `id` must be a resolver-issued id rather than a stop name, and the output field set differs from `departures`. It does not re-explain the many optional filters, which the schema already handles well.

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?

Opens with a bold, specific framing ('Der Vordereingang für jede Abfahrtsfrage eines Menschen'), states it reads a stop's board like `departures` and returns it additionally as a view, and names the sibling it replaces. An agent can distinguish it from `departures` without opening either schema.

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?

Explicit routing rule: 'Beantwortest du einem Menschen eine Abfahrtsfrage, ruf dies statt `departures`, das für Ergebnisse ist, die du weiterverarbeitest' — when to use it, which alternative to avoid, and why. Also points to `get_usage_guide` for the deeper vocabulary.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 20 tool updates
    • Removedbuy_ticket
    • Removedjourney_map_image
    • Removedlist_active_tickets
    • Removedlive_vehicles
    • Removedticket_control_view
    • Removedticket_offers
    • Removedwidget_probe_g0
    • Removedwidget_probe_g1
    • Removedwidget_probe_g2
    • Removedwidget_probe_g3
    • Removedwidget_probe_g4
    • Removedwidget_probe_r0
    • Removedwidget_probe_r1
    • Removedwidget_probe_r2
    • Removedwidget_probe_r3
    • Removedwidget_probe_v0
    • Removedwidget_probe_v1
    • Removedwidget_probe_v2
    • Removedwidget_probe_v3
    • Removedwidget_probe_v4
  2. 20 tool updates
    • Addedbuy_ticket
    • Addedjourney_map_image
    • Addedlist_active_tickets
    • Addedlive_vehicles
    • Addedticket_control_view
    • Addedticket_offers
    • Addedwidget_probe_g0
    • Addedwidget_probe_g1
    • Addedwidget_probe_g2
    • Addedwidget_probe_g3
    • Addedwidget_probe_g4
    • Addedwidget_probe_r0
    • Addedwidget_probe_r1
    • Addedwidget_probe_r2
    • Addedwidget_probe_r3
    • Addedwidget_probe_v0
    • Addedwidget_probe_v1
    • Addedwidget_probe_v2
    • Addedwidget_probe_v3
    • Addedwidget_probe_v4
  3. 20 tool updates
    • Removedbuy_ticket
    • Removedjourney_map_image
    • Removedlist_active_tickets
    • Removedlive_vehicles
    • Removedticket_control_view
    • Removedticket_offers
    • Removedwidget_probe_g0
    • Removedwidget_probe_g1
    • Removedwidget_probe_g2
    • Removedwidget_probe_g3
    • Removedwidget_probe_g4
    • Removedwidget_probe_r0
    • Removedwidget_probe_r1
    • Removedwidget_probe_r2
    • Removedwidget_probe_r3
    • Removedwidget_probe_v0
    • Removedwidget_probe_v1
    • Removedwidget_probe_v2
    • Removedwidget_probe_v3
    • Removedwidget_probe_v4
  4. 20 tool updates
    • Addedbuy_ticket
    • Addedjourney_map_image
    • Addedlist_active_tickets
    • Addedlive_vehicles
    • Addedticket_control_view
    • Addedticket_offers
    • Addedwidget_probe_g0
    • Addedwidget_probe_g1
    • Addedwidget_probe_g2
    • Addedwidget_probe_g3
    • Addedwidget_probe_g4
    • Addedwidget_probe_r0
    • Addedwidget_probe_r1
    • Addedwidget_probe_r2
    • Addedwidget_probe_r3
    • Addedwidget_probe_v0
    • Addedwidget_probe_v1
    • Addedwidget_probe_v2
    • Addedwidget_probe_v3
    • Addedwidget_probe_v4
  5. 20 tool updates
    • Removedbuy_ticket
    • Removedjourney_map_image
    • Removedlist_active_tickets
    • Removedlive_vehicles
    • Removedticket_control_view
    • Removedticket_offers
    • Removedwidget_probe_g0
    • Removedwidget_probe_g1
    • Removedwidget_probe_g2
    • Removedwidget_probe_g3
    • Removedwidget_probe_g4
    • Removedwidget_probe_r0
    • Removedwidget_probe_r1
    • Removedwidget_probe_r2
    • Removedwidget_probe_r3
    • Removedwidget_probe_v0
    • Removedwidget_probe_v1
    • Removedwidget_probe_v2
    • Removedwidget_probe_v3
    • Removedwidget_probe_v4
  6. 20 tool updates
    • Addedbuy_ticket
    • Addedjourney_map_image
    • Addedlist_active_tickets
    • Addedlive_vehicles
    • Addedticket_control_view
    • Addedticket_offers
    • Addedwidget_probe_g0
    • Addedwidget_probe_g1
    • Addedwidget_probe_g2
    • Addedwidget_probe_g3
    • Addedwidget_probe_g4
    • Addedwidget_probe_r0
    • Addedwidget_probe_r1
    • Addedwidget_probe_r2
    • Addedwidget_probe_r3
    • Addedwidget_probe_v0
    • Addedwidget_probe_v1
    • Addedwidget_probe_v2
    • Addedwidget_probe_v3
    • Addedwidget_probe_v4
  7. 3 tool updates
    • Changedconnections2 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."
    • Changedshow_connections2 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."
    • Changedshow_connections_slim2 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."
  8. 20 tool updates
    • Removedbuy_ticket
    • Removedjourney_map_image
    • Removedlist_active_tickets
    • Removedlive_vehicles
    • Removedticket_control_view
    • Removedticket_offers
    • Removedwidget_probe_g0
    • Removedwidget_probe_g1
    • Removedwidget_probe_g2
    • Removedwidget_probe_g3
    • Removedwidget_probe_g4
    • Removedwidget_probe_r0
    • Removedwidget_probe_r1
    • Removedwidget_probe_r2
    • Removedwidget_probe_r3
    • Removedwidget_probe_v0
    • Removedwidget_probe_v1
    • Removedwidget_probe_v2
    • Removedwidget_probe_v3
    • Removedwidget_probe_v4
  9. 20 tool updates
    • Addedbuy_ticket
    • Addedjourney_map_image
    • Addedlist_active_tickets
    • Addedlive_vehicles
    • Addedticket_control_view
    • Addedticket_offers
    • Addedwidget_probe_g0
    • Addedwidget_probe_g1
    • Addedwidget_probe_g2
    • Addedwidget_probe_g3
    • Addedwidget_probe_g4
    • Addedwidget_probe_r0
    • Addedwidget_probe_r1
    • Addedwidget_probe_r2
    • Addedwidget_probe_r3
    • Addedwidget_probe_v0
    • Addedwidget_probe_v1
    • Addedwidget_probe_v2
    • Addedwidget_probe_v3
    • Addedwidget_probe_v4
  10. 20 tool updates
    • Removedbuy_ticket
    • Removedjourney_map_image
    • Removedlist_active_tickets
    • Removedlive_vehicles
    • Removedticket_control_view
    • Removedticket_offers
    • Removedwidget_probe_g0
    • Removedwidget_probe_g1
    • Removedwidget_probe_g2
    • Removedwidget_probe_g3
    • Removedwidget_probe_g4
    • Removedwidget_probe_r0
    • Removedwidget_probe_r1
    • Removedwidget_probe_r2
    • Removedwidget_probe_r3
    • Removedwidget_probe_v0
    • Removedwidget_probe_v1
    • Removedwidget_probe_v2
    • Removedwidget_probe_v3
    • Removedwidget_probe_v4
  11. 20 tool updates
    • Addedbuy_ticket
    • Addedjourney_map_image
    • Addedlist_active_tickets
    • Addedlive_vehicles
    • Addedticket_control_view
    • Addedticket_offers
    • Addedwidget_probe_g0
    • Addedwidget_probe_g1
    • Addedwidget_probe_g2
    • Addedwidget_probe_g3
    • Addedwidget_probe_g4
    • Addedwidget_probe_r0
    • Addedwidget_probe_r1
    • Addedwidget_probe_r2
    • Addedwidget_probe_r3
    • Addedwidget_probe_v0
    • Addedwidget_probe_v1
    • Addedwidget_probe_v2
    • Addedwidget_probe_v3
    • Addedwidget_probe_v4
  12. 20 tool updates
    • Removedbuy_ticket
    • Removedjourney_map_image
    • Removedlist_active_tickets
    • Removedlive_vehicles
    • Removedticket_control_view
    • Removedticket_offers
    • Removedwidget_probe_g0
    • Removedwidget_probe_g1
    • Removedwidget_probe_g2
    • Removedwidget_probe_g3
    • Removedwidget_probe_g4
    • Removedwidget_probe_r0
    • Removedwidget_probe_r1
    • Removedwidget_probe_r2
    • Removedwidget_probe_r3
    • Removedwidget_probe_v0
    • Removedwidget_probe_v1
    • Removedwidget_probe_v2
    • Removedwidget_probe_v3
    • Removedwidget_probe_v4
  13. 20 tool updates
    • Addedbuy_ticket
    • Addedjourney_map_image
    • Addedlist_active_tickets
    • Addedlive_vehicles
    • Addedticket_control_view
    • Addedticket_offers
    • Addedwidget_probe_g0
    • Addedwidget_probe_g1
    • Addedwidget_probe_g2
    • Addedwidget_probe_g3
    • Addedwidget_probe_g4
    • Addedwidget_probe_r0
    • Addedwidget_probe_r1
    • Addedwidget_probe_r2
    • Addedwidget_probe_r3
    • Addedwidget_probe_v0
    • Addedwidget_probe_v1
    • Addedwidget_probe_v2
    • Addedwidget_probe_v3
    • Addedwidget_probe_v4
  14. 3 tool updates
    • Changedconnections1 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"
        +  ]
        +}
    • Changedshow_connections1 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"
        +  ]
        +}
    • Changedshow_connections_slim1 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"
        +  ]
        +}
  15. 3 tool updates
    • Changedconnections2 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."
    • Changedshow_connections2 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."
    • Changedshow_connections_slim2 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."
  16. 20 tool updates
    • Removedbuy_ticket
    • Removedjourney_map_image
    • Removedlist_active_tickets
    • Removedlive_vehicles
    • Removedticket_control_view
    • Removedticket_offers
    • Removedwidget_probe_g0
    • Removedwidget_probe_g1
    • Removedwidget_probe_g2
    • Removedwidget_probe_g3
    • Removedwidget_probe_g4
    • Removedwidget_probe_r0
    • Removedwidget_probe_r1
    • Removedwidget_probe_r2
    • Removedwidget_probe_r3
    • Removedwidget_probe_v0
    • Removedwidget_probe_v1
    • Removedwidget_probe_v2
    • Removedwidget_probe_v3
    • Removedwidget_probe_v4
  17. 20 tool updates
    • Addedbuy_ticket
    • Addedjourney_map_image
    • Addedlist_active_tickets
    • Addedlive_vehicles
    • Addedticket_control_view
    • Addedticket_offers
    • Addedwidget_probe_g0
    • Addedwidget_probe_g1
    • Addedwidget_probe_g2
    • Addedwidget_probe_g3
    • Addedwidget_probe_g4
    • Addedwidget_probe_r0
    • Addedwidget_probe_r1
    • Addedwidget_probe_r2
    • Addedwidget_probe_r3
    • Addedwidget_probe_v0
    • Addedwidget_probe_v1
    • Addedwidget_probe_v2
    • Addedwidget_probe_v3
    • Addedwidget_probe_v4

Publisher details

Operator
PROJEKTIONISTEN GmbH · Publisher source
Vendor relationship
Not applicable
Trust center
Not applicable
Restrictions
https://ai.projektionisten.eu/mcp-landingpage/ · Publisher source

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Lets an AI assistant plan public transport journeys across Germany and other countries, with legs, platforms, delays and alerts, plus stop departures, full trip details, place search, and live DB station boards. Tickets and prices are not included.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables keyless access to German and European rail and public transport data, including station search, live departures and arrivals, and multi-leg journey planning with real-time updates.
    261 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables worldwide public transport planning through the Transitous/MOTIS API: door-to-door journeys with walking legs, departures and arrivals at stops, airport terminal stops, place search, and standalone walking routes. Results can be exported as maps and GPX files for outdoor apps.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources