EPA Air Quality System (AQS) MCP Server
Click on "Deploy 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., "@EPA Air Quality System (AQS) MCP Server show me the ozone levels in Los Angeles for the past week"
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.
EPA Air Quality System (AQS) MCP Server
An MCP (Model Context Protocol) server that provides access to the EPA Air Quality System API. This server enables Claude and other MCP clients to query air quality data, monitor information, and quality assurance data from the EPA's comprehensive air quality database.
Features
31 MCP tools covering all major AQS API endpoints
Rate limiting (5 seconds between requests) to comply with API guidelines
Date validation (same calendar year requirement)
Credential resolution from parameters or environment variables
Comprehensive error handling
Related MCP server: Jana MCP Server
Installation
# Clone the repository
git clone https://github.com/yourusername/aqs-mcp.git
cd aqs-mcp
# Install dependencies
npm install
# Build the project
npm run buildConfiguration
Getting an API Key
Use the
aqs_signuptool with your email addressCheck your email for the API key
Environment Variables (Optional)
Set these to avoid passing credentials with every request:
export AQS_EMAIL="your.email@example.com"
export AQS_API_KEY="your-api-key"Claude Desktop Configuration
Add to your claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"aqs": {
"command": "node",
"args": ["/absolute/path/to/aqs-mcp/dist/index.js"],
"env": {
"AQS_EMAIL": "your.email@example.com",
"AQS_API_KEY": "your-api-key"
}
}
}
}Available Tools
Authentication & Status
Tool | Description |
| Register for an API key (sent via email) |
| Check if the API is operational |
Reference Data (Lists)
Tool | Description |
| Get all US state FIPS codes |
| Get counties in a state |
| Get monitoring sites in a county |
| Get Core Based Statistical Areas |
| Get parameter classification groups |
| Get parameters within a class |
Monitor Queries
Tool | Description |
| Get monitors at a specific site |
| Get monitors in a county |
| Get monitors in a state |
| Get monitors in a lat/lon bounding box |
| Get monitors in a CBSA |
Sample Data
Tool | Description |
| Get raw sample data at a site |
| Get raw sample data for a county |
| Get raw sample data for a state |
| Get raw sample data in a bounding box |
| Get raw sample data for a CBSA |
Daily Summaries
Tool | Description |
| Daily summary at a site |
| Daily summary for a county |
| Daily summary for a state |
| Daily summary in a bounding box |
| Daily summary for a CBSA |
Quarterly Summaries
Tool | Description |
| Quarterly summary at a site |
| Quarterly summary for a county |
| Quarterly summary for a state |
Annual Summaries
Tool | Description |
| Annual summary at a site |
| Annual summary for a county |
| Annual summary for a state |
| Annual summary in a bounding box |
| Annual summary for a CBSA |
Common Parameter Codes
Code | Pollutant |
44201 | Ozone |
88101 | PM2.5 Local |
88502 | PM2.5 FRM/FEM |
81102 | PM10 |
42401 | SO2 |
42101 | CO |
42602 | NO2 |
Location Codes
Parameter | Format | Example | Description |
| 2-digit FIPS |
| California |
| 3-digit FIPS |
| Los Angeles County |
| 4-digit |
| Site number |
| 5-digit |
| LA Metro Area |
Date Format
All dates use YYYYMMDD format (e.g., 20240101 for January 1, 2024).
Important: Begin and end dates must be in the same calendar year.
Example Usage
Query daily ozone data for Los Angeles County in January 2024:
{
"name": "aqs_daily_summary_by_county",
"arguments": {
"state": "06",
"county": "037",
"param": "44201",
"bdate": "20240101",
"edate": "20240131"
}
}Testing
Test with the MCP Inspector:
npx @modelcontextprotocol/inspector node dist/index.jsAPI Constraints
Rate Limit: 10 requests per minute (server enforces 5-second delay)
Max Parameters: 5 parameter codes per request
Date Range: Must be within same calendar year
Data Volume: Large queries may timeout; use smaller date ranges
Development
# Watch mode
npm run dev
# Build
npm run build
# Run directly
node dist/index.jsLicense
MIT
Links
Available Tools
31 toolsaqs_annual_summary_by_boxB
Get annual summary data for all monitoring sites within a geographic bounding box defined by latitude/longitude coordinates. Annual summaries include yearly statistics such as arithmetic mean, standard deviation, maximum values, percentiles (10th through 99th), observation counts, data completeness metrics, and exceedance counts for primary and secondary NAAQS standards.
Inputs: param (required), bdate (required), edate (required), minlat (required), +5 more.
aqs_annual_summary_by_cbsaA
Get annual summary data for all monitoring sites within a Core Based Statistical Area (CBSA), which represents metropolitan and micropolitan statistical areas. Annual summaries include yearly statistics such as arithmetic mean, standard deviation, maximum values, percentiles (10th through 99th), observation counts, data completeness metrics, and exceedance counts for primary and secondary NAAQS standards.
Inputs: param (required), bdate (required), edate (required), cbsa (required), +2 more.
aqs_annual_summary_by_countyB
Get annual summary data for all monitoring sites in a county. Annual summaries include yearly statistics such as arithmetic mean, standard deviation, maximum values, percentiles (10th through 99th), observation counts, data completeness metrics, and exceedance counts for primary and secondary NAAQS standards.
Inputs: param (required), bdate (required), edate (required), state (required), +3 more.
aqs_annual_summary_by_siteB
Get annual summary data for a specific EPA air quality monitoring site. Annual summaries include yearly statistics such as arithmetic mean, standard deviation, maximum values, percentiles (10th through 99th), observation counts, data completeness metrics, and exceedance counts for primary and secondary NAAQS standards.
Inputs: param (required), bdate (required), edate (required), state (required), +4 more.
aqs_annual_summary_by_stateB
Get annual summary data for all monitoring sites in a state. Annual summaries include yearly statistics such as arithmetic mean, standard deviation, maximum values, percentiles (10th through 99th), observation counts, data completeness metrics, and exceedance counts for primary and secondary NAAQS standards.
Inputs: param (required), bdate (required), edate (required), state (required), +2 more.
aqs_daily_summary_by_boxB
Get daily summary air quality data for all monitoring sites within a geographic bounding box. Daily summaries include arithmetic mean, maximum values, observation counts, and AQI values for each day. Specify the bounding box using minimum and maximum latitude/longitude coordinates.
Inputs: param (required), bdate (required), edate (required), minlat (required), +5 more.
aqs_daily_summary_by_cbsaA
Get daily summary air quality data for all monitoring sites in a Core Based Statistical Area (CBSA). CBSAs are metropolitan or micropolitan statistical areas defined by the US Office of Management and Budget. Daily summaries include arithmetic mean, maximum values, observation counts, and AQI values for each day.
Inputs: param (required), bdate (required), edate (required), cbsa (required), +2 more.
aqs_daily_summary_by_countyA
Get daily summary air quality data for all monitoring sites in a county. Daily summaries include arithmetic mean, maximum values, observation counts, and AQI values for each day. Requires state FIPS code (2-digit) and county FIPS code (3-digit).
Inputs: param (required), bdate (required), edate (required), state (required), +3 more.
aqs_daily_summary_by_siteA
Get daily summary air quality data for a specific monitoring site. Daily summaries include arithmetic mean, maximum values, observation counts, and AQI values for each day. Requires state FIPS code (2-digit), county FIPS code (3-digit), and site number (4-digit).
Inputs: param (required), bdate (required), edate (required), state (required), +4 more.
aqs_daily_summary_by_stateA
Get daily summary air quality data for all monitoring sites in a state. Daily summaries include arithmetic mean, maximum values, observation counts, and AQI values for each day. Requires state FIPS code (2-digit). Note: This can return large amounts of data.
Inputs: param (required), bdate (required), edate (required), state (required), +2 more.
aqs_is_availableA
Check if the EPA Air Quality System (AQS) API is operational. This is a health check endpoint that verifies the API is responding. Credentials are optional - uses environment variables (AQS_EMAIL, AQS_API_KEY) as fallback.
Inputs: email, key.
aqs_list_cbsasA
Get a list of Core Based Statistical Areas (CBSAs) with their codes. CBSAs are metropolitan and micropolitan statistical areas defined by the US Census. Use CBSA codes for regional air quality queries. Example: Los Angeles-Long Beach-Anaheim = "31080", New York-Newark-Jersey City = "35620".
Inputs: email, key.
aqs_list_countiesA
Get a list of counties within a state with their 3-digit FIPS codes. Use this to look up county codes for county-level AQS API queries. Example: Los Angeles County, CA = "037", Harris County, TX = "201".
Inputs: state (required), email, key.
aqs_list_parameter_classesA
Get a list of parameter classification groups (e.g., "CRITERIA", "AIR TOXICS", "METEOROLOGICAL"). Use the class name to query parameters within that class using aqs_list_parameters. Common classes: CRITERIA (criteria pollutants like ozone, PM2.5), AIR TOXICS (hazardous air pollutants), METEOROLOGICAL (weather data).
Inputs: email, key.
aqs_list_parametersA
Get a list of parameters (pollutants/measurements) within a parameter class. Returns parameter codes and names. Use these codes in data queries. Common parameter codes: 44201 (Ozone), 88101 (PM2.5 Local), 81102 (PM10), 42401 (SO2), 42101 (CO), 42602 (NO2). Use aqs_list_parameter_classes first to get available class names.
Inputs: pc (required), email, key.
aqs_list_sitesA
Get a list of air quality monitoring sites within a county with their 4-digit site codes. Use this to look up site codes for site-level AQS API queries. Requires both state and county codes.
Inputs: state (required), county (required), email, key.
aqs_list_statesA
Get a list of all US states with their 2-digit FIPS codes. Use this to look up state codes for other AQS API queries. Example: California = "06", Texas = "48", New York = "36".
Inputs: email, key.
aqs_monitors_by_boxA
Get all air quality monitors within a latitude/longitude bounding box. Useful for querying monitors in a geographic region that may span multiple states or counties.
Parameters:
param: 5-digit AQS parameter code for the pollutant. Common codes:
44201: Ozone (O3)
88101: PM2.5 (Fine Particulate Matter, Local Conditions)
81102: PM10 (Particulate Matter)
42401: Sulfur Dioxide (SO2)
42101: Carbon Monoxide (CO)
42602: Nitrogen Dioxide (NO2)
bdate/edate: Begin and end dates in YYYYMMDD format (must be same calendar year)
minlat: Minimum latitude of bounding box (decimal degrees, e.g., 33.0)
maxlat: Maximum latitude of bounding box (decimal degrees, e.g., 35.0)
minlon: Minimum longitude of bounding box (decimal degrees, e.g., -118.5)
maxlon: Maximum longitude of bounding box (decimal degrees, e.g., -117.0)
Example bounding box for Los Angeles area: minlat=33.5, maxlat=34.5, minlon=-118.8, maxlon=-117.5
Note: Email and API key can be provided or will use AQS_EMAIL/AQS_API_KEY environment variables.
Inputs: param (required), bdate (required), edate (required), minlat (required), +5 more.
aqs_monitors_by_cbsaA
Get all air quality monitors in a Core Based Statistical Area (CBSA). CBSAs are metropolitan or micropolitan statistical areas defined by the Office of Management and Budget.
Parameters:
param: 5-digit AQS parameter code for the pollutant. Common codes:
44201: Ozone (O3)
88101: PM2.5 (Fine Particulate Matter, Local Conditions)
81102: PM10 (Particulate Matter)
42401: Sulfur Dioxide (SO2)
42101: Carbon Monoxide (CO)
42602: Nitrogen Dioxide (NO2)
bdate/edate: Begin and end dates in YYYYMMDD format (must be same calendar year)
cbsa: 5-digit CBSA code. Examples:
31080: Los Angeles-Long Beach-Anaheim, CA
35620: New York-Newark-Jersey City, NY-NJ-PA
16980: Chicago-Naperville-Elgin, IL-IN-WI
19100: Dallas-Fort Worth-Arlington, TX
26420: Houston-The Woodlands-Sugar Land, TX
38060: Phoenix-Mesa-Chandler, AZ
Note: Email and API key can be provided or will use AQS_EMAIL/AQS_API_KEY environment variables.
Inputs: param (required), bdate (required), edate (required), cbsa (required), +2 more.
aqs_monitors_by_countyA
Get all air quality monitors in a county. Returns detailed information about monitors including location, operational dates, and measurement parameters.
Parameters:
param: 5-digit AQS parameter code for the pollutant. Common codes:
44201: Ozone (O3)
88101: PM2.5 (Fine Particulate Matter, Local Conditions)
81102: PM10 (Particulate Matter)
42401: Sulfur Dioxide (SO2)
42101: Carbon Monoxide (CO)
42602: Nitrogen Dioxide (NO2)
bdate/edate: Begin and end dates in YYYYMMDD format (must be same calendar year)
state: 2-digit FIPS state code (e.g., '06' for California, '36' for New York)
county: 3-digit FIPS county code (e.g., '037' for Los Angeles County)
Note: Email and API key can be provided or will use AQS_EMAIL/AQS_API_KEY environment variables.
Inputs: param (required), bdate (required), edate (required), state (required), +3 more.
aqs_monitors_by_siteA
Get air quality monitors at a specific monitoring site. Returns detailed information about monitors including location, operational dates, and measurement parameters.
Parameters:
param: 5-digit AQS parameter code for the pollutant. Common codes:
44201: Ozone (O3)
88101: PM2.5 (Fine Particulate Matter, Local Conditions)
81102: PM10 (Particulate Matter)
42401: Sulfur Dioxide (SO2)
42101: Carbon Monoxide (CO)
42602: Nitrogen Dioxide (NO2)
bdate/edate: Begin and end dates in YYYYMMDD format (must be same calendar year)
state: 2-digit FIPS state code (e.g., '06' for California, '36' for New York)
county: 3-digit FIPS county code (e.g., '037' for Los Angeles County)
site: 4-digit AQS site number
Note: Email and API key can be provided or will use AQS_EMAIL/AQS_API_KEY environment variables.
Inputs: param (required), bdate (required), edate (required), state (required), +4 more.
aqs_monitors_by_stateA
Get all air quality monitors in a state. Returns detailed information about monitors including location, operational dates, and measurement parameters.
Parameters:
param: 5-digit AQS parameter code for the pollutant. Common codes:
44201: Ozone (O3)
88101: PM2.5 (Fine Particulate Matter, Local Conditions)
81102: PM10 (Particulate Matter)
42401: Sulfur Dioxide (SO2)
42101: Carbon Monoxide (CO)
42602: Nitrogen Dioxide (NO2)
bdate/edate: Begin and end dates in YYYYMMDD format (must be same calendar year)
state: 2-digit FIPS state code (e.g., '06' for California, '36' for New York, '04' for Arizona)
Note: Email and API key can be provided or will use AQS_EMAIL/AQS_API_KEY environment variables.
Inputs: param (required), bdate (required), edate (required), state (required), +2 more.
aqs_quarterly_summary_by_countyA
Retrieve quarterly summary data for all air quality monitoring sites in a county. Quarterly summaries aggregate measurements by calendar quarter, providing observation counts, arithmetic means, and maximum values. Useful for comparing air quality across multiple monitoring sites within a county.
Inputs: param (required), bdate (required), edate (required), state (required), +3 more.
aqs_quarterly_summary_by_siteA
Retrieve quarterly summary data for a specific air quality monitoring site. Quarterly summaries aggregate measurements by calendar quarter, providing observation counts, arithmetic means, and maximum values. Useful for analyzing seasonal patterns and trends at individual monitoring locations.
Inputs: param (required), bdate (required), edate (required), state (required), +4 more.
aqs_quarterly_summary_by_stateA
Retrieve quarterly summary data for all air quality monitoring sites in a state. Quarterly summaries aggregate measurements by calendar quarter, providing observation counts, arithmetic means, and maximum values. Useful for statewide air quality analysis and comparing trends across different regions.
Inputs: param (required), bdate (required), edate (required), state (required), +2 more.
aqs_sample_data_by_boxA
Get raw sample data for all monitoring sites within a geographic bounding box. WARNING: Sample data can be very large depending on box size. Strongly recommend limiting date ranges to one week or one month. Returns individual sample measurements from all sites within the specified coordinates.
Inputs: param (required), bdate (required), edate (required), minlat (required), +5 more.
aqs_sample_data_by_cbsaA
Get raw sample data for all monitoring sites in a Core Based Statistical Area (CBSA). WARNING: Sample data can be very large for metropolitan areas. Strongly recommend limiting date ranges to one week or one month. Returns individual sample measurements from all sites in the specified CBSA.
Inputs: param (required), bdate (required), edate (required), cbsa (required), +2 more.
aqs_sample_data_by_countyA
Get raw sample data for all monitoring sites in a county. WARNING: Sample data can be very large. Strongly recommend limiting date ranges to one week or one month. Returns individual sample measurements from all sites in the specified county.
Inputs: param (required), bdate (required), edate (required), state (required), +3 more.
aqs_sample_data_by_siteA
Get raw sample data for a specific monitoring site. WARNING: Sample data can be very large. Strongly recommend limiting date ranges to one week or one month. Returns individual sample measurements including time, value, units, and quality flags.
Inputs: param (required), bdate (required), edate (required), state (required), +4 more.
aqs_sample_data_by_stateA
Get raw sample data for all monitoring sites in a state. WARNING: Sample data can be EXTREMELY large for state-level queries. Strongly recommend limiting date ranges to one week or less. Returns individual sample measurements from all sites in the specified state.
Inputs: param (required), bdate (required), edate (required), state (required), +2 more.
aqs_signupA
Register for an EPA Air Quality System (AQS) API key. Provide your email address and an API key will be sent to you. This key is required for all other AQS API operations.
Inputs: email (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 31 tools
Every tool has a clearly distinct purpose based on the combination of data type (annual/daily/quarterly summary, sample data, monitors, lists) and geographic scope (box, CBSA, county, site, state). The descriptions explicitly differentiate them, making it easy for an agent to select the correct tool without ambiguity. For example, aqs_annual_summary_by_box vs. aqs_annual_summary_by_county serve the same data type but for different geographic boundaries.
All tool names follow a highly consistent pattern: 'aqs_' prefix, then data type (e.g., annual_summary, daily_summary, list, monitors, sample_data), then 'by_' and the geographic scope (box, cbsa, county, site, state). Minor exceptions like aqs_is_available and aqs_signup are still clear and fit the overall naming scheme, maintaining perfect consistency across the set.
With 31 tools, the count is excessive for the server's purpose of querying EPA air quality data. Many tools are redundant variations (e.g., five different geographic scopes for each data type like annual_summary, daily_summary, sample_data), creating a bloated interface that could overwhelm agents. A more streamlined design with fewer, more flexible tools would be more appropriate.
The tool set provides comprehensive coverage for the EPA AQS domain, including data retrieval (summaries, sample data, monitors), metadata listing (states, counties, sites, parameters, CBSAs), and operational support (availability check, signup). It supports all key geographic scopes and data aggregation levels, leaving no obvious gaps for typical air quality analysis workflows.
Maintenance
Related MCP Connectors
Access UK air quality data, monitoring sites, and hourly pollutant measurements across regions
EPA AirNow MCP — official US current + forecast AQI, keyless, from AirNow's public file products…
Free, keyless real-time air quality (US AQI plus PM2.5, PM10, ozone, NO2, SO2, CO) for any city.
Air Quality MCP — wraps air-quality-api.open-meteo.com (free, no auth)
Related MCP Servers
- AlicenseAqualityDmaintenanceA Model Context Protocol implementation that enables LLMs to access real-time, forecasted, and historical U.S. air quality data through the AirNow API.1011 npmMIT
- AlicenseNot gradedqualityNot gradedmaintenanceProvides natural language access to environmental data including air quality measurements, greenhouse gas emissions, and facility records. It enables users to perform geographic searches, trend analysis, and proximity-based queries using data from sources like OpenAQ and Climate TRACE.MIT
- AlicenseNot gradedqualityBmaintenanceEnables access to EPA AirNow real-time AQI and forecast data for US locations through a single tool, with a free API key.93 npmMIT
- AlicenseAqualityDmaintenanceProvides real-time air quality data (US AQI, PM2.5, PM10, ozone, NO2, SO2, CO) for any city via natural language, using free Open-Meteo data and a single tool.1MIT