Skip to main content
Glama
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