关于 epa-drinking-water-mcp-server
epa-drinking-water-mcp-server 通过 MCP 提供 EPA 饮用水系统记录、历史违规、执法行动和污染物测量数据。面向查询 SDWIS DMAP 与 UCMR 5 数据的 Agent 和研究人员,结果包含来源信息及完整性说明。
主要功能
- 01搜索公共供水系统清单
- 02获取系统档案和服务区域
- 03查询历史违规与执法行动
- 04搜索 LCR 摘要和 UCMR 5 测量数据
- 05暂存数据集以执行只读 SQL 查询
适用场景
- 01按地点或属性查找饮用水系统
- 02查看某系统的已报告违规和行动
- 03检查污染物出现记录
- 04使用 SQL 查询暂存的 EPA 数据
MCP 相关
MCP 服务提供六种 EPA 数据工具,以及用于描述、查询和删除暂存表的可选数据框工具。支持 stdio 和 Streamable HTTP 传输,无需 EPA API 密钥。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @cyanheads/epa-drinking-water-mcp-serverCANVAS_PROVIDER_TYPEOptional SQL staging in the npm runtime: none or duckdb.SDWIS_DATAFRAME_DROP_ENABLEDEnable removal of staged tables when DataCanvas is enabled.CANVAS_DEFAULT_ROW_LIMITSQL retained-row ceiling; the server maximum is 25000.CANVAS_DEFAULT_MEMORY_LIMIT_MBDuckDB memory budget per engine in MiB; maximum 512.MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').MCP_TRANSPORT_TYPESelects the HTTP transport.MCP_HTTP_HOSTThe hostname for the HTTP server.MCP_HTTP_PORTThe port to run the HTTP server on.MCP_HTTP_ENDPOINT_PATHThe endpoint path for the MCP server.MCP_AUTH_MODE密钥Authentication mode to use: 'none', 'jwt', or 'oauth'.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
6收录的工具列表 · 更新于 2 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| view | enum | 否 | 默认返回记录;text 可通过 record_cursor 无损读取超大记录。records | text |
| limit | integer | 否 | 请求内联项数;超过有效上限 100 的值会被截断,并附带提示。 |
| query | string | 否 | 在所选参考主题中,对精确字段执行不区分大小写的子串搜索。 |
| topic | enum | 是 | 内置解读主题或 EPA 实时词典主题。identifiers | system_types | sources | contaminants | violation_types | enforcement_types | treatment | service_areas | standards | coverage |
| cursor | string | 否 | 此工具返回的不透明续传游标;请原样保留原始选择器。 |
| record_cursor | string | 否 | 此工具返回的带签名超大记录指针;与 view text 搭配使用。 |
详细介绍
@cyanheads/epa-drinking-water-mcp-server
通过 MCP 搜索 EPA 饮用水系统、违规记录、执法行动和污染物测量数据。支持 STDIO 或 Streamable HTTP。
概述
提供来自 SDWIS DMAP 和 UCMR 5 公布数据的 EPA 饮用水记录。解析供水系统,查看历史违规记录与执法行动,并检索铅和铜规则摘要或未受监管污染物的出现测量数据。通过 stdio 或 Streamable HTTP 运行,无需 API 密钥。
工具
| 工具 | 说明 |
|---|---|
sdwis_list_reference | 解读标识符、污染物命名空间、覆盖范围、标准和 EPA 字典 |
sdwis_search_water_systems | 查找不含联系信息的公共供水系统清单 |
sdwis_get_system_profile | 检索摘要、地理信息、服务区域或处理信息 |
sdwis_get_violations | 分页获取已报告的历史 SDWA 违规记录 |
sdwis_search_contaminants | 选择违规记录、LCR 摘要或 UCMR 5 出现数据 |
sdwis_get_enforcement_actions | 检索执法行动或相关违规记录 |
sdwis_dataframe_describe | 检查所提供画布中的表格和来源信息 |
sdwis_dataframe_query | 对暂存分区运行只读 SQL |
sdwis_dataframe_drop | 可选地移除一个暂存表格 |
Dataframe 工具需要使用设置了 CANVAS_PROVIDER_TYPE=duckdb 的 npm 或 Docker;drop 还需要设置 SDWIS_DATAFRAME_DROP_ENABLED=true。Claude Desktop 安装包提供六个用于读取 EPA 数据的工具。
功能参考
sdwis_list_reference 工具
- 必需的
topic:identifiers、system_types、sources、contaminants、violation_types、enforcement_types、treatment、service_areas、standards或coverage;可选子字符串query - 解释主题已打包提供;字典为实时数据。SDWIS 代码与 UCMR 分析物属于不同命名空间;标准说明 MCL、MCLG 和行动水平,但不会将历史记录归类为超标
sdwis_search_water_systems 工具
- 至少需要一个筛选条件:
pwsid、name_contains、state、county(需要提供州)、population_min/population_max、source、system_type、primacy_agency或pwsid_prefix activity默认为active;如需选择其他范围,请明确指定inactive或all。州指报告的法律实体所在州;县指服务覆盖的县,两者均不能确定完整的实际服务边界
sdwis_get_system_profile 工具
- 必需的九位字母数字
pwsid;section可选summary(默认)、geography、service_areas或treatment,每个部分独立分页 - Summary 返回
system;子部分返回items。found:false表示清单中缺少记录,并非合规判定;不包含运营方联系方式和邮寄地址
sdwis_get_violations 工具
- 必须提供
pwsid或state;可选county、contaminant、category、health_based和compliance_status - 包含首尾日期的
date_from/date_to用于筛选合规期重叠记录;未知日期不会匹配。监测/报告违规可能不含浓度 stage:true会请求分区;stage_max_rows默认为 5,000,最大限制为 25,000。提供已持有的canvas_id可添加另一个分区
sdwis_search_contaminants 工具
- 必须提供
dataset(violations、lcr或ucmr5)以及pwsid或state;可选 county、contaminant 和包含首尾的日期,分别筛选合规期、LCR 采样期或 UCMR 采集日期 - LCR 铅/铜查询返回 PB90/CU90 汇总数据,而非家庭样本。UCMR
PFAS涵盖 29 种分析物;锂单独处理。zip和detected_only仅适用于 UCMR;服务 ZIP 码不代表采样地点,低于报告限值的删失值仍为未知 - 支持
stage、canvas_id和stage_max_rows(默认 5,000,最大 25,000)。UCMR 冷启动调用可能需要将客户端超时设为 180 秒;如果成员解析超时,请将宽泛请求缩小到某个 PWSID 或县
sdwis_get_enforcement_actions 工具
- 必需的
pwsid;section可选actions(默认)或associations。可选violation_id通过绑定 PWSID 的关联键筛选相关行动 action_type、originator和包含首尾日期的执法日期筛选条件仅适用于行动。关联记录单独分页;来源行动文本并不表示存在联邦命令或罚款- 支持
stage、canvas_id和stage_max_rows(默认 5,000,最大 25,000)
sdwis_dataframe_describe 工具
- 必需的调用方持有的
canvas_id;可选的精确table_name;limit默认为 10,最大限制为 100,并支持使用cursor分页 - 每项对应一个表列条目,包含类型、行数、过期时间、筛选条件、来源、完整性和续页信息。没有全局 canvas 列表
sdwis_dataframe_query 工具
- 必需的
canvas_id和sql中的一条只读 SELECT、WITH 或 FROM 语句(最多 20,000 个字符);请先描述 canvas - 最多保留
CANVAS_DEFAULT_ROW_LIMIT行(框架默认值为 10,000),上限为 25,000。row_count、truncated和has_more用于区分已保留行与省略行;续页会读取不可变结果,最长保留 15 分钟 - 不允许访问文件、网络、写入功能和系统目录。
source_complete会保守地纳入所有实时来源分区,包括 SQL 未引用的表
sdwis_dataframe_drop 工具
- 必需参数为
canvas_id和精确的table_name;需要设置CANVAS_PROVIDER_TYPE=duckdb和SDWIS_DATAFRAME_DROP_ENABLED=true - 幂等:表不存在或画布已过期时返回
dropped:false;其他暂存分区仍可用
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可切换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),并提供结构化日志记录和可选的 OpenTelemetry 跟踪。
EPA 专属功能:
- 无需联系即可获取清单和供水系统成员信息;标签不可用时保留来源代码
- 历史季度 SDWIS 记录、LCR 摘要和参与有限的 UCMR 5 监测数据彼此区分;空结果既不能证明当前符合规范,也不能证明自来水安全或不存在污染物
- 来源日期保留其日历含义;非午夜的来源时间戳会保留在
_raw字段中 - 按需获取 UCMR 数据,并仅在进程内缓存;即使已获取归档数据,全州范围的请求也可能超出 45 秒的成员查询时限。请按 PWSID/县缩小范围,不要将服务器视为完整的全国数据仓库
便于 Agent 使用的输出:
- 来源信息——
effective_filters、来源 URL、retrieved_at、可用时的发布/HTTP 验证器,以及解读注意事项 - 完整性——即使此前已在其他页面或分区中返回数据,
source_complete:false仍可能与has_more:false同时出现;聚合不会恢复完整性 - 整条记录分页——
limit默认为 10,最大为 100;字节数限制可能导致返回的记录更少。使用未更改的选择器跟进next_cursor,包括空的phase:membership页面;来源游标在 15 分钟无活动后过期 - 超大记录——
item_too_large会提供record_cursor;使用view:text并拼接 JSON 块,然后跟进记录续页。两个 MCP 内容接口携带相同的值
入门
将以下任一配置添加到你的 MCP 客户端。无需 EPA 账户或 API 密钥。
{
"mcpServers": {
"epa-drinking-water-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/epa-drinking-water-mcp-server@latest"]
}
}
}
或者使用 npx(无需 Bun):
{
"mcpServers": {
"epa-drinking-water-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/epa-drinking-water-mcp-server@latest"]
}
}
}
或者使用 Docker:
{
"mcpServers": {
"epa-drinking-water-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/epa-drinking-water-mcp-server:latest"
]
}
}
}
若要暂存 SQL 数据,请在 npm 进程环境中设置 CANVAS_PROVIDER_TYPE=duckdb(Docker:-e CANVAS_PROVIDER_TYPE=duckdb)。使用 stage:true 调用来源工具,保留 dataset.canvas_id,然后在查询前调用 sdwis_dataframe_describe。保留每个来源分区的续页信息。Claude Desktop bundle 将 CANVAS_PROVIDER_TYPE=none 固定不变;在其中暂存会返回 canvas_disabled。
从本地检出版本使用 Streamable HTTP:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# http://localhost:3010/mcp
先决条件
- Bun ≥1.4.0 或 Node.js ≥24.0.0
- 可访问 EPA 服务的网络;对于冷启动 UCMR 调用,客户端超时应设为 180 秒
安装
git clone https://github.com/cyanheads/epa-drinking-water-mcp-server.git
cd epa-drinking-water-mcp-server
bun install
cp .env.example .env
bun run rebuild
配置
| 变量 | 说明 | 默认值 |
|---|---|---|
SDWIS_DATAFRAME_DROP_ENABLED | 启用画布时,允许提前移除暂存表 | false |
CANVAS_PROVIDER_TYPE | none 或 duckdb;npm/Docker 支持 DuckDB,MCPB 固定为 none | none |
CANVAS_DEFAULT_ROW_LIMIT | SQL 行数上限,受服务器最大值 25,000 限制 | 10000 |
CANVAS_DEFAULT_MEMORY_LIMIT_MB | 每个引擎的预算,上限为 512 MiB | 512 |
MCP_TRANSPORT_TYPE | stdio 或 http | stdio |
MCP_HTTP_HOST | HTTP 绑定地址;Docker 绑定到 0.0.0.0 | 127.0.0.1 |
MCP_HTTP_PORT | HTTP 端口 | 3010 |
MCP_AUTH_MODE | none、jwt 或 oauth | none |
MCP_LOG_LEVEL | 最低日志级别 | info |
OTEL_ENABLED | 启用 OpenTelemetry | false |
完整的覆盖配置请参阅 .env.example。
运行服务器
本地开发
bun run rebuild
bun run start:stdio
# or bun run start:http
bun run devcheck
bun run test
Docker
docker build -t epa-drinking-water-mcp-server .
docker run --rm -p 3010:3010 epa-drinking-water-mcp-server
该镜像默认通过端口 3010 使用无状态会话的 Streamable HTTP。若要暂存 SQL 数据,请添加 -e CANVAS_PROVIDER_TYPE=duckdb。
项目结构
| 路径 | 用途 |
|---|---|
src/index.ts | 注册、源初始化和可选画布 |
src/config | Dataframe-drop 配置 |
src/domain | 选择器、参考数据、架构和双表面格式化 |
src/mcp-server/tools/definitions | 六个 EPA 工具和三个可选 dataframe 工具 |
src/services/sdwis | 经过验证的 DMAP 读取、成员资格、分页和联接 |
src/services/ucmr5 | 存档获取、解析、索引和发生情况 |
src/services/dataframe | 按能力范围划分的暂存、SQL、过期处理和移除 |
tests | 领域、服务、工具和集成测试 |
scripts | 构建、检查、打包和发布工具 |
开发指南
- 处理程序会抛出类型化故障;框架负责呈现错误
- 直接在
src/index.ts中注册;规范化前先验证上游数据 - 保留不确定性、来源、日期和完整性;绝不推断合规性、家庭暴露或超标情况
- 保持
content[]与structuredContent等价;绝不将源结果写入用户存储
贡献
欢迎提交问题。提交前请运行 bun run devcheck 和 bun run test。
许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。