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

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. 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"
  2. 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"
      +}
  3. 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/open-world, so the safety profile is covered. The description still adds real behavioral constraints the annotations don't: a hard 24-hour-per-call cap, the default pollutant set, and the returned measurement fields.

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?

Front-loads what is returned (fields, granularity, scope) before the format details, and each sentence carries information. It runs as one dense block, but nothing is wasted.

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 values need not be re-explained, and annotations cover safety. The description supplies the 24-hour cap, defaults, and input formats, so an agent has what it needs; pagination/response-size behavior is the only notable omission.

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 heavy lifting is already done. The description largely restates the schema's bbox format, date format, and pollutant list (it does surface one concrete comma-separated code string), adding marginal value beyond the structured fields, so the baseline 3 fits.

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+resource with full scope: hourly EPA AirNow monitoring-site observations inside a bounding box over a UTC-hour span. The spatial-plus-temporal framing implicitly but clearly separates it from the point/current siblings (current_by_location, current_by_zip), making the query class self-evident.

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 a concrete motivating question ('which monitors in the LA basin exceeded AQI 100 yesterday') that makes the historical, multi-site range use case clear. It does not name an alternative tool or state exclusions, so it stops short of explicit 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.