Skip to main content
Glama

Server Details

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

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.8% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/epa-mcp-server
GitHub Stars
1
Server Listing
EPA MCP Server

TDQS

A4.4/5.0

Scored across 9 tools

Disambiguation5/5

Each tool maps to a distinct program plus resource/action combination (air quality, ECHO facility lookup vs. facility search vs. enforcement case search, EJScreen, Superfund, TRI facility detail vs. TRI regional search, SDWIS). The descriptions explicitly cross-reference sibling tools and state when to use one over another, leaving no realistic misselection risk.

Naming Consistency5/5

Every tool follows the same epa_<program>_<verb>_<noun> pattern (epa_echo_get_facility, epa_echo_search_facilities, epa_tri_get_facility_releases, etc.) with uniform snake_case and consistent verb choice between get (single entity) and search (collection).

Tool Count5/5

Nine tools spread across five EPA data programs, each earning its place with one to three operations per program. Nothing feels redundant or padded for the scope of an environmental-data server.

Completeness4/5

Core workflows are covered: discover facilities, get profiles, find violations, check air quality, EJ, Superfund, TRI, and drinking water. Minor gaps exist — Superfund and drinking-water tools are search-only with no detail endpoint (cleanup milestones, violation/sample detail), and there is no historical AirNow option, but agents can work around these.

Available Tools

9 tools
epa_airnow_get_conditionsGet Air Quality IndexA
Read-onlyIdempotent
Inspect

AirNow: 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.

NameRequiredDescriptionDefault
modeNoData mode: "current" for the latest hourly observations, "forecast" for every forecast day the reporting area has issuedcurrent
latitudeNoLatitude in decimal degrees (use with longitude instead of zip_code)
zip_codeNo5-digit US ZIP code for the location
longitudeNoLongitude in decimal degrees (use with latitude instead of zip_code)
forecast_dateNoForecast mode only (rejected in current mode): keep just the forecast valid on this date (YYYY-MM-DD). Omit to get every issued forecast day. When no issued day matches, the result is empty and its message lists the issued dates.

Output Schema

NameRequiredDescription
modeNoData mode used: "current" or "forecast"
errorNoPresent when the call failed. Absent on success.
messageNoWhy the result is empty: AirNow's own explanation, the issued forecast dates when forecast_date matched none, or a coverage hint. Absent when data is returned.
attributionNoCredit to the reporting or forecasting agencies and the U.S. EPA AirNow program, with the preliminary-data notice. Reproduce it when passing this data on.
observationsNoAQI observation or forecast records grouped by reporting area

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/openWorld, but the description adds substantial behavior beyond them: the 50-mile nearest-monitor radius, per-pollutant monitor sourcing within one reporting area, typical forecast day counts (one to five), agencies that report a category without an AQI number, empty results with issued dates in the message, and a ~1 hour cache. The preliminary-data caveat is unusual and valuable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and location requirements, then modes, then caveats; every sentence carries information. It is a dense single paragraph of roughly 150 words, which is on the long side and would scan better split into purpose / location / modes / caveats.

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

Completeness5/5

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

Despite an output schema existing, the description explains what each mode returns and its known quirks (missing AQI numbers, multiple monitors per area, empty-result messaging). Combined with the data-quality warning, an agent has everything needed to call and interpret this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description goes past the schema by explaining that forecast_date is rejected in current mode and by clarifying that omitting it returns every issued day, adding consequence-level meaning rather than restating field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (get), resource (current AQI observations or issued AQI forecast), and source (AirNow API) with the geographic scope (US location). Sibling tools all belong to other EPA programs (ECHO, EJScreen, TRI, Superfund, water), so the AirNow framing alone distinguishes it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit location rules (zip_code OR both latitude and longitude), explicit mode selection guidance, and an explicit exclusion: 'suitable for awareness, not regulatory, trend, or enforcement decisions.' It also states that current mode rejects forecast_date, removing a likely misuse path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

epa_echo_get_facilityGet EPA Facility Compliance ProfileA
Read-onlyIdempotent
Inspect

ECHO: 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_tri_get_facility_releases. Use epa_echo_search_facilities to discover Registry IDs. For area-level enforcement discovery use epa_echo_search_violations instead.

NameRequiredDescriptionDefault
registry_idYesEPA FRS Registry ID for the facility (obtained from epa_echo_search_facilities)

Output Schema

NameRequiredDescription
zipNoZIP code
cityNoCity
nameNoFacility name
errorNoPresent when the call failed. Absent on success.
stateNo2-letter state abbreviation
countyNoCounty name
noticeNoPresent when ECHO's facility search request failed, so complianceStatus and compliance are missing; every other field comes from the facility's detailed report.
streetNoStreet address
fipsCodeNo5-digit county FIPS code
latitudeNoLatitude in decimal degrees
programsNoProgram registration flags, from the ECHO systems in the facility's detailed report
longitudeNoLongitude in decimal degrees
complianceNoFacility-level noncompliance count from ECHO's facility search record. Absent when ECHO reports none or the facility search request fails.
registryIdNoEPA FRS Registry ID
inspectionsNoInspections, evaluations, investigations, and other compliance monitoring records over the 5-year window, newest first; at most 100 (inspectionsTotal gives the full count)
airComplianceNoClean Air Act status. Present only when programs.air is true and ECHO reports a CAA status.
formalActionsNoFormal enforcement actions over the 5-year window, newest first
triFacilityIdsNo15-character TRI facility IDs recorded for this facility, most recently reported first — pass one as facility_id to epa_tri_get_facility_releases for per-chemical releases. A site can carry several from successive operators. Empty when the facility has no TRI record.
waterComplianceNoClean Water Act status. Present only when programs.water is true and ECHO reports a CWA status.
complianceStatusNoECHO's facility-level compliance status, the same value epa_echo_search_facilities returns (e.g. "Significant Violation"). Absent when ECHO assigns none, as for TRI-only facilities, or when ECHO's facility search request fails (the notice field then says so).
inspectionsTotalNoCompliance monitoring records in ECHO's 5-year history for this facility; inspections lists the newest 100 when there are more
programComplianceNoECHO's per-statute enforcement and compliance summary. Empty when the facility is in no compliance-tracked program, as for TRI-only facilities.
triReleasesTransfersYearNoTRI reporting year triReleasesTransfersInLbs covers
triReleasesTransfersInLbsNoTotal TRI on- and off-site releases and transfers in pounds for triReleasesTransfersYear, ECHO's latest TRI year for this facility. Absent when ECHO holds no TRI history for it.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly=true, idempotent=true, openWorld=true, so the safety profile is covered; the description adds substantive scope that annotations cannot: the newest 100 inspections, a five-year monitoring and enforcement window, and that penalties are included. It does not mention rate limits or auth requirements, which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the return-payload enumeration are front-loaded, then the routing sentences follow. The long middle sentence is dense but every clause names a distinct returned section; slightly over-enumerated given an output schema exists, but no waste.

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

