air-quality-mcp
README.md
# air-quality-mcp
**Real, current air quality (US AQI, PM2.5, PM10, ozone, and more) for any city, free, in one command.**
```bash
pip install air-quality-mcp # or: uvx air-quality-mcp
```
Then ask your agent: *"what's the air quality in Bangkok?"* or *"is it safe to run outside in Berlin today?"*
No API key. No signup. Free.
## Tools
| Tool | What the model sees it for |
|---|---|
| `get_air_quality(city)` | Current air quality for a city -- US AQI, PM2.5, PM10, ozone, NO2, SO2, CO, plus a plain-language category. "What's the air quality in X", "is it safe to go outside in Y", "how polluted is Z". |
`city` is a free-text place name (e.g. "Bangkok", "Berlin", "Springfield, US").
## Example
```
> get_air_quality("Bangkok")
{
"location": {
"name": "Bangkok",
"country": "Thailand",
"admin1": "Bangkok"
},
"us_aqi": 27,
"aqi_category": "Good",
"pm2_5": 5.4,
"pm10": 6.4,
"ozone": 36.0,
"nitrogen_dioxide": 14.1,
"sulphur_dioxide": 3.9,
"carbon_monoxide": 1861.0,
"local_time": "2026-08-06T20:00",
"attribution": "Air quality data by Open-Meteo (open-meteo.com)"
}
```
```
> get_air_quality("Berlin")
{
"location": {
"name": "Berlin",
"country": "Germany",
"admin1": "State of Berlin"
},
"us_aqi": 51,
"aqi_category": "Moderate",
"pm2_5": 5.5,
"pm10": 9.6,
"ozone": 102.0,
"nitrogen_dioxide": 2.6,
"sulphur_dioxide": 1.0,
"carbon_monoxide": 145.0,
"local_time": "2026-08-06T15:00",
"attribution": "Air quality data by Open-Meteo (open-meteo.com)"
}
```
`aqi_category` is computed from `us_aqi` using the standard US AQI bands: 0-50 Good,
51-100 Moderate, 101-150 Unhealthy for Sensitive Groups, 151-200 Unhealthy,
201-300 Very Unhealthy, 301+ Hazardous. It comes back as `"Unknown"` on the rare
grid cell where no AQI can be resolved.
## How it's free
This server is part of the [Lulu Ads](https://getlulu.dev/publishers) network:
tool results may carry one clearly labeled, disclosed `sponsored` data field
(never instructions, never hidden). That sponsorship pays the hosting, so the
lookup stays free. Fail-open by design — if the ads backend is slow, down,
or (as with a local install) has no credentials at all, the tools behave
exactly like an unmonetized server.
Run your own MCP? The same one-line integration is open to every publisher —
[getlulu.dev/publishers](https://getlulu.dev/publishers), 70% rev share.
## Data
Air quality data by [Open-Meteo](https://open-meteo.com) (free, no API key
required). This project is not affiliated with Open-Meteo.
## Self-hosting over HTTP
```bash
pip install fastmcp lulu-ads httpx uvicorn
MCP_TRANSPORT=http AIRQUALITY_LOCAL_DEV=1 python server.py # serves http://localhost:8080/air-quality/mcp
```
TDQS
A4.6/5.0
Scored across 1 tool
Disambiguation5/5
Only one tool exists, so there is no possibility of confusion or overlap. The tool's purpose is unambiguous and clearly distinct.
Naming Consistency5/5
The tool name 'get_air_quality' follows the clean verb_noun convention, consistent with typical MCP naming patterns. There are no other names to conflict.
Tool Count3/5
With only one tool, the server feels thin for the broader 'air quality' domain. While it may serve a single lookup use case, the count is borderline.
Completeness4/5
The tool thoroughly covers current air quality with detailed pollutant data and AQI categories. Minor gaps exist such as historical queries or forecasts, but the core current-condition use case is fully addressed.
Maintenance
ActivitySlowing
ResponsivenessNo issues