Skip to main content
Glama

ViaFrei

Smithery npm Glama ViaFrei MCP connector

Germany's traffic, trains, charging and roads — in your AI assistant.

Ask in plain words. Get the live answer, with its source.

website node licence no API key MCP

viafrei.de · Connect your assistant · For developers · For businesses · All tools · API reference


claude mcp add --transport http viafrei https://mcp.viafrei.de/mcp

Free. No account, no API key, no sign-up. One line and your assistant knows whether the A8 is jammed, whether your train, bus or tram is late, where the nearest fast charger is (and whether it is free, where the operator publishes that), which hydrogen station takes a lorry, whether the lift at your station works and whether the road ahead is forecast to freeze — from official German open data, live, with the source named in every answer. And every German motorway has a live page of its own on viafrei.de, with a map.

Beta. ViaFrei is being stabilised: sources are still being added, and answers and coverage can change. The answers are written by an AI assistant from our data, and AI can make mistakes, so check anything important (a closure, a departure, a price) against the source each answer names.

New in 2.1.25: viafrei.de asks your assistant first. The home opens on one live conversation (a question, the tool, today's answer with its time and sources) and a "Connect in one minute" button. Every example is back, with an examples page listing them all, under a road-sign design that keeps the information of every card. Since 2.1.19 the answers improved too: departures name a long-distance train by its number, an ambiguous station name offers the largest stations first, a road answer says which road classes nobody covers in that Land, charging availability no longer falls behind, find_charging_station counts places rather than records, fuel prices are fetched only when a person asks (every station within 25 km in one request), and a connector reconnects by itself after a server restart.

New in 2.1.18: the website shows the tools' live answers. The figures on the viafrei.de home page now stand beside the question you could ask your assistant and what ViaFrei's own tools answer to it right now, with the tool's name, the data's time and every source credited. A place's cards (warnings, roads, places nearby, charging, parking) carry the answer for that place. It is the same answer your assistant gets through this connector.

New since 2.1.13: a live page for every German motorway. All 122 of them, in seven languages, at viafrei.de/en/motorway and viafrei.de/de/autobahn. Each page has a map of the road with its closures, jams and roadworks, a strip of its junctions you can filter by stretch and direction, the full closures planned for the next seven days with their signed detours, lorry parks with free spaces, chargers by power class and the longest stretch without a fast one, road weather and DWD warnings, traffic cameras, the dated lorry ban, and the interchanges with the motorways each one meets. Fuel prices load only when you click. The home page lists the ten worst motorways right now, and every place page has an Autobahn card with the motorways nearby. 2.1.17 made the pages easy to find: a search title and description per page in every language, an opening sentence an AI answer can quote, a redesigned motorway catalogue on the home page, and a robots.txt that names the AI training crawlers. More in Motorway pages.

The site's cards now say what the tools say. The charging, transit, road and parking cards on viafrei.de answer from the same rules as find_charging_station, check_transit_disruption, check_road_status and find_parking: one charger listed once, a status judged by the same freshness rule everywhere, VBB's live feed for punctuality in Berlin and Brandenburg, shared bikes near a stop, the Land traffic feeds and Hamburg's cameras on the road card, and the share-alike lorry parks and P+R sites in blocks of their own. get_driving_rules now opens its lorry-ban answer with the next ban day, dated.

Earlier in 2.1: hydrogen stations (find_hydrogen_station), company offices in find_poi and what is mapped at an address in find_address, more city roads (Bremen, Kassel, Leipzig, Rüsselsheim am Main, Schleswig-Holstein's large bridges), Kassel's car parks, 23 more charge-point operators, and a jam rule that no longer calls a lane narrowing a jam. Every source is listed, with what it feeds and what we hold back, in SOURCES.md; the CHANGELOG has the whole list.


🧳 What you can ask

You don't need to know any tool names. Ask the way you'd ask a friend who happens to have every German traffic feed open. German or English; the answer comes back in the language you asked in.

when you're…

ask

🌅 about to commute

Wann fährt die nächste Bahn ab Köln Neumarkt? · Fahren Busse und Bahnen in Bayern gerade pünktlich? · When does the next train leave Hamburg Hbf?

🚗 about to drive

Gibt es Stau auf der A8? · Are there roadworks on the A7 next week? · Is the A1 closed anywhere? · Welche Vollsperrungen sind auf der A7 in den nächsten sieben Tagen geplant? · Welche Baustellen gibt es in Bremen? · Ist die Fehmarnsundbrücke wegen Wind gesperrt?

🚚 driving a lorry

Wann ist der nächste Lkw-Fahrverbotstag? · Gilt am 31. Oktober in Niedersachsen Lkw-Fahrverbot?

🚧 stuck in traffic

How much time is the jam on the A3 between Frankfurt and Würzburg costing right now? · Is traffic backed up on the Cologne motorway ring — A1, A3 or A4? · Ist der Elbtunnel auf der A7 heute Nacht gesperrt?

⚡ driving electric or on hydrogen

Where can I charge with Type 2 near Leipzig? · Wo gibt es einen Schnelllader mit 150 kW bei Nürnberg? · Where can I fill up a hydrogen lorry near Hamburg?

🅿️ parking

Is the P+R at Fröttmaning usually full in the morning? · Wie viele Plätze sind in den Kasseler Parkhäusern frei? · Find a rest area with lorry parking on the A9

⛽ filling up

Where is diesel cheapest near Kassel? · Welche Tankstellen gibt es in Weimar?

♿ travelling step-free

Funktioniert der Aufzug am Bahnhof Köln Messe/Deutz?

🌦️ watching the weather

Gibt es eine Unwetterwarnung für Freiburg? · Is the road near Garmisch going to be icy this morning?

📍 looking for a place

What is the address of the Elbphilharmonie in Hamburg? · Welche Apotheken gibt es in Fulda? · My satnav shows 50.1109, 8.6821 — what address is that?

🇩🇪 new to German roads

Do I need an emission sticker for Stuttgart? · Is there a speed limit on the Autobahn?

⏳ waiting for news

Tell me as soon as the closure on the A7 is lifted. · Sag mir Bescheid, wenn in Köln ein Viertel oder mehr der Bus- und Bahnfahrten verspätet ist. · Warn me when a DWD severe-weather warning comes into force for Cologne.

What the answers cover, honestly. Live traffic is the motorways. Closures and roadworks also cover federal roads, Land roads in Niedersachsen, Sachsen, Thüringen and Baden-Württemberg, the city streets of Hamburg and Bremen, the traffic reports some Länder and cities publish (Baden-Württemberg, Schleswig-Holstein, Berlin, Hamburg, Köln, Hannover, Kassel, Leipzig, Rüsselsheim am Main), and the state of Schleswig-Holstein's large bridges; other city streets are not covered. Departures cover every German stop from the timetable; a live delay appears where a realtime feed carries that trip, and otherwise the answer says the time is the plan. Live parking and charging occupancy exist only where the operator publishes them, and an answer never reads "no data" as free. Fuel prices cover the stations we watch, not all of Germany. A charger's live status counts as current only while it is younger than its feed's own window; older, it is shown with its time as possibly out of date. Hydrogen stations are H2 Mobility's published list: pumps and opening hours, but no availability, price or working state, so check before you drive. Places and addresses come from OpenStreetMap, so what is not mapped there cannot be found, and ratings are not part of it. A watch lives in the conversation that opened it: the server keeps every change there, and your assistant shows it when you ask, or on its own if your client supports MCP notifications. Nothing is sent by e-mail or SMS. Up to 10 watches per conversation, each for up to 24 hours (3 by default), and a road is watched as a whole, not one section of it.

Related MCP server: germany-mcp-server

💬 Real answers

These came back from the production server at https://mcp.viafrei.de/mcp. They are not mock-ups. The first two were asked of server 2.1.25 on 2026-10-17 at 18:38 Berlin time, an hour after it went live. The next three were asked of server 2.1.17 on 2026-10-14, around 22:40 Berlin time, minutes after it went live. The next three were asked of server 2.1.8 on 2026-10-13 around 22:40, three more of server 2.1.5 that afternoon, between about 14:50 and 16:20, and the others of server 2.0.10 that morning around 06:41. Those were asked again of server 2.1.17 on 2026-10-14 around 22:43 and answer in the same shape; their figures, and the frost warning, belong to the moment they were captured. Each one shows the first lines of what the tool returned, and the source line as it was sent, shortened where marked.

Alsdorf (05334004): no jams reported, 1 closure, 12 restrictions, 0 planned roadworks sites — window until 2026-10-20.
I do not hold federal and Land roads (Bundes-, Landes-/Staatsstraßen) for North Rhine-Westphalia: for those, this answer is no all-clear.
• Roadworks (Baustelle) A4: Provider text (German): "Instandsetzung Grenze NL_D - AK Aachen · AK Aachen (aus Richtung Aachener Land) nach A4 — Zeitraum dieser Bauphase: Beginn: 25.08.26 um 09:00 Uhr, Ende: 01.12.26 um 15:00 Uhr, (Ende der Gesamtmaßnahme: 01.12.2…" (2026-08-25)
• Roadworks (Baustelle) A544: Provider text (German): "A544 | Aachen - Würselen · Autobahnkreuz Aachen -> Aachen (Europaplatz) — Zeitraum dieser Bauphase: Beginn: 17.10.26 um 05:00 Uhr, Ende: 16.10.27 um 05:00 Uhr, (Ende der Gesamtmaßnahme: 16.10.2…" (2026-10-17)
…

The second line is new in 2.1.23: where no source covers a road class in that Land, the answer says so instead of letting "no jams" read as an all-clear. The same line is on the place's road card on viafrei.de. Edited: the remaining entries and the source line omitted.

Charging around Würselen (05334036) (within 10 km), nearest first:
1. Würselen - Lehnstraße, Lehnstraße 27, 52146 Würselen (Ladenetz) — 0.1 km, Type 2, up to 22.1 kW, 0.50 €/kWh net, status from 2026-10-15 17:37 — possibly out of date (2 charging units)
2. Würselen Rathaus, Rathausstraße 2, 52146 Würselen (Ladenetz) — 0.2 km, Type 2, up to 22.1 kW, 0.41 €/kWh net, status from 13:19 — possibly out of date (2 charging units)
…
Only a few operators publish live occupancy; "no status data" means unknown, not free.

As of 18:38 · Source: Ladepunkte: e-clearing.net (smartlab Innovationsgesellschaft mbH) via Mobilithek, CC0 1.0 (…) · Ladepunkt-Verfügbarkeit: e-clearing.net (smartlab Innovationsgesellschaft mbH) via Mobilithek, CC0 1.0 (…) · …

One line per place, each saying how many charging units it holds; since 2.1.23 a publisher's many records of one car park are one place. A status too old to vouch for is said with its time, never as free. Edited: three of five lines, the site ids and most of the source line omitted.

A7: 27 closures, 188 restrictions, 1 planned roadworks site, 44 current roadworks sites per BASt — window until 2026-10-21.
• Closure (Sperrung): Provider text (German): "A7 | Langenau - Lonetal · Ulm -> Würzburg — Die Baustelle ist zu folgenden Zeiträumen gültig: 20.10.26 21:00 bis zum 21.10.26 05:30 Uhr., (Ende der Gesamtmaßnahme:…"
• Closure (Sperrung): Provider text (German): "A7 | Aalen/Westhausen - Aalen/Oberkochen · Würzburg -> Ulm — Die Baustelle ist zu folgenden Zeiträumen gültig: 14.10.26 22:00 bis zum 15.10.26 05:30 Uhr., 15.10.26 22:00 bis zum 16…" — signed detour (U 12) for AS Aalen/Westhausen – AS Aalen/Oberkochen, route as published by the Verkehrsministerium BW (German): "AS Aalen/Westhausen - B 29 - B 19 - L 1084 - AS Aalen/Oberkochen" — signage context, not a route recommendation
• Closure (Sperrung): Provider text (German): "A7 Hamburg-Marmstorf (AS) Sperrung wg. erforderlicher Gehölzarbeiten · Hamburg -> Hannover — Die Baustelle ist zu folgenden Zeiträumen gültig: 19.10.26 von 09:00 bis 15:00 Uhr, (Ende der Gesamtmaßnahme: 21.10.26)"
…
Sources that answered: Autobahn GmbH, BASt (roadworks), BAB traffic messages, Landesmeldestelle Schleswig-Holstein (police traffic messages), Verkehrsministerium BW (signed detours).

As of 22:38 · Source: Verkehrsdaten: Autobahn GmbH des Bundes (…) · Arbeitsstellen: Bundesanstalt für Straßen- und Verkehrswesen (BASt) via Mobilithek, CC BY 4.0, bearbeitet (…) · …

Each closure in its publisher's words with its night-time windows, and the signed detour where Baden-Württemberg publishes one. The planned full closures on the A7 page are the same question asked by the page itself, so the two cannot disagree. Edited: seven of ten entries, the count of further entries, two notes and most of the source line omitted.

Regeln in Deutschland — Sonntags- und Feiertagsfahrverbot für Lkw:
• Nächster Fahrverbotstag: Sonntag, 18. Oktober, 0–22 Uhr, bundesweit. (Kalender nach § 30 Abs. 3 und 4 StVO, Feiertage geprüft am 2026-10-08)
• Sonntags und an Feiertagen dürfen Lkw über 7,5 t sowie Lkw mit Anhänger von 0 bis 22 Uhr nicht fahren. (§ 30 Abs. 3 StVO)
• Für Pkw, Wohnmobile und Transporter unter 7,5 t gilt das Verbot nicht — der Sonntag ist für sie ein normaler Fahrtag. (§ 30 Abs. 3 StVO)
…
• Ein Feiertag nur einzelner Länder ist nur dort ein Fahrverbotstag: Am 31. Oktober gilt das Lkw-Verbot von 0 bis 22 Uhr in den neun genannten Ländern; in Baden-Württemberg, Bayern, Berlin, Hessen, Nordrhein-Westfalen, Rheinland-Pfalz und im Saarland ist der Tag kein Feiertag nach § 30 Abs. 4 — außer er fällt auf einen Sonntag. (§ 30 Abs. 3 und 4 StVO)
…
Stand 19.09.2026 · Quelle: Verkehrsregeln: ViaFrei, eigene Zusammenstellung aus amtlichen Quellen (StVO, StVZO, 35. BImSchV, StVG, EmoG, AFIR); jede Aussage mit Quelle und Prüfdatum — informativ, keine Rechtsberatung / … (…)

The answer now opens with the next ban day, dated, before the rule itself, and a holiday kept only in some Länder names them. The motorway pages print the same calendar for the Länder each motorway crosses. Edited: the list of holidays and four further rules omitted, and the English half of the source line cut.

Charging around Kassel (within 10 km, ≥ 150 kW), nearest first:
2. Kassel, Germany - Zentrum, Neue Fahrt 9, 34117 Kassel (Tesla, Inc.) — 0.2 km, CCS2, up to 250 kW, 0.48 €/kWh net, status from 10:01 — possibly out of date, 10 without status
4. Circle K I Kassel Leipziger Strasse 22, 34125 Kassel (Spirii) — 1.2 km, CCS2, up to 400 kW, 0.83 €/kWh, status from 09:30 — possibly out of date
…
Only a few operators publish live occupancy; "no status data" means unknown, not free.
Price per kWh: published for 3 of 5 only; for the others we hold no price.

As of 22:43 · Source: Ladesäulenregister: Bundesnetzagentur.de, CC BY 4.0, bearbeitet (…) · Ladepunkte: Tesla Germany GmbH via Mobilithek, CC0 1.0 (…) · …

A status is judged by its feed's own window: one read this morning is shown with its time as possibly out of date, never as free now. The charging card and the motorway pages use the same rule. Edited: a place key, three of five sites, the watch ids, the register note and most of the source line omitted.

"SAP" in Walldorf:
1. SAP SE — company, Hasso-Plattner-Ring 7, 69190 Walldorf, Baden-Württemberg, 49.29442, 8.63995
2. SAP WDF01 — commercial building, Dietmar-Hopp-Allee 16, 69190 Walldorf, Baden-Württemberg, 49.29368, 8.64166
3. SAP WDF02 — office building, Dietmar-Hopp-Allee 14, 69190 Walldorf, Baden-Württemberg, 49.29461, 8.64274
4. SAP WDF03 — office building, Robert-Bosch-Straße 34, 69190 Walldorf, Baden-Württemberg, 49.29296, 8.64373
5. SAP WDF04 — office building, Dietmar-Hopp-Allee 15a, 69190 Walldorf, Baden-Württemberg, 49.29421, 8.64443
…

23 matches, 1–10 shown — the next with cursor="10".

OpenStreetMap data as of 2026-10-06

As of 22:44 · Source: OSM-Standortdaten: © OpenStreetMap-Mitwirkende, ODbL 1.0 (…)

A company's buildings, each with its address and point, from OpenStreetMap, which is also why the answer carries the ODbL line. The answer says how many matched and how to fetch the next page. Edited: five of ten entries and the source URIs cut to ….

"Hasso-Plattner-Ring 7, Walldorf" — 2 mapped objects at this address:
1. Hasso-Plattner-Ring 7, 69190 Walldorf, Baden-Württemberg — 49.29448, 8.63670
   (2 OpenStreetMap objects of this address, up to 145 m apart, shown as one point: outline, usually the building (OSM way; point = its centre))
2. Hasso-Plattner-Ring 7, 69190 Walldorf, Baden-Württemberg — 49.29438, 8.63978 — outline, usually the building (OSM way; point = its centre) — 224 m from point 1
The 2 points lie up to 224 m apart — further than 150 m, so not one door mapped twice; probably several buildings under this house number.

Mapped at this address in OpenStreetMap:
- SAP WDF21 — office building
- SAP WDF19 — office building
- SAP SE — company

As of 22:44 · Source: OSM-Standortdaten: © OpenStreetMap-Mitwirkende, ODbL 1.0 (…)

The address, the buildings mapped under it (and how far apart they are, so "two buildings" is not mistaken for "one door mapped twice"), and the companies and buildings OpenStreetMap places there. Edited: the note on another Walldorf, the data date and the source URIs cut.

Berlin (11000000): 1 jam report, 247 closures, 267 restrictions, 10 planned roadworks sites — window until 2026-10-16.
• Slow traffic (Stockender Verkehr): Provider text (German): "A100 Stadtring Berlin, Wilmersdorf Richtung Neukölln, zwischen Gradestraße und Tunnel Ortsteil Britz, 0,8 km stockender Verkehr" (since 12:35; 6.6 km away)
• Roadworks (Baustelle): Provider text (German): "Karl-Liebknecht-Straße (Mitte) — Richtung Brandenburger Tor in Höhe Spandauer Straße Baustellenfläche für eine Hochbaustelle, Fahrbahn auf einen verschwenkten…" (2026-03-26–2027-09-30)
• Roadworks (Baustelle): Provider text (German): "Gertraudenstraße (Mitte) — in beiden Richtungen zwischen Spittelmarkt und Fischerinsel Brückenprüfung, Fahrbahn auf zwei Fahrstreifen verengt, Gewichtsbeschrän…" (2023-04-27–2028-03-31)
• Closure (Sperrung): Provider text (German): "Rosenthaler Straße (Mitte) — in beiden Richtungen zwischen Hackescher Markt und Sophienstraße Gleisbauarbeiten, Vollsperrung für Kfz-Verkehr" (2026-09-18–2026-10-20)
…
Sources that answered: Autobahn GmbH, BASt (roadworks), VIZ.NRW / NMS, Senatsverwaltung Berlin (traffic messages).

As of 22:34 · Source: Verkehrsdaten: Autobahn GmbH des Bundes (…) · … · Verkehrsmeldungen Berlin: Senatsverwaltung für Mobilität, Verkehr, Klimaschutz und Umwelt Berlin via Mobilithek, Datenlizenz Deutschland – Namensnennung – Version 2.0 (www.govdata.de/dl-de/by-2-0), Daten verändert (…) · …

One jam, not dozens: a lane narrowed for a building site is roadworks, however the police message is filed, and the one queue on the A100 is the jam. Edited: six of ten entries, the radius notes, the other sources of the source line and its URIs omitted.

Hydrogen stations for trucks/buses near Hamburg (within 50 km), nearest first:
1. Hamburg - Schnackenburgallee — 5.5 km · Schnackenburgallee 12, 22525 Hamburg · 350 bar truck/bus, 700 bar car · opening hours: not published (unknown) · record last changed 2026-10-13 (today)
2. Hamburg - Flughafen — 7.9 km · Weg beim Jäger 193, 22335 Hamburg · 700 bar car, 350 bar truck/bus · opening hours: not published (unknown) · record last changed 2026-10-13 (today)
3. Hamburg - Großmoorbogen — 10.0 km · Großmoorbogen 1, 21079 Hamburg · 350 bar truck/bus, 700 bar car · opening hours: not published (unknown) · record last changed 2026-10-13 (today)
No live availability, price or operating status is published — check that the station is working before you drive.

As of 14:50 · Source: Wasserstofftankstellen: H2 Mobility Deutschland GmbH & Co. KG via Mobilithek, CC BY 4.0, bearbeitet (…) · Ortsdaten: © GeoNames (CC BY 4.0), bearbeitet (…)

Only the stations with a 350 bar pump for lorries and buses, because the question was about a lorry. It names what the publisher does not say, opening hours included, and never guesses that a station is working. Edited: the two source URIs cut to ….

Bremen: 4 jam reports, 151 closures, 119 restrictions, 8 planned roadworks sites — window until 2026-10-16.
• Slow traffic (Stockender Verkehr): Provider text (German): "A1 Osnabrück Richtung Bremen, zwischen Dreieck Stuhr und Bremen-Arsten, 4 km stockender Verkehr im Baustellenbereich" (since 12:46; +16 min per Autobahn GmbH; 6.2 km away)
• Traffic restriction (Verkehrseinschränkung) (Bremen): Provider text (German): "Einengung der Fahrbahn; Einengung des Geh-/Radweges; Halteverbot;" (2026-06-01–2026-10-31)
• Closure (Sperrung) (Bremen): Provider text (German): "Vollsperrung; Einengung des Geh-/Radweges; Halteverbot;" (2026-08-17–2026-10-16)
…
Sources that answered: Autobahn GmbH, BASt (roadworks), VIZ.NRW / NMS, Bremen traffic management centre (roadworks).

As of 16:14, unchanged since 13:15 · Source: Verkehrsdaten: Autobahn GmbH des Bundes (…) · … · Baustellen Bremen: Verkehrsmanagementzentrale Bremen via Mobilithek, Datenlizenz Deutschland – Namensnennung – Version 2.0 (www.govdata.de/dl-de/by-2-0), Daten verändert (…) · …

The motorway jam and the city's own building sites in one answer, each in its publisher's words and with its dates, and a line naming every source that answered. Edited: asked in English; a place key, seven of ten entries, the radius notes and three of five sources omitted.

Parking around Kassel (within 10 km), nearest first:
1. Galeria — Car park (Parkhaus), 0.2 km, 210 spaces, 102 free (as of 16:06)
2. Friedrichsplatz — Car park (Parkhaus), 0.2 km, 980 spaces, 579 free (as of 16:06)
3. Kurfürsten Galerie — Car park (Parkhaus), 0.3 km, 560 spaces, 456 free (as of 16:06)
…
As of 16:06 · Source: Parkhäuser Kassel: Stadt Kassel, Straßenverkehrs- und Tiefbauamt via Mobilithek, Datenlizenz Deutschland – Namensnennung – Version 2.0 (www.govdata.de/dl-de/by-2-0), Daten verändert (…) · Parkhaus-Belegung Kassel: Stadt Kassel, Straßenverkehrs- und Tiefbauamt via Mobilithek, … (…) · …
Where no "free" count is shown the operator publishes no occupancy — it does not mean the site is full.

The city's live counts, each with the time of its reading. Edited: asked in English; a place key, two car parks, the separate OpenStreetMap list and two of four sources omitted.

Abfahrten ab Köln Neumarkt — Fahrplan mit Echtzeit, 06:41 bis 07:01:
06:42 Tram 3 → Köln Dellbrück Thielenbruch, Gleis 14, pünktlich
06:43 Tram 7 → Benzelrath Frechen-Benzelrath, Gleis 12, Plan
06:44 Tram 16 → Bonn Bad Godesberg Stadthalle, Gleis 14, +1 Min. (voraussichtlich 06:45)
06:45 Bus 146 → Köln Lindenthal Deckstein, Steig 25, pünktlich
06:47 Tram 18 → Köln Buchheim Herler Str., Gleis 16, +1 Min. (voraussichtlich 06:48)
… und 23 weitere im Fenster.

Stand 06:41 · Quelle: Fahrplandaten: DELFI e.V., CC BY 4.0, bearbeitet (…) · … · Echtzeitdaten: DELFI e.V. via Mobilithek, CC BY-SA, bearbeitet (…)
Die Echtzeitangaben aus DELFI GTFS-RT und DELFI SIRI ET stehen unter CC BY-SA (Share-alike), …
Verspätungen und Ausfälle aus den DELFI-Echtzeitdaten, wo sie vorliegen; mit „Plan“ markierte Zeiten sind Fahrplanzeiten ohne Echtzeitangabe. …

Trams and buses with their live delay, from the same national realtime feeds as the trains. Where no live figure exists the row says Plan, never "on time". Edited: five of ten rows, the stop id line and two of three sources omitted.

7 of 62 reported facilities at Berlin Hauptbahnhof are out of service. Counted are the facilities DB reports for this station.
Escalator 1.UG - Tram Haltestelle 4: out of service
Lift Gleis 3/4 (C/D) - Gleis 11/12: out of service
Lift Gleis 5/6 (C/D) - Gleis 11/12: out of service
Lift Gleis 1/2 (C/D) - 1.UG - EG: in service
… and 54 more.

As of 06:41 · Source: Aufzüge und Fahrtreppen: Deutsche Bahn AG, DB API Marketplace, CC BY 4.0, bearbeitet (…) · …

Each lift and escalator, where it is and whether it works. For anyone with a wheelchair, a pram or a heavy suitcase, this decides whether a station is usable. Edited: four escalator rows omitted, and one source cut to ….

A7: 45 roadworks sites per BASt between 2026-10-13 and 2026-10-20: 44 current, 1 planned. 5 of them are in this answer — raise limit to 20 for the rest.
• Construction works (Baustelle): A7 (+15 more sections) — 1 of 2 lanes closed, hard shoulder closed, 80 km/h limit, phase 2026-06-23 until 2026-10-25 — 2023-03-23 until 2028-04-14 — Provider text (German): "A7 zw. Bad Brückenau-Volkers → Bad Brückenau/Wildflecken 1,602 km; Brückenneubau"
• Construction works (Baustelle): A7 (+3 more sections) — 1 of 3 lanes closed, 80 km/h limit — 2023-10-28 until 2026-12-31 — Provider text (German): "A7 zw. Hammelburg → Bad Kissingen/Oberthulba 1,007 km; Brückenneubau"
…
As of 06:17 · Source: Arbeitsstellen: Bundesanstalt für Straßen- und Verkehrswesen (BASt) via Mobilithek, CC BY 4.0, bearbeitet (…)
Planning data from BASt: road sections only, no coordinates and no live delay. For the situation right now, call check_autobahn_traffic.

Which junctions each site lies between, what is closed, and until when — and it says plainly that this is planning data, pointing to the live tool for now. Edited: the first and the last two of five sites omitted, and the "unchanged since" note cut from the stand line.

I know no filling station from our price data within 5 km of Weimar, … The nearest station with a diesel price is about 19.3 km away — radius_km 20 reaches it. … find_cheapest_fuel can ask the provider which ones are here — new areas one at a time and only a limited number per hour; its answer carries their prices, within about a minute.
More filling stations mapped by OpenStreetMap — we don't have a price for these stations yet:
1. Jet — 1.2 km
2. Star, Rießnerstraße 37, 99427 Weimar — 1.5 km
4. Shell, Rießnerstraße 14, 99427 Weimar — 1.5 km
…
As of 06:41 · Source: Tankstellenpreise: Tankerkönig.de — MTS-K, CC BY 4.0, bearbeitet (…) · OSM-Standortdaten: © OpenStreetMap-Mitwirkende, ODbL 1.0 (…) · …
Hinweis zu den Kraftstoffpreisdaten (MTS-K): Diese Daten dürfen ausschließlich zum Zweck der Verbraucherinformation verwendet werden; …

Where we hold no price, the answer says so, offers the next step, and lists the OpenStreetMap stations nearby — never with an invented price. Where we do hold prices, each priced station is listed with its price per litre and its open state; this page shows none, because of the MTS-K condition. Edited: place keys and a second Weimar removed from the first line, two stations and one source omitted.

Parking around Fröttmaning (within 10 km), nearest first:
1. P+R Fröttmaning — Park and ride (P+R), 0.3 km, 1259 spaces, no live occupancy — forecast for now (weekdays 06–07): usually free (more than 75 % free) – forecast from past experience, as of 12/2024
2. P+R Kieferngarten — Park and ride (P+R), 1.1 km, 235 spaces, no live occupancy — forecast for now (weekdays 06–07): usually free (more than 75 % free) – forecast from past experience, as of 12/2024
Munich's P+R sites are, per the dataset, as a rule only for public-transport passengers („grundsätzlich nur den ÖPNV-Fahrgästen“).
…
As of 06:41 · Source: Datenquelle: dl-de/by-2-0: Landeshauptstadt München – opendata.muenchen.de (bearbeitet) (…) · …
Where no "free" count is shown the operator publishes no occupancy — it does not mean the site is full.

No live count exists here, so it says so and gives the city's own forecast for this weekday and hour, labelled as a forecast and dated. Edited: a place key, one P+R site, the separate OpenStreetMap list and four of five sources omitted.

Charging around Leipzig (within 10 km, Type 2), nearest first:
1. Parkhaus Neumarkt, Neumarkt 30, 04109 Leipzig (Parkhaus Neumarkt) — 0.2 km, Type 2, up to 22 kW, no status data, per charging point register
2. Motel One Leipzig Nikolaikirche, Schuhmachergäßchen 5, 04109 Leipzig (Wirelane GmbH) — 0.3 km, Type 2, up to 11 kW, no status data, per charging point register
…
Only a few operators publish live occupancy; "no status data" means unknown, not free.
Price per kWh: not published for any of these sites (in the data we hold).
Charging point register as of 2026-09-01 — chargers as reported by their operators to the Bundesnetzagentur, with no live occupancy and no warranty of accuracy or completeness.
…

It says what it does not know: "no status data" is unknown, never free, and where an operator publishes a price per kWh the answer shows it. Edited: a place key and the third site omitted, and the stand and source lines cut.

Description of 52.5163, 13.3777:
- Nearest address: Pariser Platz 1, 10117 Berlin (3 m)
- Settlement: Unter den Linden (0.7 km)
- Municipality: Berlin
- State (Land): Berlin
- Junction: Seestraße (4.2 km)

Address data as of 2026-10-06
As of 06:56 · Source: Ortsdaten: © GeoNames (CC BY 4.0), bearbeitet (…) · … · OSM-Standortdaten: © OpenStreetMap-Mitwirkende, ODbL 1.0 (…)

That's the Brandenburg Gate. Edited: one of three sources cut to ….

One official notice for Garmisch-Partenkirchen, highest level 1 of 4:
1. Level 1 of 4 — Wetterwarnung (the DWD's own name; our translation: weather warning) — FROST
   Valid: until 2026-10-13 08:00 (since 2026-10-13 00:00)
   Official DWD wording, reproduced unaltered (German):
   „Amtliche WARNUNG vor FROST“
   For the drive: Expect ice and much longer braking distances; winter tyres are mandatory in these conditions (§ 2 (3a) StVO).

DWD road-surface forecast for the nearest road-weather stations (SWSMOS/METRo model forecast, run 05:00 — not a measurement and not an official warning):
- Station Farchant-Tunnel (open road, 5.3 km) — forecast 06:00: dry (Trocken), road surface 4.6 °C; no slippery class forecast until 2026-10-14 06:42.
…
Quelle: Deutscher Wetterdienst (…) · Quelle: Deutscher Wetterdienst. Datenquelle: BMVBS und Straßenbauverwaltungen der Länder (…) · …
The road-weather station data are unverified point measurements and do not reflect conditions on a road section; …

The official warning word for word, and beside it the forecast for the road surface itself, with what that forecast is not. Edited: the area line, the CAP fields, part of the DWD text, two stations and one source omitted.

On viafrei.de the same data is on the page: the home shows cards for one place, public transport first, then fuel, parking, roads, the motorways nearby, charging, weather and what is nearby, and German towns and cities have place pages under their full names, where each card row with its own point links to OpenStreetMap's map. Since 2.1.9 the cards answer by the tools' own rules, so a card and an assistant asked about the same place say the same thing:

  • charging: one charger published by two feeds is one row, a site whose every point is closed is not listed, and each row says "1 of 2 free (as of 22:21)", "occupied", "out of service", "possibly out of date" or "no status data", which is unknown and never free;

  • transit: Berlin and Brandenburg take their punctuality from VBB's own live feed, a railway station's realtime calls are matched through the national stop directory, and shared bikes within 1 km are listed with their stations;

  • roads: the Land traffic feeds and roadworks registers answer a place as they do in check_road_status, every row says where it is, a city's own street messages are not crowded out by the motorways, Hamburg places name up to two traffic cameras (as links, never an image), and every source behind a row or a count is credited;

  • parking: Trucklounge's lorry parks and the P+R NRW sites appear in blocks of their own, each with its licence's own sentence;

  • the place page adds the low-emission-zone sentence get_driving_rules states for that Gemeinde, and lines suggesting what to ask your assistant to watch.

Each station on the transit card has a line of its own: how many of its lifts and escalators run, each one out of service by name, the platforms the timetable marks step-free, and the car parks and P+R sites within 300 m. The weather card shows the nearest road-weather station's next six hours, and the fuel card names the two nearest hydrogen stations within 25 km.

Why the source line matters. Every answer ends with one, and it is the licence speaking: show it to whoever reads the answer. Copy the line the server sends you, not the ones on this page, which are shortened. See Using the data you get back.

🛣️ Motorway pages

Every motorway in Germany has a page of its own, 122 of them, in seven languages: the index is at viafrei.de/en/motorway (German: viafrei.de/de/autobahn), and a motorway is its number in lower case — the A7 is viafrei.de/en/motorway/a7 and viafrei.de/de/autobahn/a7. A spelling such as A 7, a07 or BAB7 takes you to the same page.

What the A7's page holds, from top to bottom:

  • One sentence about the road, built from its own data: from Füssen to Flensburg/Harrislee, about 928 km on the schematic line, the Länder it crosses in road order and how many junctions and interchanges it has, followed by what is reported now, with its time. On 2026-10-14 the English page read: "The A7 runs from Füssen junction to Flensburg/Harrislee junction, about 928 km long (schematic), through Bavaria, Baden-Württemberg, Hesse, Lower Saxony, Hamburg and Schleswig-Holstein, with 141 junctions and interchanges (24 of them interchanges). Reported on the A7 now: 21 closures, 0 jams, 118 roadworks (as of 22:37)."

  • A map, drawn on the server: Germany's outline and the Länder from the BKG's VG2500, the motorway as a schematic line through the junctions of BASt's Location Code List, closures solid, roadworks hatched, jams with their delay. Where the list has no course for a stretch the line breaks, and the page names the break rather than drawing across it.

  • What is reported now: closures, jams and roadworks under their own heading, then the full closures planned for the next seven days, soonest first, each with the signed detour where Baden-Württemberg publishes one.

  • The junction strip: every junction, interchange and triangle in order, with its counts. A form filters the page by stretch (from, to), direction and layer, and works without JavaScript. Each interchange names and links the motorways it meets, and a chosen stretch gives its own length.

  • Parking and rest: truck stops, lorry parks and service areas with live free spaces where the operator publishes them, and car parks; the share-alike sources (Trucklounge, P+R NRW, and OpenStreetMap's car parks at the junctions) in blocks of their own.

  • Charging: the chargers along the road with their status, the sites by power class, and the longest stretch with no charger of 150 kW or more. It says where chargers are, never that one is free unless its operator says so.

  • Weather: the DWD's official warnings along the road and the road-surface forecast of its road-weather stations.

  • Traffic cameras, as links to the publisher's images.

  • Fuel prices, only when you click: the page itself carries none, and the click loads at most ten stations, each price with its time and the MTS-K note.

  • On every motorway: the lorry ban, dated for the Länder this road crosses (whether it holds now, until when, and the next ban days), the advisory speed, the rescue lane and the emergency numbers, in the same words get_driving_rules uses.

  • Ask your assistant: how to connect, the address to copy, and two or three questions this page can answer, each answered from the page's own rows with its time and source.

The index lists every motorway with its live counts, has a search that takes a number in any spelling, a "worst right now" order (closures and jams first, then the longest delay), and an overview map of Germany with the motorways that have a closure or a jam drawn apart. The home page lists the ten worst motorways right now as cards, and every place card set has an Autobahn card: the motorways near the place, nearest junction first, each linked to its page.

Found by search, classic and AI. Each motorway page has its own title and description in every language ("A7 Germany: traffic jams, roadworks, map"), the motorway sitemaps list every page in every language, and llms.txt and llms-full.txt describe the pages; llms-full.txt also lists every motorway page in English and German. robots.txt keeps the AI training and corpus crawlers off the fuel and place pages, names them one by one, and leaves the motorway pages open to every crawler. The fuel prices are a click no crawler follows.

🔌 Connect in one minute

The product is a hosted MCP server. Point your client at it and the tools appear. There is nothing to install, no key to request and no quota to negotiate. Step-by-step guides for each assistant: viafrei.de/en/connect.

Claude Code

claude mcp add --transport http viafrei https://mcp.viafrei.de/mcp

Claude (desktop app and claude.ai), ChatGPT and other apps that take a connector URL — add a custom connector with this address (in Claude: Settings → Connectors → Add custom connector; in ChatGPT the connector settings need developer mode):

https://mcp.viafrei.de/mcp

Cursor, and any client with an mcpServers file that takes a url, over HTTP:

{ "mcpServers": { "viafrei": { "url": "https://mcp.viafrei.de/mcp" } } }

VS Code (.vscode/mcp.json, or MCP: Add Server from the command palette):

{ "servers": { "viafrei": { "type": "http", "url": "https://mcp.viafrei.de/mcp" } } }

Clients that speak only stdio — for example Claude Desktop's config file (claude_desktop_config.json, opened from Settings → Developer → Edit Config). That is what this package is for:

{ "mcpServers": { "viafrei": { "command": "npx", "args": ["-y", "viafrei"] } } }

Node 22 or newer. npx fetches the bridge when your client starts it. If the file already has an mcpServers block, add the "viafrei" entry inside it rather than pasting a second block.

An older client on HTTP+SSE is answered too, at https://mcp.viafrei.de/sse. The transport is deprecated in the specification, so prefer the address above when you can:

claude mcp add --transport sse viafrei https://mcp.viafrei.de/sse

Restart the client and ask one of the questions above.

Where to find ViaFrei

  • npm — viafrei. This package: the stdio bridge, for the config line above. Its page shows the current version and this README.

  • Smithery — smithery.ai/servers/viafrei/viafrei. Connect through Smithery's hosted connection, with no local install.

  • Glama — glama.ai/mcp/servers/mavrovde/viafrei-mcp. The directory listing for this repository, with the tool list.

  • Official MCP Registry — de.viafrei/mcp. The hosted endpoint, as MCP clients and directories that read the registry find it; server.json is the entry. It is republished with every release of this package, after the npm publish, and only when the live server reports the same version.

  • For AI tools — viafrei.de/llms.txt and llms-full.txt: what ViaFrei is, how to connect, every tool in one line each, the example questions with the tool that answers each, and the live pages (the motorway index, an example motorway page, the place pages); llms-full.txt also lists every motorway page in English and German.

🧰 Everything it can do

22 tools, 9 prompts, 10 resources and 2 resource templates — server 2.1.25, snapshot of 2026-10-17. Each line is the server's own words; the full parameters are in API.md.

🚗 On the road

tool

what it answers

check_autobahn_traffic — Autobahn traffic

Jams, slow traffic, closures and roadworks in force this minute on up to 5 motorways, with delay/speed.

check_road_status — Road status and closures

Whether a motorway, B or Land road (NI, SN, TH, BW: pass the Land/town as place) is open, closed, restricted, now or coming days; by place, jams, city/Land messages, Hamburg traffic cameras.

find_roadworks_ahead — Planned roadworks

Returns roadworks PLANNED on one motorway, one Bundes-/Landesstraße in NI, SN, TH or BW, or Hamburg city streets by place, in a date window: section, restriction, dates.

find_parking — Parking nearby

Parking near a place, a coordinate or along one motorway: motorway lorry parks, car parks and P+R sites, with total spaces and, where published, free spaces now and the reading's age.

🚆 Public transport

tool

what it answers

get_train_departures — Train departures

Next trains from a German railway station: platform, delay, cancellations.

get_departures — Scheduled departures (bus, tram, train)

Scheduled departures from any German stop — bus, tram, U-Bahn, S-Bahn, train, ferry.

check_transit_disruption — Public-transport disruption in a region

How punctual public transport is now in one German region: the share of trips ever over 5 min late, trips with a cancelled stop, the trend, and the service alerts in force there (diversions, closed stops).

check_station_facilities — Station lifts and escalators

Report whether the lifts and escalators of a German railway station — or of a Köln Stadtbahn stop — are working now: each one, where it is, its state (in service / out of service / unknown) and the operator's explanation.

⚡ Charging and fuel

tool

what it answers

find_charging_station — EV charging nearby

Returns EV charging sites near a place or coordinate with operator, connector types, maximum power, price per kWh where published, and how many points are free right now where the operator publishes live status.

find_cheapest_fuel — Cheapest fuel nearby

Returns the cheapest stations for one fuel grade near a place or coordinate: price per litre, brand, address, distance, open state.

find_fuel_station — Find a filling station

Finds filling stations around a place or coordinate under any combination of filters — grade, brand, name, open now, open at a time you name, open 24 h — sorted by distance, price or name.

find_hydrogen_station — Hydrogen stations nearby

Returns hydrogen (H2) filling stations near a place or coordinate, nearest first, with operator, address, pumps (700 bar car, 350 bar truck/bus), opening hours where published and the age of the record.

📍 Places and addresses

tool

what it answers

find_place — Look up a place

Looks up a place name and returns every place that matches, each with its kind, official key (AGS/RS), population, English name and coordinate.

find_poi — Find a named place

Finds a business or landmark by name or kind — company, shop, clinic, hotel, hostel — with address, category and coordinate.

find_address — Look up a street address

Looks up a street address: its coordinate, and the named OpenStreetMap objects at it (company, shop, office) or that none are.

describe_location — Describe a coordinate

Turns a coordinate into words: the nearest address, settlement and motorway junction with their distances, and the Gemeinde, Kreis and Land the point lies in.

find_nearby — What is nearby

Overview of what is around a place or coordinate: nearby fuel stations, EV charging, parking, the nearest railway station and motorway junction, each with its distance.

🚲 Sharing

tool

what it answers

find_sharing — Shared bikes nearby

Returns rentable shared bikes near a place or coordinate: bike-sharing stations with bikes and free docks now, and free-floating bikes around, with distance and data age (nextbike incl. KVB Rad, MyRadl, VAG_Rad; Donkey Republic).

🌦️ Weather and rules

tool

what it answers

check_weather_warnings — Weather warnings and road-surface forecast

Returns the official DWD weather warnings in force for a place — storm, snow, ice, heavy rain, thunderstorm, heat — with Warnstufe 1–4, area, validity and the official text unaltered.

get_driving_rules — German driving rules

Returns the German road rules a visitor needs: low-emission zones (Umweltzone) and which Feinstaubplakette a city requires, speed limits (advisory 130), winter tyres, alcohol, the Sunday lorry ban, tolls (no car toll), Rettungsgasse, what must be in the car, and electric cars (E-Kennzeichen, ad-hoc payment, plugs).

🔔 Watches

tool

what it answers

watch_situation — Watch for a change

Opens a watch so THIS conversation is told when something changes: a road reopening, a stop running late, a weather warning, a charge point turning free.

stop_watch — Stop a watch

Ends a watch this conversation opened with watch_situation, so no further notifications arrive for it.

🧭 Prompts — ready-made briefings

Pick one in your client's prompt menu and fill in the blanks; it calls the right tools in the right order.

prompt

what it does

plan_departure — Trip briefing before departure — Reise-Briefing vor der Abfahrt

Briefs a drive that is about to start: the official weather warnings at both ends, whether each motorway is open, and the jams in force this minute, ending in one go/no-go sentence.

compare_travel_options — Drive or take the train? — Auto oder Bahn?

Weighs one trip by car against the same trip by rail: closures and live jams on the motorway side, the next departures and the region's punctuality on the rail side, as two paragraphs the traveller can compare.

prepare_car_trip — What you need before driving in Germany — Vorbereitung der Autofahrt

Collects what a driver must carry and know before driving in Germany and into one particular city: the low-emission-zone badge, speed limits, winter tyres, the alcohol limit, tolls, mandatory equipment and the rules for an electric car.

plan_fuel_stop — Refuel or charge on the way — Tank- oder Ladestopp unterwegs

Finds where this traveller fills up or charges on the way: the cheapest stations for one fuel grade around one place, or the charging points with the right connector and power, and the rest area beside them if they also need a break.

plan_commute — Plan today's commute by train — Pendelfahrt für heute planen

Plans one public-transport leg on the day itself: the next departures from the station with delays, platforms and cancellations, and whether the region's buses and trains are running normally at this hour.

plan_arrival_parking — Where to leave the car on arrival — Parken am Ziel

Finds where to leave the car at the end of the drive: the car park in town, the park-and-ride at the edge with the onward departures, or the rest area if the traveller is early.

find_a_place — Find out what a name refers to — Herausfinden, was ein Name meint

Resolves a bare name of unknown kind into a place, a named thing, or an address, trying each table in turn and stopping at the first that answers.

plan_local_errand — What is around this place? — Was ist hier in der Nähe?

Answers "what is around here" for one place: the nearest fuel, EV charging, parking, railway station and motorway junction in one glance, then — only if the traveller wants more than the nearest one — the depth tool for that one category.

explain_this_coordinate — Say where a coordinate is — Sagen, wo eine Koordinate liegt

Turns a bare lat/lon into a sentence a traveller understands: the nearest address, settlement and motorway junction with their distances, and the Gemeinde, Kreis and Land the point lies in.

📚 Resources — reference your assistant can read

resource

what it holds

viafrei://attribution — Data sources & attribution

Licence and attribution text for every data source ViaFrei uses.

viafrei://coverage — Coverage

Which feeds, places and vehicles ViaFrei can answer for right now — licence, cadence and freshness per feed, which large cities hold no fuel price yet, plus what is deliberately not covered.

viafrei://rules/driving-in-germany — Driving in Germany — the rules a visitor needs (DE/EN)

Curated, sourced and dated: low-emission zones, speed, winter tyres, alcohol, tolls, the Sunday lorry ban, equipment, emergencies and electric driving.

viafrei://rules/low-emission-zones — Low-emission zones (Umweltzonen) — city, zone, plaque, where to buy it (DE/EN)

Which German cities run a low-emission zone, which Feinstaubplakette they require and where to buy it.

viafrei://emergency — Emergency in Germany — 112, 110, rescue lane, breakdown, crash (DE/EN)

What to dial, how to form the Rettungsgasse, what to do in a breakdown or after a crash, and what the law requires you to carry.

viafrei://rules/electric-driving — Electric driving in Germany — E plate, charging, payment, plugs (DE/EN)

What an electric car needs in Germany: the E-Kennzeichen and why its privileges differ per city, the green plaque, the right to ad-hoc card payment, plug standards, how prices are shown, etiquette and what to do in an emergency.

viafrei://status/feeds — Feed status

Per feed: is it still arriving?

viafrei://watches — My watches

The watches THIS conversation has open, with what each one is watching and when it expires.

viafrei://gazetteer — Gazetteer coverage

What the place index (gazetteer_places) holds: rows and last load per source and kind, how many carry an English name, and the sixteen Länder it can name — the coverage behind find_place/find_poi/find_nearby's place answers.

viafrei://addresses — Address coverage

What the OSM-derived address table (osm_addresses) holds per Bundesland — the Länder and each one's extract date read from the rows, the row counts estimated from the planner's statistics and labelled so — plus the ODbL § 4.6 offer owed to anyone who receives an address-derived result.

viafrei://watch/{id} — One watch

One watch of this conversation: what is being watched, what it has reported, and the attribution of the data behind each report.

viafrei://place/{query} — A resolved place

One place, poi or address resolved the same way every tool resolves place — a point, a short list of candidates, or an honest no — so a name can be pinned once and reused as lat/lon.

The running server is the source of truth. This list and API.md are rendered from a dated snapshot of it, and CI fails if either drifts from that snapshot. Ask any MCP client for tools/list to see what is live this minute.

Worked use cases

Walkthroughs that chain several tools, each naming what comes back:

How well it answers, measured: test rounds of up to nearly 3,000 questions in German and English against production, with every finding published.

🛠️ For developers

It's plain MCP over HTTP. You can call it without an SDK:

# 1. open a session
curl -si https://mcp.viafrei.de/mcp \
  -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"me","version":"0"}}}' \
  | grep -i mcp-session-id

# 1b. tell the server you are ready — the MCP lifecycle requires it before any request
curl -s https://mcp.viafrei.de/mcp \
  -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
  -H 'mcp-session-id: <from step 1>' -H 'mcp-protocol-version: 2025-06-18' \
  -d '{"jsonrpc":"2.0","method":"notifications/initialized"}'

# 2. ask a question (put the session id from step 1 in the header)
curl -s https://mcp.viafrei.de/mcp \
  -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \
  -H 'mcp-session-id: <from step 1>' -H 'mcp-protocol-version: 2025-06-18' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"check_weather_warnings","arguments":{"place":"Freiburg im Breisgau","language":"en"}}}'
  • One endpoint instead of a stack of integrations. SOURCES.md lists the more than 140 sources behind it, among them Autobahn GmbH, Deutsche Bahn, DWD, DELFI, VBB, the national access point Mobilithek, MobiData BW, the Bundesnetzagentur, dozens of charge-point operators, H2 Mobility, city open-data portals, BKG, GeoNames, OpenStreetMap and MTS-K. Each has its own format, release rhythm and licence, and they arrive here as one protocol.

  • Results are written to be read aloud. A tool answers in sentences an assistant can pass on, says what it does not know ("no status data means unknown, not free"), and ends with the source line.

  • Annotated honestly. Twenty of the twenty-two tools are read-only and idempotent (readOnlyHint, idempotentHint), so a client can call them without a confirmation prompt. The two watch tools are not, because opening or stopping a watch changes what the server will tell you later, and their annotations say so.

  • Prompts and resources, not only tools. Nine ready-made briefings, and a reference shelf (driving rules, emission zones, emergency numbers, attribution) your assistant can read directly.

  • Watches. watch_situation turns polling into a notification for as long as the session lives: a road closure appearing or clearing, a stop's departures running late, a region's late share reaching a threshold (a quarter by default), a DWD warning coming into force, a charge point turning free. Three hours by default, 24 at most, and at most 10 per session. What a watch has reported is readable at viafrei://watches and viafrei://watch/{id}, and a client that subscribes to that resource is told when it reports something new. It reaches no inbox and no phone.

  • Machine-readable failures, in the bridge too: one line on stderr and a distinct exit code per cause (see below).

