Releases: cyanheads/epa-mcp-server
Release list
v0.3.0: EJScreen environmental-justice indicators via the EJAM API (#12)
EJScreen environmental-justice indicators via the EJAM API (#12)
New epa_get_ejscreen tool + ejscreen service, backed by the community-maintained EJAM API rehosting EJScreen v2.2 (2022).
Added:
epa_get_ejscreen— 13 environmental + 6 demographic EJScreen indicators for a point + buffer, each with national/state percentiles and EJ Index values, plus the Demographic and Supplemental Demographic indices; out-of-coverage points return a note (#12)src/services/ejscreen/service wrapping the EJAM API (api.ejanalysis.com, Public Environmental Data Partners) — keyless; EJScreen v2.2 (2022), not a live EPA endpointEJSCREEN_API_BASE_URLoptional env var (default https://api.ejanalysis.com)
120 tests pass; bun run devcheck clean.
v0.2.1: Per-medium TRI release breakdown, ECHO proximity fix, mcp-ts-core 0.10.14
Per-medium TRI release breakdown, ECHO proximity fix, mcp-ts-core 0.10.14
epa_get_tri_releases gains air/water/land/underground-injection fields; epa_search_facilities proximity search works again; framework bump clears 9 dependency advisories.
Added:
epa_get_tri_releases— releasesToAirInLbs / releasesToWaterInLbs / releasesToLandInLbs / releasesToUndergroundInjectionInLbs per-medium breakdown, joined from tri.tri_release_qty (#15)
Changed:
- Supply-chain hardening — bunfig minimumReleaseAge guard + Socket install scanner, LICENSE, SECURITY.md, pinned Dockerfile base image
Fixed:
epa_search_facilitiesproximity search — ECHO now receives p_radius, not p_radius_mi (#16)
Dependency bumps:
@cyanheads/mcp-ts-core^0.10.6 → ^0.10.14 — clears 9 advisories (hono, vite, js-yaml, esbuild)@biomejs/biome^2.5.0 → ^2.5.2-
@socketsecurity/bun-security-scanner^1.1.2 (dev)
108 tests pass; bun run devcheck clean.
v0.2.0: optional AIRNOW_API_KEY, facility proximity search
optional AIRNOW_API_KEY, facility proximity search
Air quality becomes opt-in and facility search gains coordinate-based lookup.
Added:
epa_search_facilitiesproximity search —latitude/longitude/radius_miles(max 100 mi), mapped to ECHOp_lat/p_long/p_radius_mi; a partial triple raises anincomplete_proximityerror, and coordinates of 0 are valid (#14)
Changed:
AIRNOW_API_KEYis now optional — when unset (or empty/whitespace) the server starts withoutepa_get_air_quality, registering the 7 keyless tools;server.jsonandmanifest.jsonmark it optional (#13)
Dependency bumps (dev):
@biomejs/biome^2.4.16 → ^2.5.0vitest^4.1.8 → ^4.1.9
97 tests pass; bun run devcheck clean.
v0.1.5: mcp-ts-core ^0.10.6 adoption
mcp-ts-core ^0.10.6 adoption
Framework upgrade to 0.10.x with the corresponding API changes, plus Docker healthcheck and Claude Code / Codex plugin manifests.
Added:
epa_search_tri_releasesenrichment block (truncated,shown,cap) signaling capped results viactx.enrich- Docker
HEALTHCHECK(bun-native/healthzfetch) plus OCIversion/sourcelabels .claude-pluginand.codex-pluginmanifests for one-step install
Changed:
- Validation-precondition error codes across the six search/air-quality tools:
InvalidParams→ValidationError(renamed in 0.10.x) createApp()setsname/titleexplicitly toepa-mcp-server
Dependency bumps:
@cyanheads/mcp-ts-core^0.9.9 → ^0.10.6@types/node^25.9.2 → ^25.9.3
90 tests pass; bun run devcheck clean.
v0.1.4
AirNow cache keys, ECHO facility DFR endpoint, violations two-step case query
Three bug fixes that caused every call to fail at runtime.
Fixed:
- AirNow cache keys used colons from kind values like current:zip, rejected by the storage-key validator; keys now use / and . separators with sanitized param values (#9)
- ECHO facility lookup called the wrong endpoint (get_facility_info rejects numeric Registry IDs); now uses get_dfr which accepts them directly (#10)
- ECHO violations search read Cases from the discovery endpoint, which never returns them; now uses the two-step get_case_info → get_qid flow with correct field mapping (#11)
Dependency bumps (dev):
@biomejs/biome^2.4.15 → ^2.4.16@types/node^25.9.1 → ^25.9.2vitest^4.1.7 → ^4.1.8
90 tests pass; bun run devcheck clean.
v0.1.3: ecosystem metadata alignment
ecosystem metadata alignment
Added author/funding fields, FUNDING.yml, and one-click install badges (Claude Desktop, Cursor, VS Code). Migrated all package.json scripts to bun run. Also backfills the missing 0.1.2 changelog entry.
Added:
- .github/FUNDING.yml (GitHub Sponsors + Buy Me a Coffee)
- README install badges (Claude Desktop .mcpb, Cursor deeplink, VS Code deeplink)
- README Docker and npm badges
Changed:
- package.json scripts: tsx → bun run; bundle/test/start scripts updated
- package.json metadata: author, funding, packageManager, bugs, homepage added
- manifest.json: version, description, author populated
- README: version badge 0.1.3, Bun badge corrected to v1.3.0
Removed:
- tsx dev dependency (no longer needed after script migration)
86 tests pass; bun run devcheck clean.
v0.1.2: mcpName for MCP Registry, Dockerfile node build stage
mcpName for MCP Registry, Dockerfile node build stage
v0.1.1: Initial public release — EPA environmental data server
Initial public release — EPA environmental data server
Fixes all field-test bugs found during pre-release validation.
Fixed:
- TRI field mapping — chemical names and release quantities (air, water, land, UIC) were always empty due to wrong DMAP column names
- Superfund site names were always empty — wrong field in normalizeSemsSite()
- Superfund site resource never matched sites by ID — fixed heuristic
- SDWIS has_violation filter crashed — violation_flag column doesn't exist; switched to correct column; city field now populated
- AirNow cache key generation produced invalid characters (lat/lng slashes); replaced with safe key-value join
- ECHO bot-blocking returned empty results silently; added User-Agent header
- AIRNOW_API_KEY missing from server.json environmentVariables and manifest.json user_config
- epa_get_facility description no longer leaks internal DFR implementation detail
86 tests pass; bun run devcheck clean.