mcp-epa-echo
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| find_facility | Look up NPDES-permitted water dischargers by name, city+state, or NPDES
permit number - use this before any other ECHO tool that takes a facility,
since they all need an ID SOUP: ECHO exposes at least two IDs per facility - Provide at least one of: When A name/city+state search can match more than one facility - the response is
never guessed down to one. Multiple matches produce a
Results are capped at |
| facilities_near | Find NPDES-permitted water dischargers (majors AND minors) in a geographic area - answers "what's permitted to discharge near/on this reach," not "what IS being discharged" (pair with get_dmr_values per facility for that). Exactly one spatial filter is required: Results are FACILITY PERMIT LOCATIONS (the address/coordinates on file for the permit), not the physical location of a discharge pipe or outfall - a facility's outfall can be meaningfully upstream/downstream/offset from the permit address. Do not treat a facility appearing in radius/bbox results as proof it discharges exactly at that point. Each result includes Results are capped at |
| get_permit_limits | Get the effluent limits ECHO has on file for a facility's outfall(s) - one row
per (outfall x parameter x statistical basis x limit type). "DAILY AV" vs
"DAILY MX" for the same parameter are DISTINCT limits, not duplicates - and a
parameter routinely carries BOTH a mass limit ( Identify the facility with npdesId (preferred) or name (resolved
internally - ambiguous names return a note asking you to call find_facility
first). Omit
Optionally filter to one outfall with |
| get_dmr_valuesA | Get measured Discharge Monitoring Report (DMR) values for a facility - the actual reported effluent values, not just limits (use get_permit_limits for that). Identify the facility with npdesId (preferred) or name (resolved internally - ambiguous names return a note asking you to call find_facility first). THE WINDOWING TRAP, SOLVED: omitting If a date range IS given but zero rows come back, the response explains the returned permit window rather than implying "no discharge occurred" - a range outside any permit ECHO has data for looks identical to a genuinely clean period unless you check the window ECHO actually returned.
Optionally filter with |
| get_violations | Get DMR-derived violations for a facility - effluent/compliance flags ECHO computed from Discharge Monitoring Reports. This is DIFFERENT from get_enforcement_actions: a facility can have violations here with no formal case ever filed, and a single enforcement case can resolve violations from several different reporting periods - the two tools do not correspond 1:1. Identify the facility with npdesId (preferred) or name (resolved internally - ambiguous names return a note asking you to call find_facility first). SAME WINDOWING TRAP AS get_dmr_values, same fix: omitting A row is included here ONLY when ECHO itself recorded a violation
(NPDESViolations) - a NODI ("no data") code alone, even one that looks
violation-adjacent, is NOT treated as a violation on its own; verified live
that real NODI codes (e.g. "Conditional Monitoring Not Required") never
co-occur with an actual violation flag in practice. Two distinct kinds of
violation appear, both carrying
If a date range returns zero rows, the response distinguishes "no monitoring reports at all in this window" from "reports came back, none were flagged as violations" - the second is a genuinely clean compliance result, not missing data, and is reported as such rather than implied to be an error. Results are capped at |
| get_enforcement_actions | Get FORMAL ICIS-NPDES enforcement cases for a facility - consent orders, administrative orders, and their penalties. DIFFERENT from get_violations: a facility can accumulate DMR violations with no case ever filed, and one case can resolve violations spanning multiple years - do not assume a 1:1 relationship between the two tools, and do not assume "no cases here" means "no violations" (check get_violations separately). Identify the facility with npdesId (preferred) or name (resolved internally -
ambiguous names return a note asking you to call find_facility first).
Enforcement cases are looked up by the facility's ECHO Registry ID, NOT the
NPDES permit number - verified live: case_rest_services.get_cases links via
Penalties are frequently Optional Results are capped at |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/higherpass/mcp-epa-echo'
If you have feedback or need assistance with the MCP directory API, please join our Discord server