Bridge configuration

option

what it does

--url <url>

endpoint to relay to. Default https://mcp.viafrei.de/mcp. See the note below

--header "Name: value"

extra HTTP header on every request, repeatable. For an API key, when there is one

--timeout <ms>

per-request timeout, default 30000. The event stream is never timed out

--version, --help

print and exit

Many MCP clients can only pass an env block, not arguments, so every option has an environment variable too:

variable

same as

VIAFREI_MCP_URL

--url

VIAFREI_MCP_HEADER

--header. Separate several headers with a newline, which can never appear in a header name or value. That way nothing you might need to send is unrepresentable: a comma, a semicolon and a space all occur inside real header values

VIAFREI_MCP_TIMEOUT_MS

--timeout

A flag wins over the variable, and the variable wins over the built-in default. A --header of the same name replaces one from the variable; a --header of a different name is added alongside it.

There is no self-hosted ViaFrei. The server is a hosted service. --url is not a way to run your own: it exists for a proxy or gateway in front of the service, and for the stub server this repository's test suite starts.

When something is wrong

The bridge prints one line to stderr and exits with a code that says what happened. No stack traces:

viafrei: cannot reach https://example.invalid/mcp: host not found (DNS) (ENOTFOUND) - check your network connection; --url only if you relay through a proxy