Completeness4/5

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

Output schema exists, so return values needn't be restated, yet the description's summary of the payload is still helpful for tool selection. Single-parameter tool with full schema coverage and a clear entry point; nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single registry_id parameter has 100% schema description coverage that already names it as an FRS Registry ID obtained from epa_echo_search_facilities. The description repeats the same sourcing hint and adds no format, validation, or 404-behavior detail, so the schema is doing the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Retrieve a full compliance profile for a single EPA-regulated facility') keyed to a named identifier, and enumerates the content of the payload. It is clearly differentiated from epa_echo_search_facilities and epa_echo_search_violations, which are named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: use epa_echo_search_facilities to discover Registry IDs, and use epa_echo_search_violations for area-level enforcement discovery instead. It also points to epa_tri_get_facility_releases for the TRI IDs it returns, so the when/when-not conditions are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

epa_echo_search_facilitiesSearch EPA FacilitiesA
Read-onlyIdempotent
Inspect

ECHO: 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_echo_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.

NameRequiredDescriptionDefault
cityNoCity name, case-insensitive; matches cities that begin with it ("TACOMA", or "SEAT" for SEATTLE and SEATAC). Pair with state.
limitNoMaximum number of facilities to return (1–100)
stateNo2-letter US state abbreviation (e.g. "WA", "CA")
latitudeNoLatitude in decimal degrees. Pair with longitude and radius_miles for proximity search.
programsNoRestrict results to facilities registered in one environmental program — ECHO filters on a single program per search, so pass one value. CAA=air, CWA=water, RCRA=hazardous waste, TRI=toxic releases, SDWA=drinking water.
zip_codeNo5-digit ZIP code to search within
longitudeNoLongitude in decimal degrees. Pair with latitude and radius_miles for proximity search.
active_onlyNoWhen true, return only facilities with an active permit
radius_milesNoSearch radius in miles around the given latitude/longitude (max 100). Requires latitude and longitude.
has_violationNoWhen true, return only facilities with at least one program in significant noncompliance (complianceStatus "Significant Violation")

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
messageNoRecovery hint when no results are found — echoes applied filters and suggests how to broaden the search. Absent when results are returned.
facilitiesNoMatching EPA facilities
totalCountNoTotal facilities matched before the limit was applied

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/idempotent, so the safety profile is covered; the description adds real value beyond that by disclosing the timeout behavior for unscoped searches and the concrete return payload (registry ID, coordinates, county FIPS, per-program flags, five-year inspection and penalty totals, TRI release totals). Pagination and the default limit are left to the schema, which is why this is not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each carrying distinct information, with the purpose and the payload front-loaded before the operating constraint. No restatement of the tool name or filler.

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

Completeness5/5

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

For a 10-parameter read-only search with 100% schema coverage, full annotations, and an output schema, the description covers everything remaining: scope, the return fields, the hard filter requirement, the single-program limitation, and the handoff to epa_echo_get_facility. Nothing an agent needs to call this correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema can't: that a program filter accepts only one value per search, and that latitude/longitude/radius_miles must be supplied as a complete triple. It also frames the geographic filters as a required disjunction, which is a cross-parameter constraint the schema doesn't express.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (search) plus resource (EPA-regulated facilities) and enumerates the filter axes (location, program, compliance status) and covered programs (CAA, CWA, RCRA, TRI, SDWA). It also distinguishes itself from the sibling epa_echo_get_facility by explaining that the returned Registry IDs feed that tool, so an agent can route between them without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the hard precondition that at least one geographic filter (zip_code, state, city, or a complete lat+lon+radius triple) is required and that unscoped searches time out, which is exactly the kind of routing rule an agent needs. It also explains the proximity-search path. What's missing is guidance on when to use this versus epa_echo_search_violations, given that has_violation overlaps with that sibling's purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

epa_echo_search_violationsSearch EPA Enforcement CasesA
Read-onlyIdempotent
Inspect

ECHO: 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_echo_get_facility instead. At least one of state or zip_code is required.

NameRequiredDescriptionDefault
limitNoMaximum number of cases to return (1–100)
stateNo2-letter US state abbreviation to filter cases (e.g. "TX", "CA")
programNoFilter by regulatory program: CAA=Clean Air Act, CWA=Clean Water Act, RCRA=hazardous waste, SDWA=drinking water, CERCLA=Superfund, FIFRA=pesticides, TSCA=toxic substances. Matches any law a case cites, so a returned case's programsViolated (its primary law) can differ.
zip_codeNo5-digit ZIP code of the case's facility location
case_typeNoFilter by case type: civil (regulatory violations), criminal (willful violations), or all. A filing-date range covers civil cases only: with a date, all returns civil cases and criminal is rejected.all
date_filed_endNoLatest filing date, inclusive (YYYY-MM-DD). Civil cases only. Omit, or pass "", for no upper bound.
date_filed_startNoEarliest filing date, inclusive (YYYY-MM-DD). Civil cases only. Omit, or pass "", for no lower bound.

Output Schema

NameRequiredDescription
casesNoMatching enforcement cases
errorNoPresent when the call failed. Absent on success.
noticeNoPresent when a filing-date range with case_type "all" left criminal cases out of the results.
messageNoRecovery hint when no cases are found — echoes filters and suggests broadening. Absent when cases are returned.
totalCountNoTotal cases matched before the limit was applied

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered; the description adds the non-obvious constraint that state or zip_code is mandatory — information the schema does not encode (required: 0). It does not disclose the civil-only limitation of date filters, but that caveat is carried in the schema's parameter descriptions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences: purpose and filters first, return contents second, routing and constraint last. No filler and the most decision-relevant information is front-loaded.

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

Completeness4/5

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

