observations_in_bbox

Pack: airnow · Connect: https://pipeworx.io/mcp (see Connect below for a single-pack URL)

No MCP client? Call it directly: GET https://gateway.pipeworx.io/v1/tools/observations_in_bbox for the schema, then POST the same URL with its arguments for the data.

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 concentrations for PM2.5, ozone, NO2, CO, SO2 and PM10. Specify pollutants as comma-separated codes (“OZONE,PM25,PM10,CO,NO2,SO2”). bbox format: “minLon,minLat,maxLon,maxLat”; dates as “YYYY-MM-DDTHH” (UTC). Answers “which monitors in the LA basin exceeded AQI 100 yesterday”.

Parameters

NameTypeRequiredDescription
bboxstringyesminLon,minLat,maxLon,maxLat
start_datestringyesYYYY-MM-DDTHH (UTC hour, inclusive)
end_datestringyesYYYY-MM-DDTHH (UTC hour, inclusive; at most 23 hours after start_date)
parametersstringnoComma-separated pollutants (default: OZONE,PM25,PM10; also NO2,CO,SO2)
data_typestringnoA (AQI only) | C (concentration only) | B (both, default)
verbosebooleannoInclude site status, EPA region, elevation, data source agency and reporting areas

Example call

Arguments

{
  "bbox": "-74.3,40.5,-73.7,40.95",
  "start_date": "2026-10-07T12",
  "end_date": "2026-10-07T17"
}

curl

curl -X POST https://gateway.pipeworx.io/airnow/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"observations_in_bbox","arguments":{"bbox":"-74.3,40.5,-73.7,40.95","start_date":"2026-10-07T12","end_date":"2026-10-07T17"}}}'

TypeScript (@pipeworx/sdk)

import { Pipeworx } from '@pipeworx/sdk';
const pipeworx = new Pipeworx();

const result = await pipeworx.call('observations_in_bbox', {
  "bbox": "-74.3,40.5,-73.7,40.95",
  "start_date": "2026-10-07T12",
  "end_date": "2026-10-07T17"
});

More examples

{
  "bbox": "-118.5,33.9,-118.0,34.2",
  "start_date": "2026-10-07T18",
  "end_date": "2026-10-07T20",
  "parameters": "OZONE,PM25,NO2",
  "data_type": "A",
  "verbose": true
}

Response shape

Always returns: bbox, count, observations

FieldTypeDescription
bboxstringBounding box queried (minLon,minLat,maxLon,maxLat)
countintegerNumber of observations returned
observationsarrayHistorical AQI observations in bounding box
Full JSON Schema
{
  "type": "object",
  "properties": {
    "bbox": {
      "type": "string",
      "description": "Bounding box queried (minLon,minLat,maxLon,maxLat)"
    },
    "count": {
      "type": "integer",
      "description": "Number of observations returned"
    },
    "observations": {
      "type": "array",
      "description": "Historical AQI observations in bounding box",
      "items": {
        "type": "object",
        "properties": {
          "observed_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date observed (YYYY-MM-DD)"
          },
          "hour": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Hour observed (0-23)"
          },
          "utc": {
            "type": [
              "string",
              "null"
            ],
            "description": "UTC timestamp"
          },
          "site": {
            "type": [
              "string",
              "null"
            ],
            "description": "Monitoring site name"
          },
          "agency": {
            "type": [
              "string",
              "null"
            ],
            "description": "Reporting agency name"
          },
          "aqs_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "Full AQS code identifier"
          },
          "latitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Site latitude"
          },
          "longitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Site longitude"
          },
          "pollutant": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pollutant parameter name"
          },
          "aqi": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Air Quality Index value"
          },
          "category": {
            "type": [
              "integer",
              "null"
            ],
            "description": "AQI category numeric code"
          },
          "value": {
            "type": [
              "number",
              "null"
            ],
            "description": "Pollutant concentration value"
          },
          "unit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Unit of measurement"
          }
        }
      }
    }
  },
  "required": [
    "bbox",
    "count",
    "observations"
  ]
}

Connect

Add this to your MCP client config — every tool in the catalog, including this one — or use one-click install buttons:

{
  "mcpServers": {
    "pipeworx": {
      "url": "https://pipeworx.io/mcp"
    }
  }
}
Connect to just the airnow pack
{
  "mcpServers": {
    "airnow": {
      "url": "https://gateway.pipeworx.io/airnow/mcp"
    }
  }
}

See Getting Started for client-specific install steps.

Regenerated from source · build October 30, 2026