The same text also goes back to the client as a JSON-RPC error, so an assistant can say what went wrong instead of going quiet.

exit

meaning

0

clean shutdown (the client closed stdin, or sent SIGINT/SIGTERM)

1

something else went wrong; the line says what

2

bad usage: a flag or a value the bridge does not accept

3

the endpoint could not be reached, stopped answering, or never answered in time

4

the endpoint answered and the bridge cannot continue: it refused (the line names the HTTP status), forgot the session, answered with something that is not MCP, or redirected to another origin

5

protocol version mismatch; the line names the version the server speaks

A slow call may be a retried call. A 429, 502, 503 or 504 is tried again once, after the delay the server asked for in Retry-After, or 250 ms when it asked for none. A connection that fails outright (reset, broken pipe, socket or connect timeout) is tried once more after 250 ms. Two cases are not retried, because waiting would be worse than answering: a 429 with no usable Retry-After, and any requested delay longer than your timeout. An event stream is never retried.

Your timeout bounds each request, not the whole call. Two attempts plus a delay can add up to about three times the timeout, and more if the endpoint redirects. If you need a hard ceiling, enforce it on your side.

An established session may wobble: a dropped event stream is a warning, and the bridge reconnects. It may not stay dead in silence. Several failures in a row with nothing succeeding in between end the process with the code above, so the client that started it finds out.

What the bridge does not do

  • No tracking. No telemetry, no analytics, no usage counter, no update check.

  • No stored files or credentials. It writes no file outside the OS temp directory. --header is passed through to the endpoint and is never persisted or logged.

  • No cross-origin redirects. A redirect off the origin you pointed it at is refused with one line naming both ends, so a server cannot forward your API key somewhere you did not choose. Same-origin redirects are followed normally.

💼 For businesses

  • The licence work is done, and it travels with the answer. Each result carries the attribution its sources require. Where a source attaches a condition, the result states it: share-alike is flagged, and the MTS-K purpose limit arrives as a sentence you are meant to show.

  • Built for answering people. Live figures, sourced and dated, in the language of the question. Good for travel and mobility assistants, dispatchers' briefings, customer service and step-free station checks.

  • Read the business page: viafrei.de/en/business. It covers six use cases and how to work with us.

⚖️ Using the data you get back

Every result carries an attribution line. Show it to the person reading the answer. The full register is at the resource viafrei://attribution, and SOURCES.md is the readable version: every publisher, what it covers, its licence, and the exact line to reproduce.

Two constraints matter more than the rest, because getting them wrong is a licence breach rather than a style problem:

  • MTS-K fuel prices are consumer information only. Any other use is unlawful in any form, raw, reformatted or aggregated, and never for the fuel industry or its IT providers. On top of that we ask for no redistribution at all: answer the person who asked; do not build a product out of it. (This is also why this page shows no fuel price.)

  • DELFI's realtime and disruption feeds are Creative Commons Attribution-ShareAlike (its static timetable and stop directory are CC BY 4.0, and so is VBB's Berlin-Brandenburg feed). Share-alike travels with anything you derive from it: recompute it, reshape it, rearrange it or build a delay table out of it, and that is Adapted Material you must license under BY-SA (art. 1(a) names material "translated, altered, arranged, transformed, or otherwise modified"). Merely showing it beside another source's data is an aggregation and puts no obligation on the other source. The realtime feeds' catalogue records name no licence version, so do not rely on one for a derivative; SOURCES.md has the detail, and also covers the two share-alike databases under the ODbL (OpenStreetMap and one lorry-park operator).

See also NOTICE and LICENSE.

🗣️ Tell us when an answer is wrong

ViaFrei is live, free, and still growing. Some sources are thinner than they will be, and a tool can be slow or wrong. A tool that fails is something the server sees. A tool that answers confidently with the wrong thing is not. Use the A tool answered badly, or not at all issue template, saying what you asked and what came back. That report is the one thing we cannot get any other way.

The server itself

The MCP server is a hosted service, and its source is closed. It is not in this repository and is not published. What is public is the part meant to be: the tool names, descriptions, input schemas, result shapes and attribution lines, which is everything a client reads from tools/list. We say this plainly so nobody spends an evening looking for the server code.

Contributing · Security · Licence

  • Contributing: yes, please. See CONTRIBUTING.md and CODE_OF_CONDUCT.md. The bridge is small and self-contained, which makes it a good place for a first patch.

  • Security: never open a public issue for a key, a token or anything that looks like one. SECURITY.md has the private reporting path.

  • Licence: Apache-2.0 for this code. Data obtained through the server keeps its provider's licence; see NOTICE.

viafrei.de — Deutsch · English · Русский · Български · Українська · Română · Türkçe

Available Tools

22 tools
check_autobahn_trafficA
Read-onlyIdempotent

Jams, slow traffic, closures and roadworks in force this minute on up to 5 motorways, with delay/speed. Use when asked about a named motorway now: Stau, a delay, how it looks, or a LIST of closures now; name every motorway (Munich→Berlin: A9). Do NOT use for yes/no: is a road open/closed/passable — check_road_status, even now — nor a closure with no time word or a later one (tonight, weekend); Baustellen dated or geplant — find_roadworks_ahead; Stau in a town, no motorway — check_road_status; fuel (find_cheapest_fuel), trains (get_train_departures). ~5 min old. Show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindsNoWhich event kinds to return: warning = live traffic (jams, slow traffic, hazards), closure = full closures, roadworks = construction sites. Set it when the SUBJECT of the question is one of those categories by name: "Baustellen auf der A8?" is ["roadworks"], "welche Sperrungen sind in diesem Moment gemeldet?" is ["closure"]. Omit it when the question is how the road IS — Stau, frei, a delay, "wie sieht es aus", "everything"; the German "Stau?" is the idiom for the whole picture, and a filter nobody asked for hides the closure on the same stretch. Whether a closure question is this tool's at all is decided by two things, and the noun (Sperrung, Vollsperrung, closure) is neither. FIRST THE CLOCK: only a question about this minute (jetzt, gerade, in diesem Moment, right now, at this very minute) can be this tool's — with no time word at all, or for a later window (tonight, heute Abend, am Wochenende, the coming days), it is check_road_status. SECOND, WHAT IS ASKED, which the clock cannot see: what is REPORTED or in force on a named motorway is this tool ("which closures are in force on the A100 at this very minute?"), while whether the road is OPEN or passable is check_road_status AT ANY CLOCK — "ist die A8 offen", "ist die A3 in diesem Moment gesperrt?", "komme ich da durch?" — and so is a closure asked around a town instead of on a motorway number. Baustellen with a date or the word geplant are find_roadworks_ahead. Default: all three.
limitNoMaximum events to return across all roads (1–50, default 10). Jams come first, then closures, other reports, then roadworks; within each the roads take turns in the order you listed them, so every road gets its share of the page. Only what is in force now is listed — closures announced for later are counted apart in the headline.
roadsYesAutobahn numbers, e.g. ["A9"] or ["A8", "A99", "A9"] (1–5 per call). Name every motorway on the route so the whole drive is briefed in one call — "A9", "A 9" and "a9" are the same road. Results are grouped per road, in the order you list them.
cursorNoPagination cursor from a previous result's _meta.nextCursor. Omit for the first page.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds that the data is about 5 minutes old (a freshness/staleness caveat) and requires showing an attribution line, which are behavioral obligations beyond the annotations. It does not describe pagination behavior or error cases, but the freshness and attribution details are meaningful additions.

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?

The description is dense and front-loads the core purpose, but it is very long with nested clauses and multiple exclusion paths crammed into one paragraph. Every sentence does carry routing information, but the structure could be tighter. It earns its space but is not concise.

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 5 parameters, no output schema, and a rich input schema with full coverage, the description is complete. It covers what the tool returns, its freshness, the attribution requirement, and acts as a router to all relevant sibling tools. An agent has everything needed to call it correctly.

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 already 100%, so the schema documents each parameter. The description goes further by explaining semantic intent: 'roads' should list every motorway on a route for one call, 'kinds' should be omitted when the question is about how the road IS, and 'language' must be set on every call to avoid a wrong-language answer. These clarify usage in ways the schema's own descriptions reinforce but the tool-level text makes actionable.

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 a specific verb (reports jams, slow traffic, closures, roadworks), a resource (up to 5 motorways), a temporal scope (in force this minute), and the data returned (delay/speed). It explicitly distinguishes itself from siblings like check_road_status and find_roadworks_ahead, so an agent can differentiate it without opening the 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?

The description gives explicit when-to-use criteria (named motorway, now, Stau, list of closures) and when-not-to-use with named alternatives for each excluded case: yes/no open/closed goes to check_road_status, dated/geplant roadworks to find_roadworks_ahead, town Stau to check_road_status, fuel to find_cheapest_fuel, trains to get_train_departures. This is about as complete as usage guidance gets.

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

check_road_statusA
Read-onlyIdempotent

Whether a motorway, B or Land road (NI, SN, TH, BW: pass the Land/town as place) is open, closed, restricted, now or coming days; by place, jams, city/Land messages, Hamburg traffic cameras. Use when asked if a road is open/passable — "ist die A8 in diesem Moment gesperrt", "komme ich durch", at any clock, closures tonight/weekend — or city Stau: "Stau in Köln?". Do NOT use for jams/delays on a named motorway or multi-motorway route — check_autobahn_traffic; roadworks in a date window — find_roadworks_ahead; city street: not held, say so. ≤ 14 days, ≤ 11 entries. Show attribution.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
roadNoOne German motorway or federal road, e.g. "A8" or "B27", or a Landes- or Staatsstraße in Niedersachsen, Sachsen or Thüringen, e.g. "L1025" or "S296". "A8", "A 8" and "a8" are the same road. Use this whenever the person named a road — it is the only input that reaches the planned-works data, which is filed by road and section and carries no coordinates. When the person also says WHERE — a town or a Bundesland ("die B2 bei Potsdam", "L1025 in Niedersachsen") — pass that as place too: only sources for that Land answer, and a Land no source covers is named. L and S numbers repeat in every Land, so give the Land with them. Otherwise give exactly one of road, place, or lat+lon.
limitNoMaximum entries to return (1–11, default 10). By road, closures come first, then restrictions in force, then planned works; by place, nearest first.
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway junction ("AK Neufahrn"), or a street address with a house number ("Bahnhofstraße 12, 36037 Fulda"). A motorway number alone ("A7") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
horizon_daysNoHow many days ahead to look, counting from now (0 = right now only, max 14, default 3). Set it only to what the person actually asked for: 0 when they said right now / gerade / jetzt / in diesem Moment, 1 for tonight or heute Abend, 3 for "this weekend", 7 for "next week", and for a named weekday ("am Freitag", "on Friday") the number of days from today to that day. A bare "is the A8 open?" asks for no window — omit the argument and take the default rather than reading it as 0. Live closures are always included whatever this is, and so, by place, are the jams reported right now ("Stau in Köln?" needs no horizon).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds real behavioral context the annotations don't: the ≤14-day and ≤11-entry caps, ordering semantics (closures first, then restrictions, then planned works; nearest-first by place), the requirement to show attribution, and the frank statement that city street data is not held.

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?

