Skip to main content
Glama

Observations In Bbox

observations_in_bbox
Read-onlyIdempotent

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".

Example tool call

This call uses example arguments supplied in the tool’s input schema.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "bbox": "-74.3,40.5,-73.7,40.95",
      "end_date": "2026-10-07T17",
      "start_date": "2026-10-07T12"
    },
    "name": "observations_in_bbox"
  }
}

Input Schema

NameRequiredDescriptionDefault
bboxYesminLon,minLat,maxLon,maxLat
verboseNoInclude site status, EPA region, elevation, data source agency and reporting areas
end_dateYesYYYY-MM-DDTHH (UTC hour, inclusive; at most 23 hours after start_date)
data_typeNoA (AQI only) | C (concentration only) | B (both, default)
parametersNoComma-separated pollutants (default: OZONE,PM25,PM10; also NO2,CO,SO2)
start_dateYesYYYY-MM-DDTHH (UTC hour, inclusive)

Output Schema

NameRequiredDescriptionDefault
bboxYesBounding box queried (minLon,minLat,maxLon,maxLat)
countYesNumber of observations returned
observationsYesHistorical AQI observations in bounding box

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedOutput schema / properties / observations / items / properties / aqi / properties
      Added value: +{
      +  "OZONE": {
      +    "type": "number"
      +  },
      +  "PM25": {
      +    "type": "number"
      +  }
      +}
    • changedOutput schema / properties / observations / items / properties / aqi / type
      Previous value: -[
      -  "integer",
      -  "null"
      -]New value: +[
      +  "object",
      +  "null"
      +]
  2. Changed6 schema fields changed
    • changedInput schema / examples
      Previous value: -[
      -  {
      -    "bbox": "-74.1,40.6,-73.9,40.8",
      -    "end_date": "2025-01-10T23",
      -    "start_date": "2025-01-10T00"
      -  },
      -  {
      -    "bbox": "-118.3,34.0,-118.2,34.1",
      -    "data_type": "A",
      -    "end_date": "2025-01-10T23",
      -    "parameters": "OZONE,PM25,NO2",
      -    "start_date": "2025-01-08T00",
      -    "verbose": true
      -  }
      -]New value: +[
      +  {
      +    "bbox": "-74.3,40.5,-73.7,40.95",
      +    "end_date": "2026-10-07T17",
      +    "start_date": "2026-10-07T12"
      +  },
      +  {
      +    "bbox": "-118.5,33.9,-118.0,34.2",
      +    "data_type": "A",
      +    "end_date": "2026-10-07T20",
      +    "parameters": "OZONE,PM25,NO2",
      +    "start_date": "2026-10-07T18",
      +    "verbose": true
      +  }
      +]
    • changedInput schema / properties / data_type / description
      Previous value: -"A (AQI) | C (concentration) | B (both, default)"New value: +"A (AQI only) | C (concentration only) | B (both, default)"
    • changedInput schema / properties / end_date / description
      Previous value: -"YYYY-MM-DDT23"New value: +"YYYY-MM-DDTHH (UTC hour, inclusive; at most 23 hours after start_date)"
    • changedInput schema / properties / parameters / description
      Previous value: -"Comma-separated pollutants (default: OZONE,PM25,PM10)"New value: +"Comma-separated pollutants (default: OZONE,PM25,PM10; also NO2,CO,SO2)"
    • changedInput schema / properties / start_date / description
      Previous value: -"YYYY-MM-DDT00 (hour-granular ISO truncated)"New value: +"YYYY-MM-DDTHH (UTC hour, inclusive)"
    • changedInput schema / properties / verbose / description
      Previous value: -"Include site / county / agency / full-AQS-code fields"New value: +"Include site status, EPA region, elevation, data source agency and reporting areas"
  3. Changed2 schema fields changed
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "bbox": "-74.1,40.6,-73.9,40.8",
      +    "end_date": "2025-01-10T23",
      +    "start_date": "2025-01-10T00"
      +  },
      +  {
      +    "bbox": "-118.3,34.0,-118.2,34.1",
      +    "data_type": "A",
      +    "end_date": "2025-01-10T23",
      +    "parameters": "OZONE,PM25,NO2",
      +    "start_date": "2025-01-08T00",
      +    "verbose": true
      +  }
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "bbox": {
      +      "description": "Bounding box queried (minLon,minLat,maxLon,maxLat)",
      +      "type": "string"
      +    },
      +    "count": {
      +      "description": "Number of observations returned",
      +      "type": "integer"
      +    },
      +    "observations": {
      +      "description": "Historical AQI observations in bounding box",
      +      "items": {
      +        "properties": {
      +          "agency": {
      +            "description": "Reporting agency name",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "aqi": {
      +            "description": "Air Quality Index value",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "aqs_code": {
      +            "description": "Full AQS code identifier",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "category": {
      +            "description": "AQI category numeric code",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "hour": {
      +            "description": "Hour observed (0-23)",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "latitude": {
      +            "description": "Site latitude",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "longitude": {
      +            "description": "Site longitude",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "observed_date": {
      +            "description": "Date observed (YYYY-MM-DD)",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "pollutant": {
      +            "description": "Pollutant parameter name",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "site": {
      +            "description": "Monitoring site name",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "unit": {
      +            "description": "Unit of measurement",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "utc": {
      +            "description": "UTC timestamp",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "value": {
      +            "description": "Pollutant concentration value",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "bbox",
      +    "count",
      +    "observations"
      +  ],
      +  "type": "object"
      +}
  4. First observed

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds real behavioral context beyond that: the 24-hour-per-call cap and the per-site, per-hour granularity of results. It omits any note on rate limits or what happens when the span exceeds 24 hours (error vs. truncation).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the opening clause, followed by format specifics and a use-case question; every element is relevant. There is minor redundancy in listing pollutants twice (prose list plus the comma-separated example).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return shape needn't be described, and the description covers constraints, formats and granularity well. The remaining gap is operational: no guidance on oversized spans, expected result volume, or empty-result behavior for a bbox with no monitors.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the schema already documents bbox, date formats, data_type modes and pollutant codes. The description restates the bbox and date formats and gives a sample pollutant string, which is helpful reinforcement but adds little beyond the schema's own descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: hourly EPA AirNow monitoring-site observations inside a bounding box for a UTC hour span, plus exactly which metrics are returned per site-hour. The scope (historical hourly grid vs. a single point) makes it distinguishable from location/zip lookups without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for use: bbox plus a UTC hour span capped at 24 hours per call, and a concrete motivating question (which monitors in the LA basin exceeded AQI 100 yesterday). It does not name an alternative for current-conditions queries or state when not to use it, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.