Skip to main content
Glama

ViaFrei

Smithery npm Glama ViaFrei MCP connector Listed on mcpservers.org

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.3.2: answers that name the place they used, one line per place, and faster lookups. Since 2.2.14, from a 1,000-question test round:

  • The place used is named. Asked for "Munich", every place tool answers "Answering for München (you asked "Munich")." on its first line; the same for a station or stop matched under another spelling.

  • Every label offered resolves. A which-one list's labels ("Wolfen (Bitterfeld)", "AS Cloppenburg (A1)") answer in one call when handed back.

  • One place, one line. In Oschatz, a works site carried by two of Saxony's feeds (its closure system and its roadworks feed) reads once: "Bahnhofstraße · S30 — Oschatz; Erneuerung Gehweg (laufend, 31.08.2026–30.10.2026; 0,3 km)".

  • No false all-clear. check_autobahn_traffic for a motorway number we hold no stretch of says so and names the nearest real numbers, instead of "nothing reported".

  • Dense cities read better. check_road_status {place: "Kiel"} leads with "im Umkreis von 3 km 61 Meldungen, davon 11 Sperrungen", then the whole 25 km.

  • A near miss on an address helps. find_address for "Heisfeldr Straße 10, Leer" says the town holds addresses but none on that street, and suggests "Heisfelder Straße (26789 Leer (Ostfriesland)) — 114 kartierte Adressen".

  • Watches say what they watch. watch_situation takes the person's words in request; a jam alone opens no watch, because a road watch reports closures and restrictions, not jams.

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 München? · How is the traffic on the A3 around Köln? · Ist die Fehmarnsundbrücke wegen Wind gesperrt? · Which detours are signed near Hamburg Hbf?

🚚 driving a lorry

Darf der Lang-Lkw auf die A7? · Which height limits are there for lorries in Bremen? · Gibt es Lkw-Durchfahrtsverbote bei Bielefeld? · Wann ist der nächste Lkw-Fahrverbotstag? · Gilt am 31. Oktober in Niedersachsen Lkw-Fahrverbot? · Welche Durchfahrtshöhen gibt es am Kölner Dom? · Where are the lorry bans in Dresden?

🚧 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? · Is there a free disabled parking bay near Dortmund's Hansastraße? · Find a rest area with lorry parking on the A9 · Where can I park on the street near Hamburg Rathaus?

⛽ 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? · Is Tübingen Hbf step-free? · Ist die Bushaltestelle Ludgeriplatz in Münster barrierefrei? · Which platforms at Leipzig Hbf are step-free?

🌦️ 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 Marienplatz in Munich inside the low-emission zone? · Liegt Essen Hbf in der Umweltzone? · 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, plus the measured traffic state of Hamburg's and Bonn's streets and the quarter-hour counts of Hamburg's counting sites (a count is a volume, never a jam). Closures and roadworks also cover Land roads in Niedersachsen, Baden-Württemberg, Mecklenburg-Vorpommern, Sachsen and Thüringen, federal roads there and in Schleswig-Holstein, Bayern and Berlin, the city streets of Hamburg and Bremen, the works the city and Land portals publish (Kiel, Schleswig-Holstein, Brandenburg, Freiburg, Karlsruhe, Frankfurt, Berlin, Duisburg, Aachen, Ingolstadt, Köln, Münster, Dortmund, Stuttgart, München), 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. Street detail around a place (signed detours, signal installations, on-street bays, loading bays, border crossings, winter service, pedestrian-zone entrances) exists only where a city or Land publishes it, and the answer names which. Lorry restrictions by place cover North Rhine-Westphalia's towns (SEVAS), Köln, Dresden, the Frankfurt RheinMain region (ivm) and Bremen; elsewhere the answer says it holds no data, which is never a clearance, and the long-lorry network covers the whole country. 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 nine were asked of server 2.2.14 on 2026-10-20 between 06:00 and 06:16 Berlin time; an "As of" time earlier than that is the time the source was last read. The next seven were asked of server 2.2.6 on 2026-10-19 between 07:34 and 07:45 Berlin time, the day it went live. The next 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.

Hamburg Hbf: 1 jam report, 176 closures, 291 restrictions, 2 planned roadworks sites, 13 current roadworks sites per BASt — window until 2026-10-21.
I do not hold federal and Land roads (Bundes-, Landes-/Staatsstraßen) for Hamburg: for those, this answer is no all-clear.
Measured traffic state (Hamburg, BVM (traffic state), as of 06:00) within 10 km: 952 segments: jammed traffic: 3, slow traffic: 35, dense traffic: 914 — nearest segment (jammed traffic or slow traffic) 1.1 km away, main road; the source does not list free-flowing segments — a segment it does not list is flowing or not measured.
Counted traffic within 1.0 km (BVM counting sites (Hamburg)): counting site 0330, cross-section 4 (0.1 km), 05:30–05:45: no cross-section total (not every direction counted); by direction: west to east 37 · counting site 0331, cross-section 3 (0.2 km), 05:30–05:45: 53 motor vehicles; by direction: northeast to southwest 34, southwest to northeast 19. Further cross-sections in reach: 2. A count is a volume per quarter hour, not a statement about congestion or free flow.
• Traffic jam (Stau) A1: Provider text (German): "A1 | Tunnel Moorfleet - Norderelbbrücke · Lübeck -> Hamburg" (since 05:26; +10 min; 7.6 km away)
…
Signed motorway detours nearby (signs 460/455): U 26 (nearest section: Bürgerweide; 1.3 km); U 85 (nearest section: Heidenkampsweg; 1.3 km) — signage context, not a route recommendation
Signal installations nearby (16 within 500 m): 11 at junctions, 5 at pedestrian crossings; nearest: Mönckebergstraße/Steintorwall (0.1 km)

New in 2.2.12 (the counts) and 2.2.13 (the detours and the signal installations). A detour is named by its number and its nearest street, and always as the signs you will see, never as a route we recommend. A bus registration at a signal is counted only where the city records one, and a zero is never said. Edited: the first line (a note that one roadworks source is 13 days old), two of three entries, the sources that answered and the source line omitted.

