air-quality-mcp
Real, current air quality (US AQI, PM2.5, PM10, ozone, and more) for any city, free, in one command.
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 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, 70% rev share.
Data
Air quality data by Open-Meteo (free, no API key required). This project is not affiliated with Open-Meteo.
Self-hosting over HTTP
pip install fastmcp lulu-ads httpx uvicorn
MCP_TRANSPORT=http AIRQUALITY_LOCAL_DEV=1 python server.py # serves http://localhost:8080/air-quality/mcp
Metadata
Release files for air-quality-mcp 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| air_quality_mcp-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Release files / air_quality_mcp-0.1.0-py3-none-any.whl
| Download URL | air_quality_mcp-0.1.0-py3-none-any.whl |
|---|---|
| Size | 7.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
806eeda6f211b17edb7f80ae9c91d6820d66020109b8e4bb3c44c40e57e5693c
|
|
BLAKE2b-256 checksum How to use checksums |
30726919e15d37c53923da27903e28c790eed429d8619fe5adf2323135dd817f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.2
|