Skip to main content
Glama

Forecast By Zip

forecast_by_zip
Read-onlyIdempotent

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 (YYYY-MM-DD) to get one day, omit it for every day AirNow has issued. Answers "is tomorrow ok for outdoor activity in 60601".

Input Schema

NameRequiredDescriptionDefault
dateNoYYYY-MM-DD forecast day (default: every day AirNow has issued, today + up to 3)
zip_codeYesUS 5-digit ZIP code
distance_milesNoSearch radius for the nearest reporting area (default 25, max 250)

Output Schema

NameRequiredDescriptionDefault
countYesNumber of forecast records returned
forecastYesAQI forecasts for pollutants
zip_codeYesUS 5-digit ZIP code queried
requested_dateYesForecast date requested (YYYY-MM-DD or 'today')

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / examples
      Previous value: -[
      -  {
      -    "zip_code": "10001"
      -  },
      -  {
      -    "date": "2025-01-15",
      -    "zip_code": "60601"
      -  }
      -]New value: +[
      +  {
      +    "zip_code": "10001"
      +  },
      +  {
      +    "distance_miles": 50,
      +    "zip_code": "60601"
      +  }
      +]
    • changedInput schema / properties / date / description
      Previous value: -"YYYY-MM-DD (default today)"New value: +"YYYY-MM-DD forecast day (default: every day AirNow has issued, today + up to 3)"
    • changedInput schema / properties / distance_miles / description
      Previous value: -"Search radius (default 25)"New value: +"Search radius for the nearest reporting area (default 25, max 250)"
  2. Changed2 schema fields changed
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "zip_code": "10001"
      +  },
      +  {
      +    "date": "2025-01-15",
      +    "zip_code": "60601"
      +  }
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "count": {
      +      "description": "Number of forecast records returned",
      +      "type": "integer"
      +    },
      +    "forecast": {
      +      "description": "AQI forecasts for pollutants",
      +      "items": {
      +        "properties": {
      +          "action_day": {
      +            "description": "Action day flag for air quality alert",
      +            "type": "boolean"
      +          },
      +          "aqi": {
      +            "description": "Forecasted Air Quality Index value",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "category": {
      +            "description": "Forecasted AQI category",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "discussion": {
      +            "description": "Forecast discussion/explanation text",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "forecast_date": {
      +            "description": "Forecast date (YYYY-MM-DD)",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "latitude": {
      +            "description": "Site latitude",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "longitude": {
      +            "description": "Site longitude",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "pollutant": {
      +            "description": "Pollutant name (e.g., O3, PM2.5)",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "reporting_area": {
      +            "description": "Geographic area name",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "state": {
      +            "description": "State code",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "requested_date": {
      +      "description": "Forecast date requested (YYYY-MM-DD or 'today')",
      +      "type": "string"
      +    },
      +    "zip_code": {
      +      "description": "US 5-digit ZIP code queried",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "zip_code",
      +    "requested_date",
      +    "count",
      +    "forecast"
      +  ],
      +  "type": "object"
      +}
  3. First observed

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description usefully adds the data source (EPA AirNow), the default window (today + up to 3 days), and what the payload carries, but says nothing about rate limits, auth, or geographic coverage limits for non-US ZIPs. Modest value over structured 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?

Three sentences, front-loaded with the resource and scope, and the closing use-case sentence grounds the tool in a real question. There is mild repetition between 'today and up to three days ahead' and the date-default sentence, which keeps it just short of ideal.

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

Completeness5/5

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

An output schema exists, so return-value detail is unnecessary in prose; annotations carry the safety profile and the schema carries parameter semantics. The description still supplies source, default window, payload shape and a usage scenario, leaving nothing an agent needs to call it correctly.

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 all three parameters are already documented, including the date default and distance_miles range. The description only restates the date semantics already in the schema and adds no format or edge-case detail beyond it; baseline 3 applies.

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 ('EPA AirNow air quality (AQI) forecast for a US ZIP code') plus the temporal scope ('today and up to three days ahead') and payload contents (per pollutant, category, Action Day flag, discussion text). The forecast/current framing clearly separates it from the sibling current_by_zip without the agent opening either 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 concrete invocation context: pass a date for a single day, omit it for the full issued range, and a worked scenario ('is tomorrow ok for outdoor activity in 60601'). It never names current_by_zip or recent_alerts as alternatives or states when not to use it, so no exclusions are provided.

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.