Parking around Hamburg, Rathaus (within 10 km), nearest first:
1. Europa-Passage — Car park (Parkhaus), 0.2 km, 690 spaces, no occupancy published
2. Alter Wall / BUCERIUS-Passage — Car park (Parkhaus), 0.3 km, 210 spaces, 95 free (as of 06:00)
3. Große Reichenstraße — Car park (Parkhaus), 0.3 km, 850 spaces, 488 free (as of 06:06)
…
On-street parking bays nearby (the city's register) (168 bays within 300 m): Rathausstraße (for disabled badge holders; 1 bay; 0.1 km); Rathausstraße (electric vehicles charging only Mon–Sat 09:00–20:00; at most 180 min; 1 bay; 0.1 km); Rathausstraße (pay and display; 2 bays; 0.1 km) — the city publishes no occupancy — whether a bay is free is not known; the signs on site apply

New in 2.2.13. The bays come from the Landesbetrieb Verkehr's register of public parking space: a street's bays under one rule set are one line, with the rule, the hours and the maximum stay. Stopping bans and personal disabled bays are never counted or offered. The same answer also lists the city's coach places, with the city's own remark quoted, and the OpenStreetMap car parks in a block of their own. Edited: two car parks, the OpenStreetMap and coach blocks and the source line omitted.

Lorry restrictions within 5 km of Dom, Köln (NRW.Mobidrom (SEVAS)): 387 — No lorries 177, Height limit 121, Cycle street 46, Weight limit 38, No hazardous goods 2, Length limit 2, No vehicles 1. Nearest:
- No lorries — Marzellenstraße, Köln (0 km)
- Cycle street — Trankgasse, Köln (0.1 km)
- Height limit 4 m — Tunisstraße, Köln (0.2 km)
Lorry priority routes: 4 in range, the nearest 0.2 km away.
Lorry restrictions within 5 km of Dom, Köln (Stadt Köln): 26 — Height limit 21, Weight limit 3, No lorries 2. Nearest:
- Height limit 4 m — Tunisstraße, Unterführung Komödienstraße, direction “Norden” (0.2 km)
- Height limit 3.8 m — Nord-Süd-Fahrt, Unterführung Schildergasse, direction “Süden” (0.7 km)
- Height limit 4 m — Nord-Süd-Fahrt, Unterführung Cäcilienstraße, direction “Norden” (0.8 km)
Lorry route network (Stadt Köln, as of 2014-01-01), nearest section: secondary lorry connection for deliveries 0.2 km (Tunisstr., Ursulastr., Victoriastr.); primary lorry connection 1.3 km (Holzmarkt, Zu-/Abfahrt Severinsbrücke, Severinsbrücke); …
These lorry entries come from our database derived from “SEVAS (NRW.Mobidrom)” (ODbL 1.0; its geometry comes from OpenStreetMap). We send a complete machine-readable copy (CSV) under the ODbL 1.0 free of charge on request – contact details in the Impressum on viafrei.de.

New in 2.2.9 and 2.2.10. Each publisher gets its own nearest lines, so the city's per-direction heights are no longer crowded out by SEVAS's. A SEVAS restriction drawn on several road segments is counted and named once. Edited: the end of the network line, the closing line and the source line omitted.

Lorry restrictions within 5 km of Dresden Altmarkt (Landeshauptstadt Dresden): 1 — No lorries 1. Nearest:
- No lorries over 3.5 t (sign 253) (0 km); additional sign „Dienstleister, Anlieferer und Wohnmobile frei“
Lorry route network (Landeshauptstadt Dresden), nearest section: lorry priority route 1.6 km. This is the network the city routes lorry traffic over; later rules, such as through-traffic bans, are not shown in it — not an all-clear: the signs on site apply.
Current closures and roadworks: the same question without vehicle.

As of 03:41 · Source: Lkw-Verbotszonen: Landeshauptstadt Dresden (Quelle: Geodaten Sachsen), Datenlizenz Deutschland – Namensnennung – Version 2.0 (…), bearbeitet (…) · Lkw-Vorrangroutennetz: Landeshauptstadt Dresden (Quelle: Geodaten Sachsen), … · …
Lorry bans are shown here as information, not legal advice: only the signs on site say whom and when a ban binds.

New in 2.2.10. The city's ban zone is one ban, stated as the city's record states it; the additional sign is quoted in German, as it is signed. The last line is the condition note that travels with every such answer as _meta.conditionNote. Edited: the source URIs shortened to (…).

Lorry restrictions around Hamburg Hbf: no data. We hold them only where a publisher publishes them (so far NRW.Mobidrom for North Rhine-Westphalia, ivm for the Frankfurt RheinMain region, VMZ Bremen for Bremen and Stadt Köln and Landeshauptstadt Dresden, each for its own city area) — this is not an all-clear.
Oversize and heavy transport network (Landesbetrieb Verkehr Hamburg), nearest section 0.4 km (Kreuzweg, Steindamm, Deichtorplatz) — an aid for the application in VEMAGS, no permit.
Current closures and roadworks: the same question without vehicle.
…
The oversize and heavy transport network helps with an application in VEMAGS and is no permit: an oversize or heavy transport needs its own permit or authorisation (§ 29(3), § 46(1) StVO), and the signs on site apply. The network is the LBV's compilation of the routes most often needed; it names no permitted dimensions, weights or axle loads, and the route a transport may take is the one its permit sets.

New in 2.2.10. "No data" for the restrictions is said as what it is, and the network is never presented as a permission. Edited: the source line omitted.

2 of 14 reported facilities at Frankfurt (Main) Konstablerwache are out of service. Counted are the facilities DB reports for this station. The platform details are from DB's station data, as of 2026-10-19. …
…
Platforms at Frankfurt (Main) Konstablerwache per DB's station data: 2 of 2 step-free. The station as a whole: step-free, wheelchair accessible.
Platform 2 (Bahnsteig Gleis 2): step-free · wheelchair accessible · platform height 96 cm · tactile guidance · level boarding into the train: unknown
Platform 3 (Bahnsteig Gleis 3): step-free · wheelchair accessible · platform height 96 cm · tactile guidance · level boarding into the train: unknown

Traffic signals within 300 m: 6, 3 of them with an acoustic signal for blind pedestrians: Konstabler Wache/Kurt-Schumacher-Straße (60 m); Berliner Straße/Battonstraße/Kurt-Schumacher-Straße (240 m); Battonstr./Klingerstr./Stoltzestr. (270 m)

New in 2.2.9 (the platforms, from DB InfraGO's station inventory) and 2.2.10 (the acoustic signals, from Stadt Frankfurt am Main). "Unknown" is said as unknown, never as no. A tram or U-Bahn stop named with its city, such as "Stuttgart Charlottenplatz", is answered as that stop, with the sentence that we hold no lift status and no survey for it where that is so. Edited: the rest of the first line, the fourteen escalator lines and the source line omitted.

Low-emission zone and plaque — Essen Hbf:
Essen Hbf lies inside the Umweltzone Essen (Umweltzone).
Required: the green plaque (emission group 4). You can buy it at vehicle registration offices, TÜV/DEKRA/GTÜ/KÜS and approved garages on presentation of the vehicle registration document (part I). (Umweltbundesamt, Umweltzonen in Deutschland; not confirmed: exactly which cities belong to the Ruhr zone today — check the source)
Zone boundary last read on 2026-10-19.
…

New in 2.2.10, for Essen and Bochum. The point is checked against the city's own polygon, credited "Umweltzone: Datenquelle: Stadt Essen – opendata.essen.de, Datenlizenz Deutschland – Namensnennung – Version 2.0, bearbeitet", with the Umweltbundesamt's agreeing zone credited beside it. Edited: the general rules that follow and the source line omitted.

A59, road-wide: 0 jams, 12 closures, 22 roadworks sites; announced from 10:00: 3 closures, 17 roadworks sites — As of 06:09. Traffic state at 53 measuring sites (NRW, as of 06:08): 4 slow, 5 heavy, 44 free-flowing; standstill or slow near Düsseldorf-Garath, Monheim, Richrath.
• Closure (Sperrung): A59, since 2026-10-05 00:00, until 2026-10-23 12:00 (whole measure until 2031-12-23) — Provider text (German): "A59 6-streifiger Ausbau AK DU - AS DU-Marxloh · AK Duisburg (aus Richtung Duisburg-Häfen) — Zeitraum dieser Bauphase: […] Ende: 23.10.26 um 12:00 Uhr …"
…

structuredContent.events[0].gist:
Closure on the A59; since 2026-10-05, until 2026-10-23 12:00, whole measure until 2031-12-23.

New in 2.2.8 and 2.2.9. The gist is built only from fields we already parse (kind, road, junctions, direction, length, limits, dates, distance), so it never translates the publisher's words. For a works in phases it ends with the current phase and names the whole measure's end as such. A German answer carries no gist. Edited: two entries and the source line omitted; the gist is quoted from the structured result.

find_parking {place: "Xyzzyqwertstadt"}
→ isError: true · _meta.errorCode: "not_found"
  I do not know "Xyzzyqwertstadt". Name a town, a district or a stop — or pass lat/lon.

check_autobahn_traffic {road: "A59"}   (the argument is "roads", a list)
→ isError: true · _meta.errorCode: "invalid_input"
  MCP error -32602: Input validation error: Invalid arguments for tool check_autobahn_traffic: Invalid input: expected array, received undefined at roads

New in 2.2.13. Every error result carries one code from a closed list of seven (invalid_input, not_found, out_of_coverage, unavailable, limit_reached, timeout, internal), so a client can tell "ask differently" from "try later" without reading the sentence. Edited: shown as the two results' fields, not as the raw JSON-RPC frames.

The A7 is listed in the long-lorry positive network:
- BASt extract, amending ordinance no. 13, network as of uebw. 2025q2: 180 sections, 965.8 km
- Hamburg's field-trial network, as of 2015: 29 sections, 39.5 km
What binds is the Annex to § 2(1) of the LKWÜberlStVAusnV, not this extract.
Current closures and roadworks: the same question without vehicle.

As of 06:43 · Source: Lang-Lkw-Netz: Bundesanstalt für Straßen- und Verkehrswesen (BASt), Positivnetz Lang-LKW (Auszug Bundesfernstraßen), CC BY 4.0 (…), bearbeitet (…) · Lang-Lkw-Netz Hamburg (Feldversuch 2015): Freie und Hansestadt Hamburg, Behörde für Verkehr und Mobilitätswende, (BVM), Datenlizenz Deutschland – Namensnennung – Version 2.0 (www.govdata.de/dl-de/by-2-0), Daten verändert (…)
The data make no claim to be complete or correct. They have no legal or official meaning either. The data are not suitable for navigation or similar purposes (our translation of the publisher's notice).

New in 2.2.6. The "As of" time is when the files were last read: the network is published as a release, not live. The last line is BASt's own notice. It travels with every such answer as _meta.conditionNote, and your assistant should show it. Edited: the source URIs shortened to (…).

Lorry restrictions within 5 km of Bremen (VMZ Bremen): 31 — Height limit 19, Weight limit 12. Nearest:
- Height limit “Tiefer 4,0m” (0.3 km)
- Weight limit “aktuell nicht für die Nutzung schwerer Lkw empfohlen” (no value stated, the signs on site apply) (0.3 km)
- Weight limit “Wilhelm-Kaisen-Brücke: >16t” (0.4 km)
- Weight limit “Bgm.-Smidt-Brücke-Brücke: >30t” (0.7 km)
- Height limit “Gustav-Deetjen-Tunnel: 3,1m” (0.9 km)
- Height limit “Parkallee (Remberti-Tunnel): 3,5m” (0.9 km)
…
VMZ Bremen's heights and weights are shown as published (read on 2026-10-19). Only the signs on site are binding; the data is not for route guidance. A missing entry does not mean there is no restriction.

Every height and weight is quoted in the publisher's own words and never turned into a number of ours. Where the words give no figure, the answer says that no value is stated. Edited: the source line omitted.

Lkw-Beschränkungen im Umkreis von 5 km um Bielefeld (NRW.Mobidrom (SEVAS)): keine verzeichnet. Das ist keine Freigabe: es gilt die Beschilderung vor Ort.
Lkw-Vorrangrouten: 1 im Umkreis, die nächste in 0,1 km.
Diese Lkw-Einträge stammen aus unserer aus „SEVAS (NRW.Mobidrom)“ abgeleiteten Datenbank (ODbL 1.0; die Geometrie stammt aus OpenStreetMap). Eine vollständige, maschinenlesbare Kopie (CSV) unter der ODbL 1.0 senden wir auf Anfrage kostenlos – Kontakt im Impressum auf viafrei.de.
Aktuelle Sperrungen und Baustellen: dieselbe Frage ohne vehicle.

Stand 06:45 · Quelle: Lkw-Navigationsdaten NRW: NRW.Mobidrom GmbH (SEVAS), Datenlizenz Deutschland – Zero – Version 2.0; Geometrie: © OpenStreetMap-Mitwirkende, Open Database License 1.0 (opendatacommons.org/licenses/odbl/1-0/) (…) · Ortsdaten: © GeoNames (CC BY 4.0), bearbeitet (…)

"None listed" is said as what it is: no restriction is recorded, which does not clear the road. The third line is the ODbL offer for the SEVAS rows (see SOURCES.md). Edited: the source URIs shortened to (…).

Low-emission zone and plaque — München Marienplatz:
München Marienplatz lies inside the Umweltzone München (Umweltzone).
Required: the green plaque (emission group 4). You can buy it at vehicle registration offices, TÜV/DEKRA/GTÜ/KÜS and approved garages on presentation of the vehicle registration document (part I). (Umweltbundesamt, Umweltzonen in Deutschland; not confirmed: whether an additional diesel ban applies and to which Euro classes — check the source)
Zone boundary last read on 2026-10-19.
…

The point is checked against the city's own zone polygon. München's line, "Datenquelle: dl-de/by-2-0: Landeshauptstadt München – opendata.muenchen.de (bearbeitet)", is credited beside our rules text. Edited: the general rules that follow and the source line omitted.

Note: the source "Arbeitsstellen auf deutschen Autobahnen (BASt)" has not republished since 2026-10-06 (12 days) — information from it may be out of date.
Bonn: 5 jam reports, 46 closures, 844 restrictions, 0 planned roadworks sites, 14 current roadworks sites per BASt — window: right now.
I do not hold federal and Land roads (Bundes-, Landes-/Staatsstraßen) for North Rhine-Westphalia: for those, this answer is no all-clear.
Measured traffic state (City of Bonn, Amt 66 (traffic state), as of 07:25) within 10 km: 111 segments: risk of congestion: 2, increased traffic load: 10, normal traffic volume: 68, not measured: 31 — nearest segment (risk of congestion) 1.3 km away.
• Traffic jam (Stau): Provider text (German): "A555 Bonn Richtung Köln, zwischen Rodenkirchen und Kreuz Köln-Süd, 1 km Stau" (since 06:26; 18.5 km away)
…

The fourth line is the city's own measurement, new in 2.2.6, in the city's own class names. "Not measured" is never counted as free. The first line comes from 2.2.4: a source that has stopped republishing is named in the answer instead of being passed off as current. Edited: the remaining entries and the source line omitted.

Disabled-badge bays on the street around Dortmund (within 10 km), nearest first:
1. Hansastraße 9, 44137 Dortmund — 0.2 km, free (sensor, 06:45)
2. Hansastraße 20-22, 44137 Dortmund — 0.2 km, free (sensor, 06:54)
3. Gerberstraße 5, 44135 Dortmund — 0.2 km, no current sensor reading (last 2026-10-18 19:12)
…
Within the radius: 175 disabled-badge bays with a sensor, 62 reported free and 19 occupied; the rest have no current reading.
For holders of a disabled parking permit only. "No current sensor reading" means unknown, not free.

As of 06:54 · Source: Parksensoren Dortmund: Stadt Dortmund (Dortmunder Systemhaus – Smart City), Open Data Dortmund, Datenlizenz Deutschland – Zero – Version 2.0 (…) · …

New in 2.2.4. A sensor's state counts for three hours after the city's newest message. After that it is unknown, and unknown is never free. Edited: two of five lines and most of the source line omitted.

2 of 2 reported facilities at Tübingen Hbf are out of service. Counted are the facilities DB reports for this station. Lifts at stops of the city's transport operator (tram, light rail, underground) are not included — I hold no live data on them for this station.
Lift zu Gleis 1/13: out of service — under construction
Lift zu Gleis 2/3/12: out of service — under construction

Step-free access, from the Baden-Württemberg survey (BFRK, Tübingen Hbf): 7 platforms, 1 with a tactile guidance strip; 3 lifts, narrowest door 99 cm, cabins at least 94 cm wide and 220 cm deep; 5 ramps, steepest 6.1 %; 11 staircases. Unchecked raw survey data, file dated 2026-09-18. It says nothing about whether a lift is working now.
…

DB's live lift states come first. The survey block is new in 2.2.5, and it says what is built, not what works. Edited: the source line omitted.

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.

  • Glama connector — glama.ai/mcp/connectors/de.viafrei.mcp/via-frei. The hosted endpoint as a Glama connector, ownership verified, with its health check.

  • mcpservers.org — mcpservers.org/servers/mavrovde/viafrei-mcp. The directory listing for this repository, in several languages.

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

  • awesome-remote-mcp-servers — punkpeye/awesome-remote-mcp-servers. The curated list of remote MCP servers; ViaFrei is listed with its hosted endpoint.

  • TensorBlock MCP Index — tensorblock.co/mcp/servers/…. TensorBlock's searchable index of MCP servers, with a profile page for this repository.

  • 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.3.7, snapshot of 2026-10-21. 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

If a motorway, B/Land road (NI, BW, MV, SN, TH; B also SH, BY, BE; pass Land/town as place) is open/closed/restricted now/next days; by place, jams, city/Land messages, Hamburg traffic cameras; lorry limits, Lang-Lkw (vehicle).

find_roadworks_ahead — Planned roadworks

Returns roadworks PLANNED on one motorway, one Bundes-/Landesstraße in NI, BW, MV, SN or TH (BY: B only), or 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: lorry parks, car parks, P+R and disabled-badge bays, 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 >5 min late, trips skipping a stop, trips cancelled, the trend and the service alerts in force there (diversions, closed stops).

check_station_facilities — Station lifts and escalators

Whether the lifts and escalators of a railway station or Köln Stadtbahn stop work now: each one, its place, state and reason.

⚡ 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 match, each with its kind, population, English name and coordinate; the official key (AGS/RS) only in the structured result.

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; also any low-emission zone.

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 the Feinstaubplakette, speed limits (advisory 130), winter tyres, alcohol, the Sunday lorry ban, tolls, Rettungsgasse, what must be in the car, electric cars.

🔔 Watches

tool

what it answers

watch_situation — Watch for a change

Opens a watch so THIS conversation is told when something changes: a road closed or restricted (not a jam), a stop running late, a weather warning, a charger freeing up.

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_traffic
Read-onlyIdempotent

Per motorway (≤ 5): an Ampel verdict, then jams, closures and roadworks in force now, with delay/speed. Use when asked about a named motorway now: frei/clear (Ampel), Stau, a delay, how it looks, or a LIST of closures; name every motorway (Munich→Berlin: A9). Do NOT use for open/closed/gesperrt/passable, even now, a closure with no time word or a later one (tonight, weekend), or a town, no motorway — check_road_status; Baustellen dated or geplant — find_roadworks_ahead; a named city street: not held; fuel (find_cheapest_fuel), trains (get_train_departures). ~5 min old. 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.
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). Each road's most important item comes first, in the order you listed the roads, so every road with something in force is on the first page when limit is at least the number of roads; after that jams, then closures, other reports, then roadworks, the roads taking turns within each. Only what is in force now is listed — closures announced for later are counted apart in the headline.
placeNoOptional: the town, junction or address the person is at or asks about ("A1 bei Köln", "A3 near Frankfurt"). Then each road's events within radius_km come first, nearest first, and the headline counts them with the road-wide total beside it. Omit it for the whole road. Give either place OR lat+lon, never both.
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
radius_kmNoRadius around place or lat+lon in km (1–100, default 25). Ignored without a place.
check_road_status
Read-onlyIdempotent

If a motorway, B/Land road (NI, BW, MV, SN, TH; B also SH, BY, BE; pass Land/town as place) is open/closed/restricted now/next days; by place, jams, city/Land messages, Hamburg traffic cameras; lorry limits, Lang-Lkw (vehicle). Use when asked if a road is open/closed/gesperrt/passable, even now — "A8 in diesem Moment gesperrt?" — closures tonight/weekend, or Stau in a town (Köln). Do NOT use for a named motorway frei/clear (Ampel) or its jams/delays — check_autobahn_traffic; dated roadworks — find_roadworks_ahead; a named city street: not held, no call. ≤ 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 road: a German motorway, e.g. "A8"; a Bundesstraße in Schleswig-Holstein, Niedersachsen, Baden-Württemberg, Bayern, Berlin, Mecklenburg-Vorpommern, Sachsen or Thüringen, e.g. "B27"; or a Landes- or Staatsstraße in Niedersachsen, Baden-Württemberg, Mecklenburg-Vorpommern, 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.
vehicleNoSet ONLY when the person asks for a lorry (Lkw, truck, HGV) or a long lorry (Lang-Lkw, EuroCombi, Gigaliner): then the answer is where that vehicle may go, instead of closures. "long_lorry" with a road ("darf der Lang-Lkw auf die A7?") answers whether the road is in the long-lorry positive network; with a place, the network roads near it. "lorry" or "long_lorry" with a place ("Durchfahrtshöhe in Haan", "Lkw-Vorrangroute in Frankfurt", "Gewichtsgrenze in Bremen") answers the height, weight, width and lorry-ban signs near it, and the lorry priority routes, where a publisher holds them (NRW, Frankfurt RheinMain, Bremen). Omit for cars and for closures.
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_daysNoDays ahead from now (0 = right now only, max 14, default 3). Only what was asked; count the days from today to the last day meant, both included: 0 for right now / jetzt / gerade; 1 for today, tonight, heute Abend; 2 for tomorrow; a weekday ("am Freitag") the days through it; "this weekend" the days through Sunday (Monday 7, Friday 3, Sunday 1); "next week" through next Sunday. A bare "is the A8 open?" asks for no window: omit it, never 0. Live closures, and by place the jams reported now, are always included.
check_station_facilitiesA
Read-onlyIdempotent

Whether the lifts and escalators of a railway station or Köln Stadtbahn stop work now: each one, its place, state and reason. Another tram, U-Bahn or bus stop (named with its city: "Stuttgart Charlottenplatz") gets its step-free survey where one exists. Use when asked about step-free access, broken lifts, wheelchair or pram: "Funktioniert der Aufzug am Kölner Hbf?", "is the lift at Hamburg Hbf working?". Do NOT use for departures, platforms or delays — call get_train_departures (trains) or get_departures (bus, tram, U-Bahn). At most 50, broken 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.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), so the bar is lower. The description still adds behavioral context beyond them: broken equipment is returned first, results carry an attribution line, and ambiguous station names produce a disambiguation list rather than a guess. It does not discuss error handling or rate limits, so not 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 examples, then the explicit exclusion, then practical notes. Dense but each block serves a routing or invocation purpose; the closing ordering/attribution note is brief and earns its place.

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

Completeness4/5

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

For a read-only tool with no output schema, the description conveys what comes back (each facility, its place, state and reason) plus ordering and attribution. With zero required parameters, the ambiguity-resolution behavior is also covered. Only the exact response shape and error cases are left implicit, keeping it from a 5.

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 five parameters richly (including the limit ordering rule and the station-vs-eva_no exclusivity). The description adds little param-specific meaning beyond repeating the 50 cap and broken-first ordering, 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: whether lifts and escalators at a railway station/Stadtbahn stop are working, including place, state and reason. It explicitly distinguishes itself from get_train_departures and get_departures, 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 explicit when-to-use triggers ('step-free access, broken lifts, wheelchair or pram') with real example queries, and an explicit when-not-to-use with named alternatives ('Do NOT use for departures, platforms or delays — call get_train_departures or get_departures'). 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.

check_transit_disruptionA
Read-onlyIdempotent

How punctual public transport is now in one German region: the share of trips ever >5 min late, trips skipping a stop, trips cancelled, 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.4/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, closed-world), so the bar is lower, and the description still adds real operational context: 'No per-line figures', the region-level granularity ('data is filed at Kreis level'), and a licensing obligation the agent must honour ('show attribution' under CC BY-SA / CC BY 4.0). It does not describe return shape beyond the metric list, but attribution and aggregation limits are non-obvious traits the annotations could not 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-loads the resource and what it returns, then routing, then constraints — the right order. It is information-dense but packed into a few long sentences with parenthetical examples, making it slightly harder to scan than an ideally partitioned definition.

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 metrics, the trend comparison, and the in-force service alerts (diversions, closed stops). Combined with usage boundaries and licensing, an agent has everything needed to call and interpret 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 lat/lon/region/language/window_min are already fully documented, including the lat+lon-vs-region mutual exclusion and the 'en' language pitfall. The description largely restates the schema (window ≤ 120 min, region scope) rather than adding syntax or format detail, 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?

Opens with a specific verb+resource ('How punctual public transport is now in one German region') and enumerates the metrics returned (late share, skipped stops, cancellations, trend, alerts). It explicitly names the sibling it is not (get_train_departures) with a concrete counter-example, so an agent can route 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?

Gives a positive trigger ('Use when asked whether buses and trains run normally, or a strike, storm or works disrupt them') and a negative one ('Do NOT use for a station's departures or a line from a named DEPARTURE station'), naming the alternative tool. The destination-vs-departure distinction ('nach …'/'zum …' is not one) 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; also any low-emission zone. 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 come from the municipality the point lies in (its key), not the nearest Kreis point; near the 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.4/5.0
Behavior4/5

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

Annotations already establish readOnly/idempotent/no-open-world safety, so the bar is lower, and the description adds real context beyond them: attribution source (OpenStreetMap ODbL 1.0), the requirement to show the attribution line, and a caveat that administrative fields come from the containing municipality rather than the nearest Kreis point, with a border warning. It stops short of stating any rate limits or error behavior, but the provenance and licensing obligations are valuable disclosure.

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 verb and return content, and every clause carries information. Slightly dense and mildly repetitive ('this only goes coordinate to words' restates the opening), but no wasted 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?

With no output schema, the description enumerates the returned fields and the administrative-source caveat an agent needs to interpret them. Combined with full schema coverage and annotations, nothing needed to call or read this tool 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 already explains lat/lon WGS84 ranges and the language default/enum behavior in detail. The description adds no parameter-level syntax or format guidance of its own, 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 transformation ('turns a coordinate into words') and enumerates the return content: nearest address, settlement, motorway junction, Gemeinde/Kreis/Land, low-emission zone. It also names the sibling tools it is not, so an agent can distinguish it 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 positive trigger ('Use when you already HAVE a lat/lon') and explicit exclusion ('Do NOT use to look up a place or address BY NAME — that is find_place, find_poi or find_address'), naming the three alternatives. 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_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 the business there, never who lives 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). 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 declare read-only, idempotent, non-destructive, closed-world, but the description adds real behavioral detail beyond them: a hard cap of 5 points, deduplication of a door mapped twice, distance reporting for far-apart points, handling of multi-town results as a question, and an ODbL 1.0 attribution obligation. That is material context annotations 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-loads the purpose and immediately follows with the disambiguating rules, then edge cases and licensing. It is dense and every sentence carries information, though the run-on construction packs several distinct rules into single sentences and could be separated slightly more cleanly.

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 explaining what is returned (coordinate plus named objects or none) and how the coordinate is reused by other tools. Required input constraints, the multi-result ceiling, dedup behavior, and the legal attribution requirement are all covered for a tool of this complexity.

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, including the town/postcode requirement and the language default. The description mostly reinforces these rather than adding new parameter meaning; the lat/lon pass-through is a downstream usage hint, not an input detail. 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 and resource (looks up a street address) plus exactly what it returns (coordinate + named OSM objects at it, or none). It explicitly names the siblings it is not (find_place, find_poi) and the input shape that selects it, 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?

Gives an explicit trigger ('person gives a STREET AND NUMBER'), an explicit exclusion ('never who lives there'), and routes two alternative cases to named siblings (find_place for town/district/station, find_poi for named company/shop/landmark). When-to-use and when-not-to-use are both covered.

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" — LPG/Autogas and CNG are not held by any source here: say so, never substitute a petrol grade. 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.4/5.0
Behavior4/5

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

Annotations already cover read-only/idempotent/open-world, and the description goes beyond them: provider terms caps (radius ≤ 25 km, ≤ 10 stations), the fact that each result line discloses the age of its price and opening-hours claim, and the mandatory attribution/MTS-K notice. It stops short of describing pagination or result-ordering behaviour beyond "cheapest first", but the added operational and compliance context is substantial.

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

Conciseness4/5

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

Purpose and return fields are front-loaded in the first sentence, followed by usage, exclusions, constraints and disclosure requirements. Dense but nearly every clause earns its place; the only slight waste is re-stating the ≤25 km and ≤10 limits already enforced by the schema.

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 naming the fields returned (price per litre, brand, address, distance, open state) and the legal attribution line. For a 7-parameter, zero-required lookup tool the agent has everything needed to select and invoke 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 each parameter already carries detailed guidance (WGS 84, enum semantics, place-vs-coordinates exclusivity, language default trap). The description restates the radius and count caps but adds no parameter meaning the schema does not already provide, so 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?

Specific verb+resource (returns cheapest fuel stations for one grade near a place/coordinate) with the return fields enumerated. It explicitly distinguishes itself from find_charging_station, check_autobahn_traffic and find_fuel_station, so an agent can route without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use ("where to fill up or what fuel costs") plus explicit when-not-to-use, each paired with the alternative tool to call instead. It also gives the condition that routes to the sibling find_fuel_station (brand, name, open now/at a named time, nearest-first).

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" — LPG/Autogas and CNG are not held by any source here, so say so rather than call for them. 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.7/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, openWorld, non-destructive), so the bar is lower, yet the description still adds real behavioral context: every result carries attribution and the MTS-K note, and discloses the age of each price and opening-hours claim. It also explains a non-obvious data behavior — unknown-hours stations are excluded by open_now and counted instead rather than assumed open.

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

Conciseness5/5

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

The scoping sentence, the usage/anti-usage routing, and the output-freshness note are each front-loaded and distinct. Given 13 parameters and a routing responsibility across two siblings, the length is proportionate and no sentence is filler.

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

Completeness5/5

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

For a 13-parameter read tool with no output schema, the description covers the gaps that matter: sibling disambiguation, data-provenance notes, and the trustworthiness caveat about stale prices and unknown hours. Nothing an agent needs in order to select or call it correctly 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 itself is unusually rich (enum semantics, lat/lon vs place exclusivity, open_at vs open_now conflict, radius ceiling, language default trap). The description largely restates the filter set already documented in the schema, so it adds little parameter meaning beyond it — the baseline 3 for full coverage 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 and resource ('Finds filling stations around a place or coordinate') and immediately enumerates the filter axes (grade, brand, name, opening hours, sort order). It explicitly distinguishes itself from the two nearest siblings, find_cheapest_fuel and find_charging_station, so an agent can route without opening any schema.

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

Usage Guidelines5/5

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

Gives a positive usage rule ('Use when the question is WHICH station'), three concrete trigger examples, and two explicit exclusions naming the alternative tools to call instead. Both the when and the when-not are stated, which is the top of the range.

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 or diesel (call find_fuel_station) or EV charging (call find_charging_station); LPG/Autogas and CNG are not held — say so. 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.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, and the description adds genuinely new behavioral context: hard limits (radius ≤150 km, ≤10 stations), the absence of live availability or price data, the 'nearest one beyond radius' fallback, and the attribution line requirement. This is disclosure beyond what structured fields provide.

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 constraints, then usage and exclusions. The German/English trigger phrases and the exhaustiveness of the exclusion list make it longer than strictly minimal, but every sentence is decision-relevant 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 compensates by enumerating returned fields (operator, address, pump pressures, hours, record age) plus the attribution line. Combined with alternatives, limits, and language handling, an agent has everything needed to select and 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 schema already documents lat/lon/place/vehicle/language/radius/limit thoroughly. The description only echoes a couple of limits (radius ≤150 km, ≤10 stations) that the schema already states, so it adds little new parameter meaning. Baseline 3 is appropriate when the schema carries the load.

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 hydrogen (H2) filling stations near a place or coordinate, nearest first') and lists what each result carries (operator, address, pumps, hours, record age). It explicitly names the sibling tools it is not (find_fuel_station, find_charging_station), so an agent can distinguish it without opening other 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 explicit positive triggers ('where to refuel a fuel-cell car, lorry or bus') and explicit exclusions with the correct alternatives for petrol/diesel and EV charging. It also flags that LPG/CNG are not held at all, closing an otherwise likely misuse path.

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_parking
Read-onlyIdempotent

Parking near a place, a coordinate or along one motorway: lorry parks, car parks, P+R and disabled-badge bays, with total spaces, stated amenities (WC, shower) and published free spaces. 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". "disabled_badge" = on-street bays reserved for a disabled parking permit (Behindertenparkplatz, Schwerbehindertenparkplatz), where a municipality publishes them, with a sensor's free/occupied where one is fitted — pass it only when such a bay was asked for; it is never part of "any" and takes place or lat+lon, not road. 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.
facilitiesNoKeep only sites whose own publisher states ALL of these amenities: "toilet", "shower", "restaurant", "snack", "cafe", "shop", "fuel", "charging", "drinking_water", "picnic", "playground", "wifi", "security", "accessible_toilet". Pass it only when the person asks for one — "Rastplatz mit Dusche an der A7" → road "A7", facilities ["shower"]; "car park with a toilet near Köln Hbf" → facilities ["toilet"]. Many publishers state no amenities, so the filter can narrow the answer to little; an amenity nobody stated is unknown, not absent, and the answer says how many sites state any. A toilet, restaurant or charger merely NEAR a site (listed beside it, from OpenStreetMap or the charging register) never satisfies the filter. Leave it out otherwise: every listed site already carries its amenity line.
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.
find_placeA
Read-onlyIdempotent

Looks up a place name and returns every match, each with its kind, population, English name and coordinate; the official key (AGS/RS) only in the structured result. 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 to show 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.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), so the bar is lower. The description still adds non-obvious behavior: a hard cap of 10 results, a 200 km radius ceiling, that the official AGS/RS key appears only in the structured result, and that every result carries an attribution line the agent must surface to the user. It does not describe ranking/tie-breaking or fallback behavior when nothing matches.

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 opening sentence front-loads purpose and payload, and the when-to-use, exclusion, and limit sentences each carry distinct information. It is longer than strictly necessary (the disambiguation point is stated twice, via `near` and via the Neustadt example), 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?

With 8 parameters, no output schema, and annotations covering only safety, the description supplies what the structured fields cannot: the result shape, the result cap, the radius ceiling, the attribution obligation, and the ambiguity-recovery workflow. Nothing an agent needs to invoke 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%, so the baseline is 3, and the schema already documents every parameter including the important `language` default trap. The description adds strategic framing rather than new syntax: it explains that `near` is the disambiguation lever for same-named places and reiterates the 10-result/200 km bounds, tying the parameters into one workflow.

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

Purpose5/5

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

The description opens with a specific verb and resource ("Looks up a place name and returns every match") and enumerates the returned fields (kind, population, English name, coordinate, AGS/RS key). It explicitly contrasts itself with a sibling ("Do NOT use to find a company, shop or landmark: call find_poi"), so an agent can separate it from find_poi and find_address 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 three concrete trigger conditions (person asks where somewhere is, a coordinate is needed for another tool, recovering from an ambiguity error) plus an explicit exclusion routing to find_poi. The ambiguity-recovery role ("this is where you find out which Neustadt is which") is unusually actionable guidance.

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, BW, MV, SN or TH (BY: B only), or 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"; a Bundesstraße in Niedersachsen, Baden-Württemberg, Bayern, Mecklenburg-Vorpommern, Sachsen or Thüringen, e.g. "B6"; a Landesstraße in Niedersachsen, Baden-Württemberg, Mecklenburg-Vorpommern or Thüringen, e.g. "L1025"; or a Staatsstraße in Sachsen, e.g. "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 — a district, street or address, e.g. "Hamburg-Altona", "Berlin-Mitte", "Kiel" — for the city and Land roadworks held by point within 3 km of it. Where no such source covers the place, 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 declare read-only, idempotent, non-destructive and closed-world. The description adds operationally relevant constraints the annotations do not: a 92-day window cap, a 20-site cap, ONE road/place per call, and the 'show attribution' requirement. It does not, however, describe error or empty-result behavior.

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

Conciseness4/5

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

Dense but front-loaded: purpose, triggers, exclusions-with-routing, then hard limits. Every clause carries information, though the run-on when/when-not sentence is heavy and slightly compressed.

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 still tells the agent what comes back (section, restriction, dates) and that attribution must be shown. Combined with the 100%-covered schema, an agent has everything needed to select and invoke 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 schema already documents the from/to window logic, road syntax, limit ordering and language handling in depth. The description only reinforces the one-road-per-call rule and the date-window cap, adding little beyond the structured fields; 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 (planned roadworks) plus the exact scope: one motorway, one Bundes-/Landesstraße in named Länder, or city streets by place, within a date window. It is unmistakably distinct from the traffic and road-status siblings.

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 (a date or window is named, 'geplant', duration questions) and explicit when-not conditions, each routed to a named alternative: multi-motorway / real-time / undated Baustellen go to check_autobahn_traffic, open-road questions to check_road_status.

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 the Feinstaubplakette, speed limits (advisory 130), winter tyres, alcohol, the Sunday lorry ban, tolls, Rettungsgasse, what must be in the car, electric cars. Use when someone drives through Germany or asks whether they may enter a city or street. Do NOT use for live traffic or closures: check_autobahn_traffic; to FIND a charger: find_charging_station. city narrows to its zone; place or lat+lon checks a point against the published zone boundaries. Sourced, dated; show the attribution. Not legal advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude (WGS 84) of the point to check against the zone boundaries. Use with lon; otherwise use place.
lonNoLongitude (WGS 84) of the point to check against the zone boundaries. Use with lat; otherwise use place.
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.
placeNoA street address, district, station or other point ("Alexanderplatz, Berlin", "Kölner Dom") to check against the published low-emission-zone boundaries: inside, outside with the distance, or unknown. Give either place OR lat+lon, never both.
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; with place or lat+lon, omitted means "lez".
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?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's remaining job is the non-schema behavior it does disclose: results are 'sourced, dated', the attribution must be shown, it is 'not legal advice', and omission of topic resolves to an overview or to 'lez' when a point is supplied. That is genuine added context, though it never says how much text or how many rules come back per call.

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 return surface, then routing, then exclusions in a compact run of short clauses. The long topic inventory is dense but earns its place as retrieval surface; a few clauses (city/place behavior) restate the schema and could be trimmed.

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 six-parameter, zero-required lookup with no output schema, the description covers what it returns, which inputs select which answer, and the attribution/not-legal-advice framing of the output. It stops short of describing response shape or size, which is the only real gap for an agent composing an answer.

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?

With 100% schema description coverage the schema already documents lat/lon, city, place, topic and language, including the place-vs-lat/lon exclusivity and the 'omitted topic with place means lez' rule. The description's restatement ('city narrows to its zone; place or lat+lon checks a point') adds little beyond the schema, so this sits at the prescribed baseline.

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 the German road rules a visitor needs') and then enumerates the exact topic surface it covers: Umweltzone/Feinstaubplakette, speed limits, winter tyres, alcohol, Sunday lorry ban, tolls, Rettungsgasse, equipment, EV. An agent can distinguish this from every sibling 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 an explicit trigger ('Use when someone drives through Germany or asks whether they may enter a city or street') and explicit exclusions with named alternatives ('Do NOT use for live traffic or closures: check_autobahn_traffic; to FIND a charger: find_charging_station'), plus the routing rule that city/place/lat+lon narrow which answer you get.

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 closed or restricted (not a jam), a stop running late, a weather warning, a charger freeing up. 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 alerts outside this chat — we cannot send one; say so. Set hours (≤ 24, default 3) for the time asked; 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`: a city, district or Land ("Hamburg", "Landkreis Fulda"), resolved to its AGS key the way check_transit_disruption resolves its region — or an AGS key ("14612"). 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, not a jam; `station` = one public-transport stop (key: its name, "Köln Hbf", or its DHID) — reports departures running late past the threshold; `region` = a city, district or Land (key: its name, "Hamburg", or its AGS 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, not a jam; `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.
requestNoThe person's request in their own words ("sag mir Bescheid, wenn sich auf der A7 ein Stau bildet"). Pass it on every call: a `road` or `place` watch reports closures and restrictions, never a jam or slow traffic, and the answer says so — a request about a jam alone opens no watch.
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
Behavior4/5

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

Annotations only say it is a non-read-only, non-destructive, non-idempotent, non-open-world operation. The description adds materially beyond that: session scope, a hard cap of 10 watches, no external channel delivery, mandatory attribution, and the ambiguity behavior ('A name that fits several places or stops gets a which-one list and opens no watch'). It does not spell out what happens after expiry or how the notification surfaces, keeping 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?

Front-loaded with purpose, then when-to-use, then exclusions, then parameter guidance—a sensible funnel. It is dense and semicolon-heavy, and the example sentences plus repeated 'show attribution' style directives make it longer than strictly necessary, but nearly every clause carries routing or constraint value.

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

Completeness5/5

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

For a 7-parameter, nested-condition tool with no output schema, the description covers the mutation semantics, the watch limit, the ambiguity/error path, language selection, and the fact that road/place watches never report a jam. An agent has everything needed to invoke it correctly and to respond appropriately when it refuses.

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. The description still adds operational meaning: 'A name is enough as the key; no lookup first' and 'Set hours (≤ 24, default 3) for the time asked; condition narrows it (only the reopening, one charge point)', tying parameters to the user's intent rather than restating types.

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 exactly what triggers a notification across the six kinds. It is immediately distinguishable from the sibling lookup tools (check_road_status, check_weather_warnings) and from stop_watch by its 'THIS conversation' scoping.

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 positive triggers with literal user utterances ('sag mir Bescheid, wenn die A8 wieder frei ist') and explicit exclusions ('Do NOT use to look up now, nor for e-mail, SMS or alerts outside this chat — we cannot send one; say so'). It also instructs that no lookup call precedes it, which is a routing decision between this and the check_* siblings.

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. 8 tool updatesv2.3.7
    • Changedcheck_autobahn_traffic5 fields changed
      • addedInput schema / properties / lat
        Added value: +{
        +  "description": "Latitude in WGS 84, e.g. 48.137. Use with lon when the caller already holds coordinates; otherwise use place.",
        +  "maximum": 90,
        +  "minimum": -90,
        +  "type": "number"
        +}
      • changedInput schema / properties / limit / description
        Previous 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."New value: +"Maximum events to return across all roads (1–50, default 10). Each road's most important item comes first, in the order you listed the roads, so every road with something in force is on the first page when limit is at least the number of roads; after that jams, then closures, other reports, then roadworks, the roads taking turns within each. Only what is in force now is listed — closures announced for later are counted apart in the headline."
      • addedInput schema / properties / lon
        Added value: +{
        +  "description": "Longitude in WGS 84, e.g. 11.576. Use with lat; otherwise use place.",
        +  "maximum": 180,
        +  "minimum": -180,
        +  "type": "number"
        +}
      • addedInput schema / properties / place
        Added value: +{
        +  "description": "Optional: the town, junction or address the person is at or asks about (\"A1 bei Köln\", \"A3 near Frankfurt\"). Then each road's events within radius_km come first, nearest first, and the headline counts them with the road-wide total beside it. Omit it for the whole road. Give either place OR lat+lon, never both.",
        +  "maxLength": 120,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / radius_km
        Added value: +{
        +  "default": 25,
        +  "description": "Radius around place or lat+lon in km (1–100, default 25). Ignored without a place.",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changedcheck_road_status3 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, and so, by place, are the jams reported right now (\"Stau in Köln?\" needs no horizon)."New value: +"Days ahead from now (0 = right now only, max 14, default 3). Only what was asked; count the days from today to the last day meant, both included: 0 for right now / jetzt / gerade; 1 for today, tonight, heute Abend; 2 for tomorrow; a weekday (\"am Freitag\") the days through it; \"this weekend\" the days through Sunday (Monday 7, Friday 3, Sunday 1); \"next week\" through next Sunday. A bare \"is the A8 open?\" asks for no window: omit it, never 0. Live closures, and by place the jams reported now, are always included."
      • changedInput schema / properties / road / description
        Previous 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."New value: +"One road: a German motorway, e.g. \"A8\"; a Bundesstraße in Schleswig-Holstein, Niedersachsen, Baden-Württemberg, Bayern, Berlin, Mecklenburg-Vorpommern, Sachsen or Thüringen, e.g. \"B27\"; or a Landes- or Staatsstraße in Niedersachsen, Baden-Württemberg, Mecklenburg-Vorpommern, 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."
      • addedInput schema / properties / vehicle
        Added value: +{
        +  "description": "Set ONLY when the person asks for a lorry (Lkw, truck, HGV) or a long lorry (Lang-Lkw, EuroCombi, Gigaliner): then the answer is where that vehicle may go, instead of closures. \"long_lorry\" with a road (\"darf der Lang-Lkw auf die A7?\") answers whether the road is in the long-lorry positive network; with a place, the network roads near it. \"lorry\" or \"long_lorry\" with a place (\"Durchfahrtshöhe in Haan\", \"Lkw-Vorrangroute in Frankfurt\", \"Gewichtsgrenze in Bremen\") answers the height, weight, width and lorry-ban signs near it, and the lorry priority routes, where a publisher holds them (NRW, Frankfurt RheinMain, Bremen). Omit for cars and for closures.",
        +  "enum": [
        +    "lorry",
        +    "long_lorry"
        +  ],
        +  "type": "string"
        +}
    • Changedfind_cheapest_fuel1 field changed
      • changedInput schema / properties / fuel / description
        Previous value: -"Fuel 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."New value: +"Fuel grade: \"e5\" (Super E5), \"e10\" (Super E10, the standard German petrol) or \"diesel\" — LPG/Autogas and CNG are not held by any source here: say so, never substitute a petrol grade. Default \"e10\". Pass the grade the person named — a diesel driver is not helped by a petrol price."
    • Changedfind_fuel_station1 field changed
      • changedInput schema / properties / fuel / description
        Previous value: -"Only 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."New value: +"Only stations with a current price for this grade: \"e5\" (Super E5), \"e10\" (Super E10) or \"diesel\" — LPG/Autogas and CNG are not held by any source here, so say so rather than call for them. 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."
    • Changedfind_parking3 fields changed
      • addedInput schema / properties / facilities
        Added value: +{
        +  "description": "Keep only sites whose own publisher states ALL of these amenities: \"toilet\", \"shower\", \"restaurant\", \"snack\", \"cafe\", \"shop\", \"fuel\", \"charging\", \"drinking_water\", \"picnic\", \"playground\", \"wifi\", \"security\", \"accessible_toilet\". Pass it only when the person asks for one — \"Rastplatz mit Dusche an der A7\" → road \"A7\", facilities [\"shower\"]; \"car park with a toilet near Köln Hbf\" → facilities [\"toilet\"]. Many publishers state no amenities, so the filter can narrow the answer to little; an amenity nobody stated is unknown, not absent, and the answer says how many sites state any. A toilet, restaurant or charger merely NEAR a site (listed beside it, from OpenStreetMap or the charging register) never satisfies the filter. Leave it out otherwise: every listed site already carries its amenity line.",
        +  "items": {
        +    "enum": [
        +      "toilet",
        +      "accessible_toilet",
        +      "shower",
        +      "restaurant",
        +      "snack",
        +      "cafe",
        +      "shop",
        +      "fuel",
        +      "charging",
        +      "drinking_water",
        +      "picnic",
        +      "playground",
        +      "wifi",
        +      "security"
        +    ],
        +    "type": "string"
        +  },
        +  "maxItems": 5,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / properties / kind / description
        Previous 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."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\". \"disabled_badge\" = on-street bays reserved for a disabled parking permit (Behindertenparkplatz, Schwerbehindertenparkplatz), where a municipality publishes them, with a sensor's free/occupied where one is fitted — pass it only when such a bay was asked for; it is never part of \"any\" and takes place or lat+lon, not road. 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 / kind / enum
        Previous value: -[
        -  "any",
        -  "rest_area",
        -  "car_park",
        -  "park_and_ride",
        -  "truck"
        -]New value: +[
        +  "any",
        +  "rest_area",
        +  "car_park",
        +  "park_and_ride",
        +  "truck",
        +  "disabled_badge"
        +]
    • Changedfind_roadworks_ahead2 fields changed
      • changedInput schema / properties / place / description
        Previous value: -"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."New value: +"A place — a district, street or address, e.g. \"Hamburg-Altona\", \"Berlin-Mitte\", \"Kiel\" — for the city and Land roadworks held by point within 3 km of it. Where no such source covers the place, the answer says so. Give road OR place."
      • 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 and Kreisstraßen are not covered. Ask again for a second road. Give road OR place."New value: +"The road to look at, one per call: an Autobahn, e.g. \"A7\" or \"A100\"; a Bundesstraße in Niedersachsen, Baden-Württemberg, Bayern, Mecklenburg-Vorpommern, Sachsen or Thüringen, e.g. \"B6\"; a Landesstraße in Niedersachsen, Baden-Württemberg, Mecklenburg-Vorpommern or Thüringen, e.g. \"L1025\"; or a Staatsstraße in Sachsen, e.g. \"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."
    • Changedget_driving_rules4 fields changed
      • addedInput schema / properties / lat
        Added value: +{
        +  "description": "Latitude (WGS 84) of the point to check against the zone boundaries. Use with lon; otherwise use place.",
        +  "maximum": 90,
        +  "minimum": -90,
        +  "type": "number"
        +}
      • addedInput schema / properties / lon
        Added value: +{
        +  "description": "Longitude (WGS 84) of the point to check against the zone boundaries. Use with lat; otherwise use place.",
        +  "maximum": 180,
        +  "minimum": -180,
        +  "type": "number"
        +}
      • addedInput schema / properties / place
        Added value: +{
        +  "description": "A street address, district, station or other point (\"Alexanderplatz, Berlin\", \"Kölner Dom\") to check against the published low-emission-zone boundaries: inside, outside with the distance, or unknown. Give either place OR lat+lon, never both.",
        +  "maxLength": 120,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / properties / topic / description
        Previous value: -"Which 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."New value: +"Which 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; with place or lat+lon, omitted means \"lez\"."
    • Changedwatch_situation3 fields changed
      • changedInput schema / properties / key / description
        Previous 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."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`: a city, district or Land (\"Hamburg\", \"Landkreis Fulda\"), resolved to its AGS key the way check_transit_disruption resolves its region — or an AGS key (\"14612\"). 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 (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."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, not a jam; `station` = one public-transport stop (key: its name, \"Köln Hbf\", or its DHID) — reports departures running late past the threshold; `region` = a city, district or Land (key: its name, \"Hamburg\", or its AGS 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, not a jam; `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."
      • addedInput schema / properties / request
        Added value: +{
        +  "description": "The person's request in their own words (\"sag mir Bescheid, wenn sich auf der A7 ein Stau bildet\"). Pass it on every call: a `road` or `place` watch reports closures and restrictions, never a jam or slow traffic, and the answer says so — a request about a jam alone opens no watch.",
        +  "maxLength": 200,
        +  "type": "string"
        +}
  2. 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."
  3. 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."
  4. 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"
        +}
  5. 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."
  6. 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."
  7. 6 tool updatesv1.4.8
    • Addeddescribe_location
    • Addedfind_address
    • Addedfind_fuel_station
    • Addedfind_nearby
    • Addedfind_place
    • Addedfind_poi
  8. 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
    385 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