Metadata-Version: 2.4
Name: air-quality-mcp
Version: 0.1.0
Summary: Free, keyless air quality MCP server — real current AQI, PM2.5, PM10, and pollutant data via Open-Meteo.
Project-URL: Homepage, https://getlulu.dev/mcps/air-quality-mcp
Project-URL: Repository, https://github.com/Lulu-The-Narwhal/lulu-platform
Author-email: Lulu <hello@getlulu.dev>
License: MIT
Keywords: air-quality,aqi,claude,mcp,model-context-protocol,pollution
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Requires-Python: >=3.10
Requires-Dist: fastmcp==3.4.4
Requires-Dist: httpx>=0.27.0
Requires-Dist: lulu-ads==0.8.6
Description-Content-Type: text/markdown

# 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
```
