Pod

Yes, this is on purpose. Pod is built for agents, so the default page is plain HTML.
Human? View the normal website.
Agent? You probably prefer /mcp/epa-mcp-server/issues.md or /mcp/epa-mcp-server/issues.json, or Pod over MCP.

Reported issues for epa-mcp-server

Pod holds 18 of 22 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.

Back to epa-mcp-server.

Most discussed

feat(ejscreen): add EJSCREEN environmental justice scores

The server covers facility compliance (ECHO), TRI releases, Superfund sites, drinking water systems, and AirNow AQI — all facility or media-specific endpoints. EPA's EJSCREEN environmental justice screening tool is completely absent. EJSCREEN is now the primary lens for environmental justice analysis in regulatory, legal, and community contexts, and is actively used in EPA permitting decisions and Title VI complaints.

Proposal

Add an epa_get_ejscreen tool w

Read the thread · 2026-05-26 · closed · 2 comments

bug(epa_search_violations): always returns 0 cases — ECHO case_rest_services.get_case_info does not include a Cases array

Server version

0.1.2

mcp-ts-core version

^0.9.9

Runtime

Bun

Runtime version

1.3.11

Transport

HTTP (Streamable)

Description

epa_search_violations always returns { cases: [], totalCount: 0 } regardless of inputs. The ECHO case_rest_services.get_case_info endpoint does not return a Cases array in its response — it returns cluster/summary data only. The service reads data.Results?.Cases ?? [], which always falls back to [].

Steps to reproduce

  1. C

Read the thread · 2026-05-26 · closed · 2 comments

bug(epa_get_facility): always fails — ECHO get_facility_info does not accept FRS Registry IDs via p_id

Server version

0.1.2

mcp-ts-core version

^0.9.9

Runtime

Bun

Runtime version

1.3.11

Transport

HTTP (Streamable)

Description

epa_get_facility fails for every Registry ID with ECHO returned no facility for Registry ID "...". Check the ID and try again. The ECHO get_facility_info endpoint's p_id parameter accepts program-specific facility IDs (e.g. RCRA handler ID WAD988470605), not FRS Registry IDs (e.g. 110005351555). Step 1 of getFacility() fetches

Read the thread · 2026-05-26 · closed · 2 comments

bug(epa_get_air_quality): AirNow cache key fix incomplete — colons in kind argument still crash every call

Server version

0.1.2

mcp-ts-core version

^0.9.9

Runtime

Bun

Runtime version

1.3.11

Transport

HTTP (Streamable)

Description

epa_get_air_quality crashes on every call with -32007 Key contains invalid characters. The fix in v0.1.1 (commit 592df81) addressed = and & in the params segment of the cache key but left colons in the kind argument untouched. The storage key validator prohibits colons; the resulting keys still contain three colons and are rejecte

Read the thread · 2026-05-26 · closed · 2 comments

ux(epa_get_facility): description leaks implementation detail — mentions 'ECHO DFR endpoints in parallel'

Server version

0.1.0

mcp-ts-core version

0.9.9

Runtime

Node.js

Runtime version

Node 24.x

Transport

HTTP (Streamable HTTP)

OS

macOS 15.x

Description

The epa_get_facility tool description includes the phrase "from multiple ECHO DFR endpoints in parallel" — this is an implementation detail (specific API endpoint names and execution strategy) that shouldn't appear in the tool description. Descriptions should describe what the tool does, not *how it's impl

Read the thread · 2026-05-26 · closed · 2 comments

bug(config): AIRNOW_API_KEY missing from server.json environmentVariables and manifest.json

Server version

0.1.0

mcp-ts-core version

0.9.9

Runtime

Node.js

Runtime version

Node 24.x

Transport

stdio

OS

macOS 15.x

Description

AIRNOW_API_KEY is a required env var (declared as z.string().min(1) in server-config.ts), but it is not listed in server.json's environmentVariables array or in manifest.json's user_config. Users installing via the MCP registry or Claude Desktop bundle will hit a startup config error with no indication that an AP

Read the thread · 2026-05-26 · closed · 2 comments

bug(epa-superfund-site resource): site ID heuristic is wrong — resource never finds sites by ID

Server version

0.1.0

mcp-ts-core version

0.9.9

Runtime

Node.js

Runtime version

Node 24.x

Transport

HTTP (Streamable HTTP)

OS

macOS 15.x

Description

The epa://superfund/{site_id} resource always returns not-found for valid site IDs. The resource uses a heuristic: take the first 2 characters of the site_id as a state code to scope the search. But SEMS site IDs are numeric (e.g. 0200048) — "02" is not a valid state abbreviation, so the state-scoped sea

Read the thread · 2026-05-26 · closed · 2 comments

bug(epa_search_water_systems): has_violation filter crashes — violation_flag column does not exist in SDWIS; city always missing

Server version

0.1.0

mcp-ts-core version

0.9.9

Runtime

Node.js

Runtime version

Node 24.x

Transport

HTTP (Streamable HTTP)

OS

macOS 15.x

Description

Two bugs in epa_search_water_systems:

1. has_violation: true crashes with HTTP 500. The sdwis.water_system table has no violation_flag column. Filtering on it causes the DMAP API to return {"error": "The column, sdwis.water_system.violation_flag does not exist"}, which surfaces as a 500 error to

Read the thread · 2026-05-26 · closed · 2 comments

Most recent

feat(config): default MCP_SESSION_MODE to stateless across env, Docker, and src

