Skip to main content
ClaudeWave
cyanheads avatar
cyanheads

usgs-water-mcp-server

View on GitHub

Query real-time and historical water data from ~8,000 USGS stream gages and groundwater wells via MCP. STDIO or Streamable HTTP.

MCP ServersOfficial Registry1 stars0 forksTypeScriptApache-2.0Updated today
ClaudeWave Trust Score
95/100
Verified
Passed
  • Open-source license (Apache-2.0)
  • Actively maintained (<30d)
  • Clear description
  • Topics declared
  • Documented (README)
Last scanned: 8/23/2026
Install in Claude Code / Claude Desktop
Method: Manual
Claude Code CLI
git clone https://github.com/cyanheads/usgs-water-mcp-server
claude_desktop_config.json (Claude Desktop)
{
  "mcpServers": {
    "usgs-water": {
      "command": "node",
      "args": ["/path/to/usgs-water-mcp-server/dist/index.js"]
    }
  }
}
1. Run the command above in your terminal (Claude Code), or paste the JSON config into claude_desktop_config.json (Claude Desktop).
2. Replace any <placeholder> values with your API keys or paths.
3. Restart Claude. The MCP server and its tools appear automatically.
💡 Clone https://github.com/cyanheads/usgs-water-mcp-server and follow its README for install instructions.
Use cases

MCP Servers overview

<div align="center">
  <h1>@cyanheads/usgs-water-mcp-server</h1>
  <p><b>Query real-time and historical water data from ~8,000 USGS stream gages and groundwater wells via MCP. STDIO or Streamable HTTP.</b>
  <div>7 Tools • 2 Resources</div>
  </p>
</div>

<div align="center">