Purpose and routing are front-loaded well, but the block is dense — long parenthetical lists, mixed German/English examples, and multiple constraints packed into single sentences. It is information-rich but not cleanly segmented, so scanability suffers.

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 7-parameter, zero-required, no-output-schema tool with full schema descriptions and safety annotations, the description covers routing, scope limits, ordering, language handling, and data gaps. An agent has everything needed to call it correctly.

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 reasoning the schema states only piecemeal: pass Land/town with L/S numbers because they repeat, road is the only path to planned-works data, and one of road/place/lat+lon. It reinforces but does not merely repeat the schema.

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 a specific verb and resource — road open/closed/restricted status across motorways, B/L/S roads, by place, jams, cameras — and explicitly distinguishes itself from check_autobahn_traffic, find_roadworks_ahead, and city-street coverage. 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?

It gives explicit when-to-use triggers with quoted German examples ('ist die A8 in diesem Moment gesperrt', 'Stau in Köln?') and explicit when-not-to-use routing to three named siblings with the condition that selects each. This is a model negative-and-positive routing block.

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

check_station_facilitiesA
Read-onlyIdempotent

Report whether the lifts and escalators of a German railway station — or of a Köln Stadtbahn stop — are working now: each one, where it is, its state (in service / out of service / unknown) and the operator's explanation. Use when asked about step-free access or a broken lift: "Funktioniert der Aufzug am Kölner Hauptbahnhof?", "is the lift at Hamburg Hbf working?", "Rolltreppe am Neumarkt kaputt?", wheelchair, pram, heavy luggage. Do NOT use for train times, platforms or delays — call get_train_departures. At most 50 facilities, out-of-service ones first. Results carry their attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many facilities to list (1–50, default 20). Out-of-service equipment is listed first and the counts in the summary always cover ALL of them, so a shorter list never hides a broken lift.
eva_noNoThe station's EVA number (6–8 digits, e.g. 8000207 for Köln Hbf), when a previous result — a departure board, for instance — already gave you one. It skips the name lookup and is exact.
stationNoThe railway station — or Köln Stadtbahn stop — as the person says it: "Köln Hbf", "Hamburg Hbf", "Munich Central", "Neumarkt Köln". Pass their words — English names and "central station" are understood. If the name fits several stations the result lists them and asks which; do not guess one yourself. Give either station OR eva_no, never both.
facilityNoWhich equipment to report: "elevator" for lifts only, "escalator" for escalators only, "any" for both (default). Pass a value only when the person named the equipment itself ("Aufzug", "Rolltreppe", "lift", "escalator"): a question about a wheelchair, a pram, heavy luggage or step-free access keeps the default — an escalator carries a suitcase too, and a filter there hides half of what the traveller needs. Filtering does not change how a broken one is reported, only which ones are listed.any
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered and the bar is lower. The description still adds real behavioral context beyond them: a 50-facility cap, out-of-service equipment listed first, the guarantee that summary counts cover all facilities so a short list never hides a broken lift, and an attribution line on results. Ambiguous station names producing a disambiguation list ('the result lists them and asks which; do not guess') is a genuinely useful behavior disclosure, though nothing is said about failure modes when a station has no facility data.

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 front-loaded with the core purpose, then usage triggers, then the exclusion. It is long, but each sentence does work — the bilingual examples exist to route non-English queries and the exclusion prevents misrouting to departures. The clause about attribution lines is slightly marginal, keeping it off a 5.

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 return-value burden and does so: it lists the per-facility fields (location, state, operator explanation), the ordering rule, the cap, and the attribution line. Combined with annotations covering the safety profile and a 100%-covered schema, an agent has everything needed to call it correctly.

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% and the parameter descriptions are unusually thorough, so the baseline is 3. The description only echoes the limit semantics ('At most 50 facilities, out-of-service ones first') already spelled out in the limit field; it adds no new meaning for eva_no, station, facility or language beyond what the schema already documents.

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 names a specific verb and resource ('Report whether the lifts and escalators ... are working now') and enumerates exactly what is returned: each facility, its location, its state (in service / out of service / unknown) and the operator's explanation. It also distinguishes itself from the nearest sibling by name ('Do NOT use for train times, platforms or delays — call get_train_departures'), so an agent can separate it from get_departures without opening a 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 triggers are given with multilingual user phrasings ('Funktioniert der Aufzug am Kölner Hauptbahnhof?', 'Rolltreppe am Neumarkt kaputt?') plus the intent vocabulary that should route here: wheelchair, pram, heavy luggage, step-free access. An explicit exclusion and named alternative (get_train_departures) covers the main confusion case, leaving nothing to inference.

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

check_transit_disruptionA
Read-onlyIdempotent

How punctual public transport is now in one German region: the share of trips ever over 5 min late, trips with a cancelled stop, the trend, and the service alerts in force there (diversions, closed stops). Use when asked whether buses and trains run normally, or a strike, storm or works disrupt them. Do NOT use for a station's departures or a line from a named DEPARTURE station ("RE1 ab Köln Hbf verspätet?"; a destination, "nach …"/"zum …", is not one) — get_train_departures. No per-line figures. Window ≤ 120 min. CC BY-SA (DELFI) or CC BY 4.0 (VBB, Berlin/Brandenburg): show attribution.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use region.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use region.
regionNoThe German region to report on, as free text: a Bundesland ("Bayern", "Bavaria", "Nordrhein-Westfalen"), a city ("Hamburg", "Köln"), a Kreis ("Landkreis Fulda") or one of the conurbations Ruhrgebiet, Rhein-Ruhr and Rhein-Main. A town inside a Kreis is reported as that Kreis and the answer says so, because the data is filed at Kreis level. Not a stop, not a street, not an address. Give either region OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
window_minNoHow many minutes back to look, 5–120 (default 60). The trend compares this window with the equally long one before it, so 60 means "the last hour against the hour before". Use a short window for "right now" and a long one for "has it been bad all morning".

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds traits they cannot carry: no per-line granularity, a hard 120-minute window cap, region-level data filing (a town is reported as its Kreis and the answer says so), and mandatory licence attribution (CC BY-SA DELFI / CC BY 4.0 VBB). These are real operational constraints an agent must respect.

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 and tightly packed, with the when/when-not routing and the licence clause each doing work. The parenthetical German query examples add length but also real disambiguation value, so only minor trimming is possible.

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 return burden and does so — it names the four reported metrics and the alert types (diversions, closed stops). Zero required parameters plus documented lat/lon-vs-region exclusivity and the language default warning cover everything needed to call it correctly.

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 largely restates the window limit ("Window ≤ 120 min") already documented in the schema. Its genuinely additive notes — no per-line figures and the lat/lon vs region exclusivity — are already covered by the parameter descriptions, so it does not meaningfully extend parameter semantics.

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 resource (punctuality of public transport in one German region) and enumerates exactly what is reported: share of trips >5 min late, cancelled stops, trend, and service alerts in force. It explicitly separates itself from get_train_departures and rules out per-line figures, so an agent can distinguish it from siblings without opening the 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 positive trigger ("Use when asked whether buses and trains run normally, or a strike, storm or works disrupt them") and an explicit negative one ("Do NOT use for a station's departures or a line from a named DEPARTURE station... get_train_departures"). The German example even disambiguates a destination phrase ("nach …") from a departure station, which is unusually precise routing guidance.

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

check_weather_warningsA
Read-onlyIdempotent

Returns the official DWD weather warnings in force for a place — storm, snow, ice, heavy rain, thunderstorm, heat — with Warnstufe 1–4, area, validity and the official text unaltered. At a town or coordinate it adds the DWD road-surface forecast (Straßenwetter-Prognose: dry to black ice, road temperature) for the nearest road-weather stations. Use when asked about weather on a trip, safe driving, storm or snow warnings, or icy roads (Glätte, Glatteis). Do NOT use for a general forecast (not offered) or jams (check_autobahn_traffic). Show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway junction ("AK Neufahrn"), or a street address with a house number ("Bahnhofstraße 12, 36037 Fulda"). A motorway number alone ("A7") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
min_levelNoLowest official DWD level to report, 0–4 (default 0, i.e. everything). The DWD's own names: 1 = Wetterwarnung, 2 = Markante Wetterwarnung, 3 = Unwetterwarnung, 4 = Warnung vor extremem Unwetter; 0 = Vorabinformation Unwetter, an advance notice that is not yet a Warnstufe. Raise it ONLY when the question names a level or a Warnstufe in so many words ("ab Stufe 3", "level 3 or higher", "nur Stufe 4"). Unwetter, Unwetterwarnung, severe and storm are the ordinary way to ask about bad weather, not a filter: leave it at 0 there — a level the caller filtered away is a warning the person is never told about.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare the safe read-only/idempotent/open-world profile, so the description focuses on what the annotations can't say: the data is official DWD text returned unaltered, the road forecast applies to the nearest road-weather stations, and the caller must display an attribution line. Rich added context, though it stops short of noting any rate limits or failure modes.

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?

Heavily front-loaded: purpose, then hazard/level detail, then the road-forecast extension, then when-not, then the attribution directive. No filler sentences; each clause carries distinct information despite the density.

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 return contract and does so: Warnstufe 1–4, area, validity, official unaltered text, and the road-weather forecast fields. For a read-only lookup with 100% schema coverage and full annotations, 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 documents each parameter well, so the baseline is 3. The description earns above baseline by explaining a behavioral consequence of the place-vs-coordinate choice (the road-surface forecast is added at a town or coordinate), which the schema does not state.

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+resource (official DWD weather warnings in force for a place) and enumerates the hazard types and Warnstufe 1–4, plus the extra road-surface forecast at town/coordinate. It also names the sibling it is NOT (check_autobahn_traffic for jams), so an agent can separate it from adjacent tools without opening a 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 positive triggers (trip weather, safe driving, storm/snow warnings, icy roads/Glätte) and explicit exclusions (general forecast not offered; jams go to check_autobahn_traffic). It even adds a caller obligation, 'Show the attribution line', 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.

describe_locationA
Read-onlyIdempotent

Turns a coordinate into words: the nearest address, settlement and motorway junction with their distances, and the Gemeinde, Kreis and Land the point lies in. Use when you already HAVE a lat/lon and need to say where that is. Do NOT use to look up a place or address BY NAME — that is find_place, find_poi or find_address; this only goes coordinate to words. Those three come from the municipality the point lies in (by its official key), not from the nearest Kreis point; near the national border the answer says so. OpenStreetMap ODbL 1.0 for the address; show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude of the point to describe (WGS84).
lonYesLongitude of the point to describe (WGS84).
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de

TDQS

A4.6/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive) but the description adds real behavioral context the agent couldn't infer: boundary behaviour near national borders is disclosed, and the licensing/attribution requirement (OSM ODbL 1.0, must show attribution line) is a genuine obligation. It also flags that Gemeinde/Kreis/Land come from the municipality's official key rather than nearest Kreis point, a subtle accuracy caveat.

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-loads purpose, then usage routing, then behavioral caveats in a compact block. Slightly dense with the licensing sentence appended, but every sentence earns its place and none is redundant.

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, no-output-schema tool, it covers purpose, alternatives, output contents, boundary caveat, and attribution obligation. Nothing an agent needs to call and correctly present results 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% with an enum on language, so baseline would be 3; the description adds meaning beyond the schema by warning that omitting language defaults to German and yields a wrong answer for English questions, and clarifying that place names/road numbers are never translated. This is actionable semantic guidance beyond the raw enum.

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+resource ('turns a coordinate into words') and enumerates the exact outputs (nearest address, settlement, motorway junction with distances, Gemeinde/Kreis/Land). It explicitly differentiates from siblings find_place, find_poi, find_address by stating 'this only goes coordinate to words'.

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 ('when you already HAVE a lat/lon and need to say where that is') and when-not ('Do NOT use to look up a place or address BY NAME'), naming the three alternative lookup tools. Nothing is left to inference.

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

find_addressA
Read-onlyIdempotent

Looks up a street address: its coordinate, and the named OpenStreetMap objects at it (company, shop, office) or that none are. Use when the person gives a STREET AND NUMBER — "Bahnhofstraße 12, Fulda" — for the point, or for who or what is there. The coordinate passes to any other tool as lat/lon. Do NOT use for a town/district/station name alone (find_place) or a company/shop/landmark by name (find_poi) — needs a street and a number. At most 5 points; a door mapped twice is folded, points far apart say how far; several towns are a question. OpenStreetMap ODbL 1.0; show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many results to return (1–5, default 3) — more than one means the same address carries more than one OpenStreetMap object.
queryYesA street address, as a person writes one: street and house number, plus a town or postcode — "Bahnhofstraße 12, 36037 Fulda" or "Bahnhofstraße 12, Fulda". Both orders work. A street and number with neither a town nor a postcode cannot be placed (the same street name exists in about two thousand German towns) and is refused.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the read-only/idempotent/non-destructive profile, but the description adds substantial behavioral detail beyond them: a 5-point cap, duplicate-door folding, distance disclosure when points are far apart, ambiguity handling ('several towns are a question'), and the ODbL attribution obligation. That is exactly the kind of result-shaping and licensing context annotations cannot convey.

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 trigger, and every sentence carries information (limits, dedup, attribution). It is quite dense with em-dash clauses and parentheticals, which slightly taxes readability, but there is no 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?

No output schema exists, yet the description explains what is returned (a coordinate reusable as lat/lon, plus the named OSM objects or an explicit none), and annotations cover the safety profile. Nothing an agent needs to call or interpret it is missing.

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 schema already documents query, limit, and language in detail, including the language default trap. The description reinforces the street+number requirement for query but adds no format or syntax detail beyond the schema, so the baseline 3 applies.

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 ('looks up a street address') and enumerates what it returns: the coordinate plus named OSM objects at that point. It explicitly distinguishes itself from find_place and find_poi by naming them, so an agent can route correctly 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 an explicit positive trigger (a STREET AND NUMBER, with a worked example) and explicit exclusions: not for a town/district/station name alone (find_place) or a company/shop/landmark by name (find_poi). It also states the input precondition (needs both street and number), leaving nothing to inference.

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

find_charging_stationA
Read-onlyIdempotent

Returns EV charging sites near a place or coordinate with operator, connector types, maximum power, price per kWh where published, and how many points are free right now where the operator publishes live status. Use when an EV driver asks where to charge ("Wo kann ich laden?", "CCS 150 kW near Leipzig", "ist gerade eine Säule frei?"). Do NOT use for petrol or diesel — call find_cheapest_fuel; for E-Kennzeichen or Ladekarte rules — call get_driving_rules. Radius ≤ 25 km, ≤ 10 sites; availability is missing for most operators and is then unknown, never free. Show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
limitNoHow many lines to return, nearest first (1–10, default 5). Places within 50 m that read alike are folded into one line that says how many units it holds; structuredContent.sites has one entry per place of the lines shown, with siteIds naming every record of that place, so it can be longer than limit.
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway junction ("AK Neufahrn"), or a street address with a house number ("Bahnhofstraße 12, 36037 Fulda"). A motorway number alone ("A7") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
connectorNoPlug the car needs: "ccs2" (CCS Combo 2 — the DC fast-charging standard on almost every European EV), "type2" (Typ 2 / Mennekes, the AC socket) or "chademo" (older Japanese DC, e.g. Nissan Leaf). Omit unless the person named their plug or their car model — filtering on a guess hides chargers they could have used.
radius_kmNoSearch radius around the place in kilometres (1–25, default 10). A charging stop is worth a detour, so this is wider than the fuel radius — but 25 km is the cap, and a larger circle is a dataset request rather than a driver's question.
min_power_kwNoOnly charging points of at least this many kW (1–1000). Use when the person names a number or asks for fast charging: 50 = DC fast (a bare "fast"/"schnell"/"Schnelllader"), 150 = HPC ("HPC", "ultra", "ultraschnell"), 300 = the fastest posts in Germany. Omit for "where can I charge" — 11 kW overnight is a valid answer to that question.
only_availableNoWhen true, return only sites with at least one point reported FREE right now. Default false. Use it when the person asks what is free at this moment. Note that only some operators publish live status: the result always says how many nearby sites were dropped because their status is unknown, so the filter never silently hides a charger that may well be free.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description goes beyond them with data-quality behaviour: availability is missing for most operators, so a missing value is 'unknown, never free' — a real trap for an agent. It also mandates showing the attribution line.

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 usage, then exclusions, then constraints — a sensible order with no filler sentences. It is dense and a couple of clauses (radius ≤ 25 km, ≤ 10 sites) duplicate the schema, but nothing is wasted.

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 9-parameter tool with no output schema, the description compensates by naming the returned fields and the fallback behaviour when live status is absent. An agent has everything needed to select the tool, pick the right parameter mode (place vs lat+lon), and interpret gaps in the response.

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 schema already documents every parameter including the connector, min_power_kw, only_available, and radius semantics. The description only restates the radius/site caps and the unknown-availability caveat, adding little beyond what is already in the structured fields.

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 ('Returns EV charging sites near a place or coordinate') and enumerates the returned fields (operator, connector types, max power, price per kWh, live free-point counts). It is immediately distinguishable from siblings like find_cheapest_fuel or find_hydrogen_station.

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 conditions ('Use when an EV driver asks where to charge') with sample phrasings, and explicit exclusions that route to alternatives: petrol/diesel → find_cheapest_fuel, E-Kennzeichen/Ladekarte → get_driving_rules. Operational caps (radius ≤ 25 km, ≤ 10 sites) are stated up front.

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

find_cheapest_fuelA
Read-onlyIdempotent

Returns the cheapest stations for one fuel grade near a place or coordinate: price per litre, brand, address, distance, open state. Use when the user asks where to fill up or what fuel costs. Do NOT use for charging an electric car (call find_charging_station), price history, or traffic (call check_autobahn_traffic). Radius ≤ 25 km, at most 10 stations. For a brand, a name, open now or at a named time, or nearest-first, call find_fuel_station. Each line names the age of its price and opening-hours claim. Prices are consumer information only; the attribution line and MTS-K note must be shown.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
fuelNoFuel grade: "e5" (Super E5), "e10" (Super E10, the standard German petrol) or "diesel". Default "e10". Pass the grade the person named — a diesel driver is not helped by a petrol price.e10
limitNoHow many stations to return, cheapest first (1–10, default 5). The provider's terms cap it at 10.
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway junction ("AK Neufahrn"), or a street address with a house number ("Bahnhofstraße 12, 36037 Fulda"). A motorway number alone ("A7") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
radius_kmNoSearch radius around the place in kilometres (1–25, default 5). The provider's terms cap it at 25 km — a larger circle is a dataset request, not a consumer question.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/openWorld/non-destructive, and the description adds context beyond them: each returned line discloses the age of its price and opening-hours claim, the provider's terms cap radius and result count, and the attribution line and MTS-K note are mandatory outputs. Nothing here contradicts the safety 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?

Front-loaded with the core return description, then when-to-use, when-not, parameter routing, and output/legal constraints in that order. Despite covering a 7-parameter tool with no output schema, every clause carries distinct information and there is no 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?

With no output schema, the description compensates by enumerating the returned fields, the price-age and hours-age disclosures, and the required attribution/MTS-K output. Combined with the schema's 100% parameter coverage and the safety annotations, an agent has everything needed to call and interpret this tool.

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% and the schema text already explains lat/lon vs place, the fuel enum intent, language defaulting, and the radius/limit caps. The description mostly restates the radius and limit bounds rather than adding new parameter meaning, so the baseline 3 applies.

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+resource with a clear scope: cheapest stations for one fuel grade near a place/coordinate, plus exactly what each result carries (price per litre, brand, address, distance, open state). It explicitly distinguishes itself from find_fuel_station (brand, name, open-now, nearest-first) and from find_charging_station and check_autobahn_traffic, so an agent can route correctly without opening the 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 ("where to fill up or what fuel costs"), explicit when-not (electric charging, price history, traffic) with the alternative tool named for each, and a routing rule to find_fuel_station for brand/name/open-now/named-time/nearest-first. Constraint envelopes (radius <= 25 km, at most 10 stations) are stated up front.

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

find_fuel_stationA
Read-onlyIdempotent