With an output schema present and 100% parameter coverage, the description covers purpose, routing, and the mandatory-filter rule. Minor gaps: no statement about result ordering or pagination behavior when limit caps the result set.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the parameters are documented in detail in the schema (enum meanings, date format, the program-matching nuance). The description only restates the filter axes and the one-of requirement, adding little meaning beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ("Search EPA civil and criminal enforcement cases") with explicit filter dimensions and a clear distinction from epa_echo_get_facility, which handles single-facility lookups. An agent can tell what this returns (case identifier, programs, penalty, dates, case type) without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the use case positively ("area-level violation discovery") and names the alternative tool with the condition that selects it (single known facility → epa_echo_get_facility). It also states the minimal invocation requirement: at least one of state or zip_code.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

epa_ejscreen_get_scoresGet EJScreen Environmental Justice IndicatorsA
Read-onlyIdempotent
Inspect

EJScreen: 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.

NameRequiredDescriptionDefault
unitNoUnit for distance. Kilometers are converted to miles (× 0.621371) before the request.miles
distanceNoBuffer radius around the point, in the given unit (default 1). The miles-equivalent must be 15 or less.
latitudeYesLatitude in decimal degrees.
longitudeYesLongitude in decimal degrees.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when the point is outside EJScreen coverage and no indicators were returned.
coverageNoWhether EJScreen data was available for the point.
locationNoThe queried location and buffer context.
reportUrlNoLink (absolute URL) to the full EJScreen report for this point and buffer.
dataSourceNoProvenance and vintage of the data.
demographicNoEJScreen demographic indicators present for the area. Empty when out of coverage.
environmentalNoEJScreen environmental indicators present for the area. Empty when out of coverage.
demographicIndexNoEJScreen Demographic Index. Absent when out of coverage.
supplementalDemographicIndexNoEJScreen Supplemental Demographic Index. Absent when out of coverage.

TDQS

A4.5/5.0
Behavior5/5

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

Adds substantial context beyond the readOnly/idempotent/openWorld hints: the exact data vintage (EJScreen v2.2, 2022), the serving path (community-maintained EJAM API, not a live EPA endpoint after 2025 discontinuation), and the out-of-coverage response behavior. This is exactly the provenance an agent needs to judge trustworthiness and failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Placeholder — see justification text in the conciseness_structure field of the final assessment.

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

Completeness5/5

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

With an output schema, 100% parameter coverage and annotations already present, the remaining burden is provenance and edge-case behavior — both covered (EJAM rehosting caveat, US-coverage fallback, buffer cap). Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with unit conversion, buffer bounds and degree ranges all documented in the schema itself. The description restates the default and the 15-mile ceiling but adds no format or interpretation detail beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource (EJScreen environmental-justice indicators) scoped to 'a point and surrounding buffer', which cleanly separates it from the sibling tools that cover air quality, facilities, violations, TRI releases and water systems. The indicator families named confirm what the agent gets back.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context — supply latitude, longitude and a buffer distance (default 1 mile, max 15 miles) — and states the US-only boundary condition with a stated fallback ('coverage note'). It does not name an alternative tool for non-point or non-US queries, so it stops short of explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

epa_superfund_search_sitesSearch Superfund SitesA
Read-onlyIdempotent
Inspect

Superfund: 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, ordered nearest first. Proximity searches exhaust candidate pages within a shared 50-second deadline; narrow the radius or add filters if the search times out. Use for "are there Superfund sites near X" questions.

NameRequiredDescriptionDefault
cityNoCity name (partial match within state, case-insensitive). Punctuation is matched as written ("St. Louis", "Coeur d'Alene").
limitNoMaximum number of sites to return (1–200)
stateNo2-letter US state abbreviation to filter sites
latitudeNoLatitude for proximity search (use with longitude and radius_miles)
zip_codeNo5-digit ZIP code to filter sites
longitudeNoLongitude for proximity search (use with latitude and radius_miles)
npl_statusNoFilter by NPL (National Priorities List) status: listed=final NPL, not-listed=not on NPL, proposed=proposed for listing, all=include allall
radius_milesNoSearch radius in miles from the given coordinates. Required when using latitude+longitude.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
sitesNoMatching Superfund sites
noticeNoPresent when the result limit omits nearby sites or a non-proximity punctuated city filter reaches its page limit. Explains which matching sites were not returned.
messageNoRecovery hint when no sites are found. Absent when sites are returned.
totalCountNoNumber of sites returned (may be less than available if limit applied)

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld, so the bar is lower, yet the description still adds real behavior: the returned field set, nearest-first ordering for proximity queries, and a 50-second shared deadline with mitigation advice. That timeout budget is operationally valuable and appears nowhere in the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what the tool is and what it returns, then the two input modes, then the timeout caveat. Every sentence carries information; there is no filler or restatement of the title.

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

Completeness4/5

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

For an 8-parameter read-only search with a full schema and an output schema, the description covers purpose, inputs, ordering, and failure behavior. Listing return fields is slightly redundant given the output schema exists, but nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds the either/or mode contract (state/city/ZIP versus latitude+longitude+radius) that governs which parameters must be combined, which the schema only hints at per-field. That combination semantics is genuinely additive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (Search) plus resource (Superfund/CERCLA/SEMS sites) plus the two search axes (location, NPL status). The scope is clearly distinct from the EPA siblings, which cover air, ECHO facilities, TRI releases, and water systems.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the triggering question form ("are there Superfund sites near X") and gives remedial guidance when a proximity search times out (narrow radius, add filters). It does not name when to prefer a sibling tool instead, but the domain is non-overlapping enough that this is a minor gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

epa_tri_get_facility_releasesGet TRI Chemical Releases for FacilityA
Read-onlyIdempotent
Inspect

TRI: 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_tri_search_releases, which also identifies top emitters across a region, or from the triFacilityIds of epa_echo_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.

NameRequiredDescriptionDefault
yearNoReporting year to retrieve. Omit for all available years, newest first. At most 500 filings are returned; narrow with year or chemical_name when capped. TRI data is typically available through ~2 years prior to the current year.
facility_idYes15-character TRI facility ID (e.g. "9867WSNRWD1981S") — the facilityId field returned by epa_tri_search_releases, or an entry of epa_echo_get_facility triFacilityIds. A 12-digit EPA Registry ID matches no TRI records.
chemical_nameNoOptional filter to restrict results to a specific chemical (partial match, case-insensitive). Commas, apostrophes, brackets, and Greek letters are matched as written, e.g. "4,4'-Methylenedianiline".

Output Schema