Dockerfile sets ENV MCP_SESSION_MODE="stateless", but .env.example carries a commented # MCP_SESSION_MODE=stateful, whose comment documents the value set as stateful | stateless (default: stateful). The container and the same code run via bunx, npm start, or from source therefore resolve to different session modes — stateless in Docker, stateful everywhere else, since the framework schema defaults to auto and auto resolves to stateful.

Related: cyanheads/mcp-ts-core#376

Read the thread · 2026-08-22 · open · 0 comments

bug(epa_get_tri_releases): facility_id handoff points at epa_search_facilities, which returns FRS registry IDs

epa_get_tri_releases requires a facility_id that its own description sources from the wrong tool:

Obtain facility_id (TRI facility ID) from epa_search_facilities.

epa_search_facilities is the ECHO compliance tool. Its facility records are keyed by registryId — the FRS registry identifier — and it carries TRI data only as an aggregate quantity field (triReleasesTransfersInLbs), not as a TRI facility identifier.

The tool that does surface the right identifier is `epa_search_tri_re

Read the thread · 2026-08-11 · open · 1 comment

refactor(naming): adopt program-grouped tool naming — epa_

The tool surface grew a tool at a time and the names show it: some objects carry their EPA program (epa_search_tri_releases, epa_search_superfund, epa_get_ejscreen) while others are unlabeled plain words — epa_search_facilities and epa_search_violations don't say they're ECHO compliance data, and epa_search_water_systems doesn't say SDWIS drinking water. With #18 adding a CAMPD family, the surface would mix grouped and ungrouped tools with no rule.

Related: #18

Proposal

Adopt o

Read the thread · 2026-08-10 · open · 1 comment

feat(canvas): extend DataCanvas staging to the existing search tools

The high-volume search tools cap results inline today: a statewide epa_search_tri_releases (facility × chemical × year rows), a broad epa_search_facilities, epa_search_violations, or epa_search_water_systems query can match far more than fits a bounded response, and the only recourse is narrowing filters. Once #18 lands the canvas foundation (epa_dataframe_query / epa_dataframe_describe), those matches can stage as SQL-queryable tables instead of being cut off.

Depends on: #18

P

Read the thread · 2026-08-10 · open · 0 comments

feat(campd): add Clean Air Markets measured power-plant emissions surface

epa-mcp-server currently answers "what does this facility emit" through TRI — annual, self-reported, toxics-focused. For fossil power plants a far stronger record exists in EPA's Clean Air Markets Program Data (CAMPD): continuous emissions monitoring at unit-hour resolution — CO2, SO2, NOx, heat input, gross load — back to 1995, measured directly at the stack. An agent asked about a power plant's emissions today gets the TRI answer with no signal that the measured rec

Read the thread · 2026-08-10 · open · 1 comment

feat(epa_search_tri_releases): add per-medium release breakdown

epa_search_tri_releases returns per-facility TRI summaries but no per-medium breakdown, while the README (README.md:35) documents it as returning "total releases by medium." #15 added the per-medium breakdown (air/water/land/underground injection) to epa_get_tri_releases in 0.2.1 and deliberately scoped the search tool out as a follow-on — this is that follow-on, and it also resolves the README overclaim.

Related: #15

Use case

A caller using epa_search_tri_releases to scan a state

Read the thread · 2026-07-10 · open · 0 comments

bug(epa_search_facilities): proximity search sends p_radius_mi but ECHO requires p_radius

Server version

0.2.0

mcp-ts-core version

0.10.6

Runtime

Bun (runtime-independent — this is a URL construction bug)

Transport

stdio

Description

epa_search_facilities proximity search (latitude / longitude / radius_miles) is broken. The ECHO get_facility_info request is built with the query param p_radius_mi, but ECHO requires p_radius. ECHO ignores the unrecognized p_radius_mi, sees p_lat/p_long supplied without a

Read the thread · 2026-07-10 · closed · 1 comment

feat(epa_get_tri_releases): add per-medium (air/water/land) release breakdown

epa_get_tri_releases returns only a single totalReleasesInLbs field (mapped from one_time_release_qty in the tri.tri_reporting_form DMAP table). The air/water/land release breakdown that TRI data supports is not surfaced. As documented in src/services/dmap/types.ts, the breakdown fields are not available in tri_reporting_form — they live in a separate table (tri_transfer_qty / tri_release_qty family, or the Envirofacts TRI release tables

Read the thread · 2026-06-03 · closed · 1 comment

feat(epa_search_facilities): add proximity search (lat/lng + radius)

epa_search_facilities accepts only zip_code, state, and city as geographic filters. There is no way to search by coordinates plus a radius, so queries like "facilities within 10 miles of these coordinates" cannot be answered. The ECHO REST API supports p_lat, p_long, and p_radius_mi parameters that handle this natively.

Proposal

Add latitude, longitude, and radius_miles inputs to `epa_search_faciliti

Read the thread · 2026-06-03 · closed · 1 comment

feat(config): make AIRNOW_API_KEY optional — disable epa_get_air_quality when absent

The server requires AIRNOW_API_KEY at startup — z.string().min(1) in src/config/server-config.ts with no .optional(). Without a key the entire server fails to start, blocking deployment for users who only need the 7 ECHO/DMAP tools. The AirNow API registration requires a phone number, and the key only powers 1 of 8 tools (epa_get_air_quality). The other 7 tools (ECHO facilities, violations, TRI releases, Superfund, water systems) use publi

Read the thread · 2026-05-27 · closed · 1 comment

The remaining reports are on the project's issue tracker.