Repository avatar
AI Tools
v0.1.0
active

uba-mcp

io.github.mohammad-abbasi-sh/uba-mcp

Unofficial read-only MCP server for German air quality (UBA) — hourly values + LQI, 400 stations.

Documentation

uba-mcp 🌬️

mcp-name: io.github.mohammad-abbasi-sh/uba-mcp

Unofficial read-only MCP server for UBA air quality — the Umweltbundesamt (German Federal Environment Agency) Air Data API v4: hourly measurements from ~400 German stations (PM10, PM2.5, NO2, O3, SO2, CO, benzene …) since 2016, with the official UBA air-quality index (LQI). No key, no login.

Built by Mohammad Abbasi as part of the "Germany MCP factory". Not affiliated with the Umweltbundesamt.

For AI agents

Add to your MCP client config (stdio):

{
  "mcpServers": {
    "uba": {
      "command": "uvx",
      "args": ["uba-mcp==0.1.0"]
    }
  }
}

Or run locally: python -m uba_mcp.server (needs mcp<2, httpx).

Tools

ToolDescription
uba_list_stationsMeasuring stations, filterable by city, state, type, area or name
uba_station_detailOne station: address, coordinates, type, data window, recent pollutants
uba_current_air_qualityLatest hourly values + LQI at a station (code, id or city name)
uba_measurementsHourly values over a date range (max 31 days) + min/max/mean & daily means
uba_list_componentsAll 12 pollutants: code, symbol, unit, name
uba_list_networksThe 17 measuring networks (16 Länder + UBA)
uba_healthReachability check (ok / blocked / error) — one polite request

Example output (uba_current_air_quality / Berlin Neukölln, 2026-11-11 09:00 CET):

{"station": {"code": "DEBE034", "name": "Berlin Neukölln", "city": "Berlin"},
 "hour": {"start": "2026-11-11 09:00:00", "total_index": 2, "total_label": "moderate",
  "values": [{"code": "PM2", "value": 17.0, "unit": "µg/m³", "label": "moderate"},
             {"code": "PM10", "value": 23.0, "unit": "µg/m³", "label": "good"},
             {"code": "O3", "value": 24.0, "unit": "µg/m³", "label": "very good"},
             {"code": "NO2", "value": 15.0, "unit": "µg/m³", "label": "good"}]}}

Notes:

  • Stations are found by code (DEBE010 = Berlin Wedding), numeric id, or city name (first active station in that city).
  • The index / total_index (0–4) and labels come from the API itself; they follow the UBA LQI, 2025 revision (hourly means, µg/m³):
ClassNO2PM10PM2.5O3SO2
0 very good0–100–90–50–240–10
1 good11–3010–276–1525–7211–30
2 moderate31–6028–5416–3073–14431–60
3 poor61–10055–9031–50145–24061–100
4 very poor>100>90>50>240>100
  • All times are CET/CEST as returned by the API. Data: UBA Air Data API v4 umweltbundesamt.de/api/air_data/v4 — no key, no login, read-only.

Development

python3 -m venv .venv && .venv/bin/pip install "mcp<2" httpx pytest
.venv/bin/pip install -e .
.venv/bin/python -m pytest tests/ -q
  • tests/test_domain.py — offline, parses real captured API fixtures
  • tests/test_live.py — 7 cautious live requests against the UBA API

License

MIT


Built by Mohammad Abbasi — Almanibama · mabbasi.ir