@pipeworx/airnow
Connect: https://pipeworx.io/mcp — every tool in the catalog, including @pipeworx/airnow’s. Install: one-click buttons
Connect to just the @pipeworx/airnow pack
https://gateway.pipeworx.io/airnow/mcp — only @pipeworx/airnow’s own tools, nothing else in the catalog.
No MCP client? Skip the connection: POST https://gateway.pipeworx.io/v1/tools/search_packs {"query":"..."} to find a tool below, GET /v1/tools/<name> for its schema, POST the same URL with arguments for the data — see For AI agents.
Tools: 4
US EPA AirNow — official current and forecast air quality index (AQI) for every
US reporting area, plus hourly per-site monitor observations. Keyless: reads
AirNow’s public file products on files.airnowtech.org live per call.
AirNow retired its keyed web service (www.airnowapi.org/aq/*) on
2026-10-01; every call returned HTTP 410 until this pack was moved to the file
products (fleet #2808). The retired-service notice at
docs.airnowapi.org/webservices/retired redirects to a login page, so the file
products are the only public route left.
Tools
current_by_zip(zip_code, distance_miles?)— latest observed AQI per pollutant for the reporting area nearest a ZIP, with yesterday’s AQI and the other reporting areas inside the radius.current_by_location(latitude, longitude, distance_miles?)— same, for a lat/lon.forecast_by_zip(zip_code, date?, distance_miles?)— issued forecasts (today- up to 3 days) per pollutant, with Action Day flag and forecaster discussion.
Omit
datefor every issued day;forecast_days_availablelists them.
- up to 3 days) per pollutant, with Action Day flag and forecaster discussion.
Omit
observations_in_bbox(bbox, start_date, end_date, parameters?, data_type?, verbose?)— hourly per-site AQI and concentrations insideminLon,minLat,maxLon,maxLatfor a span of UTC hours (YYYY-MM-DDTHH), max 24 hours per call (one ~1 MB upstream file per hour). Pollutants:OZONE, PM25, PM10, NO2, CO, SO2(AQI exists for the first four only).
Every response carries data_as_of (the upstream file’s Last-Modified),
source (the file URL) and found. A miss is {found:false, reason, hint}:
zip_not_in_airnow_index, no_reporting_area_in_radius,
no_forecast_area_in_radius, no_forecast_for_date, hours_not_published,
no_sites_in_bbox.
Auth
None. No key, no account.
Data sources
All under https://files.airnowtech.org/airnow/ (an S3 bucket AirNow rewrites
hourly; format fact sheets in airnow/docs/):
| File | Used by | Refresh |
|---|---|---|
today/cityzipcodes.csv — ZIP → city, state, lat, lon (27k rows) | *_by_zip | daily |
today/reportingarea.dat — per reporting area: yesterday (Y), current observed (O), forecast (F) rows | current_*, forecast_by_zip | hourly |
YYYY/YYYYMMDD/HourlyAQObs_YYYYMMDDHH.dat — per-site AQI + concentrations, one file per UTC hour | observations_in_bbox | ~30-60 min after the hour |
Quirks worth knowing:
- Forecasts two or more days out often carry a
categorybut anullAQI — that is how the agencies issue them, not a parse gap. - The current-hour
HourlyAQObsfile does not exist until AirNow publishes it; those hours are listed inhours_not_yet_publishedrather than erroring. - “Nearest reporting area” is by great-circle distance to the area’s published
centroid, so a ZIP on a metro edge may resolve to the neighbouring region
(ZIP 10001 → “New York City Region”, 10 mi).
other_areas_in_radiusshows the alternatives. - The gateway caches
airnowresults for 10 minutes (CACHE_TTL_OVERRIDES); the pack also keeps the parsed files in the isolate for 10 min (reporting area) / 24 h (ZIP index) / 6 h (hourly files).
Tools
- current_by_zip — Latest observed air quality index (AQI) for the EPA AirNow reporting area nearest a US ZIP code: one row per pollutant (ozone, PM2.5, PM10) with the AQI value, category (Good / Moderate / Unhealthy …)
- current_by_location — Latest observed air quality index (AQI) for the EPA AirNow reporting area nearest a latitude/longitude in the US: one row per pollutant with AQI value, category, observation hour, agency and yesterday
- forecast_by_zip — EPA AirNow air quality (AQI) forecast for a US ZIP code — today and up to three days ahead, per pollutant, with the forecast category, Action Day flag and the forecaster’s discussion text. Pass a date
- observations_in_bbox — Hourly EPA AirNow monitoring-site observations inside a bounding box for a span of UTC hours (max 24 hours per call): per site and hour, the AQI for ozone, PM2.5, PM10 and NO2 and the measured concent
Tools
current_by_location— Latest observed air quality index (AQI) for the EPA AirNow reporting area nearest a latitude/longitude in the US: one row per pollutant with AQI value, category, observation hour, agency and yesterdaycurrent_by_zip— Latest observed air quality index (AQI) for the EPA AirNow reporting area nearest a US ZIP code: one row per pollutant (ozone, PM2.5, PM10) with the AQI value, category (Good / Moderate / Unhealthy …)forecast_by_zip— EPA AirNow air quality (AQI) forecast for a US ZIP code — today and up to three days ahead, per pollutant, with the forecast category, Action Day flag and the forecaster's discussion text. Pass a dateobservations_in_bbox— Hourly EPA AirNow monitoring-site observations inside a bounding box for a span of UTC hours (max 24 hours per call): per site and hour, the AQI for ozone, PM2.5, PM10 and NO2 and the measured concent