Finds filling stations around a place or coordinate under any combination of filters — grade, brand, name, open now, open at a time you name, open 24 h — sorted by distance, price or name. Use when the question is WHICH station: the closest diesel to a stop, an ARAL open tonight, what one forecourt sells. Do NOT use for the plain "where is fuel cheapest" question (call find_cheapest_fuel) or for charging an electric car (call find_charging_station). Every result carries the attribution and the MTS-K note, and says how old each price and opening-hours claim is.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
fuelNoOnly stations with a current price for this grade: "e5" (Super E5), "e10" (Super E10) or "diesel". Omit to get every station near the place whatever it sells — the answer then lists all the grades it holds a price for. Required when sort is "price", because a price ordering needs a grade.
nameNoPart of the station's own name or brand, case-insensitive: "Autohof", "Raststätte Fulda". Use it when the person named a specific forecourt rather than a chain. Combine with place to keep the search local.
sortNoOrder of the answer: "distance" (nearest first, the default — use it for "closest diesel to Hamburg Hbf"), "price" (cheapest first, needs fuel), or "name" (alphabetical, for a person scanning a list of a brand's forecourts).distance
brandNoOnly stations of this brand, matched case-insensitively anywhere in the brand field: "ARAL", "Shell", "TotalEnergies", "JET". Use it when the person named a chain ("die ARAL an der B1"). Free stations often carry no brand at all and are then not matched by any brand.
limitNoHow many stations to return (1–10, default 5).
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway junction ("AK Neufahrn"), or a street address with a house number ("Bahnhofstraße 12, 36037 Fulda"). A motorway number alone ("A7") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
open_atNoOnly stations open at that time in Germany (Europe/Berlin): "23:30" means the next time the clock shows 23:30, and "2026-09-30 06:15" a specific local date and time. Use it for "is it still open tonight". Do not pass it together with open_now — they ask the same question about two different clocks.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
open_nowNoWhen true, only stations the published opening hours say are open at this moment. Default false. A station whose hours we have never read is NOT returned by this filter and is counted in the answer instead — the result never guesses that an unknown station is open.
radius_kmNoSearch radius around the place in kilometres (1–25, default 5). 25 km is the provider's own ceiling — a larger circle is a dataset request, not a consumer question.
whole_dayNoWhen true, only stations the provider flags as open around the clock (24/7). Default false. Use it when asked whether a station never closes ("durchgehend geöffnet", "around the clock") and for a night drive; it is a stricter filter than open_now, which is satisfied by a station that closes at 22:00.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, it discloses data provenance and freshness behavior: every result carries attribution and the MTS-K note plus the age of each price and opening-hours claim. It also clarifies that unknown hours are never treated as open, which is a real behavioral trait not present in 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.

Conciseness4/5

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

Three sentences, capability first, exclusions second, output caveat last — well front-loaded with no filler. It is dense (long em-dash clause) but each clause carries routing or behavioral information, so nothing is wasted.

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 13 optional parameters and no output schema, the description still tells the agent what determines the answer (filters + sort) and what comes back (attribution, MTS-K note, staleness). Combined with the fully documented schema, an agent has everything needed to call it correctly.

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 coverage is 100% and the schema descriptions already carry the cross-parameter rules (fuel required for sort=price, place OR lat+lon, open_at vs open_now). The description only summarizes the filter set without adding syntax or format meaning beyond it, so the baseline 3 applies.

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 concrete verb+resource ("Finds filling stations") and immediately narrows scope: around a place or coordinate, with the exact filter axes (grade, brand, name, open now, open at a time, 24 h) and sort orders. It explicitly names the siblings it is not (find_cheapest_fuel, find_charging_station), so an agent can route without opening the 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 a positive selection rule ("Use when the question is WHICH station") with three concrete examples, plus two explicit exclusions routing to find_cheapest_fuel and find_charging_station. When-to-use, when-not, and the alternatives are all present.

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

find_hydrogen_stationA
Read-onlyIdempotent

Returns hydrogen (H2) filling stations near a place or coordinate, nearest first, with operator, address, pumps (700 bar car, 350 bar truck/bus), opening hours where published and the age of the record. Use when someone asks where to refuel a fuel-cell car, lorry or bus ("Wasserstofftankstelle", "H2 tanken", "hydrogen station near me"). Do NOT use for petrol, diesel or LPG (call find_fuel_station) or EV charging (call find_charging_station). Radius ≤ 150 km, ≤ 10 stations; no live availability or price is published. Shows the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
limitNoHow many stations to list, nearest first (1–10, default 5).
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway junction ("AK Neufahrn"), or a street address with a house number ("Bahnhofstraße 12, 36037 Fulda"). A motorway number alone ("A7") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
vehicleNoWhich pump the vehicle needs: "car" (Pkw — 700 bar, e.g. Toyota Mirai, Hyundai Nexo; a few sites also offer 350 bar for cars) or "truck" (Lkw or bus — 350 bar). Omit unless the person said what they drive.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
radius_kmNoSearch radius around place or lat+lon in kilometres (1–150, default 50). Hydrogen stations are few, so the default is wide; when none is inside, the answer still names the nearest one beyond. Example: 50

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely non-redundant behavior: hard caps (radius ≤ 150 km, ≤ 10 stations), the absence of live availability or pricing, that the nearest station is named even when out of radius, and that an attribution line is shown. It does not discuss error behavior or what happens on an unresolvable place, which keeps it short of a 5.

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?

Three sentences, front-loaded with what is returned, then the trigger, then the exclusions and caps. Every clause carries information; it is dense but not padded, though the multilingual example list and operator-field enumeration make it a little long for the core signal.

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?

There is no output schema, so the description must describe the return payload — and it does, naming operator, address, pump pressures (700 bar car / 350 bar truck-bus), opening hours, record age and the attribution line. Combined with the caps and the no-live-data caveat, an agent has everything needed to call and interpret this tool.

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% and the schema already spells out coordinate-vs-place exclusivity, enum meanings, ranges and defaults thoroughly, so the baseline is 3. The description reiterates the radius and count caps but adds no syntax or format meaning beyond what the schema supplies.

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?

Specific verb+resource ('Returns hydrogen (H2) filling stations near a place or coordinate'), with scope stated as nearest-first and the returned fields enumerated. It explicitly names the siblings it is not (find_fuel_station for petrol/diesel/LPG, find_charging_station for EV), so an agent can distinguish it 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?

Explicit when-to-use trigger ('where to refuel a fuel-cell car, lorry or bus') with multilingual query phrasings, plus explicit when-not-to-use clauses routing to two named alternatives. Nothing is left to inference.

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

find_nearbyA
Read-onlyIdempotent

Overview of what is around a place or coordinate: nearby fuel stations, EV charging, parking, the nearest railway station and motorway junction, each with its distance. Use when someone asks "what is around me" or "what is near " — a broad look, not one category in depth. Do NOT use for a fuel grade's price (find_cheapest_fuel), charger/connector status (find_charging_station), parking kind/occupancy (find_parking), a NAME lookup (find_place/find_poi/find_address), or a coordinate's address (describe_location). Radius ≤ 15 km, up to 3 per category. Shows each source's attribution.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway junction ("AK Neufahrn"), or a street address with a house number ("Bahnhofstraße 12, 36037 Fulda"). A motorway number alone ("A7") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
radius_kmNoSearch radius around place or lat+lon in kilometres (1–15, default 5). This tool answers "what is around me", not "search a wide area" — for that, use the specific tool with its own wider radius.
categoriesNoWhich categories to include: "fuel", "charging", "parking", "station" (railway station), "junction" (motorway junction). Omit for all five. Pass a subset only when the person named one — otherwise the full picture is the point of this tool.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive), so the description's added value is its operational limits: radius capped at 15 km, up to 3 results per category, and per-source attribution being surfaced. It doesn't discuss failure modes or behavior when a place doesn't resolve, but the disclosed caps go beyond 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.

Conciseness4/5

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

Front-loaded with purpose, then use, then do-not-use routing, then constraints — a logical order with no filler. It is dense and long, but given six parameters and twelve sibling tools, nearly every clause earns its place.

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 zero required parameters, the description covers what an agent needs: what comes back (per-category items with distances and attribution), the radius cap, and the latitude/longitude-vs-place choice. Nothing essential is missing.

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% and the schema text is very rich (WGS 84 ranges, place free-text formats, language default warning), so the schema carries the burden. The description adds one genuinely new detail — the up-to-3-per-category return cap — and restates the radius bound, hence the baseline 3.

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 names a specific resource scope (fuel, charging, parking, railway station, motorway junction) and its distinguishing trait — a broad radius-based overview with distances per category. It explicitly contrasts itself with one-category-in-depth tools like find_cheapest_fuel and find_parking, so an agent can separate it from all siblings without opening a 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?

It gives a direct trigger ("what is around me", "what is near <place>") and then an explicit do-not-use list mapping each excluded intent to the right sibling (find_cheapest_fuel, find_charging_station, find_parking, find_place/find_poi/find_address, describe_location). Nothing about routing is left to inference.

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

find_parkingA
Read-onlyIdempotent

Parking near a place, a coordinate or along one motorway: motorway lorry parks, car parks and P+R sites, with total spaces and, where published, free spaces now and the reading's age. Use when asked where to park or leave the car for the train ("Parkhaus in Köln", "Rastplatz A3", "P+R"). Do NOT use for fuel (find_cheapest_fuel) or EV charging (find_charging_station). Radius ≤ 25 km, ≤ 10 sites per list; ODbL and CC BY-SA sources are separate lists (up to three). No "free now" means no published count, not full. No prices: for "was kostet" say so, no call. Show each source's attribution.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
kindNoWhich kind of parking: "car_park" = public car park (Parkhaus/Parkplatz), "park_and_ride" = P+R beside a station, "truck" = lorry parking, "any" = all of them. Default "any". Rest areas are NOT a kind we can filter: no source we hold classifies them, so for "Rastanlage"/"Raststätte"/"rest area" leave kind out ("truck" when lorry spaces were asked for); "rest_area" is still accepted and answered as "any", with a sentence saying why. Pass a kind only when the person named one — a lorry driver asking for a break wants "truck", someone leaving the car for the train wants "park_and_ride". A camper, a caravan or a coach is none of these: leave the argument out rather than filtering a tourist into lorry bays.any
roadNoA single motorway number to list parking along, e.g. "A3" ("A 3" and "a3" are the same road). Use this when the person named a road and no town — "Rastplatz auf der A7". Give road OR place OR lat+lon, never two of them: a road is a 900 km line and a place is a point, so the two answer different questions. When the question names BOTH — "Parkhaus in Köln an der A3" — use the place: a person parks at a point, and the radius already covers the motorway beside it. A road list is in name order and cannot follow a direction of travel: for "A4 Richtung Görlitz" ask with place for the destination or the next town on the way instead, which answers nearest first.
limitNoHow many facilities to return, nearest first (1–10, default 5).
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway junction ("AK Neufahrn"), or a street address with a house number ("Bahnhofstraße 12, 36037 Fulda"). A motorway number alone ("A7") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
radius_kmNoSearch radius around place or lat+lon in kilometres (1–25, default 10). Ignored when you pass road, which covers the whole motorway. Start small in a city and widen if the answer is empty.
only_with_free_spacesNoSet true only when the person asks whether spaces are free right now. It keeps just the facilities whose operator publishes live occupancy AND currently reports a space, and the result says how many were dropped for publishing nothing — most German parking publishes no occupancy at all, so true usually narrows the answer to very little. Default false.

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, idempotent, non-destructive, closed-world), and the description adds substantial non-obvious behavior: radius cap of 25 km, max 10 sites per list, up to three separate source lists (ODbL vs CC BY-SA), attribution display requirement, and the critical warning that an absent 'free now' means no published count rather than a full lot.

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 before constraints, and every sentence carries information (limits, exclusions, pricing gap, attribution). It is dense and slightly long, with a few parenthetical examples that could be trimmed, but nothing is padding.

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?

There is no output schema, so the description must carry return-shape and edge-case burden, and it does: it describes what fields come back (spaces, free spaces, reading age), how many results, the multi-source split, the no-price gap, and the empty-list widening cue. Nothing an agent needs to answer 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%, so the baseline is 3, but the description adds interpretation the schema does not: "No 'free now' means no published count, not full", the ≤25 km / ≤10-per-list limits, and the note that sources split into separate lists. It does not add much on lat/lon/place/road beyond the schema, but the occupancy-semantics clarification is genuinely value-adding.

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 names a specific verb-and-resource combination (parking near a place/coordinate/motorway) and enumerates exactly what is returned: lorry parks, car parks, P+R sites, total spaces and published free spaces with reading age. It is instantly separable from find_cheapest_fuel and find_charging_station, which are named directly.

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 triggers are given ('where to park or leave the car for the train') with three concrete example queries, plus explicit when-NOT-to-use routing to two named siblings for fuel and EV charging. It also states the no-price case is a no-call case, which prevents a wrong invocation.

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

find_placeA
Read-onlyIdempotent

Looks up a place name and returns every place that matches, each with its kind, official key (AGS/RS), population, English name and coordinate. Use when the person asks where somewhere is, when you need a coordinate for another tool, and above all to RECOVER after a tool reported a name as ambiguous — this is where you find out which Neustadt is which. Pass near to rank and separate same-named places by distance. Do NOT use to find a company, shop or landmark: call find_poi. At most 10 results, radius <= 200 km. Every result carries an attribution line that must be shown to the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude to measure from, instead of `near`.
lonNoLongitude to measure from, instead of `near`.
kindNoNarrow to one kind: "city", "district" (Kreis), "admin" (Land or Regierungsbezirk), "station", "stop", "motorway" or "junction". Omit unless the person was specific.
nearNoA second place to measure from, used to tell same-named candidates apart: "Neustadt" near "Hamburg" is one of twenty Neustadts. Every result then carries its distance from this point.
limitNoHow many candidates to return, best match first (1–10, default 5).
queryYesThe place name to look up, as the person said it — "Neustadt", "Munich", "Kreis Fulda", "Köln Hbf". English names and spellings without umlauts both work.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
radius_kmNoWhen near/lat+lon is given, keep only candidates within this many kilometres (1–200). Omit to rank by distance without dropping any.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: a cap of 10 results, a 200 km radius ceiling, and a mandatory attribution line that must be shown to the user. It omits anything about ranking/ordering details beyond 'best match first', which is minor.

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 usage triggers, then constraint, with the key routing rule stated early. Slightly long and mildly redundant (the 'which Neustadt is which' example echoes the schema), but every sentence carries actionable content.

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 compensates by listing the returned fields and the attribution requirement. Combined with annotations and 100% schema coverage across 8 params, an agent has everything needed to call this correctly and route to it appropriately.

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 rich per-parameter docs (near, radius_km, language, kind) already carry the parameter semantics. The description adds only a light pointer ("Pass `near` to rank and separate same-named places"), which the schema itself states more fully. Baseline 3 is appropriate.

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 (looks up) and resource (a place name), enumerates the returned fields (kind, AGS/RS key, population, English name, coordinate), and explicitly distinguishes itself from the sibling find_poi. An agent can identify it and separate it from find_address, find_poi and describe_location without opening a 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 three concrete when-to-use triggers (where somewhere is, need a coordinate for another tool, recovering from an ambiguity error) and an explicit exclusion ("Do NOT use to find a company, shop or landmark: call find_poi"). The alternative tool is named, so routing is unambiguous.

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

find_poiA
Read-onlyIdempotent

