AirNow MCP Server
The AirNow MCP Server provides a natural language interface to access U.S. air quality data through the AirNow API, designed for integration with large language models (LLMs).
Access Current, Forecasted, and Historical AQI Data: Retrieve Air Quality Index values by ZIP code, latitude/longitude, or geographic bounding box
Query Detailed Observations: Access monitoring site data for specific parameters (ozone, pm25, pm10, co, no2, so2) and date/time ranges
Retrieve Contour Maps: Obtain current or historical contour maps for ozone and PM2.5 in KML format
Health Recommendations: Access health recommendations based on AQI levels
Integration Options: Use NPX or Docker for easy integration with LLMs
Required for running the AirNow MCP Server via NPX, providing access to real-time, forecasted, and historical U.S. air quality data through the AirNow API.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AirNow MCP Serverwhat's the air quality in New York City right now?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AirNow MCP Server
Overview
The unofficial AirNow MCP Server is a Model Context Protocol (MCP) implementation that enables integration between large language models (LLMs) and the AirNow API for U.S. air quality data. This server provides a comprehensive set of tools that allows LLMs to access and utilize real-time, forecasted, and historical air quality information.
Related MCP server: EPA Air Quality System (AQS) MCP Server
Key Features
Direct access to AirNow API resources through standardized MCP tools
Natural language interface for querying air quality data
Support for current, forecasted, and historical AQI, observations, and contour maps
Easy integration via NPX/Docker
About the AirNow API
The AirNow API provides access to official U.S. air quality data, including:
Current and Forecasted Air Quality Index (AQI):
Retrieve real-time and forecasted AQI values for ozone, PM2.5, and PM10 for specific locations or regions.Observations and Reporting Areas:
Access air quality observations by ZIP code, latitude/longitude, bounding box, or reporting area.Air Quality Maps:
Obtain contour maps for ozone and PM2.5, available as images or data overlays.Historical Data:
Query historical air quality data for supported pollutants.Health Recommendations:
The API provides health recommendations and cautionary statements based on AQI levels.
For detailed information on endpoints, parameters, and response formats, log in with your AirNow API account and go to the AirNow API Web Services Documentation.
Available Tools
Forecasts
forecast_by_lat_long – Get current or historical forecasted AQI values and categories for a reporting area by latitude and longitude.
forecast_by_zip_code – Get current or historical forecasted AQI values and categories for a reporting area by Zip code.
Contour Maps
contour_maps_by_geographic_bounding_box_ozone – Get current or historical ozone contour maps in KML.
contour_maps_by_geographic_bounding_box_pm25 – Get current or historical PM2.5 contour maps in KML.
contour_maps_by_bounding_box_combined_ozone_pm25 – Get current or historical contour maps in KML for combined ozone and PM2.5 values.
Observations
current_observations_by_reporting_area_by_lat_long – Get current AQI values and categories for a reporting area by latitude and longitude.
current_observations_by_reporting_area_by_zip_code – Get current AQI values and categories for a reporting area by Zip code.
observations_by_monitoring_site_by_geographic_bounding_box – Get AQI values or data concentrations for a specified date and time range and set of parameters within a geographic area of interest.
Historical Data
historical_observations_by_reporting_area_by_lat_long – Get historical AQI values and categories for a reporting area by latitude and longitude.
historical_observations_by_reporting_area_by_zip_code – Get historical AQI values and categories for a reporting area by Zip code.
Requirements
An AirNow API key, which you can obtain by requesting an AirNow API Account.
For use with NPX,
Node.js >= v22.14.0is required.
Configuration
Claude Desktop
Add one of these configurations to your claude_desktop_config.json:
NPX
{
"mcpServers": {
"airnow-mcp-server": {
"command": "npx",
"args": [
"-y",
"@prsantos/airnow-mcp-server"
],
"env":{
"AIRNOW_API_KEY": "<YOUR-AIRNOW-API-KEY>",
"APPDATA": "<Value of APPDATA>" // Windows example: "C:\\Users\\[username]\\AppData\\Roaming"
}
}
}
}Note:
For Windows, get the APPDATA value by opening the Command Prompt and running:
echo %APPDATA%For Mac, get the APPDATA value, by opening the Terminal running:
which npm
Docker
{
"mcpServers": {
"airnow-mcp-server": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"AIRNOW_API_KEY",
"prsantos/airnow-mcp-server"
],
"env":{
"AIRNOW_API_KEY": "<YOUR-AIRNOW-API-KEY>"
}
}
}
}Available Tools
10 toolsget-contour-maps-by-bounding-box-combined-ozone-pm25A
Get current or historical combined Ozone and PM2.5 contour maps in KML by geographic bounding box.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | Geographic bounding box of the area of interest in latitude and longitude. Format: minX,minY,maxX,maxY. Example: -118,34,-71,42 | |
| date | Yes | The date and hour of the data (in UTC). Time represents the beginning of the measurement period. Format: yyyy-mm-ddTHH. Example: January 1, 2012 at 1PM would be formatted as: 2012-01-01T13 and represents data measured between 1:00 PM-1:59 PM UTC | |
| srs | Yes | The coordinate system of the bounding box. Format: The well-known text or EPSG code. Default: EPSG:4326. Example: EPSG:4326 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions 'current or historical' data and KML format, but lacks details on permissions, rate limits, data freshness, or error handling, which are critical for a data retrieval tool with no structured safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads key information (action, resource, format, method) with no wasted words, making it easy to parse and understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description adequately covers the tool's purpose and basic usage but lacks behavioral details like response format, pagination, or error cases, making it minimally viable but incomplete for full agent guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents parameters. The description adds context by specifying 'combined Ozone and PM2.5' and 'KML', but does not provide additional semantic details beyond what the schema already covers, meeting the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get'), the resource ('combined Ozone and PM2.5 contour maps'), the format ('KML'), and the method ('by geographic bounding box'), distinguishing it from siblings that handle single pollutants or different data types like observations or forecasts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage for current or historical contour maps via bounding box, but does not explicitly state when to use this tool versus alternatives like sibling tools for single pollutants or other data retrieval methods, leaving some ambiguity in sibling differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-contour-maps-by-geographic-bounding-box-ozoneB
Get current or historical Ozone contour maps in KML by geographic bounding box.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | Geographic bounding box of the area of interest in latitude and longitude. Format: minX,minY,maxX,maxY. Example: -118,34,-71,42 | |
| date | Yes | The date and hour of the data (in UTC). Time represents the beginning of the measurement period. Format: yyyy-mm-ddTHH. Example: January 1, 2012 at 1PM would be formatted as: 2012-01-01T13 and represents data measured between 1:00 PM-1:59 PM UTC | |
| srs | Yes | The coordinate system of the bounding box. Format: The well-known text or EPSG code. Default: EPSG:4326. Example: EPSG:4326 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but offers minimal behavioral context. It states the output format (KML) and temporal scope (current/historical), but doesn't disclose authentication needs, rate limits, data freshness, error conditions, or what 'contour maps' specifically contain. For a data retrieval tool with zero annotation coverage, this leaves significant gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence with zero wasted words. It front-loads the core purpose and efficiently includes key details (Ozone, KML, bounding box). Every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 parameters with full schema coverage but no annotations or output schema, the description is minimally adequate. It covers the basic purpose and output format, but for a tool that retrieves environmental data with temporal and spatial parameters, more context about data sources, update frequency, or typical use cases would be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all three parameters. The description adds no parameter-specific information beyond what's in the schema (e.g., it doesn't clarify 'bbox' format or 'date' interpretation). Baseline score of 3 is appropriate when the schema does all the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get'), resource ('Ozone contour maps'), format ('in KML'), and scope ('by geographic bounding box'). It distinguishes from some siblings by specifying 'Ozone' (vs. PM2.5 or combined) and 'geographic bounding box' (vs. other location methods), but doesn't explicitly differentiate from all similar tools like 'get-contour-maps-by-bounding-box-combined-ozone-pm25'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It mentions 'current or historical' but doesn't explain when to choose this over other observation or forecast tools in the sibling list, nor does it specify any prerequisites or exclusions for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-contour-maps-by-geographic-bounding-box-pm25B
Get current or historical PM2.5 contour maps in KML by geographic bounding box.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | Geographic bounding box of the area of interest in latitude and longitude. Format: minX,minY,maxX,maxY. Example: -118,34,-71,42 | |
| date | Yes | The date and hour of the data (in UTC). Time represents the beginning of the measurement period. Format: yyyy-mm-ddTHH. Example: January 1, 2012 at 1PM would be formatted as: 2012-01-01T13 and represents data measured between 1:00 PM-1:59 PM UTC | |
| srs | Yes | The coordinate system of the bounding box. Format: The well-known text or EPSG code. Default: EPSG:4326. Example: EPSG:4326 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions output format (KML) and data type (current/historical PM2.5), but lacks critical behavioral details such as rate limits, authentication needs, data freshness, error handling, or what 'contour maps' entail (e.g., resolution, units). For a tool with no annotations, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads key information (action, resource, format, method). Every word contributes directly to the tool's purpose without redundancy or fluff, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and a tool that fetches environmental data (which may involve complexities like data latency or accuracy), the description is incomplete. It lacks details on output structure, error cases, performance expectations, or how results integrate with sibling tools, leaving significant gaps for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, providing detailed parameter documentation. The description adds minimal value beyond the schema, only implying that parameters define the bounding box and date for PM2.5 data. No additional semantics or usage context are provided, meeting the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get'), resource ('PM2.5 contour maps'), and format ('in KML'), with geographic bounding box as the method. It distinguishes from some siblings by specifying PM2.5 (vs. ozone or combined pollutants) and bounding box method, though not all sibling distinctions are explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for current or historical PM2.5 contour maps via bounding box, but lacks explicit guidance on when to choose this over alternatives like sibling tools for ozone, combined pollutants, or different geographic methods (e.g., zip code, lat-long). No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-current-observations-by-reporting-area-by-lat-longC
Get current AQI values and categories for a reporting area by latitude and longitude.
| Name | Required | Description | Default |
|---|---|---|---|
| distance | No | If no reporting area is associated with the latitude and longitude, current observations from a nearby reporting area within this distance (in miles) will be returned, if available. Example: 150 | |
| format | Yes | Format of the payload file returned. Example: application/json | |
| latitude | Yes | Latitude in decimal degrees. Example: 38.33 | |
| longitude | Yes | Longitude in decimal degrees. Example: -122.28 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It states what the tool returns ('current AQI values and categories') but lacks critical behavioral details: it doesn't mention error handling (e.g., what happens if no reporting area is found), rate limits, authentication needs, or response format implications. The 'distance' parameter description in the schema hints at fallback behavior, but the tool description itself doesn't disclose this.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose. Every word earns its place with no redundancy or unnecessary elaboration. It's appropriately sized for a straightforward lookup tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is incomplete. It doesn't explain what 'AQI values and categories' means, the structure of returned data, or error conditions. For a tool with 4 parameters and no structured output documentation, more context about behavior and results is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are fully documented in the schema. The description adds no parameter-specific information beyond implying latitude/longitude are required inputs. It doesn't explain parameter interactions, default values, or provide examples beyond what's in the schema. Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get current AQI values and categories for a reporting area by latitude and longitude.' It specifies the verb ('Get'), resource ('current AQI values and categories'), and key input method ('by latitude and longitude'). However, it doesn't explicitly differentiate from siblings like 'get-current-observations-by-reporting-area-by-zip-code' beyond the input method difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'get-forecast-by-lat-long' for forecasts or 'get-historical-observations-by-reporting-area-by-lat-long' for historical data. There's no context about use cases, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-current-observations-by-reporting-area-by-zip-codeC
Get current AQI values and categories for a reporting area by Zip code.
| Name | Required | Description | Default |
|---|---|---|---|
| distance | No | If no reporting area is associated with the Zip code, current observations from a nearby reporting area within this distance (in miles) will be returned, if available. Example: 150 | |
| format | Yes | Format of the payload file returned. Example: application/json | |
| zipCode | Yes | Zip code to get the current observations for. Example: 94954 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure. While it mentions what the tool returns ('current AQI values and categories'), it doesn't describe important behavioral aspects like error handling (what happens with invalid zip codes), rate limits, authentication requirements, or whether this is a read-only operation. The description is minimal and leaves key behavioral questions unanswered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that communicates the core functionality without unnecessary words. It's appropriately front-loaded with the main purpose. However, given the tool's complexity and lack of annotations, it might be too concise at the expense of needed behavioral context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations, no output schema, and multiple sibling alternatives, the description is insufficiently complete. It doesn't explain what 'reporting area' means in practice, doesn't clarify the relationship between zip codes and reporting areas, and provides no information about the response structure or format options despite the format parameter being required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the input schema already provides comprehensive documentation for all three parameters. The description doesn't add any meaningful parameter semantics beyond what's in the schema - it mentions 'by Zip code' which aligns with the zipCode parameter but provides no additional context about parameter usage, relationships, or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get current AQI values and categories') and target resource ('for a reporting area by Zip code'), making the purpose immediately understandable. However, it doesn't explicitly differentiate from its closest sibling 'get-current-observations-by-reporting-area-by-lat-long', which performs the same function but uses latitude/longitude instead of zip code.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With multiple sibling tools available (including forecast tools, historical observations, and lat-long variants), there's no indication of when zip code lookup is preferred over lat-long or when current observations are appropriate versus forecasts or historical data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-forecast-by-lat-longB
Get current or historical forecasted AQI values and categories for a reporting area by latitude and longitude.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date of forecast. Format: YYYY-MM-DD. Example: 2012-02-01 | |
| distance | No | Return a forecast from a nearby reporting area within this distance (in miles). Example: 150 | |
| format | Yes | Format of the payload file returned. Example: application/json | |
| latitude | Yes | Latitude in decimal degrees. Example: 38.33 | |
| longitude | Yes | Longitude in decimal degrees. Example: -122.28 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions 'current or historical forecasted AQI values and categories' but doesn't explain what 'forecasted' entails (e.g., time range, accuracy), how 'reporting area' is determined, or any limitations like rate limits or authentication needs. For a tool with no annotations, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core functionality without unnecessary words. It directly states what the tool does, making it easy to parse and understand quickly. Every part of the sentence contributes to clarifying the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (5 parameters, no output schema, no annotations), the description is incomplete. It covers the basic purpose but lacks usage guidelines, behavioral details, and output information. While the schema handles parameters well, the description doesn't compensate for missing annotations or output schema, leaving gaps in overall context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds minimal value beyond the input schema, which has 100% coverage with detailed parameter descriptions. It implies latitude/longitude are used to locate a 'reporting area' and mentions 'current or historical' (hinting at the 'date' parameter), but doesn't elaborate on parameter interactions or semantics. With high schema coverage, the baseline is 3, and the description doesn't significantly enhance understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get current or historical forecasted AQI values and categories for a reporting area by latitude and longitude.' It specifies the verb ('Get'), resource ('forecasted AQI values and categories'), and mechanism ('by latitude and longitude'), making it easy to understand what the tool does. However, it doesn't explicitly differentiate from siblings like 'get-forecast-by-zip-code' or 'get-current-observations-by-reporting-area-by-lat-long', which would require a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention siblings like 'get-forecast-by-zip-code' for zip-based queries or 'get-current-observations-by-reporting-area-by-lat-long' for non-forecast data, nor does it specify prerequisites or exclusions. This leaves the agent without context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-forecast-by-zip-codeC
Get current or historical forecasted AQI values and categories for a reporting area by Zip code.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date to get the forecast for. Format: YYYY-MM-DD. Example: 2012-02-01 | |
| distance | No | Distance in miles to search for the forecast. Example: 150 | |
| format | Yes | Format of the payload file returned. Example: application/json | |
| zipCode | Yes | Zip code to get the forecast for. Example: 94954 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It states the tool retrieves forecasted AQI data but lacks details on permissions, rate limits, data freshness, error handling, or response format. This is inadequate for a tool with potential external API calls and data sensitivity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads key information (get forecast, AQI, by Zip code). It avoids redundancy but could be slightly more structured by separating current vs. historical aspects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is incomplete. It doesn't explain return values (e.g., AQI categories, timestamps), error conditions, or dependencies like API availability. For a tool with environmental data implications, this leaves significant gaps for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all parameters (date, distance, format, zipCode). The description adds no additional parameter semantics beyond implying AQI-related data, which doesn't compensate for schema completeness. Baseline 3 is appropriate as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get'), the resource ('forecasted AQI values and categories'), and the target ('by Zip code'), with specificity about current/historical data. However, it doesn't explicitly differentiate from sibling tools like 'get-forecast-by-lat-long' or 'get-current-observations-by-reporting-area-by-zip-code', which would require a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'get-forecast-by-lat-long' or observation-based tools. It mentions 'current or historical' but doesn't specify criteria for choosing between them or exclusions, leaving the agent without contextual usage instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-historical-observations-by-reporting-area-by-lat-longC
Get historical AQI values and categories for a reporting area by latitude and longitude.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date to get the historical observations for. Format: YYYY-MM-DD. Example: 2012-02-01 | |
| distance | No | If no reporting area is associated with the latitude and longitude, historical observations from a nearby reporting area within this distance (in miles) will be returned, if available. Example: 150 | |
| format | Yes | Format of the payload file returned. Example: application/json | |
| latitude | Yes | Latitude in decimal degrees. Example: 38.33 | |
| longitude | Yes | Longitude in decimal degrees. Example: -122.28 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions retrieving 'historical AQI values and categories' but fails to describe key behaviors: whether this is a read-only operation, potential rate limits, error handling (e.g., if no reporting area is found), or the structure of the returned data. The description is minimal and lacks operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It is front-loaded and wastes no space, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a tool with 5 parameters, no annotations, and no output schema, the description is incomplete. It does not address behavioral aspects like data format details, error scenarios, or how the 'distance' parameter affects results, leaving significant gaps for an agent to understand proper usage and expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not add any parameter-specific information beyond what is already detailed in the input schema, which has 100% coverage with clear descriptions for all parameters. Since the schema fully documents the parameters, the baseline score of 3 is appropriate, as the description provides no additional semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get historical AQI values and categories') and the target ('for a reporting area by latitude and longitude'), making the purpose understandable. However, it does not explicitly differentiate this tool from its sibling 'get-historical-observations-by-reporting-area-by-zip-code', which serves a similar purpose but uses a different input method (zip code vs. lat/long).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, such as the sibling tools for current observations, forecasts, or historical data by zip code. It lacks explicit context about use cases, prerequisites, or exclusions, leaving the agent to infer usage based on parameter names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-historical-observations-by-reporting-area-by-zip-codeC
Get historical AQI values and categories for a reporting area by Zip code.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date to get the historical observations for. Format: YYYY-MM-DD. Example: 2012-02-01 | |
| distance | No | If no reporting area is associated with the Zip code, historical observations from a nearby reporting area within this distance (in miles) will be returned, if available. Example: 150 | |
| format | Yes | Format of the payload file returned. Example: application/json | |
| zipCode | Yes | Zip code to get the historical observations for. Example: 94954 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states what the tool does but lacks critical details: it doesn't specify output format beyond 'AQI values and categories', mention rate limits, authentication requirements, error handling, or data freshness. The description implies a read-only operation but doesn't explicitly confirm safety or potential side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose without unnecessary words. Every part earns its place by specifying the action, data type, and target, making it easy to scan and understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a 4-parameter tool with no annotations and no output schema, the description is incomplete. It doesn't address behavioral aspects like data sources, accuracy, limitations (e.g., date ranges), or output structure. For a tool that likely returns structured environmental data, more context is needed to use it effectively without trial and error.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are fully documented in the input schema. The description adds no additional parameter semantics beyond implying Zip code and date usage. It doesn't explain interactions between parameters (e.g., how distance affects results) or provide examples beyond what's in the schema. Baseline 3 is appropriate when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get historical AQI values and categories') and target ('for a reporting area by Zip code'), which is specific and actionable. However, it doesn't differentiate from sibling tools like 'get-historical-observations-by-reporting-area-by-lat-long' or 'get-current-observations-by-reporting-area-by-zip-code', which would require mentioning temporal scope (historical vs current) or input method (Zip code vs lat/long).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description doesn't mention sibling tools or contextual factors like data availability, performance considerations, or prerequisites. Users must infer usage from the tool name alone, which is insufficient for optimal selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-observations-by-monitoring-site-by-geographic-bounding-boxC
Get observations by monitoring site within a geographic bounding box.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | Yes | Geographic bounding box of the area of interest in latitude and longitude. The format is a comma separated list minX,minY,maxX,maxY. Example: 122.715607,38.181254,-120.012970,39.022646 | |
| datatype | Yes | Data type to return. Example: C | |
| enddate | No | The end date and time of the data requested. Format: UTC Date or DateTime as end of measurement period. Examples: 2014-01-02T13:00, 2014-01-02T13, or 2014-01-02 | |
| format | Yes | MIME type of the file to be returned. Example: application/json | |
| includerawconcentrations | No | When set to 1, an additional field that contains the raw concentration will be added to the output. Default is 0. | |
| monitortype | No | The type of monitor to be returned. Options include: Permanent Only (0), Mobile Only (1), Permanent and Mobile (2). Example: 0 | |
| parameters | Yes | Comma separated list of pollutant parameters short codes to return data for. Options include: ozone, pm25, pm10, co, no2, so2. Example: ozone,pm25 | |
| startdate | No | The start date and time of the data requested. Format: UTC Date or DateTime as beginning of measurement period. Examples: 2014-01-01T13:00, 2014-01-01T13, or 2014-01-01 | |
| verbose | No | When set to 1, provides additional site information including Site Name, Agency Name, AQS ID, and Full AQS ID. Default is 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but offers minimal behavioral disclosure. It states what the tool does but doesn't describe response format, pagination, rate limits, authentication requirements, or error conditions. For a data retrieval tool with 9 parameters, this leaves significant behavioral aspects undocumented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that states the core functionality without unnecessary words. It's appropriately sized for the tool's complexity and front-loads the essential information. Every word earns its place in conveying the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex data retrieval tool with 9 parameters, no annotations, and no output schema, the description is inadequate. It doesn't explain what 'observations' contain, the data format returned, or how results are structured. The description should provide more context about the nature of the observations and typical use cases given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all 9 parameters. The description adds no parameter-specific information beyond what's in the schema. This meets the baseline of 3 since the schema does the heavy lifting, but the description provides no additional context about parameter interactions or usage patterns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and resource ('observations by monitoring site') with geographic bounding scope. It distinguishes from siblings like contour maps, forecasts, and reporting-area tools by specifying monitoring sites and bounding box. However, it doesn't explicitly contrast with similar tools like 'get-historical-observations-by-reporting-area-by-lat-long' beyond the obvious site vs reporting-area difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives is provided. The description doesn't mention prerequisites, typical use cases, or comparisons to sibling tools. While the name implies geographic bounding box filtering, there's no explicit 'when-not' or alternative tool recommendations for different scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose based on the combination of data type (e.g., contour maps, observations, forecasts), pollutant (e.g., ozone, PM2.5), location method (e.g., bounding box, lat-long, zip code), and time frame (e.g., current, historical). There is no overlap in functionality, making it easy for an agent to select the correct tool for a specific query.
All tool names follow a consistent verb-noun pattern with hyphens, starting with 'get-' and including descriptive details like data type, location method, and parameters. This uniformity enhances readability and predictability, allowing agents to easily understand and navigate the tool set.
With 10 tools, the server is well-scoped for air quality data retrieval, covering key operations such as current and historical observations, forecasts, and contour maps across different location methods. Each tool serves a specific purpose without redundancy, making the count appropriate for the domain.
The tool set provides comprehensive coverage for air quality data, including current and historical observations, forecasts, and contour maps for ozone and PM2.5, with multiple location inputs (lat-long, zip code, bounding box). There are no obvious gaps, as it supports all major data retrieval needs in this domain.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Air Quality MCP — wraps air-quality-api.open-meteo.com (free, no auth)
EPA AirNow MCP — official US real-time AQI + forecast (free key)
Access UK air quality data, monitoring sites, and hourly pollutant measurements across regions
Real-world data for agents: air quality, geocoding, quakes, holidays, web search
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with the World Air Quality Index to fetch real-time air quality data for cities and coordinates worldwide via Model Context Protocol (MCP).1MIT
- AlicenseAqualityDmaintenanceProvides access to EPA's Air Quality System API with 31 tools for querying air quality data, monitoring sites, and pollution measurements across the United States through natural language.31MIT
- FlicenseNot gradedqualityDmaintenanceProvides weather forecast tools via the Model Context Protocol, enabling users to query weather data for destinations through natural language.
- AlicenseNot gradedqualityCmaintenanceEnables access to EPA AirNow real-time AQI and forecast data for US locations through a single tool, with a free API key.9MIT
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/prsantos-com/airnow-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server