mcpField
E
epa-drinking-water-mcp-server

epa-drinking-water-mcp-server

本地服务
github.com/cyanheads法律与政务13 天前更新

关于 epa-drinking-water-mcp-server

epa-drinking-water-mcp-server 通过 MCP 提供 EPA 饮用水系统记录、历史违规、执法行动和污染物测量数据。面向查询 SDWIS DMAP 与 UCMR 5 数据的 Agent 和研究人员,结果包含来源信息及完整性说明。

主要功能

  1. 01搜索公共供水系统清单
  2. 02获取系统档案和服务区域
  3. 03查询历史违规与执法行动
  4. 04搜索 LCR 摘要和 UCMR 5 测量数据
  5. 05暂存数据集以执行只读 SQL 查询

适用场景

  1. 01按地点或属性查找饮用水系统
  2. 02查看某系统的已报告违规和行动
  3. 03检查污染物出现记录
  4. 04使用 SQL 查询暂存的 EPA 数据

MCP 相关

MCP 服务提供六种 EPA 数据工具,以及用于描述、查询和删除暂存表的可选数据框工具。支持 stdio 和 Streamable HTTP 传输,无需 EPA API 密钥。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"cyanheads-epa-drinking-water": {
"command": "npx",
"args": [
"-y",
"@cyanheads/epa-drinking-water-mcp-server"
],
"env": {
"CANVAS_PROVIDER_TYPE": "<CANVAS_PROVIDER_TYPE>",
"SDWIS_DATAFRAME_DROP_ENABLED": "<SDWIS_DATAFRAME_DROP_ENABLED>",
"CANVAS_DEFAULT_ROW_LIMIT": "<CANVAS_DEFAULT_ROW_LIMIT>",
"CANVAS_DEFAULT_MEMORY_LIMIT_MB": "<CANVAS_DEFAULT_MEMORY_LIMIT_MB>",
"MCP_LOG_LEVEL": "<MCP_LOG_LEVEL>",
"MCP_TRANSPORT_TYPE": "<MCP_TRANSPORT_TYPE>",
"MCP_HTTP_HOST": "<MCP_HTTP_HOST>",
"MCP_HTTP_PORT": "<MCP_HTTP_PORT>",
"MCP_HTTP_ENDPOINT_PATH": "<MCP_HTTP_ENDPOINT_PATH>",
"MCP_AUTH_MODE": "<MCP_AUTH_MODE>"
}
}
}
}
启动命令npx -y @cyanheads/epa-drinking-water-mcp-server
需要配置的环境变量
CANVAS_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@cyanheads/epa-drinking-water-mcp-server0.2.0

工具

6

收录的工具列表 · 更新于 2 天前

参数类型必填说明
viewenum否默认返回记录;text 可通过 record_cursor 无损读取超大记录。records | text
limitinteger否请求内联项数;超过有效上限 100 的值会被截断,并附带提示。
querystring否在所选参考主题中,对精确字段执行不区分大小写的子串搜索。
topicenum是内置解读主题或 EPA 实时词典主题。identifiers | system_types | sources | contaminants | violation_types | enforcement_types | treatment | service_areas | standards | coverage
cursorstring否此工具返回的不透明续传游标;请原样保留原始选择器。
record_cursorstring否此工具返回的带签名超大记录指针;与 view text 搭配使用。

详细介绍

@cyanheads/epa-drinking-water-mcp-server

通过 MCP 搜索 EPA 饮用水系统、违规记录、执法行动和污染物测量数据。支持 STDIO 或 Streamable HTTP。

6 个 EPA 工具 • 3 个可选 DataCanvas 工具

版本 许可证 Docker MCP SDK npm TypeScript Bun

在 Claude Desktop 中安装 在 Cursor 中安装 在 VS Code 中安装

框架


概述

提供来自 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_TYPEnone 或 duckdb;npm/Docker 支持 DuckDB,MCPB 固定为 nonenone
CANVAS_DEFAULT_ROW_LIMITSQL 行数上限,受服务器最大值 25,000 限制10000
CANVAS_DEFAULT_MEMORY_LIMIT_MB每个引擎的预算,上限为 512 MiB512
MCP_TRANSPORT_TYPEstdio 或 httpstdio
MCP_HTTP_HOSTHTTP 绑定地址;Docker 绑定到 0.0.0.0127.0.0.1
MCP_HTTP_PORTHTTP 端口3010
MCP_AUTH_MODEnone、jwt 或 oauthnone
MCP_LOG_LEVEL最低日志级别info
OTEL_ENABLED启用 OpenTelemetryfalse

完整的覆盖配置请参阅 .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/configDataframe-drop 配置
src/domain选择器、参考数据、架构和双表面格式化
src/mcp-server/tools/definitions六个 EPA 工具和三个可选 dataframe 工具
src/services/sdwis经过验证的 DMAP 读取、成员资格、分页和联接
src/services/ucmr5存档获取、解析、索引和发生情况
src/services/dataframe按能力范围划分的暂存、SQL、过期处理和移除
tests领域、服务、工具和集成测试
scripts构建、检查、打包和发布工具

开发指南

请参阅 CLAUDE.md 和 AGENTS.md。

  • 处理程序会抛出类型化故障;框架负责呈现错误
  • 直接在 src/index.ts 中注册;规范化前先验证上游数据
  • 保留不确定性、来源、日期和完整性;绝不推断合规性、家庭暴露或超标情况
  • 保持 content[] 与 structuredContent 等价;绝不将源结果写入用户存储

贡献

欢迎提交问题。提交前请运行 bun run devcheck 和 bun run test。

许可证

Apache-2.0。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。