Finds a business or landmark by name or kind — company, shop, clinic, hotel, hostel — with address, category and coordinate. Use when the person names a THING rather than a town: "the adesso office in Dortmund", "the nearest Aldi", "a hotel in Weimar". The coordinate passes to any other tool as lat/lon. Do NOT use for a town, district or station (every tool's place resolves those), nor for fuel, charging or parking (own tools). Give "in" (a town) when you can: far faster than nationwide. 25 per page, 50 via cursor; radius <= 50 km. OpenStreetMap under ODbL 1.0; show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
inNoA town to search in — "Dortmund", "Fulda". Strongly preferred: it is both far faster and far less ambiguous than a nationwide search. Use this OR near/lat+lon, not both.
latNoLatitude of the point to search around, when the caller already holds a coordinate.
lonNoLongitude of the point to search around.
nameYesThe name of the thing to find — a company, shop, clinic, hotel, office or landmark. Part of the name is enough: "adesso" finds "adesso SE". A chain name works too, because brands are matched as well as names. A kind word alone, German or English ("Apotheke", "pharmacy", "trade fair"), lists that kind nearest first. When the person names a company AND a type ("the Bosch office"), put the company here and the type in category. Never for fuel, charging or parking, even near a named company or landmark ("a charger by the Allianz Arena"): those have their own tools, asked with the place.
nearNoA place to search around, when the question is "the nearest X" rather than "X in Y". Use with radius_km.
limitNoHow many to return per page, best match first (1–25, default 10). The answer says when more matched; fetch them with cursor, up to 50 in all.
cursorNoPagination cursor from a previous result's _meta.nextCursor. Omit for the first page.
categoryNoNarrow to one OpenStreetMap family: "office" (companies, agencies), "shop", "amenity" (fuel, pharmacy, school, restaurant, town hall), "healthcare" (hospitals, clinics, doctors, pharmacies), "tourism" (hotels, attractions), "leisure", "industrial" (factories, plants), "historic" (castles, monuments, city gates), "natural" (mountain peaks) or "building". Set it whenever the person names the type ("Bosch office" → office, "Hotel Adler" → tourism); omit it when they name no type.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
radius_kmNoSearch radius in kilometres around near/lat+lon (1–50, default 10). Ignored when "in" is used.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly, idempotent, non-destructive, and not open-world. The description adds operational constraints: pagination limits (25 per page, 50 via cursor), radius limit (≤50 km), coordinate pass-through, and attribution requirement (ODbL 1.0). These are valuable behavioral details beyond the safety profile.

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?

Front-loaded with the core purpose and usage rules. Every sentence is dense with actionable information—examples, exclusions, pagination, attribution—and none is wasted.

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 10-parameter tool with no output schema, the description covers selection criteria, key parameter usage, pagination, radius limit, and legal attribution. It provides everything an agent needs to invoke the tool correctly.

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 schema already documents all parameters thoroughly. The description adds minor guidance (e.g., 'Give in when you can') but largely repeats constraints like page size and radius that are also in the schema. Baseline 3 is appropriate.

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 (find) and resource (business or landmark) with examples, and explicitly distinguishes from siblings by naming what it is NOT for (towns, fuel, charging, parking). An agent can select it without ambiguity.

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?

Provides explicit when-to-use (person names a THING) and when-not-to-use (town, district, station, fuel/charging/parking), and recommends using 'in' for speed. Names alternatives implicitly via sibling tools, leaving nothing to inference.

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

find_roadworks_aheadA
Read-onlyIdempotent

Returns roadworks PLANNED on one motorway, one Bundes-/Landesstraße in NI, SN, TH or BW, or Hamburg city streets by place, in a date window: section, restriction, dates. Use when a date or window is named, it says geplant, or how long a site lasts ("Baustellen auf der A7 in den Sommerferien?"). ONE road/place per call. Do NOT use when more than one motorway is named, for the situation this minute, or for Baustellen with neither date nor geplant — all three are check_autobahn_traffic; whether a road is open — check_road_status. ≤ 92 days, max 20 sites. Show attribution.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLast day of the window, inclusive, as YYYY-MM-DD. Omit for 7 days after `from`, which is the right window for "am I going to hit roadworks on this drive". The window may span at most 92 days. For "how long will this last" / "wie lange dauert die Baustelle noch", leave both dates out: the default 7 days already returns the site's planned end date. Only widen — 28 days is the sensible step — when the person asked about a period that long.
fromNoFirst day of the window, as YYYY-MM-DD in German local time. Omit for today. Resolve relative wording ("next Friday", "in den Sommerferien", "nächsten Monat") into real dates yourself, counted from today's date; this argument never takes words, and it never takes a fixed example date — the window a person means moves with the calendar.
roadNoThe road to look at, one per call: an Autobahn, e.g. "A7" or "A100", or a Bundesstraße, Landesstraße or Staatsstraße in Niedersachsen, Sachsen or Thüringen, e.g. "B6", "L1025", "S296" — "A7", "A 7" and "a7" are the same road. B and L roads in other Länder and Kreisstraßen are not covered. Ask again for a second road. Give road OR place.
limitNoMaximum sites to return (1–20, default 10), ordered by planned start. Every returned site is in the structured result; the readable text prints the first 10 and says how many more of them are in the structured half. The answer always names how many sites the window holds in total, so a small limit never hides the size of the problem.
placeNoA place in Hamburg — a district, street or address, e.g. "Hamburg-Altona", "Wilhelmsburg", "Köhlbrandbrücke" — for the city's own roadworks (Bauweiser) within 3 km of it. Outside Hamburg, city roadworks are not held and the answer says so. Give road OR place.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already establish the safe read-only, idempotent, non-open-world profile, so the bar is lower. The description still adds real behavioral context beyond them: the 92-day window cap, the 20-site ceiling, the one-road-per-call restriction, the coverage boundaries (B/L roads outside the listed Länder and Kreisstraßen are not held; city roadworks only exist for Hamburg, within 3 km), and the standing attribution requirement.

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 and dense: purpose first, then triggers, then exclusions, then constraints. It is long and parenthetical-heavy (German sample queries, mixed English/German phrasing), but nearly every clause is actionable routing or constraint information rather than 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?

With no output schema, the description supplies the return shape (section, restriction, dates), the text-vs-structured split (the readable text prints the first 10 and reports the total count), the coverage limits, and the size bounds. An agent has everything needed to decide and call correctly.

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% and the parameter docs are unusually rich (date resolution rules, the 92-day cap, the road/place mutual exclusion, the language default warning), so the schema carries the load. The description's contribution is mostly restating the caps ("≤ 92 days, max 20 sites", "ONE road/place per call"), which earns the baseline 3 rather than more.

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 names a specific verb ("Returns"), the exact resource (PLANNED roadworks), the coverage universe (one motorway, one B/L/S road in NI/SN/TH/BW, or Hamburg streets by place) and the return fields (section, restriction, dates). An agent can distinguish it from find_poi or check_autobahn_traffic 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?

It states positive triggers ("Use when a date or window is named, it says geplant, or how long a site lasts") and negative ones (Do NOT use when more than one motorway is named, for the situation this minute, or for Baustellen with neither date nor geplant) and routes each exclusion to a named sibling: check_autobahn_traffic and check_road_status. This is textbook when/when-not/alternative guidance.

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

find_sharingA
Read-onlyIdempotent

Returns rentable shared bikes near a place or coordinate: bike-sharing stations with bikes and free docks now, and free-floating bikes around, with distance and data age (nextbike incl. KVB Rad, MyRadl, VAG_Rad; Donkey Republic). Use when someone asks for a rental or shared bike ("Leihrad", "Fahrradverleih", "nächstes nextbike", "bike share near me"). Do NOT use for parking (find_parking) or a general look around a place (find_nearby). Radius ≤ 5 km, ≤ 20 stations; e-scooters are not covered. Shows each source's attribution.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.
lonNoLongitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.
limitNoHow many stations to list, nearest first (1–20, default 8). Free-floating bikes are summarised, not listed one by one.
placeNoWhere to look, as free text: a city ("München", "Munich"), a district or Kreis ("Kreis Fulda"), a Bundesland, a station or stop ("Hamburg Hbf"), a motorway junction ("AK Neufahrn"), or a street address with a house number ("Bahnhofstraße 12, 36037 Fulda"). A motorway number alone ("A7") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
radius_kmNoSearch radius around place or lat+lon in kilometres (0.1–5, default 1). Example: 1
only_availableNotrue (default): list only stations with at least one bike to rent right now. false: also list empty stations, e.g. to find a free dock to return a bike.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description adds genuine scope context instead — data age is returned, free-floating bikes are summarised rather than listed, e-scooters are out of scope, and per-source attribution is shown. It does not state refresh cadence or failure behavior, so it falls short of a 5.

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 usage triggers, then exclusions and limits — a sensible priority order with no filler. It is on the long side (multiple parenthetical examples and a trigger-phrase list), which slightly exceeds what an agent strictly needs, but each clause carries information.

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 usefully sketches the return shape — stations with distance and data age, summarised free-floating bikes, per-source attribution. Combined with explicit coverage limits and exclusions, an agent has enough to call correctly, though it omits what happens when no bikes are found in range.

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%, and the parameter docs are unusually strong (place vs lat/lon exclusivity, language defaulting caveat, only_available semantics). The description adds essentially nothing per-parameter beyond restating the radius and station caps already in the schema, so the baseline 3 applies.

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 ('Returns rentable shared bikes near a place or coordinate') and immediately scopes it: bike-sharing stations with bikes/free docks plus free-floating bikes. Names the covered providers (nextbike incl. KVB Rad, MyRadl, VAG_Rad; Donkey Republic), so an agent can distinguish it from every sibling without opening the 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 with trigger phrases ('Leihrad', 'Fahrradverleih', 'nächstes nextbike', 'bike share near me') and explicit when-not-to-use, naming the alternatives (find_parking, find_nearby). It also states hard limits (radius ≤ 5 km, ≤ 20 stations) and an exclusion (e-scooters not covered), leaving nothing to inference.

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

get_departuresA
Read-onlyIdempotent

Scheduled departures from any German stop — bus, tram, U-Bahn, S-Bahn, train, ferry. Use when asked when a bus, tram, U-/Stadtbahn or ferry goes ("welche Bahnen" at a Hbf too), or for another DAY or a time over 2 h away: "Wann fährt der nächste Bus ab Fulda Bahnhof?" Do NOT use for a railway station's trains now or later today — get_train_departures. Plan times, with a live delay or cancellation per row where held; regional punctuality check_transit_disruption. No A-to-B journeys: say so, no call. Holds ≥ 48 h ahead, ≤ 3 days; further out, say so. 15 per call. Show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
stopNoThe stop, as the person says it: "Fulda, Bahnhof", "München, Marienplatz", "Köln, Hbf", "Hamburg, Rathausmarkt" (town first). Include the town when the person did — half the names in Germany exist in twenty towns, and a bare "Bahnhof" or "Hauptbahnhof" comes back as a list of candidates to choose from, so call it and let the result ask. Pass their words; do not guess an id. Give either stop OR the stop id, never both.
whenNoStart of the window as an ISO-8601 instant with an offset ("2026-10-02T07:30:00+02:00"). Leave it out for "now". Convert the person's words yourself — "morgen früh", "tonight" — and pass the instant; the answer is always rendered in Europe/Berlin.
limitNoHow many departures to return, earliest first (1–15, default 10). The result always says how many more were in the window.
modesNoKeep only these kinds of service: "bus", "tram", "subway" (U-Bahn), "rail" (every train, including S-Bahn and regional) or "ferry". Omit it unless the person named a kind — "nur Busse", "welche Tram". Several are allowed, which is what "die Busse und Bahnen vor dem Hbf" means. An S-Bahn is "rail": the feed does not always distinguish it, and the line name ("S 6") says which it is.
stop_idNoThe stop's timetable id, exactly as a previous result of this tool gave it ("de:06631:1234"). It skips the name lookup and is exact — use it for a follow-up about a stop this tool has already named, and for one the person picked out of a candidate list.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
duration_minNoHow far past that moment to look, in minutes (5–1440, default 60). Small for "what goes now", a few hours for an evening. To look further ahead (the timetable reaches at least 48 h), move `when` instead of widening this: a window of a whole day returns at most 15 rows and would answer about the wrong half of it.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description adds substantial behavior beyond them: results carry a live delay/cancellation per row, coverage holds ≥48 h ahead and ≤3 days, 15 rows per call, an attribution line must be shown, and out-of-range requests should be declined rather than attempted.

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 usage, then exclusions, then constraints — a sensible order. It is dense and peppered with parenthetical German examples and quoted fragments that add length, but each clause carries routing or constraint information. Slightly more cramped than ideal.

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?

There is no output schema, so the description must carry the return contract — and it does: per-row live delay/cancellation, a count of further departures in the window, and the attribution line to display. Combined with the window limits and candidate-list fallback for ambiguous stop names, an agent has everything needed to call and present results correctly.

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 this is largely reinforcement, but the description adds real operational meaning: 'set language on every call' with the failure mode of leaving it defaulted, the advice to move `when` rather than widen `duration_min`, and how bus/tram/rail/ferry map to user phrasing ('nur Busse'). It tops up documented params rather than re-deriving them.

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 ('Scheduled departures from any German stop') and enumerates covered modes (bus, tram, U-Bahn, S-Bahn, train, ferry), so the agent immediately knows the scope. It also names the sibling it is NOT (get_train_departures), making the boundary unambiguous 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 when-to-use triggers ("welche Bahnen" at an Hbf, another day, times over 2 h away), an explicit exclusion with the alternative named (railway station now/today → get_train_departures), a pointer to check_transit_disruption for punctuality, and a hard rule for A-to-B journeys ("say so, no call"). This is close to a routing decision table.

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

get_driving_rulesA
Read-onlyIdempotent

Returns the German road rules a visitor needs: low-emission zones (Umweltzone) and which Feinstaubplakette a city requires, speed limits (advisory 130), winter tyres, alcohol, the Sunday lorry ban, tolls (no car toll), Rettungsgasse, what must be in the car, and electric cars (E-Kennzeichen, ad-hoc payment, plugs). Use when someone drives through Germany or asks whether they may enter a city. Do NOT use for live traffic or closures: check_autobahn_traffic; to FIND a charger: find_charging_station. Optional city narrows to its zone. Sourced and dated; show the attribution. Not legal advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity the question is about, e.g. "Stuttgart", "München", "Munich". Narrows "lez" to that city's zone and adds the per-city caveat for "ev". Other topics are nationwide. Omit when the question is not about one city.
topicNoWhich rule to answer. "lez" = low-emission zone and Feinstaubplakette, "speed" = speed limits including the Autobahn advisory 130, "winter" = winter-tyre duty, "alcohol" = alcohol and drugs, "toll" = car and lorry toll, "truck_ban" = Sunday and holiday lorry ban, "equipment" = what the law requires in the car, "emergency" = 112/110, rescue lane, breakdown, crash, "ev" = electric car (E-Kennzeichen, charging payment, plugs). Omit for a one-line overview of all nine.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de

TDQS

A4.3/5.0
Behavior4/5

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

With readOnlyHint/idempotentHint already covering the safety profile, the description adds real value: it warns the output is sourced and dated and that attribution must be shown, states it is not legal advice, and flags the language default trap that silently produces a German answer for an English question. It stops short of describing the response structure, so a 4 rather than 5.

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 usage and exclusion guidance is front-loaded and every sentence carries routing or behavioral weight. The long topic enumeration overlaps substantially with the topic enum in the schema, which is redundant bulk, but it is not wasted prose.

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 zero-required-param, read-only lookup with no output schema, the description covers scope, triggers, exclusions, attribution and the language pitfall. Only the returned shape/form is left unaddressed, which is a minor gap given no output schema exists to describe it.

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 schema already explains city scoping, the topic enum values and the language default in detail. The description restates the city narrowing but adds no syntax or behavior the schema lacks; baseline 3 is appropriate.

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+resource (returns German road rules) and enumerates the exact subject matter covered, from Umweltzone and Feinstaubplakette to E-Kennzeichen. An agent can distinguish it from traffic, fuel, parking and charger siblings 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 an explicit trigger ("when someone drives through Germany or asks whether they may enter a city") and explicit exclusions naming the correct alternatives: check_autobahn_traffic for live traffic/closures and find_charging_station for charger lookups. Nothing is left to inference.

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

get_train_departuresA
Read-onlyIdempotent

Next trains from a German railway station: platform, delay, cancellations. Use when asked when a train, S-Bahn or ICE leaves a named station, or if a train or line from it is late ("RE1 from Köln Hbf late?"); later today ("heute Abend") stays here. A line with no DEPARTURE station ("ist die S1 pünktlich?"; a destination, "nach …"/"zum …", is not one) — check_transit_disruption. Do NOT use for buses, trams, a non-railway stop, another day or a time over 2 h away — get_departures. Train type: categories (ICE/IC/RE/RB/S); no destination filter. ≤ 15 rows, ≤ 120 min. Show the attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
whenNoStart of the window as an ISO-8601 instant with an offset ("2026-09-20T18:30:00+02:00"). Leave it out for "now", which is what almost every question means. Times in the answer are Europe/Berlin whatever you pass.
limitNoHow many departures to return, earliest first (1–15, default 10). More than 15 is refused — that is a board a person can read, not a dataset.
eva_noNoThe station's EVA number (6–8 digits, e.g. 8002549 for Hamburg Hbf), when a previous result gave you one. It skips the name lookup and is exact — use it to answer a follow-up about a station this tool has already named.
stationNoThe railway station, as the person says it: "Hamburg Hbf", "Köln Hbf", "Munich Central", "Frankfurt (Main) Hbf". Pass their words — English names and "central station" are understood. If the name fits several stations (a bare "Hauptbahnhof"), call anyway: the result lists them and asks which; do not guess one yourself. Give either station OR eva_no, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
categoriesNoKeep only these train types, when the person named one: "ICE", "IC" (also EC, ECE, Railjet, Nightjet), "RE" (also IRE), "RB" or "S" (S-Bahn). "next ICE to …" is ["ICE"], "Fernzug" is ["ICE", "IC"], "Regionalzug" is ["RE", "RB"]. The board then lists only those, so pair it with a longer duration_min. Omit it for "which trains leave". A replacement bus is never a train type.
duration_minNoHow far ahead to look, in minutes (5–120, default 60). Use a small window for "what leaves now" and a larger one for "this evening". Above 120 is refused: a departure board is not a timetable search.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/openWorld/non-destructive, but the description adds real behavioral context beyond them: hard caps (≤15 rows, ≤120 min, 'over 2 h is refused'), the ambiguity-handling behavior (a bare 'Hauptbahnhof' returns a list and asks, so don't guess), the language-default failure mode, and the requirement to show the attribution line. This is disclosure the structured fields do not carry.

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 tightly packed; almost every clause carries routing or constraint information. It is dense to the point of being cryptic in spots (e.g. 'A line with no DEPARTURE station'), but the length is justified by the number of near-miss siblings and edge cases it must disambiguate.

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 7-parameter tool with no output schema, the description does state the return shape (platform, delay, cancellations, ≤15 rows, attribution line) and all key limits. Minor gaps remain around the not-found/invalid-station failure path and pagination beyond the row cap, but overall it is sufficient to call correctly.

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 much of the description's parameter text mirrors the schema (e.g. the language/default guidance). It still adds cross-parameter meaning an agent needs: 'Give either station OR eva_no, never both', 'pair [categories] with a longer duration_min', 'no destination filter', and the train-type mapping for colloquial terms.

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?

Specific verb+resource: 'Next trains from a German railway station: platform, delay, cancellations.' It explicitly distinguishes itself from get_departures ('Do NOT use for buses, trams, a non-railway stop, another day or a time over 2 h away') and check_transit_disruption, so an agent can route without opening a 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 ('when a train, S-Bahn or ICE leaves a named station', lateness questions, 'heute Abend' stays here), explicit when-not (buses/trams/non-railway stops/later days/>2 h), and names the two alternative tools with the condition that selects each. Nothing is left to inference.

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

stop_watchA

Ends a watch this conversation opened with watch_situation, so no further notifications arrive for it. Use when the person no longer needs to be told — "du musst mir nichts mehr zur A8 sagen", "stop watching that charger". No id at hand: pass kind ("weather") and key in the person's words ("A8", "Bamberg", "Kiel"); one match is stopped, several are listed. Do NOT use to look a situation up (call check_road_status), to list what is running (read viafrei://watches), or to cancel anything outside this chat. Another session's watch is never found. Results carry their attribution line.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoInstead of an id: the watched subject in the person's words, as it was given to watch_situation — a road or place ("A8", "Bamberg"), and with `kind` a place for a weather or charger watch or a stop name for a station watch ("Kiel", "Köln Hbf"), which is resolved the way watch_situation resolved it. The id the watch carries works too. For a station, region, weather or charger watch a key that matches none of them falls back to `kind` alone. Matched against this session's open watches, case and spaces ignored. One match is stopped; several are listed and none is stopped.
uriNoThe watch's resource uri, e.g. "viafrei://watch/12". Give either this or `watch_id`, not both.
kindNoInstead of an id: the kind of watch the person means, as watch_situation took it ("road", "station", "region", "place", "weather", "charger"). "Turn off the charging alert" is kind "charger" alone.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
watch_idNoThe numeric id of the watch to stop, as `watch_situation` returned it (the 12 in viafrei://watch/12).

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (which only assert readOnly=false/destructive=false/idempotent=false), the description discloses the match-resolution rule (one match stopped, several listed and none stopped), the session-scoping limit (another session's watch is never found), and that results carry an attribution line. These are the behaviors an agent cannot get from the structured fields.

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 action and its effect, then usage, then exclusions, then fallback behavior. Dense and largely waste-free, though the kind/key enumeration in the prose partially duplicates the schema and the parenthetical example clusters lengthen it.

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 stateful mutation tool with no output schema, the description covers purpose, trigger conditions, alternatives, ambiguous-match handling, cross-session limits, and the attribution of results. An agent has everything needed to call it correctly or choose a sibling instead.

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 the baseline is 3, but the description adds a genuine decision heuristic for the alternative invocation paths — id vs. kind+key — and notes that the key is matched case- and space-insensitively against this session's open watches. It does not, however, explain anything about `uri` or `language` beyond what the schema already says.

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 (ends/stops) and resource (a watch opened by watch_situation) plus the consequence (no further notifications). It explicitly distinguishes itself from watch_situation (create), check_road_status (lookup) and viafrei://watches (listing), so an agent can route correctly without reading any sibling 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 to use it with natural-language user examples ("du musst mir nichts mehr zur A8 sagen"), gives explicit negative cases (do NOT look up, list, or cancel outside this chat), and explains the no-id fallback path (kind + key in the person's words) including the ambiguous-match outcome. Nothing is left to inference.

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

watch_situationA

Opens a watch so THIS conversation is told when something changes: a road reopening, a stop running late, a weather warning, a charge point turning free. Use when asked to be told later: "sag mir Bescheid, wenn die A8 wieder frei ist", "tell me when a warning comes for Kiel". A name is enough as the key; no lookup first. Do NOT use to look up now, nor for e-mail, SMS or any alert outside this chat — we cannot send one; say so. Set hours (≤ 24, default 3) to cover the time asked about; condition narrows it (only the reopening, one charge point). Session-scoped, ≤ 10 watches. Show attribution.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesThe thing to watch, in the person's own words — a name is enough and no read tool is needed first; the server resolves it and the answer names the key it resolved to. `road`: a road number ("A8", "B27"). `place`: a town or address ("Fulda"). `weather`: a place name ("Kiel"), resolved to the DWD warn cell it lies in — or a warn cell id ("801002000"); a Land or Kreis is an area and takes no single cell. `station`: a stop or station name ("Köln Hbf", "München, Marienplatz"), resolved to its DHID the way get_departures resolves a stop — or a DHID ("de:14612:28"); an EVA number from get_train_departures ("8000207") is not a DHID and is refused. `charger`: a place ("Würzburg"), resolved to the nearest charging site that reports live occupancy — or a site id from find_charging_station. `region`: an AGS prefix ("14612") from check_transit_disruption. A name that fits several places or stops gets a which-one list and opens no watch; call again with the chosen line.
kindYesWhat kind of thing to watch. `road` = one motorway or federal road (key: "A8", "B27") — reports a closure or restriction appearing or clearing; `station` = one public-transport stop (key: its name, "Köln Hbf", or its DHID) — reports departures running late past the threshold; `region` = a city or district by AGS prefix (key: "14612") — reports the share of late trips crossing the threshold; `place` = a town or address (key: "Fulda") — reports road restrictions appearing within the radius; `weather` = one DWD warn cell (key: a place name, "Kiel", or the cell id) — reports an official warning coming into force; `charger` = one charging site (key: a place, "Würzburg", or the site id) — reports a point turning free.
hoursNoHow long to watch, in hours (default 3, maximum 24). Prefer this over `until`: it needs no knowledge of the current time. Give one of `hours` or `until`, never both.
untilNoAn explicit end instant as ISO-8601 with an offset ("2026-09-20T18:40:00+02:00"), at most 24 hours ahead. Use only when the person named a time; otherwise use `hours`. Give one of `hours` or `until`, never both.
languageNoSet this on every call to the language the person is writing in: "en" if they wrote English, "de" if they wrote German. Do not leave it out: it defaults to German ("de"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps.de
conditionNoOptional threshold; the keys of each kind, with an example: road {"event": "reopen"} (only the reopening); station {"delay_min": 20}; region {"late_share": 0.3, "delay_min": 5, "min_trips": 20}; place {"radius_km": 10}; weather {"min_level": 3}; charger {"point_id": "2"} (one charge point). Any other key, or a key of another kind, is refused by name; leave it out for the default. The answer repeats the condition it applies.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare the mutation profile (readOnly=false, idempotent=false, openWorld=false, destructive=false); the description goes well beyond that by disclosing session scoping, a hard cap of 10 watches, the 24h maximum, the default watch length, and an attribution requirement. It also discloses ambiguity handling — a name fitting several places returns a which-one list and opens nothing — which is exactly the kind of behavior an agent cannot infer from the schema.

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 usage, then the behavioral caveats, and every clause carries information (limits, attribution, ambiguity, the no-lookup shortcut). The middle is dense with stacked examples, which is slightly crowded but not redundant.

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?

There is no output schema, and the description compensates by explaining what a watch reports per kind, how ambiguity and conditions are echoed back, session scope, and the watch cap. For a state-creating tool with a nested condition object, every fact an agent needs before calling it is present.

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% and the schema already explains key/kind resolution, hours vs until mutual exclusivity, language, and every condition sub-key with examples. The description restates the hours cap/default and that condition narrows the watch, adding a little framing but no syntax beyond what the schema carries. Baseline 3 is appropriate when the schema does the heavy lifting.

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 — 'Opens a watch so THIS conversation is told when something changes' — and enumerates the change types (road reopening, stop late, weather warning, charger free). The closing 'Do NOT use to look up now' cleanly separates it from the large family of check_* / find_* read siblings, so an agent can route correctly without opening a 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 with quoted user phrasings ('sag mir Bescheid, wenn die A8 wieder frei ist'), explicit when-not ('Do NOT use to look up now, nor for e-mail, SMS or any alert outside this chat'), and even instructs the agent what to tell the user in that case. It also warns 'A name is enough as the key; no lookup first', heading off the obvious wrong behavior of resolving via a read tool first.

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. 1 tool updatev2.1.22
    • Changedfind_charging_station1 field changed
      • changedInput schema / properties / limit / description
        Previous value: -"How many lines to return, nearest first (1–10, default 5). Records of one place within 50 m that read alike are folded into one line that says how many units it holds; structuredContent.sites lists every record of the lines shown, so it can be longer than limit."New value: +"How many lines to return, nearest first (1–10, default 5). Places within 50 m that read alike are folded into one line that says how many units it holds; structuredContent.sites has one entry per place of the lines shown, with siteIds naming every record of that place, so it can be longer than limit."
  2. 22 tool updatesv2.1.18
    • Changedcheck_autobahn_traffic2 fields changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum events to return across all roads (1–50, default 10). Jams on every road come first, then closures and roadworks; roads keep the order you listed them within each. Only what is in force now is listed — closures announced for later are counted apart in the headline."New value: +"Maximum events to return across all roads (1–50, default 10). Jams come first, then closures, other reports, then roadworks; within each the roads take turns in the order you listed them, so every road gets its share of the page. Only what is in force now is listed — closures announced for later are counted apart in the headline."
    • Changedcheck_road_status1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Changedcheck_station_facilities1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Changedcheck_transit_disruption1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Changedcheck_weather_warnings1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Changeddescribe_location1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Changedfind_address1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Changedfind_charging_station2 fields changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
      • changedInput schema / properties / limit / description
        Previous value: -"How many charging sites to return, nearest first (1–10, default 5)."New value: +"How many lines to return, nearest first (1–10, default 5). Records of one place within 50 m that read alike are folded into one line that says how many units it holds; structuredContent.sites lists every record of the lines shown, so it can be longer than limit."
    • Changedfind_cheapest_fuel1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Changedfind_fuel_station1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Addedfind_hydrogen_station
    • Changedfind_nearby1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Changedfind_parking3 fields changed
      • changedInput schema / properties / kind / description
        Previous value: -"Which kind of parking: \"rest_area\" = motorway rest and service area (no feed we ingest classifies this category at all, so an answer filtered to it says so and names the parking we do hold), \"car_park\" = public car park (Parkhaus/Parkplatz), \"park_and_ride\" = P+R beside a station, \"truck\" = lorry parking, \"any\" = all of them. Default \"any\". Pass a kind only when the person named one — \"Rastanlage\"/\"Raststätte\" is \"rest_area\", a lorry driver asking for a break wants \"truck\", someone leaving the car for the train wants \"park_and_ride\". A camper, a caravan or a coach is none of the five: leave the argument out rather than filtering a tourist into lorry bays."New value: +"Which kind of parking: \"car_park\" = public car park (Parkhaus/Parkplatz), \"park_and_ride\" = P+R beside a station, \"truck\" = lorry parking, \"any\" = all of them. Default \"any\". Rest areas are NOT a kind we can filter: no source we hold classifies them, so for \"Rastanlage\"/\"Raststätte\"/\"rest area\" leave kind out (\"truck\" when lorry spaces were asked for); \"rest_area\" is still accepted and answered as \"any\", with a sentence saying why. Pass a kind only when the person named one — a lorry driver asking for a break wants \"truck\", someone leaving the car for the train wants \"park_and_ride\". A camper, a caravan or a coach is none of these: leave the argument out rather than filtering a tourist into lorry bays."
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
      • changedInput schema / properties / road / description
        Previous value: -"A single motorway number to list parking along, e.g. \"A3\" (\"A 3\" and \"a3\" are the same road). Use this when the person named a road and no town — \"Rastplatz auf der A7\". Give road OR place OR lat+lon, never two of them: a road is a 900 km line and a place is a point, so the two answer different questions. When the question names BOTH — \"Parkhaus in Köln an der A3\" — use the place: a person parks at a point, and the radius already covers the motorway beside it."New value: +"A single motorway number to list parking along, e.g. \"A3\" (\"A 3\" and \"a3\" are the same road). Use this when the person named a road and no town — \"Rastplatz auf der A7\". Give road OR place OR lat+lon, never two of them: a road is a 900 km line and a place is a point, so the two answer different questions. When the question names BOTH — \"Parkhaus in Köln an der A3\" — use the place: a person parks at a point, and the radius already covers the motorway beside it. A road list is in name order and cannot follow a direction of travel: for \"A4 Richtung Görlitz\" ask with place for the destination or the next town on the way instead, which answers nearest first."
    • Changedfind_place1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Changedfind_poi7 fields changed
      • changedInput schema / properties / category / description
        Previous value: -"Narrow to one OpenStreetMap family: \"office\" (companies, agencies), \"shop\", \"amenity\" (fuel, pharmacy, school, restaurant, town hall), \"healthcare\", \"tourism\" (hotels, attractions), \"leisure\", \"industrial\", \"historic\" (castles, monuments, city gates), \"natural\" (mountain peaks) or \"building\". Omit unless the person was specific."New value: +"Narrow to one OpenStreetMap family: \"office\" (companies, agencies), \"shop\", \"amenity\" (fuel, pharmacy, school, restaurant, town hall), \"healthcare\" (hospitals, clinics, doctors, pharmacies), \"tourism\" (hotels, attractions), \"leisure\", \"industrial\" (factories, plants), \"historic\" (castles, monuments, city gates), \"natural\" (mountain peaks) or \"building\". Set it whenever the person names the type (\"Bosch office\" → office, \"Hotel Adler\" → tourism); omit it when they name no type."
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Pagination cursor from a previous result's _meta.nextCursor. Omit for the first page.",
        +  "maxLength": 256,
        +  "type": "string"
        +}
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
      • changedInput schema / properties / limit / default
        Previous value: -5New value: +10
      • changedInput schema / properties / limit / description
        Previous value: -"How many to return, best match first (1–10, default 5)."New value: +"How many to return per page, best match first (1–25, default 10). The answer says when more matched; fetch them with cursor, up to 50 in all."
      • changedInput schema / properties / limit / maximum
        Previous value: -10New value: +25
      • changedInput schema / properties / name / description
        Previous value: -"The name of the thing to find — a company, shop, clinic, hotel, office or landmark. Part of the name is enough: \"adesso\" finds \"adesso SE\". A chain name works too, because brands are matched as well as names."New value: +"The name of the thing to find — a company, shop, clinic, hotel, office or landmark. Part of the name is enough: \"adesso\" finds \"adesso SE\". A chain name works too, because brands are matched as well as names. A kind word alone, German or English (\"Apotheke\", \"pharmacy\", \"trade fair\"), lists that kind nearest first. When the person names a company AND a type (\"the Bosch office\"), put the company here and the type in category. Never for fuel, charging or parking, even near a named company or landmark (\"a charger by the Allianz Arena\"): those have their own tools, asked with the place."
    • Changedfind_roadworks_ahead4 fields changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
      • addedInput schema / properties / place
        Added value: +{
        +  "description": "A place in Hamburg — a district, street or address, e.g. \"Hamburg-Altona\", \"Wilhelmsburg\", \"Köhlbrandbrücke\" — for the city's own roadworks (Bauweiser) within 3 km of it. Outside Hamburg, city roadworks are not held and the answer says so. Give road OR place.",
        +  "maxLength": 120,
        +  "minLength": 2,
        +  "type": "string"
        +}
      • changedInput schema / properties / road / description
        Previous value: -"The road to look at, one per call: an Autobahn, e.g. \"A7\" or \"A100\", or a Bundesstraße, Landesstraße or Staatsstraße in Niedersachsen, Sachsen or Thüringen, e.g. \"B6\", \"L1025\", \"S296\" — \"A7\", \"A 7\" and \"a7\" are the same road. B and L roads in other Länder, Kreisstraßen and city streets are not covered. Ask again for a second road."New value: +"The road to look at, one per call: an Autobahn, e.g. \"A7\" or \"A100\", or a Bundesstraße, Landesstraße or Staatsstraße in Niedersachsen, Sachsen or Thüringen, e.g. \"B6\", \"L1025\", \"S296\" — \"A7\", \"A 7\" and \"a7\" are the same road. B and L roads in other Länder and Kreisstraßen are not covered. Ask again for a second road. Give road OR place."
      • removedInput schema / required
        Removed value: -[
        -  "road"
        -]
    • Changedfind_sharing1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Changedget_departures1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Changedget_driving_rules1 field changed
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Changedget_train_departures2 fields changed
      • addedInput schema / properties / categories
        Added value: +{
        +  "description": "Keep only these train types, when the person named one: \"ICE\", \"IC\" (also EC, ECE, Railjet, Nightjet), \"RE\" (also IRE), \"RB\" or \"S\" (S-Bahn). \"next ICE to …\" is [\"ICE\"], \"Fernzug\" is [\"ICE\", \"IC\"], \"Regionalzug\" is [\"RE\", \"RB\"]. The board then lists only those, so pair it with a longer duration_min. Omit it for \"which trains leave\". A replacement bus is never a train type.",
        +  "items": {
        +    "enum": [
        +      "ICE",
        +      "IC",
        +      "RE",
        +      "RB",
        +      "S"
        +    ],
        +    "type": "string"
        +  },
        +  "maxItems": 5,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Changedstop_watch2 fields changed
      • changedInput schema / properties / key / description
        Previous value: -"Instead of an id: the watched subject in the person's words, as watch_situation took it — works for road and place watches (\"A8\", \"Bamberg\"). For station, region, weather and charger watches `kind` alone is enough when one is open, and a key that matches none of them falls back to the kind alone. Matched against this session's open watches, case and spaces ignored. One match is stopped; several are listed and none is stopped."New value: +"Instead of an id: the watched subject in the person's words, as it was given to watch_situation — a road or place (\"A8\", \"Bamberg\"), and with `kind` a place for a weather or charger watch or a stop name for a station watch (\"Kiel\", \"Köln Hbf\"), which is resolved the way watch_situation resolved it. The id the watch carries works too. For a station, region, weather or charger watch a key that matches none of them falls back to `kind` alone. Matched against this session's open watches, case and spaces ignored. One match is stopped; several are listed and none is stopped."
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
    • Changedwatch_situation5 fields changed
      • addedInput schema / properties / condition / additionalProperties
        Added value: +false
      • changedInput schema / properties / condition / description
        Previous value: -"Optional threshold. Each key belongs to ONE kind and a key that does not belong to the chosen kind is refused by name; leave it out to use that kind's default."New value: +"Optional threshold; the keys of each kind, with an example: road {\"event\": \"reopen\"} (only the reopening); station {\"delay_min\": 20}; region {\"late_share\": 0.3, \"delay_min\": 5, \"min_trips\": 20}; place {\"radius_km\": 10}; weather {\"min_level\": 3}; charger {\"point_id\": \"2\"} (one charge point). Any other key, or a key of another kind, is refused by name; leave it out for the default. The answer repeats the condition it applies."
      • changedInput schema / properties / key / description
        Previous value: -"The thing being watched, in the vocabulary of `kind`: a road number, a stop DHID, an AGS prefix, a place name, a DWD warncell, a charging site id. For `road` and `place` it is the person's own words — \"A8\", \"B27\", \"Fulda\" — and needs no lookup. For `station`, `region`, `weather` and `charger` it is an identifier the matching read tool returned — look it up first: `station` = one of `stop.stopIds` from get_departures (\"de:14612:28\"); an EVA number from get_train_departures (\"8000207\") is NOT a stop id and is refused, as is any id no known stop carries; `region` from check_transit_disruption, `weather` from check_weather_warnings, `charger` from find_charging_station — a key nothing matches there produces a watch that is simply never triggered."New value: +"The thing to watch, in the person's own words — a name is enough and no read tool is needed first; the server resolves it and the answer names the key it resolved to. `road`: a road number (\"A8\", \"B27\"). `place`: a town or address (\"Fulda\"). `weather`: a place name (\"Kiel\"), resolved to the DWD warn cell it lies in — or a warn cell id (\"801002000\"); a Land or Kreis is an area and takes no single cell. `station`: a stop or station name (\"Köln Hbf\", \"München, Marienplatz\"), resolved to its DHID the way get_departures resolves a stop — or a DHID (\"de:14612:28\"); an EVA number from get_train_departures (\"8000207\") is not a DHID and is refused. `charger`: a place (\"Würzburg\"), resolved to the nearest charging site that reports live occupancy — or a site id from find_charging_station. `region`: an AGS prefix (\"14612\") from check_transit_disruption. A name that fits several places or stops gets a which-one list and opens no watch; call again with the chosen line."
      • changedInput schema / properties / kind / description
        Previous value: -"What kind of thing to watch. `road` = one motorway or federal road (key: \"A8\", \"B27\") — reports a closure or restriction appearing or clearing; `station` = one public-transport stop by its DHID (key: \"de:14612:28\") — reports departures running late past the threshold; `region` = a city or district by AGS prefix (key: \"14612\") — reports the share of late trips crossing the threshold; `place` = a town or address (key: \"Fulda\") — reports road restrictions appearing within the radius; `weather` = a DWD warncell (key: \"105315000\") — reports an official warning coming into force; `charger` = one charging site (key: the site id from find_charging_station) — reports a point turning free."New value: +"What kind of thing to watch. `road` = one motorway or federal road (key: \"A8\", \"B27\") — reports a closure or restriction appearing or clearing; `station` = one public-transport stop (key: its name, \"Köln Hbf\", or its DHID) — reports departures running late past the threshold; `region` = a city or district by AGS prefix (key: \"14612\") — reports the share of late trips crossing the threshold; `place` = a town or address (key: \"Fulda\") — reports road restrictions appearing within the radius; `weather` = one DWD warn cell (key: a place name, \"Kiel\", or the cell id) — reports an official warning coming into force; `charger` = one charging site (key: a place, \"Würzburg\", or the site id) — reports a point turning free."
      • changedInput schema / properties / language / description
        Previous value: -"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out because it has a default — the default is only the fallback when the language is genuinely unclear, and an English question answered in German is a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."New value: +"Set this on every call to the language the person is writing in: \"en\" if they wrote English, \"de\" if they wrote German. Do not leave it out: it defaults to German (\"de\"), which is only the fallback when the language is genuinely unclear, so an English question sent without it is answered in German — a wrong answer. Place names, station names and road numbers are never translated in either language; in English the German term is kept in parentheses so the person recognises it on signs and in local apps."
  3. 15 tool updatesv1.8.29
    • Changedcheck_autobahn_traffic2 fields changed
      • changedInput schema / properties / kinds / description
        Previous value: -"Which event kinds to return: warning = live traffic (jams, slow traffic, hazards), closure = full closures, roadworks = construction sites. Set it when the SUBJECT of the question is one of those categories by name: \"Baustellen auf der A8?\" is [\"roadworks\"], \"welche Sperrungen sind in diesem Moment gemeldet?\" is [\"closure\"]. Omit it when the question is how the road IS — Stau, frei, a delay, \"wie sieht es aus\", \"everything\"; the German \"Stau?\" is the idiom for the whole picture, and a filter nobody asked for hides the closure on the same stretch. Whether a closure question is this tool's at all is decided by two things, and the noun (Sperrung, Vollsperrung, closure) is neither. FIRST THE CLOCK: only a question about this minute (jetzt, gerade, in diesem Moment, right now, at this very minute) can be this tool's — with no time word at all, or for a later window (tonight, heute Abend, am Wochenende, the coming days), it is check_road_status. SECOND, WHAT IS ASKED, which the clock cannot see: what is REPORTED or in force on a named motorway is this tool (\"ist auf der A5 in diesem Moment eine Vollsperrung gemeldet?\", \"which closures are in force on the A100 at this very minute?\"), while whether the road is OPEN or passable is check_road_status AT ANY CLOCK — \"ist die A8 offen\", \"ist die A3 in diesem Moment gesperrt?\", \"komme ich da durch?\" — and so is a closure asked around a town instead of on a motorway number. Baustellen with a date or the word geplant are find_roadworks_ahead. Default: all three."New value: +"Which event kinds to return: warning = live traffic (jams, slow traffic, hazards), closure = full closures, roadworks = construction sites. Set it when the SUBJECT of the question is one of those categories by name: \"Baustellen auf der A8?\" is [\"roadworks\"], \"welche Sperrungen sind in diesem Moment gemeldet?\" is [\"closure\"]. Omit it when the question is how the road IS — Stau, frei, a delay, \"wie sieht es aus\", \"everything\"; the German \"Stau?\" is the idiom for the whole picture, and a filter nobody asked for hides the closure on the same stretch. Whether a closure question is this tool's at all is decided by two things, and the noun (Sperrung, Vollsperrung, closure) is neither. FIRST THE CLOCK: only a question about this minute (jetzt, gerade, in diesem Moment, right now, at this very minute) can be this tool's — with no time word at all, or for a later window (tonight, heute Abend, am Wochenende, the coming days), it is check_road_status. SECOND, WHAT IS ASKED, which the clock cannot see: what is REPORTED or in force on a named motorway is this tool (\"which closures are in force on the A100 at this very minute?\"), while whether the road is OPEN or passable is check_road_status AT ANY CLOCK — \"ist die A8 offen\", \"ist die A3 in diesem Moment gesperrt?\", \"komme ich da durch?\" — and so is a closure asked around a town instead of on a motorway number. Baustellen with a date or the word geplant are find_roadworks_ahead. Default: all three."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum events to return across all roads (1–50, default 10). Roads keep the order you listed them; within a road, jams come first, then closures and roadworks."New value: +"Maximum events to return across all roads (1–50, default 10). Jams on every road come first, then closures and roadworks; roads keep the order you listed them within each. Only what is in force now is listed — closures announced for later are counted apart in the headline."
    • Changedcheck_road_status5 fields changed
      • changedInput schema / properties / horizon_days / description
        Previous value: -"How many days ahead to look, counting from now (0 = right now only, max 14, default 3). Set it only to what the person actually asked for: 0 when they said right now / gerade / jetzt / in diesem Moment, 1 for tonight or heute Abend, 3 for \"this weekend\", 7 for \"next week\", and for a named weekday (\"am Freitag\", \"on Friday\") the number of days from today to that day. A bare \"is the A8 open?\" asks for no window — omit the argument and take the default rather than reading it as 0. Live closures are always included whatever this is."New value: +"How many days ahead to look, counting from now (0 = right now only, max 14, default 3). Set it only to what the person actually asked for: 0 when they said right now / gerade / jetzt / in diesem Moment, 1 for tonight or heute Abend, 3 for \"this weekend\", 7 for \"next week\", and for a named weekday (\"am Freitag\", \"on Friday\") the number of days from today to that day. A bare \"is the A8 open?\" asks for no window — omit the argument and take the default rather than reading it as 0. Live closures are always included whatever this is, and so, by place, are the jams reported right now (\"Stau in Köln?\" needs no horizon)."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum entries to return (1–11, default 10). Closures come first, then restrictions in force, then planned works."New value: +"Maximum entries to return (1–11, default 10). By road, closures come first, then restrictions in force, then planned works; by place, nearest first."
      • changedInput schema / properties / place / description
        Previous value: -"Where to look, as free text: a city (\"München\", \"Munich\"), a district or Kreis (\"Kreis Fulda\"), a Bundesland, a station or stop (\"Hamburg Hbf\"), a motorway (\"A7\"), or a street address with a house number (\"Hauptstraße 12, 36037 Fulda\"). Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both."New value: +"Where to look, as free text: a city (\"München\", \"Munich\"), a district or Kreis (\"Kreis Fulda\"), a Bundesland, a station or stop (\"Hamburg Hbf\"), a motorway junction (\"AK Neufahrn\"), or a street address with a house number (\"Bahnhofstraße 12, 36037 Fulda\"). A motorway number alone (\"A7\") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both."
      • changedInput schema / properties / road / description
        Previous value: -"One German motorway or federal road, e.g. \"A8\" or \"B27\". \"A8\", \"A 8\" and \"a8\" are the same road. Use this whenever the person named a road — it is the only input that reaches the planned-works data, which is filed by road and section and carries no coordinates. Give exactly one of road, place, or lat+lon."New value: +"One German motorway or federal road, e.g. \"A8\" or \"B27\", or a Landes- or Staatsstraße in Niedersachsen, Sachsen or Thüringen, e.g. \"L1025\" or \"S296\". \"A8\", \"A 8\" and \"a8\" are the same road. Use this whenever the person named a road — it is the only input that reaches the planned-works data, which is filed by road and section and carries no coordinates. When the person also says WHERE — a town or a Bundesland (\"die B2 bei Potsdam\", \"L1025 in Niedersachsen\") — pass that as place too: only sources for that Land answer, and a Land no source covers is named. L and S numbers repeat in every Land, so give the Land with them. Otherwise give exactly one of road, place, or lat+lon."
      • changedInput schema / properties / road / pattern
        Previous value: -"^[ABab] ?\\d{1,3}$"New value: +"^(?:[ABab] ?\\d{1,3}|[LlSs] ?\\d{1,4})$"
    • Changedcheck_station_facilities1 field changed
      • changedInput schema / properties / station / description
        Previous value: -"The railway station, as the person says it: \"Köln Hbf\", \"Hamburg Hbf\", \"Munich Central\". Pass their words — English names and \"central station\" are understood. If the name fits several stations the result lists them and asks which; do not guess one yourself. Give either station OR eva_no, never both."New value: +"The railway station — or Köln Stadtbahn stop — as the person says it: \"Köln Hbf\", \"Hamburg Hbf\", \"Munich Central\", \"Neumarkt Köln\". Pass their words — English names and \"central station\" are understood. If the name fits several stations the result lists them and asks which; do not guess one yourself. Give either station OR eva_no, never both."
    • Changedcheck_weather_warnings1 field changed
      • changedInput schema / properties / place / description
        Previous value: -"Where to look, as free text: a city (\"München\", \"Munich\"), a district or Kreis (\"Kreis Fulda\"), a Bundesland, a station or stop (\"Hamburg Hbf\"), a motorway (\"A7\"), or a street address with a house number (\"Hauptstraße 12, 36037 Fulda\"). Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both."New value: +"Where to look, as free text: a city (\"München\", \"Munich\"), a district or Kreis (\"Kreis Fulda\"), a Bundesland, a station or stop (\"Hamburg Hbf\"), a motorway junction (\"AK Neufahrn\"), or a street address with a house number (\"Bahnhofstraße 12, 36037 Fulda\"). A motorway number alone (\"A7\") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both."
    • Changedfind_address1 field changed
      • changedInput schema / properties / query / description
        Previous value: -"A street address, as a person writes one: street and house number, plus a town or postcode — \"Hauptstraße 12, 36037 Fulda\" or \"Hauptstraße 12, Fulda\". Both orders work. A street and number with neither a town nor a postcode cannot be placed (the same street name exists in about two thousand German towns) and is refused."New value: +"A street address, as a person writes one: street and house number, plus a town or postcode — \"Bahnhofstraße 12, 36037 Fulda\" or \"Bahnhofstraße 12, Fulda\". Both orders work. A street and number with neither a town nor a postcode cannot be placed (the same street name exists in about two thousand German towns) and is refused."
    • Changedfind_charging_station2 fields changed
      • changedInput schema / properties / min_power_kw / description
        Previous value: -"Only charging points of at least this many kW (1–1000). Use when the person asks for fast charging or names a number: 50 = DC fast, 150 = HPC, 300 = the fastest posts in Germany. Omit for \"where can I charge\" — 11 kW overnight is a valid answer to that question."New value: +"Only charging points of at least this many kW (1–1000). Use when the person names a number or asks for fast charging: 50 = DC fast (a bare \"fast\"/\"schnell\"/\"Schnelllader\"), 150 = HPC (\"HPC\", \"ultra\", \"ultraschnell\"), 300 = the fastest posts in Germany. Omit for \"where can I charge\" — 11 kW overnight is a valid answer to that question."
      • changedInput schema / properties / place / description
        Previous value: -"Where to look, as free text: a city (\"München\", \"Munich\"), a district or Kreis (\"Kreis Fulda\"), a Bundesland, a station or stop (\"Hamburg Hbf\"), a motorway (\"A7\"), or a street address with a house number (\"Hauptstraße 12, 36037 Fulda\"). Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both."New value: +"Where to look, as free text: a city (\"München\", \"Munich\"), a district or Kreis (\"Kreis Fulda\"), a Bundesland, a station or stop (\"Hamburg Hbf\"), a motorway junction (\"AK Neufahrn\"), or a street address with a house number (\"Bahnhofstraße 12, 36037 Fulda\"). A motorway number alone (\"A7\") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both."
    • Changedfind_cheapest_fuel1 field changed
      • changedInput schema / properties / place / description
        Previous value: -"Where to look, as free text: a city (\"München\", \"Munich\"), a district or Kreis (\"Kreis Fulda\"), a Bundesland, a station or stop (\"Hamburg Hbf\"), a motorway (\"A7\"), or a street address with a house number (\"Hauptstraße 12, 36037 Fulda\"). Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both."New value: +"Where to look, as free text: a city (\"München\", \"Munich\"), a district or Kreis (\"Kreis Fulda\"), a Bundesland, a station or stop (\"Hamburg Hbf\"), a motorway junction (\"AK Neufahrn\"), or a street address with a house number (\"Bahnhofstraße 12, 36037 Fulda\"). A motorway number alone (\"A7\") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both."
    • Changedfind_fuel_station2 fields changed
      • changedInput schema / properties / place / description
        Previous value: -"Where to look, as free text: a city (\"München\", \"Munich\"), a district or Kreis (\"Kreis Fulda\"), a Bundesland, a station or stop (\"Hamburg Hbf\"), a motorway (\"A7\"), or a street address with a house number (\"Hauptstraße 12, 36037 Fulda\"). Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both."New value: +"Where to look, as free text: a city (\"München\", \"Munich\"), a district or Kreis (\"Kreis Fulda\"), a Bundesland, a station or stop (\"Hamburg Hbf\"), a motorway junction (\"AK Neufahrn\"), or a street address with a house number (\"Bahnhofstraße 12, 36037 Fulda\"). A motorway number alone (\"A7\") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both."
      • changedInput schema / properties / whole_day / description
        Previous value: -"When true, only stations the provider flags as open around the clock (24/7). Default false. Use it for a night drive; it is a stricter filter than open_now, which is satisfied by a station that closes at 22:00."New value: +"When true, only stations the provider flags as open around the clock (24/7). Default false. Use it when asked whether a station never closes (\"durchgehend geöffnet\", \"around the clock\") and for a night drive; it is a stricter filter than open_now, which is satisfied by a station that closes at 22:00."
    • Changedfind_nearby1 field changed
      • changedInput schema / properties / place / description
        Previous value: -"Where to look, as free text: a city (\"München\", \"Munich\"), a district or Kreis (\"Kreis Fulda\"), a Bundesland, a station or stop (\"Hamburg Hbf\"), a motorway (\"A7\"), or a street address with a house number (\"Hauptstraße 12, 36037 Fulda\"). Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both."New value: +"Where to look, as free text: a city (\"München\", \"Munich\"), a district or Kreis (\"Kreis Fulda\"), a Bundesland, a station or stop (\"Hamburg Hbf\"), a motorway junction (\"AK Neufahrn\"), or a street address with a house number (\"Bahnhofstraße 12, 36037 Fulda\"). A motorway number alone (\"A7\") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both."
    • Changedfind_parking2 fields changed
      • changedInput schema / properties / only_with_free_spaces / description
        Previous value: -"Set true ONLY when the person insists on somewhere with free spaces right now. It keeps just the facilities whose operator publishes live occupancy AND currently reports a space, and the result says how many were dropped for publishing nothing — most German parking publishes no occupancy at all, so true usually narrows the answer to very little. Default false."New value: +"Set true only when the person asks whether spaces are free right now. It keeps just the facilities whose operator publishes live occupancy AND currently reports a space, and the result says how many were dropped for publishing nothing — most German parking publishes no occupancy at all, so true usually narrows the answer to very little. Default false."
      • changedInput schema / properties / place / description
        Previous value: -"Where to look, as free text: a city (\"München\", \"Munich\"), a district or Kreis (\"Kreis Fulda\"), a Bundesland, a station or stop (\"Hamburg Hbf\"), a motorway (\"A7\"), or a street address with a house number (\"Hauptstraße 12, 36037 Fulda\"). Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both."New value: +"Where to look, as free text: a city (\"München\", \"Munich\"), a district or Kreis (\"Kreis Fulda\"), a Bundesland, a station or stop (\"Hamburg Hbf\"), a motorway junction (\"AK Neufahrn\"), or a street address with a house number (\"Bahnhofstraße 12, 36037 Fulda\"). A motorway number alone (\"A7\") resolves to the road, which has no single point — name a town or junction on it instead. Use this instead of coordinates whenever the person named a place. An address needs its town or postcode — a street and a number alone exist in many towns. Give either place OR lat+lon, never both."
    • Changedfind_poi2 fields changed
      • changedInput schema / properties / category / description
        Previous value: -"Narrow to one OpenStreetMap family: \"office\" (companies, agencies), \"shop\", \"amenity\" (fuel, pharmacy, school, restaurant), \"healthcare\", \"tourism\" (hotels, attractions), \"leisure\", \"industrial\" or \"building\". Omit unless the person was specific."New value: +"Narrow to one OpenStreetMap family: \"office\" (companies, agencies), \"shop\", \"amenity\" (fuel, pharmacy, school, restaurant, town hall), \"healthcare\", \"tourism\" (hotels, attractions), \"leisure\", \"industrial\", \"historic\" (castles, monuments, city gates), \"natural\" (mountain peaks) or \"building\". Omit unless the person was specific."
      • changedInput schema / properties / category / enum
        Previous value: -[
        -  "office",
        -  "amenity",
        -  "shop",
        -  "tourism",
        -  "healthcare",
        -  "leisure",
        -  "industrial",
        -  "building"
        -]New value: +[
        +  "office",
        +  "amenity",
        +  "shop",
        +  "tourism",
        +  "healthcare",
        +  "leisure",
        +  "industrial",
        +  "historic",
        +  "natural",
        +  "building"
        +]
    • Changedfind_roadworks_ahead2 fields changed
      • changedInput schema / properties / road / description
        Previous value: -"The Autobahn to look at, one per call, e.g. \"A7\" or \"A100\" — \"A7\", \"A 7\" and \"a7\" are the same road. Bundesautobahnen only: this feed carries no Bundesstraßen and no city streets. Ask again for a second motorway."New value: +"The road to look at, one per call: an Autobahn, e.g. \"A7\" or \"A100\", or a Bundesstraße, Landesstraße or Staatsstraße in Niedersachsen, Sachsen or Thüringen, e.g. \"B6\", \"L1025\", \"S296\" — \"A7\", \"A 7\" and \"a7\" are the same road. B and L roads in other Länder, Kreisstraßen and city streets are not covered. Ask again for a second road."
      • changedInput schema / properties / road / pattern
        Previous value: -"^[Aa] ?\\d{1,3}$"New value: +"^(?:[AaBb] ?\\d{1,3}|[LlSs] ?\\d{1,4})$"
    • Addedfind_sharing
    • Changedget_departures1 field changed
      • changedInput schema / properties / duration_min / description
        Previous value: -"How far past that moment to look, in minutes (5–1440, default 60). Small for \"what goes now\", a few hours for an evening. To reach the far end of the 48 h timetable, move `when` instead of widening this: a window of a whole day returns at most 15 rows and would answer about the wrong half of it."New value: +"How far past that moment to look, in minutes (5–1440, default 60). Small for \"what goes now\", a few hours for an evening. To look further ahead (the timetable reaches at least 48 h), move `when` instead of widening this: a window of a whole day returns at most 15 rows and would answer about the wrong half of it."
    • Changedstop_watch2 fields changed
      • addedInput schema / properties / key
        Added value: +{
        +  "description": "Instead of an id: the watched subject in the person's words, as watch_situation took it — works for road and place watches (\"A8\", \"Bamberg\"). For station, region, weather and charger watches `kind` alone is enough when one is open, and a key that matches none of them falls back to the kind alone. Matched against this session's open watches, case and spaces ignored. One match is stopped; several are listed and none is stopped.",
        +  "maxLength": 200,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / kind
        Added value: +{
        +  "description": "Instead of an id: the kind of watch the person means, as watch_situation took it (\"road\", \"station\", \"region\", \"place\", \"weather\", \"charger\"). \"Turn off the charging alert\" is kind \"charger\" alone.",
        +  "enum": [
        +    "road",
        +    "station",
        +    "region",
        +    "place",
        +    "weather",
        +    "charger"
        +  ],
        +  "type": "string"
        +}
  4. 18 tool updatesv1.7.3
    • Changedcheck_autobahn_traffic1 field changed
      • addedInput schema / properties / cursor / maxLength
        Added value: +256
    • Changedcheck_road_status1 field changed
      • addedInput schema / properties / place / maxLength
        Added value: +120
    • Changedcheck_station_facilities1 field changed
      • addedInput schema / properties / station / maxLength
        Added value: +120
    • Changedcheck_transit_disruption2 fields changed
      • changedInput schema / properties / region / description
        Previous value: -"The German region to report on, as free text: a Bundesland (\"Bayern\", \"Bavaria\", \"Nordrhein-Westfalen\"), a city (\"Hamburg\", \"Köln\") or a Kreis (\"Landkreis Fulda\"). A town inside a Kreis is reported as that Kreis and the answer says so, because the data is filed at Kreis level. Not a stop, not a street, not an address. Give either region OR lat+lon, never both."New value: +"The German region to report on, as free text: a Bundesland (\"Bayern\", \"Bavaria\", \"Nordrhein-Westfalen\"), a city (\"Hamburg\", \"Köln\"), a Kreis (\"Landkreis Fulda\") or one of the conurbations Ruhrgebiet, Rhein-Ruhr and Rhein-Main. A town inside a Kreis is reported as that Kreis and the answer says so, because the data is filed at Kreis level. Not a stop, not a street, not an address. Give either region OR lat+lon, never both."
      • addedInput schema / properties / region / maxLength
        Added value: +120
    • Changedcheck_weather_warnings1 field changed
      • addedInput schema / properties / place / maxLength
        Added value: +120
    • Changedfind_address1 field changed
      • addedInput schema / properties / query / maxLength
        Added value: +160
    • Changedfind_charging_station1 field changed
      • addedInput schema / properties / place / maxLength
        Added value: +120
    • Changedfind_cheapest_fuel1 field changed
      • addedInput schema / properties / place / maxLength
        Added value: +120
    • Changedfind_fuel_station3 fields changed
      • addedInput schema / properties / brand / maxLength
        Added value: +60
      • addedInput schema / properties / name / maxLength
        Added value: +120
      • addedInput schema / properties / place / maxLength
        Added value: +120
    • Changedfind_nearby1 field changed
      • addedInput schema / properties / place / maxLength
        Added value: +120
    • Changedfind_parking2 fields changed
      • addedInput schema / properties / place / maxLength
        Added value: +120
      • addedInput schema / properties / road / maxLength
        Added value: +16
    • Changedfind_place2 fields changed
      • addedInput schema / properties / near / maxLength
        Added value: +120
      • addedInput schema / properties / query / maxLength
        Added value: +120
    • Changedfind_poi3 fields changed
      • addedInput schema / properties / in / maxLength
        Added value: +120
      • addedInput schema / properties / name / maxLength
        Added value: +120
      • addedInput schema / properties / near / maxLength
        Added value: +120
    • Changedfind_roadworks_ahead1 field changed
      • changedInput schema / properties / to / description
        Previous value: -"Last day of the window, inclusive, as YYYY-MM-DD. Omit for 7 days after `from`, which is the right window for \"am I going to hit roadworks on this drive\". The window may span at most 90 days. For \"how long will this last\" / \"wie lange dauert die Baustelle noch\", leave both dates out: the default 7 days already returns the site's planned end date. Only widen — 28 days is the sensible step — when the person asked about a period that long."New value: +"Last day of the window, inclusive, as YYYY-MM-DD. Omit for 7 days after `from`, which is the right window for \"am I going to hit roadworks on this drive\". The window may span at most 92 days. For \"how long will this last\" / \"wie lange dauert die Baustelle noch\", leave both dates out: the default 7 days already returns the site's planned end date. Only widen — 28 days is the sensible step — when the person asked about a period that long."
    • Changedget_departures2 fields changed
      • addedInput schema / properties / stop / maxLength
        Added value: +120
      • addedInput schema / properties / stop_id / maxLength
        Added value: +64
    • Changedget_train_departures1 field changed
      • addedInput schema / properties / station / maxLength
        Added value: +120
    • Changedstop_watch1 field changed
      • addedInput schema / properties / uri / maxLength
        Added value: +64
    • Changedwatch_situation1 field changed
      • changedInput schema / properties / key / description
        Previous value: -"The thing being watched, in the vocabulary of `kind`: a road number, a stop id, an AGS prefix, a place name, a DWD warncell, a charging site id. For `road` and `place` it is the person's own words — \"A8\", \"B27\", \"Fulda\" — and needs no lookup. For `station`, `region`, `weather` and `charger` it is an identifier, and it must be the one the matching read tool returned (get_train_departures, check_transit_disruption, check_weather_warnings, find_charging_station): look it up first, because a key nothing matches produces a watch that is simply never triggered."New value: +"The thing being watched, in the vocabulary of `kind`: a road number, a stop DHID, an AGS prefix, a place name, a DWD warncell, a charging site id. For `road` and `place` it is the person's own words — \"A8\", \"B27\", \"Fulda\" — and needs no lookup. For `station`, `region`, `weather` and `charger` it is an identifier the matching read tool returned — look it up first: `station` = one of `stop.stopIds` from get_departures (\"de:14612:28\"); an EVA number from get_train_departures (\"8000207\") is NOT a stop id and is refused, as is any id no known stop carries; `region` from check_transit_disruption, `weather` from check_weather_warnings, `charger` from find_charging_station — a key nothing matches there produces a watch that is simply never triggered."
  5. 2 tool updatesv1.4.9
    • Addedget_departures
    • Changedget_train_departures1 field changed
      • changedInput schema / properties / station / description
        Previous value: -"The railway station, as the person says it: \"Hamburg Hbf\", \"Köln Hbf\", \"Munich Central\", \"Frankfurt (Main) Hbf\". Pass their words — English names and \"central station\" are understood. If the name fits several stations the result lists them and asks which; do not guess one yourself. Give either station OR eva_no, never both."New value: +"The railway station, as the person says it: \"Hamburg Hbf\", \"Köln Hbf\", \"Munich Central\", \"Frankfurt (Main) Hbf\". Pass their words — English names and \"central station\" are understood. If the name fits several stations (a bare \"Hauptbahnhof\"), call anyway: the result lists them and asks which; do not guess one yourself. Give either station OR eva_no, never both."
  6. 6 tool updatesv1.4.8
    • Addeddescribe_location
    • Addedfind_address
    • Addedfind_fuel_station
    • Addedfind_nearby
    • Addedfind_place
    • Addedfind_poi
  7. 13 tool updatesv0.0.9
    • First observedcheck_autobahn_traffic
    • First observedcheck_road_status
    • First observedcheck_station_facilities
    • First observedcheck_transit_disruption
    • First observedcheck_weather_warnings
    • First observedfind_charging_station
    • First observedfind_cheapest_fuel
    • First observedfind_parking
    • First observedfind_roadworks_ahead
    • First observedget_driving_rules
    • First observedget_train_departures
    • First observedstop_watch
    • First observedwatch_situation

TDQS

A4.4/5.0

Scored across 22 tools

Disambiguation4/5

Several genuinely overlapping pairs exist (find_cheapest_fuel vs find_fuel_station, check_autobahn_traffic vs check_road_status vs find_roadworks_ahead, get_train_departures vs get_departures, find_place vs find_poi vs find_address). However, every description carries explicit routing rules and 'Do NOT use... call X' clauses that make the intended selection unambiguous in practice.

Naming Consistency5/5

Uniform snake_case verb_noun throughout, with a predictable verb-to-purpose mapping: find_* for lookups, check_* for live status, get_* for retrieval, plus a coherent watch_situation/stop_watch pair.

Tool Count4/5

At 22 tools the set is on the heavy side, but each tool maps to a distinct modality (fuel, charging, H2, parking, sharing, transit, weather, roadworks, rules, watches) rather than duplicating scope, so the count is defensible.

Completeness4/5

Broad coverage of lookup, reverse geocode, multimodal station/parking/charging status, traffic, roadworks, weather warnings, transit and watches, with a clear lifecycle for each. Gaps are acknowledged rather than hidden (no A-to-B routing, no general forecast, no e-scooters), so agents can say so and route around them.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    A comprehensive MCP server providing 30 tools for geocoding, routing, and OpenStreetMap data analysis. It enables AI assistants to search for locations, calculate travel routes, and perform quality assurance checks on map data.
    30
    498 npm
    5
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    MCP server providing AI agents with access to German government open data. 12 tools across 6 categories: Autobahn traffic, DWD weather, NINA disaster warnings, SMARD energy market, Bundestag parliamentary data, and pollen forecasts. All APIs are free, no keys required.
    16
    3
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that exposes the Deutsche Bahn public transport API to any MCP-compatible client (Claude Desktop, Cursor, Cline, Continue, etc.). Five tools cover station search, departures, journey planning, trip details, and nearby stations.
    6
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Keyless remote MCP server for German public-infrastructure open data: weather, air quality, traffic, public transit, parking and roadworks across 84+ German cities (DWD, Umweltbundesamt, Mobilithek, GovData). 38 read-only tools.
    12
    14
    Apache 2.0