[![Version](https://img.shields.io/badge/Version-0.2.3-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/usgs-water-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^2.0.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/usgs-water-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/usgs-water-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^7.0.2-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.4.0-blueviolet.svg?style=flat-square)](https://bun.sh/)

</div>

<div align="center">

[![Install in Claude Desktop](https://img.shields.io/badge/Install_in-Claude_Desktop-D97757?style=for-the-badge&logo=anthropic&logoColor=white)](https://github.com/cyanheads/usgs-water-mcp-server/releases/latest/download/usgs-water-mcp-server.mcpb) [![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en/install-mcp?name=usgs-water-mcp-server&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBjeWFuaGVhZHMvdXNncy13YXRlci1tY3Atc2VydmVyIl19) [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_Server-0098FF?style=for-the-badge&logo=visualstudiocode&logoColor=white)](https://vscode.dev/redirect?url=vscode:mcp/install?%7B%22name%22%3A%22usgs-water-mcp-server%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40cyanheads%2Fusgs-water-mcp-server%22%5D%7D)

[![Framework](https://img.shields.io/badge/Built%20on-@cyanheads/mcp--ts--core-67E8F9?style=flat-square)](https://www.npmjs.com/package/@cyanheads/mcp-ts-core)

</div>

<div align="center">

**Public Hosted Server:** [https://usgs-water.caseyjhand.com/mcp](https://usgs-water.caseyjhand.com/mcp)

</div>

---

## Tools

Five tools for querying USGS water data, plus two for SQL analytics over the DuckDB-backed canvas dataframes that `water_get_series` and `water_find_sites` materialize:

| Tool | Description |
|:-----|:------------|
| `water_list_parameters` | Static lookup of well-known USGS parameter codes with names, units, and domain. No network call. |
| `water_find_sites` | Find USGS monitoring sites by bounding box, state, county, or HUC watershed. Filter by site type and parameter availability. Large match sets spill to DataCanvas. |
| `water_get_readings` | Get the latest instantaneous values (~15 min real-time) for up to 100 USGS sites. |
| `water_get_series` | Get a time series of daily or instantaneous values for a site over a date range. Large ranges spill to DataCanvas. |
| `water_get_conditions` | Get current hydrologic conditions ranked against the full period-of-record percentile statistics. |
| `water_dataframe_describe` | List tables and columns staged on a DataCanvas by `water_get_series` or `water_find_sites`. |
| `water_dataframe_query` | Run a read-only SQL SELECT against the time-series and site tables staged by `water_get_series` and `water_find_sites`. |

### `water_list_parameters`

Static lookup of well-known USGS parameter codes — no network call, instant response.

- Discover that `00060` = Discharge (ft³/s), `00065` = Gage height (ft), `00010` = Temperature (°C), `72019` = Depth to water level (ft), and more
- Filter by thematic domain: `streamflow`, `groundwater`, `temperature`, `meteorological`, `water-quality`, or `all`
- Use this first — parameter codes are required by every other water tool

---

### `water_find_sites`

Discover USGS monitoring sites before calling data tools — all other tools require a site number.

- Geographic scoping: bounding box (`"west,south,east,north"` decimal degrees), 2-letter state code, bare 5-digit FIPS county code (e.g. `51013`), or HUC watershed code — either a 2-digit major HUC (`02`) or an 8-digit minor HUC (`02070008`), the only two lengths NWIS accepts
- Site type filtering: `ST` (stream), `GW` (groundwater well), `LK` (lake/reservoir), `SP` (spring), and more
- Parameter filter: only return sites that have data for a specific parameter code — comma-separate to require several (e.g. `00060,00065`)
- Data type filter: require sites with real-time (`iv`), daily (`dv`), or groundwater (`gw`) data
- Returns site number, name, coordinates, type, state/county/HUC codes, and drainage area (expanded mode only) — altitude is included in both modes when USGS records it
- Bounded result set: capped at 500 sites inline, with a `truncated` flag and `upstreamTotal` (the full upstream count) so an oversized query never overflows the response
- **DataCanvas spillover:** when the result is truncated and `CANVAS_PROVIDER_TYPE=duckdb` is set, the full match set is staged to a DuckDB-backed canvas — the response includes `canvas_id` and `table_name` to retrieve every match past the 500 cap via `water_dataframe_query`. Without DataCanvas, narrow the query with additional filters (county, HUC, bbox, parameter, data type) to bring the result under the cap

---

### `water_get_readings`

Get the latest instantaneous (~15 min) values for one or more USGS monitoring sites.

- Batch up to 100 site numbers in a single call
- Accepts any parameter code discoverable via `water_list_parameters`
- Configurable lookback period via ISO 8601 duration (e.g. `PT2H` = last 2 hours, `P7D` = last 7 days)
- Returns per-site, per-parameter records with timestamp, value, unit, and provisional/approved qualifier
- Bounded by design: each series carries its 10 most recent records, with `totalValues` reporting how many the period actually held and `truncated` flagging the cap. Use `water_get_series` when you need the full series
- Partial batches are explicit: requested sites NWIS returns no data for are named in `missingSites` rather than dropped silently
- Groundwater depth available via `parameterCd=72019` (the legacy `gwlevels` endpoint was decommissioned November 2025 — use the IV service instead)

---

### `water_get_series`

Get a historical time series for a site and parameter over a date range.

- Daily values (DV service, one value per day) or instantaneous values (IV service, ~15 min resolution)
- Returns site name, parameter name, unit code, and time-ordered value records with qualifiers
- **DataCanvas spillover:** large date ranges (>500 records) automatically spill to a DuckDB-backed canvas when `CANVAS_PROVIDER_TYPE=duckdb` is set — response includes `canvas_id` and `table_name` for follow-up SQL via `water_dataframe_query`
- Without DataCanvas, returns the most recent 500 records with a `truncated` flag and `totalRecords` count
- Supports chaining: pass a prior `canvas_id` to append data to an existing canvas

---

### `water_get_conditions`

Get current hydrologic conditions placed in full historical context.

- Fetches the current IV reading and the full daily percentile table in parallel
- Classifies the reading: `record-high` (≥ p95), `above-normal` (p75–p95), `normal` (p25–p75), `below-normal` (p10–p25), `low` (p05–p10), `record-low` (< p05)
- Pairs each class with a `percentileLabel` spelling out the threshold — `record-high` and `record-low` mark percentile-of-record extremes, not verified all-time records, and the label says so where the class name does not
- Ranks against the observation's own calendar day, so a reading near midnight is not compared against the neighboring day's percentiles
- Discloses the granularity approximation in `comparisonBasis`: the reading is instantaneous while the percentiles are approved daily-mean values, so the class is a "how unusual is this" ranking — not a flood-stage or drought determination, which need authoritative thresholds this tool does not fetch
- Validates `site` and `parameterCd` at the schema edge; a well-formed value NWIS still rejects surfaces as the typed `invalid_request` reason rather than an opaque upstream error
- Gracefully degrades when historical context is missing: returns the current reading with `historicalContext: null` and a `historicalContextStatus` saying why — `no_record` (new/short record), `no_matching_day` (no row for the date), or `unavailable` (stat call failed — transient and retryable, kept distinct from a sparse record)

---

### `water_dataframe_describe` / `water_dataframe_query`

In-conversation SQL analytics over the dataframes that `water_get_series` and `water_find_sites` materialize on a DuckDB-backed canvas — time-series tables from the former, full site match sets from the latter.

**Workflow:**
1. Call `water_get_series` with a large date range, or `water_find_sites` with a query that matches more than 500 sites — when DataCanvas is enabled, the response includes `canvas_id` and `table_name`
2. Call `water_dataframe_describe` with the `canvas_id` to confirm the table schema — series tables carry `date_time`, `value`, `qualifiers`, `site_number`, `parameter_cd`, `unit_code`; site tables carry `site_number`, `site_name`, `site_type`, `latitude`, `longitude`, `huc_cd`, and the expanded fields
3. Call `water_dataframe_query` with the `canvas_id` and a SELECT statement to run aggregates, filter, or join

Read-only by default — only SELECT statements are permitted. Results are capped at 10,000 rows; a query matching more comes back with `truncated: true`. Requires `CANVAS_PROVIDER_TYPE=duckdb` in the server environment.

## Resources and prompts

| Type | Name | Description |
|:-----|:-----|:------------|
| Resource | `usgs-water://site/{siteId}` | Site metadata: name
ai-agentsai-toolscyanheadshydrologymcpmcp-servermodel-context-protocolnwistypescriptusgswater

What people ask about usgs-water-mcp-server

What is cyanheads/usgs-water-mcp-server?

+

cyanheads/usgs-water-mcp-server is mcp servers for the Claude AI ecosystem. Query real-time and historical water data from ~8,000 USGS stream gages and groundwater wells via MCP. STDIO or Streamable HTTP. It has 1 GitHub stars and its last recorded update is dated 2026-08-22.

How do I install usgs-water-mcp-server?

+

You can install usgs-water-mcp-server by cloning the repository (https://github.com/cyanheads/usgs-water-mcp-server) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.

Is cyanheads/usgs-water-mcp-server safe to use?

+

Our security agent has analyzed cyanheads/usgs-water-mcp-server and assigned a Trust Score of 95/100 (tier: Verified). See the full breakdown of passed checks and flags on this page.

Who maintains cyanheads/usgs-water-mcp-server?

+

cyanheads/usgs-water-mcp-server is maintained by cyanheads. The last recorded GitHub activity is dated 2026-08-22, with 11 open issues.

Are there alternatives to usgs-water-mcp-server?

+

Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.

Deploy usgs-water-mcp-server to your cloud

Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.

Maintain this repo? Add a badge to your README

Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.

Featured on ClaudeWave: cyanheads/usgs-water-mcp-server
[![Featured on ClaudeWave](https://claudewave.com/api/badge/cyanheads-usgs-water-mcp-server)](https://claudewave.com/repo/cyanheads-usgs-water-mcp-server)
<a href="https://claudewave.com/repo/cyanheads-usgs-water-mcp-server"><img src="https://claudewave.com/api/badge/cyanheads-usgs-water-mcp-server" alt="Featured on ClaudeWave: cyanheads/usgs-water-mcp-server" width="320" height="64" /></a>

More MCP Servers

usgs-water-mcp-server alternatives