Skip to main content
Glama

departures

Read-only

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.

Input Schema

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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / modes / description
      Previous value: -"Transport-mode filter; the board then shows nothing else. Entries:\n`\"bus\"`, `\"tram\"`, `\"subway\"`, `\"train\"`/`\"rail\"`, `\"ferry\"`,\n`\"transit\"`; several combine. Another entry — a street mode, a misspelling\n— is an argument error, not a dropped filter: a board lists scheduled\nservices. Omitted or empty = all modes. A Stadtbahn or\nlight-rail mention needs BOTH labels — `[\"tram\",\"subway\"]`: which of the\ntwo such a network carries depends on the dataset rather than on the\nvehicle. Set the filter only when the user really asks for a vehicle type;\nthe guide has the rest of the vocabulary and the traps."New value: +"Transport-mode filter; the board then shows nothing else. Entries:\n`\"bus\"`, `\"tram\"`, `\"subway\"`, `\"train\"`/`\"rail\"`, `\"ferry\"`, `\"air\"`\n(flights), `\"transit\"` (all of them but flights); several combine. Another entry — a street mode, a misspelling\n— is an argument error, not a dropped filter: a board lists scheduled\nservices. Omitted or empty = all modes. A Stadtbahn or\nlight-rail mention needs BOTH labels — `[\"tram\",\"subway\"]`: which of the\ntwo such a network carries depends on the dataset rather than on the\nvehicle. Set the filter only when the user really asks for a vehicle type;\nthe guide has the rest of the vocabulary and the traps."
  2. Changed1 schema field changed
    • addedInput schema / properties / lang
      Added value: +{
      +  "description": "Die Sprache der Namen: `'de'` (Vorgabe), `'it'`, `'fr'`, auch mit Region (`'de-CH'`).",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  3. Changed1 schema field changed
    • changedInput schema / properties / id / description
      Previous value: -"Stop id to read the board of, as the resolver hands it out: a DHID (`\"de:03241:57\"`,\n`at:…`, `ch:…`) or a station id (`\"Parentch:1:sloid:3000\"`). Resolve the stop first — a\nname here is an argument error."New value: +"Stop id to read the board of, as the resolver hands it out: a DHID (`\"de:03241:57\"`,\n`at:…`, `ch:…`, `it:…`) or a station id (`\"Parentch:1:sloid:3000\"`). Resolve the stop first — a\nname here is an argument error."
  4. Changed1 schema field changed
    • changedInput schema / properties / id / description
      Previous value: -"Stop id to read the board of, as a DHID (`\"de:03241:57\"`; in Austria and\nSwitzerland `at:…`/`ch:…`). Resolve the stop first — a name here is an\nargument error."New value: +"Stop id to read the board of, as the resolver hands it out: a DHID (`\"de:03241:57\"`,\n`at:…`, `ch:…`) or a station id (`\"Parentch:1:sloid:3000\"`). Resolve the stop first — a\nname here is an argument error."
  5. Changed4 schema fields changed
    • changedInput schema / properties / extended / description
      Previous value: -"`true` keeps the map data in the text: every stop's coordinate, the whole\ncourse of each run, and a polyline where the board carries one — for an\napplication that DRAWS the board. It multiplies the answer. A chat client\nleaves it off."New value: +"`true` keeps the map data in the text: every stop's coordinate, the whole\ncourse of each run, and each departure's way (`pathOnMap`, `pathSource`,\n`additionalInfos.pathKind`) — for an application that DRAWS the board. It\nmultiplies the answer. A chat client leaves it off."
    • addedInput schema / properties / facilities
      Added value: +{
      +  "description": "Instead of the board, the stop's lifts, escalators and ramps („hat Kröpcke einen Aufzug\nzur U-Bahn?\"): `\"elevator\"`, `\"escalator\"`, `\"ramp\"` or `\"all\"`; the guide has the fields.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / first_last
      Added value: +{
      +  "description": "`true` answers instead of the board, per line and direction, the first and the last\nride of a day („letzte Bahn heute\"): the day running now, or the calendar day of `time`\nin local time.",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • changedInput schema / properties / time_range_seconds / description
      Previous value: -"Time WINDOW in seconds, starting at `time`. Together with `last_of_window`\nthis answers „letzte Fahrt\": pick it so the window ENDS after end of\nservice (from the evening on, `28800` = 8 h rather than 4 h). Omit for a\nnormal next-N lookup."New value: +"Time WINDOW in seconds, starting at `time`. Together with `last_of_window`\nit reads the last rides before the window ends: pick it so the window ENDS\nwhere the question does. The last ride of a day is `first_last`. Omit for a\nnormal next-N lookup."
  6. Changed2 schema fields changed
    • changedInput schema / properties / id / description
      Previous value: -"Stop id to read the board of, as a DHID (`\"de:03241:57\"`). Resolve the\nstop first — a name here is an argument error."New value: +"Stop id to read the board of, as a DHID (`\"de:03241:57\"`; in Austria and\nSwitzerland `at:…`/`ch:…`). Resolve the stop first — a name here is an\nargument error."
    • changedInput schema / properties / lines / description
      Previous value: -"Only the departures of these lines, by the ids a board writes: the line alone\n(either direction) as at `mot.line.id`, or line@direction as at\n`mot.line.direction.ids` (`\"de:nds-gvh:gvh-2-9:_1@0\"`); several combine. A line\nNUMBER (`\"9\"`) is no id — read the id off a board first. An entry that is no line\nis an argument error."New value: +"Only the departures of these lines, by the ids a board writes: the line alone\n(either direction) as at `mot.line.id`, or line@direction as at\n`mot.line.direction.ids` (`\"de:VBN-VH:6002:_3@0\"`); several combine. A line\nNUMBER (`\"9\"`) is no id — read the id off a board first. An entry that is no line\nis an argument error."
  7. Changed1 schema field changed
    • addedInput schema / properties / lines
      Added value: +{
      +  "description": "Only the departures of these lines, by the ids a board writes: the line alone\n(either direction) as at `mot.line.id`, or line@direction as at\n`mot.line.direction.ids` (`\"de:nds-gvh:gvh-2-9:_1@0\"`); several combine. A line\nNUMBER (`\"9\"`) is no id — read the id off a board first. An entry that is no line\nis an argument error.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
  8. First observed

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources