InfraNode
InfraNode is a keyless, read-only MCP server providing normalized access to ~20 categories of German public infrastructure open data across 84+ cities via 38 tools. No API keys, accounts, or local installation required. All responses use a consistent { data, meta } envelope with attribution and source status, and degrade gracefully if an upstream source fails.
Discovery
list_cities– List covered cities with slugs, state, population, and coveragesources– Browse data sources with license and attribution infocompare– Fetch one resource (e.g., weather, air quality) across multiple cities at onceget_city/geo– City master data (population, area, geography, boundaries)
Weather & Environment
weather– Current weather (DWD)weather_warnings– Official DWD weather warningsair_quality/air_quality_live– Historical (UBA) and live (OpenAQ) air quality (PM10, NO2, etc.)pollen_uv– Pollen count and UV index (DWD)water_level– River gauge levels (PEGELONLINE)flood– Flood warning levels
Mobility & Transport
transit/transit_departures– Public transit stops and live ÖPNV departures with real-time delaysstation_departures/station_arrivals– Live long-distance train departures/arrivals (DB)traffic/road_events– Highway and inner-city construction/traffic alertswebcams– Traffic webcamscharging– EV charging station locationssharing– Bike/scooter sharing vehicles and stationsfuel_prices– Current fuel prices (average/minimum per type)
City, Demographics & Society
demographics/indicators– Demographic and socioeconomic indicators (GENESIS/INKAR/BBSR)unemployment– Unemployed count and rate per districttourism– Guest overnight stays and arrivalsconstruction– Building permits (residential buildings/units)accidents– Road traffic accidents per district (Unfallatlas)health/icu_live– Hospital directory and live ICU bed utilization (DIVI)holidays– Public holidays by city/federal stateelection– Election resultsevents– City events and public gatheringspois– Points of interest by type (hospital, school, pharmacy, restaurant, police, kindergarten)
Energy & Vehicles
power_load– Daily electricity grid load (SMARD)power_price– Day-ahead electricity exchange price (SMARD)energy– Energy/plant indicators (Marktstammdatenregister)vehicle_registrations– Car stock and EV share per registration district (KBA)
Provides read-only access to city data from OpenStreetMap, including points of interest, traffic, and construction sites for German cities.
Provides read-only access to city master data from Wikidata for German cities, such as population, area, and administrative details.
Deutsch | English
InfraNode
Die Open-Data-REST-API für Deutschland: eine HTTP-API ohne API-Key für Open Data zur öffentlichen Infrastruktur, auch als MCP-Server verfügbar.
Deutsche Städte veröffentlichen viel Open Data, aber jede Quelle hat ihr eigenes
Format, eigene Felder und eigene Eigenheiten, und für mehrere braucht es eine
Registrierung im jeweiligen Portal. InfraNode normalisiert rund 20 Kategorien,
Wetter (DWD), Luftqualität (UBA), ÖPNV (inklusive Echtzeit-Abfahrten), Verkehr,
Strompreis (SMARD), Bodenrichtwerte (BORIS), Parken, Ladeinfrastruktur,
Pegelstände, Demografie, Energie und mehr, für 84+ deutsche Städte hinter
einer Schnittstelle. Kein API-Key, kein Konto. Jede Antwort nutzt
denselben kanonischen { data, meta }-Umschlag mit Lizenz und Attribution je
Datensatz. Dieselben Daten stehen KI-Agenten auch als MCP-Server zur Verfügung
(12 schlanke Read-only-Tools über 78 Datenarten).
Der Einstieg ist get_city_overview, ein einziger Aufruf: Er liefert einen
Katalog aller Datenarten, die es für eine Stadt gibt, dazu einen Live-Auszug der
wichtigsten Werte. So sehen Agenten die volle Breite und nicht nur das Wetter.
InfraNode wächst laufend, neue Datenarten und Städte kommen regelmäßig dazu.
Zu den Quellen gehören der Deutsche Wetterdienst (DWD), das Umweltbundesamt (UBA), Mobilithek/DELFI, der VBB (Verkehrsverbund Berlin-Brandenburg, CC-BY 4.0), GovData, OpenStreetMap, die Bundesnetzagentur, das KBA und weitere.
Im Einsatz

