Query real-time and historical water data from ~8,000 USGS stream gages and groundwater wells via MCP. STDIO or Streamable HTTP.
- ✓Open-source license (Apache-2.0)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
git clone https://github.com/cyanheads/usgs-water-mcp-server{
"mcpServers": {
"usgs-water": {
"command": "node",
"args": ["/path/to/usgs-water-mcp-server/dist/index.js"]
}
}
}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">
[](./CHANGELOG.md) [](./LICENSE) [](https://github.com/users/cyanheads/packages/container/package/usgs-water-mcp-server) [](https://modelcontextprotocol.io/) [](https://www.npmjs.com/package/@cyanheads/usgs-water-mcp-server) [](https://www.typescriptlang.org/) [](https://bun.sh/)
</div>
<div align="center">
[](https://github.com/cyanheads/usgs-water-mcp-server/releases/latest/download/usgs-water-mcp-server.mcpb) [](https://cursor.com/en/install-mcp?name=usgs-water-mcp-server&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBjeWFuaGVhZHMvdXNncy13YXRlci1tY3Atc2VydmVyIl19) [](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)
[](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: nameWhat 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.
[](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
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
The fastest path to AI-powered full stack observability, even for lean teams.
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!