NameRequiredDescription
capNoThe 500-filing lookup cap, present only when reached.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of filings returned when capped.
noticeNoPresent when a punctuated chemical_name filter read its page limit before finding every filing spelled as given, so more matching records may exist.
messageNoRecovery hint when no releases are found — suggests alternative years or checking the facility ID. Absent when releases are returned.
guidanceNoHow to narrow a capped lookup with year or a more specific chemical_name.
releasesNoPer-chemical annual TRI release records for the queried facility
truncatedNoTrue when 500 filings were returned and more may exist.
facilityIdNoTRI facility ID queried

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld, so the description's value-add is the domain caveats: ~18-month reporting lag, pound units with dioxin converted from grams and flagged via reportedUnit. It stops short of describing truncation/pagination behavior, though the 500-filing cap is documented in the schema rather than here.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then return shape, units, latency caveat, and identifier sourcing — a sensible order with no filler sentences. Minor redundancy: the '12-digit EPA Registry ID matches no TRI records' warning repeats verbatim what the facility_id schema description already states.

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

Completeness5/5

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

Output schema exists so return values needn't be enumerated, yet the description still summarizes the record shape and unit handling. Combined with the lag caveat and identifier sourcing, an agent has everything needed to call it correctly on the first try.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; the description earns above that by giving the provenance and exact format of facility_id ('15-character TRI facility ID') and the negative case of the 12-digit Registry ID, which is the most likely invocation error. It adds little on year/chemical_name beyond what the schema says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Query Toxic Release Inventory annual chemical release data for a specific facility') and immediately distinguishes itself from the sibling search tool by scoping to one facility. An agent can tell it apart from epa_tri_search_releases without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: get facility_id from epa_tri_search_releases (or from triFacilityIds of epa_echo_get_facility if the agent holds a Registry ID), and warns that a 12-digit Registry ID matches nothing. This is when-to-use plus how-to-source-the-key, with an explicit exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

epa_tri_search_releasesSearch TRI Releases by RegionA
Read-onlyIdempotent
Inspect

TRI: 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_tri_get_facility_releases for detailed release records for a single facility. TRI data lags ~18 months from the current calendar year.

NameRequiredDescriptionDefault
yearNoReporting year. Omit to search every available year in the state, newest reporting year first, so limit keeps the most recent filings. TRI data lags ~18 months.
limitNoMaximum number of release records to return (1–200)
stateYes2-letter US state abbreviation (required, e.g. "WA", "TX")
countyNoCounty name to narrow results within the state, e.g. "King". Case-insensitive partial match on the bare name, so a short name can also match a longer one (LAKE matches LAKE OF THE WOODS; check countyName on each record); a trailing "County", "Parish", or "Borough" is dropped before matching. Punctuation is matched as written ("Prince George's").
chemical_nameNoOptional filter to restrict results to a specific chemical (partial match, case-insensitive). Commas, apostrophes, brackets, and Greek letters are matched as written, e.g. "4,4'-Methylenedianiline".
include_release_breakdownNoAdd routine on-site releases by medium (air, water, land, underground injection) to each record. Costs one extra upstream request, which can add about 20 seconds when EPA has not cached it.

Output Schema

NameRequiredDescription
capNoThe limit that was applied. Present only when truncated.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of release records returned. Present only when truncated.
stateNoState queried
noticeNoPresent when a punctuated county or chemical_name filter read its page limit before finding limit matches spelled as given, so more matching records may exist.
messageNoRecovery hint when no releases are found. Absent when releases are returned.
releasesNoTRI release records for facilities in the queried state and filters
truncatedNoTrue when the result list was capped at the limit — more records may exist. Absent below the limit.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent safety, and the description adds material behavior beyond them: an ~18-month data lag, the ~20-second latency cost of include_release_breakdown when uncached, unit handling (pounds, grams conversion for dioxins marked via reportedUnit), and newest-first ordering. This is exactly the extra context annotations cannot supply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what the tool returns before branching into the include_release_breakdown tradeoff and alternative-tool routing, so an agent can stop reading once it has what it needs. It is dense and slightly long, but nearly every clause carries information rather than filler.

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

Completeness5/5

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

Given six parameters, an output schema, and read-only annotations, the description supplies everything an agent needs: return fields, unit conventions, latency tradeoff, data staleness, and sibling routing. Nothing required to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: quantities are in pounds, dioxin-like compounds are converted from grams and flagged with reportedUnit, and time-related defaults (newest-first so limit keeps recent filings). It stops short of documenting every parameter but meaningfully enriches the key ones.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Search) and resource (Toxic Release Inventory data) with clear scope: facilities in a state or county, for one year or all years newest-first. It explicitly distinguishes itself from the sibling epa_tri_get_facility_releases, so the boundary is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names concrete use cases (identify top polluters in an area, build an environmental exposure profile) and the alternative tool with its selecting condition ('for detailed release records for a single facility'). When-to-use and when-to-use-something-else are both explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

epa_water_search_systemsSearch Drinking Water SystemsA
Read-onlyIdempotent
Inspect

Drinking water (SDWIS): 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.

NameRequiredDescriptionDefault
limitNoMaximum number of systems to return (1–200)
stateNo2-letter US state abbreviation (e.g. "WA", "CA")
pws_typeNoFilter by public water system type: community=permanent residences, non-transient=regular non-residents (schools, businesses), transient=occasional users (campgrounds)
zip_codeNo5-digit ZIP code of the water system's address of record — often its owner's or operator's office, which can be far from the area the system serves
has_violationNoWhen true, return only systems with an open SDWIS violation (not yet returned to compliance). Works with state, zip_code, or both.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoPresent when the has_violation check read only part of what it needed — the first 1,000 open violation records for the state, the first 1,000 systems in the ZIP, or the first 1,000 open violation records for a group of the ZIP’s systems — so violating systems outside that part may be missing from the results.
messageNoRecovery hint when no systems are found. Absent when systems are returned.
systemsNoMatching public water systems
totalCountNoNumber of systems returned

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, open-world behavior, so the bar is lower; the description still adds real domain context by defining what an 'open violation' means — not returned to compliance, or not closed out when the system was deactivated. It omits any statement about result-set size limits or pagination, which matters for a search tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the verb and resource, then output fields, then the has_violation nuance, then the constraint. Slight redundancy in repeating 'drinking water (SDWIS)' twice in the opening clause, but no wasted content overall.

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