Ein einziger get_city_overview("koeln")-Aufruf: aktuelles Wetter, amtliche
Luftqualität, DWD-Warnungen, Live-Zugabfahrten mit Verspätungen, Baustellen und
der vollständige Datenkatalog der Stadt, aus einem Endpoint ohne API-Key. Jede
Stadt lässt sich live ausprobieren auf
infranode.dev.
Related MCP server: germany-mcp-server
So funktioniert es
Ein gemeinsamer HTTP-Client fragt die Upstream-Quellen ab, jede Antwort wird auf
das kanonische Schema abgebildet, mit ihrer Attribution durch das Lizenz-Gate
geführt und in Redis zwischengespeichert (mit Stale-on-Error-Fallback), danach
über eine REST-API und einen MCP-Server ausgeliefert. Fällt eine Quelle aus,
schlägt sich das in source_status nieder. Der Aufruf selbst scheitert nie
daran.
flowchart LR
subgraph SRC["25+ deutsche Open-Data-Quellen"]
direction TB
S1["DWD, UBA<br/>Wetter, Luft"]
S2["Mobilithek, DELFI, DB<br/>ÖPNV, Echtzeit"]
S3["SMARD, BNetzA, MaStR<br/>Energie"]
S4["BORIS, GovData, OSM,<br/>KBA, ..."]
end
subgraph CORE["InfraNode-Kern"]
direction TB
N["Normalisieren<br/>ein kanonisches Schema"] --> L["Lizenz-Gate<br/>Attribution je Datensatz"] --> C["Redis-Cache<br/>Stale-on-Error-Fallback"]
end
SRC --> CORE
CORE --> API["REST-API<br/>infranode.dev/api/v1<br/>84 Städte, ohne API-Key"]
CORE --> MCP["MCP-Server<br/>mcp.infranode.dev<br/>12 Read-only-Tools"]
API --> APPS["Apps & Dashboards"]
MCP --> AGENTS["KI-Agenten<br/>Claude, ChatGPT"]Wenn InfraNode dir eine Datenintegration erspart: Ein Stern hilft anderen Entwicklern, das Projekt zu finden.
Schnellstart
Basis-URL https://infranode.dev/api/v1. Kein Key, kein Konto, einfach
aufrufen:
curl https://infranode.dev/api/v1/cities/koeln/weather{
"data": {
"city_slug": "koeln",
"observed_at": "2026-06-18T13:00:00Z",
"source": "dwd",
"attribution": { "text": "Datenbasis: Deutscher Wetterdienst", "modified": true },
"payload": { "kind": "weather", "temperature_c": 30.4, "humidity": 43.0, "station_id": "02667" }
},
"meta": { "source_status": "ok", "cache_status": "hit", "correlation_id": "..." }
}Jede Antwort folgt demselben { data, meta }-Umschlag: Jeder Datensatz trägt
seine attribution (Lizenz und Quelle), und meta.source_status sagt, ob die
Upstream-Quelle Daten geliefert hat. Eine tote Quelle degradiert damit sauber,
statt den Aufruf scheitern zu lassen.
Über alle Datenarten hinweg sind Feldnamen snake_case und englisch, und dasselbe
Konzept heißt immer gleich: post_code, street, house_number, place,
name, start, end, distance_km, power_kw, lat, lon. post_code ist
immer ein fünfstelliger String (führende Nullen bleiben erhalten), Zeitstempel
sind ISO 8601 mit Zeitzone, und ein Wert, den die Quelle nicht liefert, ist
null, nie ein leerer String. Manche Antworten führen daneben noch ältere
Doppelnamen mit identischen Werten (plz, zip, strasse, hausnummer, ort,
city, bezeichnung, beginn, ende, art, dist_km, leistung_kw,
einheit_typ, dazu die camelCase-Rohfelder der Autobahn-Verkehrsmeldungen).
Diese Namen sind veraltet, nimm die kanonischen.
Tipp: Ruf zuerst
/api/v1/citiesauf, um die kanonischen Stadt-Slugs zu finden (etwakoeln,berlin,hamburg), und danach einen stadtbezogenen Endpoint.Der
{slug}wird tolerant aufgelöst, die exakte ASCII-Form brauchst du also selten: der deutsche Name mit oder ohne Umlaute, jede Groß- und Kleinschreibung, gängige englische Exonyme und Kurzformen führen alle auf den kanonischen Slug (München/münchen/munich/munchen→muenchen,cologne→koeln,frankfurt→frankfurt-am-main). Ein unbekannter Name liefert404mit dem HinweisMeintest du ...?, der den nächstliegenden Slug nennt.
Die vollständige interaktive Referenz und die Abdeckung je Stadt stehen auf infranode.dev. Die InfraNode API im Postman API Network spiegelt jeden Endpoint mit echten Beispielantworten, sodass sich die InfraNode API Postman Collection ohne API-Key direkt im Browser ausprobieren lässt.
Daten (84 Städte, 124 Endpunkte)
Jede Kategorie unten ist ein REST-Endpoint unter
/api/v1/cities/{slug}/<key>. Über MCP kommen dieselben Daten durch 12 schlanke
Tools: ein paar benannte (get_city_overview, weather, air_quality, pois,
compare, die Live-Tafeln) und ein generisches
get_city_resource(slug, resource=<key>) für jede weitere Datenart (sein
resource-Enum listet alle 81 Keys).
Gruppe | Datenarten (Endpoint-Keys) |
Entdecken |
|
Wetter & Umwelt |
|
Mobilität |
|
Stadt & Menschen |
|
Wirtschaft & Immobilien |
|
Energie & Fahrzeuge |
|
Verhalten im Betrieb
Ohne Key, nur lesend. Keine Zugangsdaten, keine Schreibzugriffe, keine Nutzerkonten.
Kanonischer Umschlag.
{ data, meta }mit Status und Attribution je Quelle.Sanfte Degradation. Eine ausgefallene Quelle liefert
source_status, keinen Fehler.Sicher entworfen. SSRF- und Injection-Gates prüfen jede Anfrage, Eingaben laufen gegen feste Allowlists.
Das Sicherheitsmodell steht in SECURITY.md.
Paginierung & Kanal-Voreinstellungen
Listen von Datenarten (charging, energy, events, transit, die
OSM-Feature-Endpoints) haben bei gleicher URL eine kanalabhängige
Voreinstellung:
Direktes REST liefert die vollständige Liste in einem Aufruf (
limit=null,returned == total,truncated=false).GPT Actions (OpenAI-Header) und MCP sind an eine voreingestellte Seitengröße gebunden, damit Antworten für Agenten klein bleiben.
limit=all(oder?all=1) erzwingt auf jedem Kanal die volle Liste,limitundoffsetblättern explizit.meta.pagination(total/returned/limit/offset/truncated) steht auf jedem Kanal, der ausgelieferte Ausschnitt ist also immer nachvollziehbar.
Bei traffic ist die rohe Polyline optional: include=geometry (oder ?full=1)
ergänzen, die Standardantwort bleibt schlank.
Stabilität, Changelog & Roadmap
Du baust produktiv auf InfraNode auf? Dann bleib bei Änderungen vorne:
Changelog listet jede sichtbare Änderung (neue Datenarten, neue Städte, geändertes Verhalten, Fehlerbehebungen, Deprecations), die neueste zuerst. Per RSS abonnierbar.
Roadmap zeigt das Geplante und die Stabilitätszusage: Die API wächst additiv, der Umschlag bleibt stabil, und Änderungen an bestehenden Antworten werden vorher angekündigt (in der Regel 30+ Tage).
Statusseite und die GitHub-Releases decken Verfügbarkeit und versionierte Änderungen ab.
Als MCP-Server nutzen
Dieselbe API steht als Remote-MCP-Server bereit, KI-Agenten können also alle 78 Datenarten als Tools aufrufen. Mit Claude Code genügt eine Zeile:
claude mcp add --transport http infranode https://mcp.infranode.dev/mcpJeden anderen MCP-Client richtest du auf denselben Remote-Endpoint (Streamable HTTP):
{
"mcpServers": {
"infranode": { "url": "https://mcp.infranode.dev/mcp" }
}
}Cursor / Windsurf: den Block oben in
~/.cursor/mcp.jsoneintragen (oder in die MCP-Einstellungen der App).VS Code:
code --add-mcp '{"name":"infranode","url":"https://mcp.infranode.dev/mcp"}'Claude Desktop: denselben
mcpServers-Block in dieclaude_desktop_config.jsoneintragen.ChatGPT: einen Connector mit der URL
https://mcp.infranode.dev/mcpanlegen.
Alle Tools tragen die Annotationen readOnlyHint: true /
destructiveHint: false / idempotentHint: true, MCP-Clients können sie also
gefahrlos automatisch freigeben. Die MCP-Schicht bringt außerdem fertige
Prompts (city_briefing, compare_air_quality, commute_check) und
Ressourcen (infranode://cities, infranode://sources) mit. Die
vollständige Installationsanleitung, das komplette Tool-Manifest mit
Beispielausgaben, das Berechtigungsmodell und ein Beispiel-Transkript stehen in
docs/mcp-install.md. Das Registry-Manifest ist
server.json.
In ChatGPT nutzen (Custom-GPT-Action)
Fertiges GPT: InfraNode: German City Data - Weather & Transit steht im GPT Store (Research & Analysis) und funktioniert sofort.
Für eine eigene Variante liefert InfraNode eine kuratierte OpenAPI-Spec für GPT-Actions: 23 der nützlichsten Operationen (ChatGPT erlaubt höchstens 30 pro Action), ohne Key, alle GET.
Im GPT-Editor Configure → Actions → Create new action → Import from URL öffnen und
https://infranode.dev/actions/openapi.jsoneinfügen.Die Authentifizierung auf None stehen lassen, als Datenschutzerklärung
https://infranode.dev/datenschutz/eintragen.In den Instructions des GPT festhalten: mit
getCityOverview(slug)starten, Stadtnamen übergetCitiesauflösen unddata.attributionzitieren (die Datenlizenzen verlangen die Namensnennung).
Details und empfohlene Instructions:
infranode.dev/chatgpt/. Die Spec wird von
scripts/build_actions_spec.py aus docs/openapi.yaml erzeugt.
Alternativen und wie InfraNode dazu steht
Andere MCP-Server decken Teile des deutschen oder europäischen Datenraums ab. Für Open Data auf Stadtebene ist InfraNode am breitesten, und die Projekte unten ergänzen einander oft:
germany-mcp-server Bundes- und Regierungsdaten (Autobahn, DWD, NINA, SMARD, Bundestag). Bundesweit, ohne Tiefe je Stadt.
db-mcp-server / db-timetable-mcp nur Fahrpläne der Deutschen Bahn.
mcp-server-public-transport ÖPNV in Europa, in Deutschland deckt es Berlin/Brandenburg (VBB) ab.
Server für einzelne Städte (etwa München, Berlin) decken je eine Stadt ab.
InfraNode deckt 84 deutsche Städte und 82 Datenarten hinter einem gehosteten Endpoint ohne API-Key ab: Umwelt, Mobilität, Energie, Wirtschaft und Stadtleben. Der vollständige Vergleich Seite an Seite steht auf infranode.dev/mcp-vergleich.
Selbst hosten (optional)
Nötig ist das nicht, der gehostete Endpoint oben ist der schnellste Weg. Der Code liegt aber offen. Den API-Stack lokal mit Docker (Compose v2) starten:
cp .env.example .env # example config, contains NO real secrets
docker compose -f deploy/docker-compose.yml up
curl http://localhost/api/v1/health # -> {"status":"ok","version":"1.0.0","redis":true}Den MCP-Server selbst lokal über stdio betreiben (gegen die öffentliche API):
uv sync --group mcp
INFRANODE_MCP_API_BASE=https://infranode.dev/api/v1 uv run python -m infranode.mcp.serverFür alle Einstellungen gilt das Env-Präfix INFRANODE_ (siehe .env.example),
jede Datenquelle hat ihren eigenen INFRANODE_ENABLE_*-Schalter. Echte Secrets
landen nie im Repo, versioniert ist nur .env.example, und die CI fährt einen
gitleaks-Scan.
Lizenz: Code und Daten sind getrennt
Code: Apache-2.0 (siehe LICENSE).
Daten: Die offenen Daten, die InfraNode ausliefert, behalten die Lizenzen ihrer Upstream-Quellen (etwa ODbL für OpenStreetMap, DL-DE-BY für GovData, Namensnennung für DWD). Diese Datenlizenzen und die Attribution werden separat in
DATA-LICENSES.mdgeführt. Die Apache-2.0-Lizenz gilt nur für den Quellcode der API, nicht für die durchgereichten Daten.
Mitmachen
Beiträge sind willkommen. Setup, Gate-Befehle und die Secret-Regel stehen in
CONTRIBUTING.md. Für eine neue Datenquelle ist die
deklarative Quellen-Registry in src/infranode/registry/source_specs.py der
Startpunkt (ein SourceSpec-Eintrag je Upstream), die vollständige Checkliste
steht in CONTRIBUTING.md.
Available Tools
12 toolsair_qualityAir QualityARead-onlyIdempotentInspect
Get official air quality for a German city (PM10, NO2 and more).
Sourced from the Umweltbundesamt (UBA). Read-only. For live nearest-station
hourly readings use get_city_resource(slug, resource='air') instead.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, the description adds value by stating the data source (Umweltbundesamt) and the specific pollutants included (PM10, NO2), enriching behavioral context without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the main purpose, followed by source and alternative usage. Every sentence serves a clear function with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single parameter, existing output schema, and annotations covering safety, the description fully covers the tool's functionality, including what data is returned and its official nature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description of the 'slug' parameter referencing list_cities. The description does not add new parameter details beyond the schema, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Get official air quality for a German city (PM10, NO2 and more),' specifying the verb, resource, and scope. It differentiates from sibling tools by mentioning an alternative for live readings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-not-to-use guidance: 'For live nearest-station hourly readings use get_city_resource(slug, resource='air') instead,' and names the alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compareCompare CitiesARead-onlyIdempotentInspect
Compare ONE resource across MULTIPLE cities in a single response.
Fans the resource out over the listed cities and returns a per-city
source_status (ok/disabled/no_data/error/not_found), so a missing or
failing city source does not spoil the whole answer. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| cities | Yes | Comma-separated list of city slugs, e.g. 'berlin,koeln,hamburg' (max. 28 cities). | |
| resource | Yes | Resource to compare. Supported: 'weather' (DWD), 'air' (UBA air quality), 'indicators' (INKAR socioeconomic indicators incl. unemployment rate and EV charging coverage), 'demographics', 'unemployment', 'tourism', 'charging-status' (live EV charging occupancy, aggregates only) and 'weather-warnings' (official DWD warning level per city). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds valuable behavioral context: the tool fans out the resource across cities and returns a per-city source_status, ensuring that a failing city does not spoil the whole response. This goes 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long, front-loaded with the core action, no fluff. Every sentence provides value: purpose, behavior, and read-only nature.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, fully described in schema, output schema present), the description is complete. It explains the key behavioral aspect (per-city source_status) and does not miss critical information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are well-described. The description reinforces the purpose but does not add new meaning beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool compares ONE resource across MULTIPLE cities in a single response. The verb 'compare' and the explicit 'ONE resource' and 'MULTIPLE cities' differentiate it from sibling tools like get_city or get_city_resource, which operate on a single city.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need to compare a resource across multiple cities in one call. It does not explicitly state when not to use it or mention alternatives, but the context is clear enough for an agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cityCity Base DataARead-onlyIdempotentInspect
Get base data for a German city (population, area, coordinates).
Sourced from Wikidata. Read-only. Useful as a first lookup to confirm a city
exists and get its core attributes. For a broader question about the city
(what data is available at all) use get_city_overview instead.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. Description adds 'Sourced from Wikidata. Read-only.' but this adds only minor context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each valuable: purpose, source, usage guidance with alternative. No wasted words. Front-loaded with primary action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has output schema (not shown but present), so return values are covered. Description covers purpose, source, and usage context. For a simple read-only lookup with one parameter, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema provides full description for the single required parameter 'slug' (coverage 100%). The tool description does not add any extra meaning beyond the schema's description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get base data for a German city' with specific attributes listed. It distinguishes from sibling tool `get_city_overview` by focusing on base data only.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Useful as a first lookup to confirm a city exists and get its core attributes.' Provides an alternative: 'For a broader question... use get_city_overview instead.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_city_overviewCity OverviewARead-onlyIdempotentInspect
Get a ONE-CALL overview of everything InfraNode knows about a German city.
Start here for any city question. Returns: the city's base data, a CATALOG of
all 67 available data types (weather, air quality, public transit, trains,
traffic, charging, parking, solar, energy, demographics, taxes, accidents,
tourism, heritage, trees, population density, playgrounds, post boxes and many
more), each with its coverage status and the exact tool to call next (for most
data types that is get_city_resource(slug, resource=<type>)), plus a small
live highlights snapshot (current weather, air quality and train departures).
Data types not yet covered for this city show where they ARE available so you
can pivot. InfraNode keeps adding data and cities, so the catalog grows over
time. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint. The description adds valuable behavioral context: it returns a catalog of 67 data types with coverage status, a live highlights snapshot, and redirection for uncovered data. It also declares the tool as read-only, consistent with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (~6 sentences) and front-loaded with the main purpose. Every sentence adds essential information without redundancy, and the structure follows a logical flow: purpose, return components, future growth.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is an output schema (implied by context signals), the description appropriately focuses on the high-level structure (base data, catalog, highlights). It covers the dynamic nature of the catalog and provides enough context for the agent to understand the tool's role without needing full return details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage for the single parameter 'slug', the baseline applies. The schema already provides clear documentation. The description does not add additional parameter semantics, which is acceptable given the coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verbs ('Get a ONE-CALL overview') and clearly defines the resource ('everything InfraNode knows about a German city'). It distinguishes from sibling tools by positioning itself as the starting point and listing the returned catalog with pointers to other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states 'Start here for any city question' and explains that for specific data types, users should call tools like get_city_resource. This provides clear when-to-use and alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_city_resourceCity Data by TypeARead-onlyIdempotentInspect
Fetch ANY per-city data type by its key (generic accessor, 67 data types).
One tool for the whole breadth of InfraNode: live data (air, traffic, transit
stops, parking, charging, water-level, flood, sharing, fuel-prices, icu-live,
webcams, station-departures/-arrivals/stations, ...), statistics
(demographics, unemployment, tourism, accidents, crime-stats, indicators,
land-values, tax-rates, insolvencies, ...), infrastructure and environment
(solar, solar-roofs, district-heating, energy, heritage, tree-cadastre,
playgrounds, public-toilets, markets, education, ...) and more. Discover the
valid keys and per-city coverage with get_city_overview(slug) or the
infranode://catalog resource; the resource enum lists every key.
Uncovered types return source_status="not_covered" (plus where they ARE
available), never an error. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'. | |
| resource | Yes | Data type key to fetch, exactly as listed by get_city_overview / the infranode://catalog resource (the 'type' field), e.g. 'charging', 'parking', 'demographics', 'solar', 'district-heating'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotent. Description adds 'Read-only' and explains error-free handling for uncovered types ('source_status="not_covered"'), providing useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, uses a bullet-like enumeration of example types for clarity, and is efficient. Slightly verbose with the long type list, but overall concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's generic nature (67 types) and presence of an output schema, the description adequately covers key discovery, coverage behavior, and safety. Complete enough for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; the description adds value by listing examples and explaining how to discover keys, but does not fundamentally extend meaning beyond the schema parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Fetch ANY per-city data type by its key', specifying verb, resource, and scope. It distinguishes from siblings by noting it is a generic accessor for 67 data types, unlike more specialized tools like air_quality or weather.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells users to discover valid keys via get_city_overview or catalog, and explains that uncovered types return a specific status instead of error. However, it does not explicitly state when NOT to use this tool in favor of siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_citiesList CitiesARead-onlyIdempotentInspect
List all covered cities (slug, federal state, population, coverage).
Takes no arguments. Call this first to discover valid city slugs before invoking any city-scoped tool. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, and idempotentHint. The description reaffirms read-only and adds output field context, which is valuable beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero wasted words. Front-loaded with the core action and output, then usage instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, rich annotations, and output schema, the description is fully complete. It covers purpose, output, and usage order.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters, so baseline 4. The description adds value by listing the output fields, aiding in understanding the tool's response.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the verb 'List', the resource 'all covered cities', and the output fields (slug, federal state, population, coverage). It distinguishes from siblings by establishing the tool as a prerequisite for city-scoped tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'Call this first to discover valid city slugs before invoking any city-scoped tool.', providing clear when-to-use guidance and establishing a dependency.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
poisPoints of InterestARead-onlyIdempotentInspect
Get points of interest in a German city, filtered by type.
Sourced from OpenStreetMap. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'. | |
| type | Yes | POI type from the API allowlist, one of: hospital, school, pharmacy, restaurant, police, kindergarten. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds context about data sourcing from OpenStreetMap, which is not covered by annotations. No contradictions found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states the core purpose, second adds essential context (source and read-only). No filler, front-loaded, every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description does not need to explain return values. It covers purpose, geographic scope (German city), filter (type), and data source. Lack of pagination or result limit details is acceptable for read-only tools with annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are well-documented in the schema. The description merely repeats 'filtered by type' without adding new meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Get'), resource ('points of interest'), and key filters ('in a German city', 'filtered by type'). It also mentions the data source (OpenStreetMap) and read-only nature, distinguishing it from sibling tools like list_cities or get_city.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. While the purpose is clear, the description lacks information about prerequisites, exclusions, or comparisons with siblings like get_city_overview or sources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sourcesData SourcesARead-onlyIdempotentInspect
List all data sources with license, attribution and availability.
Takes no arguments. Shows which upstream sources InfraNode bundles and whether each is currently active. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false. The description adds that it shows whether each source is currently active, which is not in annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, concise and front-loaded with the core purpose. No wasted words, and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, clear annotations, and existing output schema, the description fully covers what the tool does and returns. It is complete for an agent to understand its purpose and behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the description does not need to add param info. Schema coverage is 100%, and the baseline for no params is 4. The description is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists data sources with license, attribution, and availability, and shows activity status. The verb 'List' and resource 'data sources' are specific, and it distinguishes from sibling tools like 'air_quality' or 'transit_departures' which focus on specific data types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that the tool takes no arguments and is used to see which upstream sources are bundled. While it doesn't explicitly state when not to use or name alternatives, the context of being a listing tool for available data sources is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
station_board_arrivalsStation Board: ArrivalsARead-onlyIdempotentInspect
Get live arrivals for ANY railway station by its EVA number.
Mirror of station_board_departures for arriving trains (all categories,
real-time delays, disruption messages). Get the EVA from
get_city_resource(slug, resource='stations'). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| eva | Yes | Station EVA number (digits only) from get_city_resource(slug, resource='stations'), e.g. '8000105' (Frankfurt Hbf). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds behavioral details: 'live arrivals', 'all categories, real-time delays, disruption messages', which goes beyond annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no extraneous words. The main purpose is front-loaded, and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, output schema present, annotations covering safety), the description provides all necessary context: purpose, input source, read-only nature, and differentiation from departures.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%. The description adds meaning by specifying the EVA number must be 'digits only' and provides an example, as well as referencing the helper function to obtain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get live arrivals for ANY railway station by its EVA number', specifying the verb, resource, and scope. It distinguishes itself from the sibling 'station_board_departures' by noting it is a mirror for arrivals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells when to use the tool (to get arrivals) and provides guidance on obtaining the EVA number via 'get_city_resource'. It implicitly contrasts with departures, but lacks explicit 'when not to use' statements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
station_board_departuresStation Board: DeparturesARead-onlyIdempotentInspect
Get live departures for ANY railway station by its EVA number.
Covers all train categories including local/regional (S/RB/RE) and long
distance, with real-time delays, cancellations and disruption messages. Get
the EVA from get_city_resource(slug, resource='stations'). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| eva | Yes | Station EVA number (digits only) from get_city_resource(slug, resource='stations'), e.g. '8011160' (Berlin Hbf). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, etc. The description adds value by detailing the nature of data (real-time delays, cancellations, disruptions) and reaffirming 'Read-only'. This goes beyond annotations but could still mention rate limits or data freshness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with three sentences, each serving a distinct purpose: action + scope, coverage details, prerequisite. No wasted words, and the most important information (live departures) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (1 parameter, output schema exists), the description covers all essential aspects: what it returns, the required input, and how to obtain it. No significant gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and already explains the 'eva' parameter well. The description adds useful context by referencing get_city_resource as the source for the EVA number, which aids in parameter preparation. This exceeds the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the action ('Get live departures'), resource ('ANY railway station by its EVA number'), and scope ('all train categories ... with real-time delays, cancellations and disruption messages'). It distinguishes from siblings by focusing on departures and specifying coverage, though not explicitly differentiating from station_board_arrivals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool (live departures for any station) and a prerequisite (get EVA from get_city_resource). However, it lacks explicit guidance on when not to use it (e.g., for arrivals) or reference to alternatives like station_board_arrivals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transit_departuresTransit DeparturesARead-onlyIdempotentInspect
Get live public-transport departures with real-time delays for a stop.
Sourced from GTFS-RT/HVV/VGN. Unlike the static stop list
(get_city_resource(slug, resource='transit')), this returns minute-fresh
departures including delay for ONE stop. A stop_id is required: fetch the
city's transit stops first to discover valid stop IDs, then pass one here.
Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'. | |
| stop_id | No | Required stop ID to fetch departures for. Discover a city's stop IDs with get_city_resource(slug, resource='transit') first (each stop carries its id). Format: DELFI 'de:<AGS>:<id>' or a numeric gtfs.de stop id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, openWorld, idempotent), the description adds context: 'minute-fresh departures including delay for ONE stop', data source ('GTFS-RT/HVV/VGN'), and the requirement for a stop ID. It does not contradict any annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet informative, with four sentences each serving a distinct purpose: stating the main function, citing the data source, differentiating from a sibling tool, and explaining the prerequisite. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (not shown but indicated true) and the complexity of real-time departures, the description provides sufficient context: it clarifies the data source, the real-time nature, the restriction to one stop per call, and the need for prior stop discovery. It fully prepares the agent for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already described in the input schema. The description adds value by explaining the relationship between `slug` and `stop_id`, noting that `stop_id` must be discovered via another tool, and providing format examples for `stop_id`. This augments the schema without redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get live public-transport departures with real-time delays for a stop.' It specifies the verb, resource, and scope, and distinguishes itself from the sibling `get_city_resource` by noting it returns dynamic departures for a single stop.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use this tool (for live departures with delays) and contrasts it with the static stop list tool, providing an alternative. It also outlines a prerequisite: first fetch transit stops via `get_city_resource(slug, resource='transit')` to obtain valid stop IDs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
weatherWeatherARead-onlyIdempotentInspect
Get current weather observations for a German city.
Sourced from the Deutscher Wetterdienst (DWD): temperature, wind,
precipitation and related fields. Read-only, current conditions only (not a
forecast). For warnings use get_city_resource(slug, resource='weather-warnings'). For a broader question about the city (not
just weather) use get_city_overview instead, which already includes a
live weather highlight.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, covering safety. The description adds value by specifying data source (DWD), fields (temperature, wind, precipitation), and clarifying it's current conditions only (not forecast). No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no wasted words. First sentence states core purpose, second adds details, third provides usage alternatives. Front-loaded with essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and an output schema, the description covers what, source, usage boundaries, and alternatives. Complete for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with one parameter 'slug' described. The description adds meaning by stating the slug comes from list_cities tool and giving examples ('berlin' or 'hamburg'), which helps the agent understand valid inputs beyond the schema definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get current weather observations for a German city', specifying verb (Get), resource (weather observations), and scope (German city). It differentiates from siblings by explicitly contrasting with forecasts, weather warnings (get_city_resource), and city overview (get_city_overview).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (current weather), when not (not a forecast), and provides specific alternatives: for warnings use get_city_resource with resource='weather-warnings', and for broader city questions use get_city_overview. This gives clear guidance on tool selection.
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. Dates show when Glama detected each change.
1 tool update
v1.1.1- Changed
get_city_resource1 field changed- changed
Input schema / properties / resource / enumPrevious value: -[ - "accidents", - "air", - "air-uba", - "base", - "bathing-water", - "bike-counts", - "business-registrations", - "charging", - "charging-status", - "construction", - "crime-stats", - "demographics", - "district-heating", - "drinking-water", - "education", - "election", - "energy", - "events", - "fire-danger", - "flood", - "fuel-prices", - "geo", - "government-offices", - "health", - "heritage", - "holidays", - "hospitals-atlas", - "icu-live", - "indicators", - "insolvencies", - "land-values", - "markets", - "overview", - "parcel-lockers", - "parking", - "playgrounds", - "pollen-uv", - "population-density", - "post-boxes", - "post-offices", - "power-load", - "power-price", - "public-tenders", - "public-toilets", - "public-wifi", - "recycling-centres", - "road-events", - "sharing", - "solar", - "solar-roofs", - "station-arrivals", - "station-departures", - "station-facilities", - "stations", - "tax-rates", - "tourism", - "traffic", - "transit", - "tree-cadastre", - "unemployment", - "vehicle-registrations", - "water-level", - "weather", - "weather-warnings", - "webcams" -]New value: +[ + "accidents", + "air", + "air-uba", + "base", + "bathing-water", + "bike-counts", + "business-registrations", + "charging", + "charging-status", + "civil-protection-warnings", + "construction", + "crime-stats", + "demographics", + "district-heating", + "drinking-water", + "education", + "election", + "energy", + "events", + "fire-danger", + "flood", + "fuel-prices", + "geo", + "government-offices", + "health", + "heritage", + "holidays", + "hospitals-atlas", + "icu-live", + "indicators", + "insolvencies", + "land-values", + "markets", + "office-wait-times", + "overview", + "parcel-lockers", + "parking", + "playgrounds", + "pollen-uv", + "population-density", + "post-boxes", + "post-offices", + "power-load", + "power-price", + "public-tenders", + "public-toilets", + "public-wifi", + "recycling-centres", + "road-events", + "sharing", + "solar", + "solar-roofs", + "station-arrivals", + "station-departures", + "station-facilities", + "stations", + "tax-rates", + "tourism", + "traffic", + "transit", + "tree-cadastre", + "unemployment", + "vehicle-registrations", + "water-level", + "weather", + "weather-warnings", + "webcams" +]
49 tool updates
v1.0.1- Removed
accidents - Changed
air_quality12 fields changed- removed
Input schema / properties / slug / titleRemoved value: -"Slug" - removed
Input schema / titleRemoved value: -"air_qualityArguments" - removed
Output schema / $defs / ToolMeta / descriptionRemoved value: -"Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten." - removed
Output schema / $defs / ToolMeta / properties / attribution / titleRemoved value: -"Attribution" - removed
Output schema / $defs / ToolMeta / properties / cache_status / titleRemoved value: -"Cache Status" - removed
Output schema / $defs / ToolMeta / properties / correlation_id / titleRemoved value: -"Correlation Id" - removed
Output schema / $defs / ToolMeta / properties / license / titleRemoved value: -"License" - removed
Output schema / $defs / ToolMeta / properties / source / titleRemoved value: -"Source" - removed
Output schema / $defs / ToolMeta / properties / source_status / titleRemoved value: -"Source Status" - removed
Output schema / $defs / ToolMeta / titleRemoved value: -"ToolMeta" - removed
Output schema / properties / data / titleRemoved value: -"Data" - removed
Output schema / titleRemoved value: -"ToolEnvelope"
- Removed
air_quality_live - Removed
business_registrations - Removed
charging - Changed
compare14 fields changed- removed
Input schema / properties / cities / titleRemoved value: -"Cities" - changed
Input schema / properties / resource / descriptionPrevious value: -"Resource to compare. Currently supported: 'weather' (DWD) or 'air' (UBA air quality)."New value: +"Resource to compare. Supported: 'weather' (DWD), 'air' (UBA air quality), 'indicators' (INKAR socioeconomic indicators incl. unemployment rate and EV charging coverage), 'demographics', 'unemployment', 'tourism', 'charging-status' (live EV charging occupancy, aggregates only) and 'weather-warnings' (official DWD warning level per city)." - removed
Input schema / properties / resource / titleRemoved value: -"Resource" - removed
Input schema / titleRemoved value: -"compareArguments" - removed
Output schema / $defs / ToolMeta / descriptionRemoved value: -"Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten." - removed
Output schema / $defs / ToolMeta / properties / attribution / titleRemoved value: -"Attribution" - removed
Output schema / $defs / ToolMeta / properties / cache_status / titleRemoved value: -"Cache Status" - removed
Output schema / $defs / ToolMeta / properties / correlation_id / titleRemoved value: -"Correlation Id" - removed
Output schema / $defs / ToolMeta / properties / license / titleRemoved value: -"License" - removed
Output schema / $defs / ToolMeta / properties / source / titleRemoved value: -"Source" - removed
Output schema / $defs / ToolMeta / properties / source_status / titleRemoved value: -"Source Status" - removed
Output schema / $defs / ToolMeta / titleRemoved value: -"ToolMeta" - removed
Output schema / properties / data / titleRemoved value: -"Data" - removed
Output schema / titleRemoved value: -"ToolEnvelope"
- Removed
construction - Removed
demographics - Removed
election - Removed
energy - Removed
events - Removed
flood - Removed
fuel_prices - Removed
geo - Changed
get_city12 fields changed- removed
Input schema / properties / slug / titleRemoved value: -"Slug" - removed
Input schema / titleRemoved value: -"get_cityArguments" - removed
Output schema / $defs / ToolMeta / descriptionRemoved value: -"Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten." - removed
Output schema / $defs / ToolMeta / properties / attribution / titleRemoved value: -"Attribution" - removed
Output schema / $defs / ToolMeta / properties / cache_status / titleRemoved value: -"Cache Status" - removed
Output schema / $defs / ToolMeta / properties / correlation_id / titleRemoved value: -"Correlation Id" - removed
Output schema / $defs / ToolMeta / properties / license / titleRemoved value: -"License" - removed
Output schema / $defs / ToolMeta / properties / source / titleRemoved value: -"Source" - removed
Output schema / $defs / ToolMeta / properties / source_status / titleRemoved value: -"Source Status" - removed
Output schema / $defs / ToolMeta / titleRemoved value: -"ToolMeta" - removed
Output schema / properties / data / titleRemoved value: -"Data" - removed
Output schema / titleRemoved value: -"ToolEnvelope"
- Changed
get_city_overview12 fields changed- removed
Input schema / properties / slug / titleRemoved value: -"Slug" - removed
Input schema / titleRemoved value: -"get_city_overviewArguments" - removed
Output schema / $defs / ToolMeta / descriptionRemoved value: -"Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten." - removed
Output schema / $defs / ToolMeta / properties / attribution / titleRemoved value: -"Attribution" - removed
Output schema / $defs / ToolMeta / properties / cache_status / titleRemoved value: -"Cache Status" - removed
Output schema / $defs / ToolMeta / properties / correlation_id / titleRemoved value: -"Correlation Id" - removed
Output schema / $defs / ToolMeta / properties / license / titleRemoved value: -"License" - removed
Output schema / $defs / ToolMeta / properties / source / titleRemoved value: -"Source" - removed
Output schema / $defs / ToolMeta / properties / source_status / titleRemoved value: -"Source Status" - removed
Output schema / $defs / ToolMeta / titleRemoved value: -"ToolMeta" - removed
Output schema / properties / data / titleRemoved value: -"Data" - removed
Output schema / titleRemoved value: -"ToolEnvelope"
- Added
get_city_resource - Removed
health - Removed
holidays - Removed
icu_live - Removed
indicators - Removed
land_values - Changed
list_cities11 fields changed- removed
Input schema / titleRemoved value: -"list_citiesArguments" - removed
Output schema / $defs / ToolMeta / descriptionRemoved value: -"Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten." - removed
Output schema / $defs / ToolMeta / properties / attribution / titleRemoved value: -"Attribution" - removed
Output schema / $defs / ToolMeta / properties / cache_status / titleRemoved value: -"Cache Status" - removed
Output schema / $defs / ToolMeta / properties / correlation_id / titleRemoved value: -"Correlation Id" - removed
Output schema / $defs / ToolMeta / properties / license / titleRemoved value: -"License" - removed
Output schema / $defs / ToolMeta / properties / source / titleRemoved value: -"Source" - removed
Output schema / $defs / ToolMeta / properties / source_status / titleRemoved value: -"Source Status" - removed
Output schema / $defs / ToolMeta / titleRemoved value: -"ToolMeta" - removed
Output schema / properties / data / titleRemoved value: -"Data" - removed
Output schema / titleRemoved value: -"ToolEnvelope"
- Removed
parking - Changed
pois13 fields changed- removed
Input schema / properties / slug / titleRemoved value: -"Slug" - removed
Input schema / properties / type / titleRemoved value: -"Type" - removed
Input schema / titleRemoved value: -"poisArguments" - removed
Output schema / $defs / ToolMeta / descriptionRemoved value: -"Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten." - removed
Output schema / $defs / ToolMeta / properties / attribution / titleRemoved value: -"Attribution" - removed
Output schema / $defs / ToolMeta / properties / cache_status / titleRemoved value: -"Cache Status" - removed
Output schema / $defs / ToolMeta / properties / correlation_id / titleRemoved value: -"Correlation Id" - removed
Output schema / $defs / ToolMeta / properties / license / titleRemoved value: -"License" - removed
Output schema / $defs / ToolMeta / properties / source / titleRemoved value: -"Source" - removed
Output schema / $defs / ToolMeta / properties / source_status / titleRemoved value: -"Source Status" - removed
Output schema / $defs / ToolMeta / titleRemoved value: -"ToolMeta" - removed
Output schema / properties / data / titleRemoved value: -"Data" - removed
Output schema / titleRemoved value: -"ToolEnvelope"
- Removed
pollen_uv - Removed
power_load - Removed
power_price - Removed
road_events - Removed
sharing - Removed
solar - Removed
solar_roofs - Changed
sources11 fields changed- removed
Input schema / titleRemoved value: -"sourcesArguments" - removed
Output schema / $defs / ToolMeta / descriptionRemoved value: -"Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten." - removed
Output schema / $defs / ToolMeta / properties / attribution / titleRemoved value: -"Attribution" - removed
Output schema / $defs / ToolMeta / properties / cache_status / titleRemoved value: -"Cache Status" - removed
Output schema / $defs / ToolMeta / properties / correlation_id / titleRemoved value: -"Correlation Id" - removed
Output schema / $defs / ToolMeta / properties / license / titleRemoved value: -"License" - removed
Output schema / $defs / ToolMeta / properties / source / titleRemoved value: -"Source" - removed
Output schema / $defs / ToolMeta / properties / source_status / titleRemoved value: -"Source Status" - removed
Output schema / $defs / ToolMeta / titleRemoved value: -"ToolMeta" - removed
Output schema / properties / data / titleRemoved value: -"Data" - removed
Output schema / titleRemoved value: -"ToolEnvelope"
- Removed
station_arrivals - Changed
station_board_arrivals13 fields changed- changed
Input schema / properties / eva / descriptionPrevious value: -"Station EVA number (digits only) from the stations tool, e.g. '8000105' (Frankfurt Hbf)."New value: +"Station EVA number (digits only) from get_city_resource(slug, resource='stations'), e.g. '8000105' (Frankfurt Hbf)." - removed
Input schema / properties / eva / titleRemoved value: -"Eva" - removed
Input schema / titleRemoved value: -"station_board_arrivalsArguments" - removed
Output schema / $defs / ToolMeta / descriptionRemoved value: -"Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten." - removed
Output schema / $defs / ToolMeta / properties / attribution / titleRemoved value: -"Attribution" - removed
Output schema / $defs / ToolMeta / properties / cache_status / titleRemoved value: -"Cache Status" - removed
Output schema / $defs / ToolMeta / properties / correlation_id / titleRemoved value: -"Correlation Id" - removed
Output schema / $defs / ToolMeta / properties / license / titleRemoved value: -"License" - removed
Output schema / $defs / ToolMeta / properties / source / titleRemoved value: -"Source" - removed
Output schema / $defs / ToolMeta / properties / source_status / titleRemoved value: -"Source Status" - removed
Output schema / $defs / ToolMeta / titleRemoved value: -"ToolMeta" - removed
Output schema / properties / data / titleRemoved value: -"Data" - removed
Output schema / titleRemoved value: -"ToolEnvelope"
- Changed
station_board_departures13 fields changed- changed
Input schema / properties / eva / descriptionPrevious value: -"Station EVA number (digits only) from the stations tool, e.g. '8011160' (Berlin Hbf)."New value: +"Station EVA number (digits only) from get_city_resource(slug, resource='stations'), e.g. '8011160' (Berlin Hbf)." - removed
Input schema / properties / eva / titleRemoved value: -"Eva" - removed
Input schema / titleRemoved value: -"station_board_departuresArguments" - removed
Output schema / $defs / ToolMeta / descriptionRemoved value: -"Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten." - removed
Output schema / $defs / ToolMeta / properties / attribution / titleRemoved value: -"Attribution" - removed
Output schema / $defs / ToolMeta / properties / cache_status / titleRemoved value: -"Cache Status" - removed
Output schema / $defs / ToolMeta / properties / correlation_id / titleRemoved value: -"Correlation Id" - removed
Output schema / $defs / ToolMeta / properties / license / titleRemoved value: -"License" - removed
Output schema / $defs / ToolMeta / properties / source / titleRemoved value: -"Source" - removed
Output schema / $defs / ToolMeta / properties / source_status / titleRemoved value: -"Source Status" - removed
Output schema / $defs / ToolMeta / titleRemoved value: -"ToolMeta" - removed
Output schema / properties / data / titleRemoved value: -"Data" - removed
Output schema / titleRemoved value: -"ToolEnvelope"
- Removed
station_departures - Removed
stations - Removed
tax_rates - Removed
tourism - Removed
traffic - Removed
transit - Changed
transit_departures14 fields changed- removed
Input schema / properties / slug / titleRemoved value: -"Slug" - changed
Input schema / properties / stop_id / descriptionPrevious value: -"Optional stop ID; omit it to get the city's available departures."New value: +"Required stop ID to fetch departures for. Discover a city's stop IDs with get_city_resource(slug, resource='transit') first (each stop carries its id). Format: DELFI 'de:<AGS>:<id>' or a numeric gtfs.de stop id." - removed
Input schema / properties / stop_id / titleRemoved value: -"Stop Id" - removed
Input schema / titleRemoved value: -"transit_departuresArguments" - removed
Output schema / $defs / ToolMeta / descriptionRemoved value: -"Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten." - removed
Output schema / $defs / ToolMeta / properties / attribution / titleRemoved value: -"Attribution" - removed
Output schema / $defs / ToolMeta / properties / cache_status / titleRemoved value: -"Cache Status" - removed
Output schema / $defs / ToolMeta / properties / correlation_id / titleRemoved value: -"Correlation Id" - removed
Output schema / $defs / ToolMeta / properties / license / titleRemoved value: -"License" - removed
Output schema / $defs / ToolMeta / properties / source / titleRemoved value: -"Source" - removed
Output schema / $defs / ToolMeta / properties / source_status / titleRemoved value: -"Source Status" - removed
Output schema / $defs / ToolMeta / titleRemoved value: -"ToolMeta" - removed
Output schema / properties / data / titleRemoved value: -"Data" - removed
Output schema / titleRemoved value: -"ToolEnvelope"
- Removed
unemployment - Removed
vehicle_registrations - Removed
water_level - Changed
weather12 fields changed- removed
Input schema / properties / slug / titleRemoved value: -"Slug" - removed
Input schema / titleRemoved value: -"weatherArguments" - removed
Output schema / $defs / ToolMeta / descriptionRemoved value: -"Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten." - removed
Output schema / $defs / ToolMeta / properties / attribution / titleRemoved value: -"Attribution" - removed
Output schema / $defs / ToolMeta / properties / cache_status / titleRemoved value: -"Cache Status" - removed
Output schema / $defs / ToolMeta / properties / correlation_id / titleRemoved value: -"Correlation Id" - removed
Output schema / $defs / ToolMeta / properties / license / titleRemoved value: -"License" - removed
Output schema / $defs / ToolMeta / properties / source / titleRemoved value: -"Source" - removed
Output schema / $defs / ToolMeta / properties / source_status / titleRemoved value: -"Source Status" - removed
Output schema / $defs / ToolMeta / titleRemoved value: -"ToolMeta" - removed
Output schema / properties / data / titleRemoved value: -"Data" - removed
Output schema / titleRemoved value: -"ToolEnvelope"
- Removed
weather_warnings - Removed
webcams
48 tool updates
- Changed
accidents2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
air_quality2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
air_quality_live2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Added
business_registrations - Changed
charging2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
compare3 fields changed- added
Input schema / properties / cities / descriptionAdded value: +"Comma-separated list of city slugs, e.g. 'berlin,koeln,hamburg' (max. 28 cities)." - added
Input schema / properties / resource / descriptionAdded value: +"Resource to compare. Currently supported: 'weather' (DWD) or 'air' (UBA air quality)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
construction2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
demographics2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
election2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
energy2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
events2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
flood2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
fuel_prices2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
geo2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
get_city2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Added
get_city_overview - Changed
health2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
holidays2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
icu_live2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
indicators2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Added
land_values - Changed
list_cities1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Added
parking - Changed
pois3 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - added
Input schema / properties / type / descriptionAdded value: +"POI type from the API allowlist, one of: hospital, school, pharmacy, restaurant, police, kindergarten." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
pollen_uv2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
power_load2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
power_price2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
road_events2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
sharing2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Added
solar - Added
solar_roofs - Changed
sources1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
station_arrivals2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Added
station_board_arrivals - Added
station_board_departures - Changed
station_departures2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Added
stations - Added
tax_rates - Changed
tourism2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
traffic2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
transit2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
transit_departures3 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - added
Input schema / properties / stop_id / descriptionAdded value: +"Optional stop ID; omit it to get the city's available departures." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
unemployment2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
vehicle_registrations2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
water_level2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
weather2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
weather_warnings2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
- Changed
webcams2 fields changed- added
Input schema / properties / slug / descriptionAdded value: +"City slug from the list_cities tool, e.g. 'berlin' or 'hamburg'." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "ToolMeta": { + "additionalProperties": true, + "description": "Envelope-Metadaten: Quelle, Status, Cache, Lizenz und Attribution.\n\nZusatzfelder (z.B. ``covered_cities``, ``radius_m`` bei partieller Abdeckung)\nbleiben dank ``extra=\"allow\"`` erhalten.", + "properties": { + "attribution": { + "title": "Attribution", + "type": "string" + }, + "cache_status": { + "title": "Cache Status", + "type": "string" + }, + "correlation_id": { + "title": "Correlation Id", + "type": "string" + }, + "license": { + "title": "License", + "type": "string" + }, + "source": { + "title": "Source", + "type": "string" + }, + "source_status": { + "title": "Source Status", + "type": "string" + } + }, + "title": "ToolMeta", + "type": "object" + } + }, + "properties": { + "data": { + "title": "Data" + }, + "meta": { + "$ref": "#/$defs/ToolMeta" + } + }, + "required": [ + "data", + "meta" + ], + "title": "ToolEnvelope", + "type": "object" +}
38 tool updates
v1.0.0- First observed
accidents - First observed
air_quality - First observed
air_quality_live - First observed
charging - First observed
compare - First observed
construction - First observed
demographics - First observed
election - First observed
energy - First observed
events - First observed
flood - First observed
fuel_prices - First observed
geo - First observed
get_city - First observed
health - First observed
holidays - First observed
icu_live - First observed
indicators - First observed
list_cities - First observed
pois - First observed
pollen_uv - First observed
power_load - First observed
power_price - First observed
road_events - First observed
sharing - First observed
sources - First observed
station_arrivals - First observed
station_departures - First observed
tourism - First observed
traffic - First observed
transit - First observed
transit_departures - First observed
unemployment - First observed
vehicle_registrations - First observed
water_level - First observed
weather - First observed
weather_warnings - First observed
webcams
TDQS
Each tool has a clearly distinct purpose: general queries (get_city_overview, get_city, list_cities), specific data types (weather, air_quality, pois, transit_departures, station_board_departures/arrivals), comparisons (compare), source metadata (sources), and the generic accessor (get_city_resource). No overlap causes confusion.
All tool names use lowercase with underscores, following a verb_noun pattern (e.g., get_city, list_cities, station_board_departures). Even single-word names like weather and pois are consistent with the style and clearly indicate their function.
With 12 tools, the server is well-scoped for a city data API. It provides high-level discovery tools, specific data accessors for common queries, and a generic accessor for the full breadth of 65 data types. No unnecessary tools nor missing essential ones.
The tool surface covers the full lifecycle of data access: discovery (list_cities, get_city_overview, sources), base information (get_city), specific live data (weather, air_quality, transit, trains, POIs), and comparison. The generic get_city_resource fills any gaps, and no obvious missing operations are evident.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
GovData.de MCP — Germany's national open-data portal (CKAN API).
Keyless MCP access to official Luxembourg public data: laws, statistics, mobility, and more.
Germany public procurement MCP — official German government tenders (keyless).
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceSwiss open data MCP server — transport, weather, geodata, companies, etc,. Zero API keys.7622722MIT
- AlicenseBqualityDmaintenanceMCP 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.162MIT
- AlicenseNot gradedqualityDmaintenanceEnables access to German weather data from the Deutscher Wetterdienst, including station observations, forecasts, and warnings, through standardized MCP tools.MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for GovData.de, Germany's national open-data portal via CKAN API, enabling AI agents to list publishing organizations and thematic groups.15MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/street1983nk/infranode'
If you have feedback or need assistance with the MCP directory API, please join our Discord server