Skip to main content
Glama
EPA Air Quality System (AQS) MCP Server

EPA Air Quality System (AQS) MCP Server

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 build

Configuration

Getting an API Key

  1. Use the aqs_signup tool with your email address

  2. Check 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

aqs_signup

Register for an API key (sent via email)

aqs_is_available

Check if the API is operational

Reference Data (Lists)

Tool

Description

aqs_list_states

Get all US state FIPS codes

aqs_list_counties

Get counties in a state

aqs_list_sites

Get monitoring sites in a county

aqs_list_cbsas

Get Core Based Statistical Areas

aqs_list_parameter_classes

Get parameter classification groups

aqs_list_parameters

Get parameters within a class

Monitor Queries

Tool

Description

aqs_monitors_by_site

Get monitors at a specific site

aqs_monitors_by_county

Get monitors in a county

aqs_monitors_by_state

Get monitors in a state

aqs_monitors_by_box

Get monitors in a lat/lon bounding box

aqs_monitors_by_cbsa

Get monitors in a CBSA

Sample Data

Tool

Description

aqs_sample_data_by_site

Get raw sample data at a site

aqs_sample_data_by_county

Get raw sample data for a county

aqs_sample_data_by_state

Get raw sample data for a state

aqs_sample_data_by_box

Get raw sample data in a bounding box

aqs_sample_data_by_cbsa

Get raw sample data for a CBSA

Daily Summaries

Tool

Description

aqs_daily_summary_by_site

Daily summary at a site

aqs_daily_summary_by_county

Daily summary for a county

aqs_daily_summary_by_state

Daily summary for a state

aqs_daily_summary_by_box

Daily summary in a bounding box

aqs_daily_summary_by_cbsa

Daily summary for a CBSA

Quarterly Summaries

Tool

Description

aqs_quarterly_summary_by_site

Quarterly summary at a site

aqs_quarterly_summary_by_county

Quarterly summary for a county

aqs_quarterly_summary_by_state

Quarterly summary for a state

Annual Summaries

Tool

Description

aqs_annual_summary_by_site

Annual summary at a site

aqs_annual_summary_by_county

Annual summary for a county

aqs_annual_summary_by_state

Annual summary for a state

aqs_annual_summary_by_box

Annual summary in a bounding box

aqs_annual_summary_by_cbsa

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

state

2-digit FIPS

06

California

county

3-digit FIPS

037

Los Angeles County

site

4-digit

0001

Site number

cbsa

5-digit

31080

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

API 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.js

License

MIT

Available Tools

31 tools
aqs_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

    A3.8/5.0

    Scored across 31 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count2/5

    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.

    Completeness5/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      A Model Context Protocol implementation that enables LLMs to access real-time, forecasted, and historical U.S. air quality data through the AirNow API.
      10
      11 npm
      MIT
    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      Provides 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
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables access to EPA AirNow real-time AQI and forecast data for US locations through a single tool, with a free API key.
      93 npm
      MIT