Completeness4/5

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

With an output schema and full parameter documentation already present, the description only needed to add domain semantics and invocation rules, and it does both. The one gap is behavior for large result sets relative to the 1–200 limit, which an agent would want to know before calling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; the description goes beyond it by restating the state/zip_code at-least-one rule and by unpacking the has_violation semantics more fully than the schema's one-line note. It adds nothing about limit or pws_type, leaving those entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Search drinking water systems (SDWIS) by state or ZIP code' — and enumerates the returned fields, so the agent knows exactly what it gets. It doesn't name or contrast any sibling, though the drinking-water domain is unmistakably distinct from the air/facility/superfund siblings, so confusion risk is low.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'At least one of state or zip_code is required' gives a concrete invocation precondition, and the has_violation sentence explains the condition under which the tool narrows to non-compliant systems. It stops short of stating when not to use it or what to do when neither filter is available.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 18 tool updates
    • Addedepa_airnow_get_conditions
    • Addedepa_echo_get_facility
    • Addedepa_echo_search_facilities
    • Addedepa_echo_search_violations
    • Addedepa_ejscreen_get_scores
    • Removedepa_get_air_quality
    • Removedepa_get_ejscreen
    • Removedepa_get_facility
    • Removedepa_get_tri_releases
    • Removedepa_search_facilities
    • Removedepa_search_superfund
    • Removedepa_search_tri_releases
    • Removedepa_search_violations
    • Removedepa_search_water_systems
    • Addedepa_superfund_search_sites
    • Addedepa_tri_get_facility_releases
    • Addedepa_tri_search_releases
    • Addedepa_water_search_systems
  2. 3 tool updates
    • Changedepa_get_tri_releases7 fields changed
      • changedInput schema / properties / year / description
        Previous value: -"Reporting year to retrieve. Defaults to all available years. TRI data is typically available through ~2 years prior to the current year."New value: +"Reporting year to retrieve. Omit for all available years, newest first. At most 500 filings are returned; narrow with year or chemical_name when capped. TRI data is typically available through ~2 years prior to the current year."
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The 500-filing lookup cap, present only when reached.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_releases_found`: No TRI records found for the given facility ID and filters. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode."
      • removedOutput schema / properties / error / properties / data / properties / reason / examples
        Removed value: -[
        -  "no_releases_found"
        -]
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "description": "How to narrow a capped lookup with year or a more specific chemical_name.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of filings returned when capped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when 500 filings were returned and more may exist.",
        +  "type": "boolean"
        +}
    • Changedepa_search_superfund1 field changed
      • changedOutput schema / properties / notice / description
        Previous value: -"Present when a punctuated city filter read its page limit before finding limit sites spelled as given, so more matching sites may exist."New value: +"Present when a proximity search reaches its combined 500-candidate cap or a punctuated city filter reaches its page limit. More matching sites may exist, including when no sites were returned."
    • Changedepa_search_tri_releases2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_releases_found`: No TRI records found for the given state and filters. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode."
      • removedOutput schema / properties / error / properties / data / properties / reason / examples
        Removed value: -[
        -  "no_releases_found"
        -]
  3. 6 tool updates
    • Changedepa_get_facility45 fields changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "registryId",
        -      "name",
        -      "programs",
        -      "inspections",
        -      "formalActions"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "registryId",
        +      "name",
        +      "programs",
        +      "triFacilityIds",
        +      "programCompliance",
        +      "inspections",
        +      "inspectionsTotal",
        +      "formalActions"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / airCompliance / description
        Previous value: -"CAA-specific compliance details. Present only when facility is registered under CAA (programs.air=true)."New value: +"Clean Air Act status. Present only when programs.air is true and ECHO reports a CAA status."
      • changedOutput schema / properties / airCompliance / properties / programId / description
        Previous value: -"CAA program identifier"New value: +"ICIS-Air ID when the facility has exactly one; absent when it has several"
      • changedOutput schema / properties / airCompliance / properties / status / description
        Previous value: -"Air compliance status"New value: +"Current Clean Air Act compliance status"
      • changedOutput schema / properties / airCompliance / properties / statusDate / description
        Previous value: -"Date of status determination"New value: +"End of the latest quarter the status covers (MM/DD/YYYY)"
      • changedOutput schema / properties / compliance / description
        Previous value: -"Compliance summary from DFR. Absent when ECHO DFR compliance endpoint unavailable."New value: +"Facility-level noncompliance count from ECHO's facility search record. Absent when ECHO reports none or the facility search request fails."
      • changedOutput schema / properties / compliance / properties / mediaStatusCode / description
        Previous value: -"Compliance media status code"New value: +"Not populated: no ECHO response this tool reads carries a media status code."
      • changedOutput schema / properties / compliance / properties / mediaStatusDescription / description
        Previous value: -"Human-readable compliance status description"New value: +"Not populated: no ECHO response this tool reads carries a media status description. See complianceStatus and programCompliance."
      • changedOutput schema / properties / compliance / properties / quartersInViolation / description
        Previous value: -"Number of quarters with compliance violations in the past 3 years"New value: +"Quarters (of the last 12) in which any program found the facility in noncompliance"
      • changedOutput schema / properties / complianceStatus / description
        Previous value: -"Overall compliance status text"New value: +"ECHO's facility-level compliance status, the same value epa_search_facilities returns (e.g. \"Significant Violation\"). Absent when ECHO assigns none, as for TRI-only facilities, or when ECHO's facility search request fails (the notice field then says so)."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `facility_not_found`: ECHO returned no facility record for the given Registry ID. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `facility_not_found`: ECHO has no facility for the given Registry ID. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / formalActions / description
        Previous value: -"Formal enforcement actions on record"New value: +"Formal enforcement actions over the 5-year window, newest first"
      • changedOutput schema / properties / formalActions / items / description
        Previous value: -"Single formal enforcement action with case ID and penalty amount"New value: +"Single formal enforcement action"
      • addedOutput schema / properties / formalActions / items / properties / actionDate
        Added value: +{
        +  "description": "Date of the action (MM/DD/YYYY)",
        +  "type": "string"
        +}
      • changedOutput schema / properties / formalActions / items / properties / actionType / description
        Previous value: -"Type of formal enforcement action"New value: +"Type of formal enforcement action, e.g. \"Administrative Order\""
      • changedOutput schema / properties / formalActions / items / properties / caseId / description
        Previous value: -"Enforcement case identifier"New value: +"Enforcement case identifier; absent when ECHO records the action without one, as for RCRA and SDWA actions"
      • addedOutput schema / properties / formalActions / items / properties / leadAgency
        Added value: +{
        +  "description": "Lead agency: EPA, State, or Local",
        +  "type": "string"
        +}
      • changedOutput schema / properties / formalActions / items / properties / settlementDate / description
        Previous value: -"Settlement or resolution date"New value: +"Settlement date of the enforcement case (MM/DD/YYYY)"
      • addedOutput schema / properties / formalActions / items / properties / sourceId
        Added value: +{
        +  "description": "Program ID the action concerns",
        +  "type": "string"
        +}
      • addedOutput schema / properties / formalActions / items / properties / statute
        Added value: +{
        +  "description": "Statute the action was under",
        +  "type": "string"
        +}
      • changedOutput schema / properties / inspections / description
        Previous value: -"Inspection history records"New value: +"Inspections, evaluations, investigations, and other compliance monitoring records over the 5-year window, newest first; at most 100 (inspectionsTotal gives the full count)"
      • changedOutput schema / properties / inspections / items / description
        Previous value: -"Single inspection record with activity type and date"New value: +"Single inspection or other compliance monitoring record"
      • changedOutput schema / properties / inspections / items / properties / activityDate / description
        Previous value: -"Date of inspection"New value: +"Date of the record (MM/DD/YYYY)"
      • changedOutput schema / properties / inspections / items / properties / activityType / description
        Previous value: -"Inspection activity type code"New value: +"Inspection or evaluation type, e.g. \"FCE On-Site\", \"PCE Stack Test\", \"Compliance Evaluation Inspection\""
      • addedOutput schema / properties / inspections / items / properties / category
        Added value: +{
        +  "description": "Kind of record, e.g. \"Inspection/Evaluation\", \"Compliance Investigation\", \"Information Request\", \"Offsite Record Review\"; absent for RCRA and SDWA records",
        +  "type": "string"
        +}
      • changedOutput schema / properties / inspections / items / properties / description / description
        Previous value: -"Activity type description"New value: +"Finding ECHO records for the inspection, when it records one"
      • addedOutput schema / properties / inspections / items / properties / leadAgency
        Added value: +{
        +  "description": "Lead agency: EPA, State, or Local",
        +  "type": "string"
        +}
      • addedOutput schema / properties / inspections / items / properties / sourceId
        Added value: +{
        +  "description": "Program ID inspected, e.g. an ICIS-Air ID, NPDES permit, RCRA handler ID, or public water system ID",
        +  "type": "string"
        +}
      • addedOutput schema / properties / inspections / items / properties / statute
        Added value: +{
        +  "description": "Statute the record was under",
        +  "type": "string"
        +}
      • addedOutput schema / properties / inspectionsTotal
        Added value: +{
        +  "description": "Compliance monitoring records in ECHO's 5-year history for this facility; inspections lists the newest 100 when there are more",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Present when ECHO's facility search request failed, so complianceStatus and compliance are missing; every other field comes from the facility's detailed report.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / programCompliance
        Added value: +{
        +  "description": "ECHO's per-statute enforcement and compliance summary. Empty when the facility is in no compliance-tracked program, as for TRI-only facilities.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One statute's enforcement and compliance summary",
        +    "properties": {
        +      "currentStatus": {
        +        "description": "Current compliance status under this statute, e.g. \"No Violation Identified\"",
        +        "type": "string"
        +      },
        +      "fiveYearPeriodStart": {
        +        "description": "Start of the 5-year window (MM/DD/YYYY)",
        +        "type": "string"
        +      },
        +      "formalActions": {
        +        "description": "Formal enforcement actions over the 5-year window",
        +        "type": "number"
        +      },
        +      "informalActions": {
        +        "description": "Informal enforcement actions over the 5-year window",
        +        "type": "number"
        +      },
        +      "inspections": {
        +        "description": "Inspections or full compliance evaluations over the 5-year window",
        +        "type": "number"
        +      },
        +      "lastInspectionDate": {
        +        "description": "Date of the latest inspection (MM/DD/YYYY)",
        +        "type": "string"
        +      },
        +      "periodEnd": {
        +        "description": "End of both windows (MM/DD/YYYY)",
        +        "type": "string"
        +      },
        +      "quartersInNoncompliance": {
        +        "description": "Quarters in noncompliance over the 3-year window (of 12)",
        +        "type": "number"
        +      },
        +      "quartersInSignificantNoncompliance": {
        +        "description": "Quarters in significant noncompliance over the 3-year window (of 12)",
        +        "type": "number"
        +      },
        +      "statute": {
        +        "description": "Statute ECHO summarizes, e.g. CAA, CWA, RCRA, SDWA, TSCA, EPCRA",
        +        "type": "string"
        +      },
        +      "threeYearPeriodStart": {
        +        "description": "Start of the 3-year window (MM/DD/YYYY)",
        +        "type": "string"
        +      },
        +      "totalPenaltiesInDollars": {
        +        "description": "Penalties from formal enforcement actions over the 5-year window, in dollars",
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "statute"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / programs / description
        Previous value: -"Program registration flags"New value: +"Program registration flags, from the ECHO systems in the facility's detailed report"
      • changedOutput schema / properties / programs / properties / air / description
        Previous value: -"Registered under Clean Air Act (CAA)"New value: +"Has an ICIS-Air record (Clean Air Act stationary-source compliance). Emissions-inventory, risk-management, and greenhouse-gas reporting entries alone do not count."
      • changedOutput schema / properties / programs / properties / rcra / description
        Previous value: -"Registered under RCRA (hazardous waste)"New value: +"Has an RCRAInfo record (RCRA hazardous waste handler)"
      • changedOutput schema / properties / programs / properties / sdwa / description
        Previous value: -"Regulated under Safe Drinking Water Act"New value: +"Has an SDWIS record (Safe Drinking Water Act public water system)"
      • changedOutput schema / properties / programs / properties / tri / description
        Previous value: -"Participates in Toxic Release Inventory (TRI)"New value: +"Has a Toxics Release Inventory record — true exactly when triFacilityIds is non-empty"
      • changedOutput schema / properties / programs / properties / water / description
        Previous value: -"Registered under Clean Water Act (CWA)"New value: +"Has an ICIS-NPDES record (Clean Water Act discharge permit)"
      • addedOutput schema / properties / triFacilityIds
        Added value: +{
        +  "description": "15-character TRI facility IDs recorded for this facility, most recently reported first — pass one as facility_id to epa_get_tri_releases for per-chemical releases. A site can carry several from successive operators. Empty when the facility has no TRI record.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / triReleasesTransfersInLbs / description
        Previous value: -"Total TRI on/off-site releases and transfers in pounds"New value: +"Total TRI on- and off-site releases and transfers in pounds for triReleasesTransfersYear, ECHO's latest TRI year for this facility. Absent when ECHO holds no TRI history for it."
      • addedOutput schema / properties / triReleasesTransfersYear
        Added value: +{
        +  "description": "TRI reporting year triReleasesTransfersInLbs covers",
        +  "type": "number"
        +}
      • changedOutput schema / properties / waterCompliance / description
        Previous value: -"CWA/NPDES permit and compliance details. Present only when facility is registered under CWA (programs.water=true)."New value: +"Clean Water Act status. Present only when programs.water is true and ECHO reports a CWA status."
      • changedOutput schema / properties / waterCompliance / properties / permitId / description
        Previous value: -"NPDES permit ID"New value: +"NPDES permit ID when the facility has exactly one; absent when it has several"
      • changedOutput schema / properties / waterCompliance / properties / programId / description
        Previous value: -"CWA program identifier"New value: +"Not populated: the CWA program ID is the NPDES permit ID, returned as permitId."
      • changedOutput schema / properties / waterCompliance / properties / status / description
        Previous value: -"Water compliance status"New value: +"Current Clean Water Act compliance status"
    • Changedepa_get_tri_releases4 fields changed
      • changedInput schema / properties / chemical_name / description
        Previous value: -"Optional filter to restrict results to a specific chemical (partial match, case-insensitive)"New value: +"Optional filter to restrict results to a specific chemical (partial match, case-insensitive). Commas, apostrophes, brackets, and Greek letters are matched as written, e.g. \"4,4'-Methylenedianiline\"."
      • addedInput schema / properties / chemical_name / maxLength
        Added value: +4094
      • changedInput schema / properties / facility_id / description
        Previous value: -"15-character TRI facility ID (e.g. \"9867WSNRWD1981S\") — the facilityId field returned by epa_search_tri_releases. A 12-digit EPA Registry ID matches no TRI records."New value: +"15-character TRI facility ID (e.g. \"9867WSNRWD1981S\") — the facilityId field returned by epa_search_tri_releases, or an entry of epa_get_facility triFacilityIds. A 12-digit EPA Registry ID matches no TRI records."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Present when a punctuated chemical_name filter read its page limit before finding every filing spelled as given, so more matching records may exist.",
        +  "type": "string"
        +}
    • Changedepa_search_facilities14 fields changed
      • changedInput schema / properties / active_only / description
        Previous value: -"When true, return only active facilities"New value: +"When true, return only facilities with an active permit"
      • changedInput schema / properties / city / description
        Previous value: -"City name. Pair with state for best results."New value: +"City name, case-insensitive; matches cities that begin with it (\"TACOMA\", or \"SEAT\" for SEATTLE and SEATAC). Pair with state."
      • changedInput schema / properties / has_violation / description
        Previous value: -"When true, return only facilities with recent significant violations"New value: +"When true, return only facilities with at least one program in significant noncompliance (complianceStatus \"Significant Violation\")"
      • changedInput schema / properties / programs / description
        Previous value: -"Restrict results to facilities registered in these environmental programs. CAA=air, CWA=water, RCRA=waste, TRI=toxic releases, SDWA=drinking water."New value: +"Restrict results to facilities registered in one environmental program — ECHO filters on a single program per search, so pass one value. CAA=air, CWA=water, RCRA=hazardous waste, TRI=toxic releases, SDWA=drinking water."
      • addedInput schema / properties / programs / maxItems
        Added value: +1
      • changedOutput schema / properties / facilities / items / properties / inspectionCount / description
        Previous value: -"Number of EPA inspections on record"New value: +"Inspections over the last five years, across programs"
      • changedOutput schema / properties / facilities / items / properties / programs / description
        Previous value: -"Program registration flags"New value: +"Program registration flags — the same programs the programs filter selects"
      • changedOutput schema / properties / facilities / items / properties / programs / properties / air / description
        Previous value: -"Registered under Clean Air Act (CAA)"New value: +"Has a Clean Air Act (CAA) stationary-source record in ICIS-Air"
      • changedOutput schema / properties / facilities / items / properties / programs / properties / rcra / description
        Previous value: -"Registered under Resource Conservation and Recovery Act (RCRA)"New value: +"Has an RCRA hazardous waste handler record"
      • changedOutput schema / properties / facilities / items / properties / programs / properties / sdwa / description
        Previous value: -"Regulated under Safe Drinking Water Act (SDWA)"New value: +"Has a Safe Drinking Water Act (SDWA) public water system record"
      • changedOutput schema / properties / facilities / items / properties / programs / properties / tri / description
        Previous value: -"Participates in Toxic Release Inventory (TRI)"New value: +"Has a Toxics Release Inventory (TRI) facility ID, whether or not it reported in the latest year"
      • changedOutput schema / properties / facilities / items / properties / programs / properties / water / description
        Previous value: -"Registered under Clean Water Act (CWA)"New value: +"Has a Clean Water Act (CWA) discharge permit record in ICIS-NPDES"
      • changedOutput schema / properties / facilities / items / properties / totalPenaltiesInDollars / description
        Previous value: -"Total assessed penalties in dollars across all programs"New value: +"Penalties from formal enforcement actions over the last five years, across programs, in dollars"
      • changedOutput schema / properties / facilities / items / properties / triReleasesTransfersInLbs / description
        Previous value: -"Total TRI on/off-site releases and transfers in pounds (summary). For the per-chemical breakdown, call epa_get_tri_releases with the TRI facility ID that epa_search_tri_releases returns as facilityId — the Registry ID is not a TRI facility ID."New value: +"Total TRI on/off-site releases and transfers in pounds for ECHO's latest TRI year (summary). For the per-chemical breakdown, call epa_get_tri_releases with the TRI facility ID that epa_search_tri_releases returns as facilityId — the Registry ID is not a TRI facility ID."
    • Changedepa_search_superfund3 fields changed
      • changedInput schema / properties / city / description
        Previous value: -"City name (partial match within state)"New value: +"City name (partial match within state, case-insensitive). Punctuation is matched as written (\"St. Louis\", \"Coeur d'Alene\")."
      • addedInput schema / properties / city / maxLength
        Added value: +4094
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Present when a punctuated city filter read its page limit before finding limit sites spelled as given, so more matching sites may exist.",
        +  "type": "string"
        +}
    • Changedepa_search_tri_releases6 fields changed
      • changedInput schema / properties / chemical_name / description
        Previous value: -"Optional filter to restrict results to a specific chemical (partial match, case-insensitive)"New value: +"Optional filter to restrict results to a specific chemical (partial match, case-insensitive). Commas, apostrophes, brackets, and Greek letters are matched as written, e.g. \"4,4'-Methylenedianiline\"."
      • addedInput schema / properties / chemical_name / maxLength
        Added value: +4094
      • changedInput schema / properties / county / description
        Previous value: -"County name to narrow results within the state, e.g. \"King\". Case-insensitive partial match on the bare name, so a short name can also match a longer one (LAKE matches LAKE OF THE WOODS; check countyName on each record); a trailing \"County\", \"Parish\", or \"Borough\" is dropped before matching."New value: +"County name to narrow results within the state, e.g. \"King\". Case-insensitive partial match on the bare name, so a short name can also match a longer one (LAKE matches LAKE OF THE WOODS; check countyName on each record); a trailing \"County\", \"Parish\", or \"Borough\" is dropped before matching. Punctuation is matched as written (\"Prince George's\")."
      • addedInput schema / properties / county / maxLength
        Added value: +4094
      • changedInput schema / properties / year / description
        Previous value: -"Reporting year. Defaults to all available years in the state. TRI data lags ~18 months."New value: +"Reporting year. Omit to search every available year in the state, newest reporting year first, so limit keeps the most recent filings. TRI data lags ~18 months."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Present when a punctuated county or chemical_name filter read its page limit before finding limit matches spelled as given, so more matching records may exist.",
        +  "type": "string"
        +}
    • Changedepa_search_violations15 fields changed
      • changedInput schema / properties / case_type / description
        Previous value: -"Filter by case type: civil (regulatory violations), criminal (willful violations), or all"New value: +"Filter by case type: civil (regulatory violations), criminal (willful violations), or all. A filing-date range covers civil cases only: with a date, all returns civil cases and criminal is rejected."
      • addedInput schema / properties / date_filed_end / anyOf
        Added value: +[
        +  {
        +    "description": "No bound",
        +    "maxLength": 0,
        +    "minLength": 0,
        +    "type": "string"
        +  },
        +  {
        +    "description": "Date in YYYY-MM-DD form",
        +    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / date_filed_end / description
        Previous value: -"End date for case filing date range (ISO 8601: YYYY-MM-DD)"New value: +"Latest filing date, inclusive (YYYY-MM-DD). Civil cases only. Omit, or pass \"\", for no upper bound."
      • removedInput schema / properties / date_filed_end / type
        Removed value: -"string"
      • addedInput schema / properties / date_filed_start / anyOf
        Added value: +[
        +  {
        +    "description": "No bound",
        +    "maxLength": 0,
        +    "minLength": 0,
        +    "type": "string"
        +  },
        +  {
        +    "description": "Date in YYYY-MM-DD form",
        +    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / date_filed_start / description
        Previous value: -"Start date for case filing date range (ISO 8601: YYYY-MM-DD)"New value: +"Earliest filing date, inclusive (YYYY-MM-DD). Civil cases only. Omit, or pass \"\", for no lower bound."
      • removedInput schema / properties / date_filed_start / type
        Removed value: -"string"
      • changedInput schema / properties / program / description
        Previous value: -"Filter by regulatory program: CAA=Clean Air Act, CWA=Clean Water Act, RCRA=hazardous waste, SDWA=drinking water, CERCLA=Superfund, FIFRA=pesticides, TSCA=toxic substances"New value: +"Filter by regulatory program: CAA=Clean Air Act, CWA=Clean Water Act, RCRA=hazardous waste, SDWA=drinking water, CERCLA=Superfund, FIFRA=pesticides, TSCA=toxic substances. Matches any law a case cites, so a returned case's programsViolated (its primary law) can differ."
      • changedInput schema / properties / zip_code / description
        Previous value: -"5-digit ZIP code to filter cases near that area"New value: +"5-digit ZIP code of the case's facility location"
      • changedOutput schema / properties / cases / items / properties / caseType / description
        Previous value: -"Case category (e.g. \"Judicial\", \"Administrative\")"New value: +"Case category (e.g. \"Judicial\", \"Administrative - Formal\")"
      • changedOutput schema / properties / cases / items / properties / filedDate / description
        Previous value: -"Date the enforcement case was filed"New value: +"Date the enforcement case was filed (MM/DD/YYYY) — the date the filing-date range bounds"
      • changedOutput schema / properties / cases / items / properties / settlementDate / description
        Previous value: -"Settlement or resolution date"New value: +"Settlement or resolution date (MM/DD/YYYY)"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_geographic_filter`: Neither state nor zip_code was provided. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_geographic_filter`: Neither state nor zip_code was provided. `invalid_date`: date_filed_start or date_filed_end is not a real calendar date, such as 2024-02-30. `date_range_inverted`: date_filed_start is later than date_filed_end. `criminal_date_filter`: case_type \"criminal\" was combined with a filing-date bound, which ECHO records for civil cases only. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "no_geographic_filter"
        -]New value: +[
        +  "no_geographic_filter",
        +  "invalid_date",
        +  "date_range_inverted",
        +  "criminal_date_filter"
        +]
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Present when a filing-date range with case_type \"all\" left criminal cases out of the results.",
        +  "type": "string"
        +}
  4. 1 tool update
    • Addedepa_get_air_quality
  5. 8 tool updates
    • First observedepa_get_ejscreen
    • First observedepa_get_facility
    • First observedepa_get_tri_releases
    • First observedepa_search_facilities
    • First observedepa_search_superfund
    • First observedepa_search_tri_releases
    • First observedepa_search_violations
    • First observedepa_search_water_systems

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides AI agents with structured access to U.S. EPA environmental data including nearby regulated facilities, chemical releases, water violations, and hazardous waste sites for any U.S. location. Enables comprehensive environmental impact analysis through the EPA Envirofacts API with geocoding support and distance-based filtering.
    5
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.