Skip to content

io.github.cyanheads/epa-mcp-server

by cyanheads · remote · local (npm) · no sign-in to list tools · v0.5.0 · published by GitHub user cyanheads

Search EPA compliance, TRI, Superfund, drinking-water, EJScreen, and AirNow data.

Read only

9 tools: 9 only read.

Scanned Oct 21, 2026

No check matched anything in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http epa https://epa.caseyjhand.com/mcp

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

9 tools

Only reads 9Claude Code: allow
  • epa_get_air_qualityGet current AQI observations or the issued AQI forecast for a US location from the AirNow API.No findings

    Why it is in this group

    • The name "epa_get_air_quality" says "get": a word for reading.
    Description, as the server wrote it
    Get current AQI observations or the issued AQI forecast for a US location from the AirNow API. Provide either zip_code or both latitude and longitude. Current mode returns the latest hourly NowCast AQI for each pollutant (PM2.5, ozone, PM10) from the closest monitor within 50 miles, with the monitor site name, site ID, and reporting agency; pollutants in one reporting area can come from different monitors. Forecast mode returns every day the reporting area's agency has issued (typically one to five), each with the AQI category, an action-day flag, and the issue date, plus the agency's forecast discussion when one exists; some agencies forecast a category without an AQI number. In forecast mode, set forecast_date to keep only the forecast valid on that date; current mode rejects it. Data are preliminary — suitable for awareness, not regulatory, trend, or enforcement decisions. Responses are cached for ~1 hour.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • epa_get_ejscreenGet EJScreen environmental-justice indicators for a point and surrounding buffer.No findings

    Why it is in this group

    • The name "epa_get_ejscreen" says "get": a word for reading.
    Description, as the server wrote it
    Get EJScreen environmental-justice indicators for a point and surrounding buffer. Returns the 13 EJScreen environmental indicators (PM2.5, ozone, diesel particulate, NO2, lead paint, traffic proximity, Superfund/RMP/hazardous-waste/wastewater proximity, underground storage tanks, drinking-water non-compliance, and RSEI toxic air releases) and 6 demographic indicators (people of color, low income, limited English, less than high school, under 5, over 64), each with national and state percentiles plus EJ Index values, along with the Demographic Index and Supplemental Demographic Index. Data is EJScreen v2.2 (2022) served via the community-maintained EJAM API (api.ejanalysis.com, Public Environmental Data Partners), which rehosts EJScreen after EPA discontinued public access in 2025 — not a live EPA endpoint. Provide latitude, longitude, and a buffer distance (default 1 mile, max 15 miles). Points outside US coverage return a coverage note instead of indicators.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • epa_get_facilityRetrieve a full compliance profile for a single EPA-regulated facility by EPA Registry ID.No findings

    Why it is in this group

    • The name "epa_get_facility" says "get": a word for reading.
    Description, as the server wrote it
    Retrieve a full compliance profile for a single EPA-regulated facility by EPA Registry ID. Returns facility metadata, ECHO's facility-level compliance status, a per-statute (CAA, CWA, RCRA, SDWA, and others ECHO tracks) compliance summary, the newest 100 inspections and other compliance monitoring records from the last five years, five years of formal enforcement actions with penalties, the latest TRI release total, and the facility's TRI facility IDs for epa_get_tri_releases. Use epa_search_facilities to discover Registry IDs. For area-level enforcement discovery use epa_search_violations instead.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • epa_get_tri_releasesQuery Toxic Release Inventory annual chemical release data for a specific facility.No findings

    Why it is in this group

    • The name "epa_get_tri_releases" says "get": a word for reading.
    Description, as the server wrote it
    Query Toxic Release Inventory annual chemical release data for a specific facility. Returns per-chemical release records with chemical name, reporting year, routine on-site releases by medium (air, water, land, underground injection), and the one-time / non-routine release quantity. Quantities are in pounds; dioxin and dioxin-like compounds, which TRI has facilities report in grams, are converted and marked with reportedUnit. TRI data lags ~18 months — the most recent available year is typically 2 years prior to the current calendar year. facility_id is the 15-character TRI facility ID: take it from the facilityId field of epa_search_tri_releases, which also identifies top emitters across a region, or from the triFacilityIds of epa_get_facility for a facility you already hold a Registry ID for. A 12-digit EPA Registry ID is a different identifier and matches no TRI records.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • epa_search_facilitiesSearch EPA-regulated facilities by location, environmental program, or compliance status across CAA, CWA, RCRA, TRI, and SDWA.No findings

    Why it is in this group

    • The name "epa_search_facilities" says "search": a word for reading.
    Description, as the server wrote it
    Search EPA-regulated facilities by location, environmental program, or compliance status across CAA, CWA, RCRA, TRI, and SDWA. Returns facility name, EPA Registry ID, coordinates, county FIPS code, per-program registration flags, five-year inspection and penalty totals, and TRI release totals. Registry IDs returned here feed epa_get_facility. Supports proximity search via latitude + longitude + radius_miles. At least one geographic filter (zip_code, state, city, or a complete latitude+longitude+radius_miles triple) is required — unscoped searches time out.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • epa_search_superfundSearch Superfund (CERCLA/SEMS) sites by location or NPL listing status.No findings

    Why it is in this group

    • The name "epa_search_superfund" says "search": a word for reading.
    Description, as the server wrote it
    Search Superfund (CERCLA/SEMS) sites by location or NPL listing status. Returns site name, EPA site ID, NPL status (listed/not listed/proposed), cleanup status, coordinates, and county FIPS code. Accepts either state/city/ZIP or latitude+longitude+radius for proximity searches. Use for "are there Superfund sites near X" questions.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • epa_search_tri_releasesSearch Toxic Release Inventory data across facilities in a state or county, for one reporting year or, without year, every available year newest first.No findings

    Why it is in this group

    • The name "epa_search_tri_releases" says "search": a word for reading.
    Description, as the server wrote it
    Search Toxic Release Inventory data across facilities in a state or county, for one reporting year or, without year, every available year newest first. Returns facility name and county, TRI facility ID, chemical name, and the one-time / non-routine release quantity; set include_release_breakdown to add routine on-site releases by medium (air, water, land, and underground-injection), at the cost of a slower call. Quantities are in pounds; dioxin and dioxin-like compounds, which TRI has facilities report in grams, are converted and marked with reportedUnit. Use to identify top polluters in an area or build an environmental exposure profile. Use epa_get_tri_releases for detailed release records for a single facility. TRI data lags ~18 months from the current calendar year.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • epa_search_violationsSearch EPA civil and criminal enforcement cases by state, ZIP code, regulatory program, case type, or filing-date range.No findings

    Why it is in this group

    • The name "epa_search_violations" says "search": a word for reading.
    Description, as the server wrote it
    Search EPA civil and criminal enforcement cases by state, ZIP code, regulatory program, case type, or filing-date range. Returns case identifier, programs involved, penalty assessed, settlement and filing dates, and case type. Designed for area-level violation discovery — for a single known facility's enforcement history use epa_get_facility instead. At least one of state or zip_code is required.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • epa_search_water_systemsSearch drinking water systems (SDWIS) by state or ZIP code.No findings

    Why it is in this group

    • The name "epa_search_water_systems" says "search": a word for reading.
    Description, as the server wrote it
    Search drinking water systems (SDWIS) by state or ZIP code. Returns system name, PWSID, population served, primary water source, and activity status. With has_violation, returns only systems with an open violation — one SDWIS has not marked returned to compliance or closed out when the system was deactivated. At least one of state or zip_code is required.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 0.5.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http epa https://epa.caseyjhand.com/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__epa__epa_search_facilities",
      "mcp__epa__epa_get_facility",
      "mcp__epa__epa_search_violations",
      "mcp__epa__epa_get_tri_releases",
      "mcp__epa__epa_search_tri_releases",
      "mcp__epa__epa_search_superfund",
      "mcp__epa__epa_search_water_systems",
      "mcp__epa__epa_get_ejscreen",
      "mcp__epa__epa_get_air_quality"
    ],
    "ask": [],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as epa. Review it before you use it.