io.github.cyanheads/usgs-water-mcp-server
REMOTE · USGS-WATER.CASEYJHAND.COM · 2 COMPONENTS
Query real-time and historical USGS water data from ~8,000 stream gages and groundwater wells.
Available components
Last scanned (2 hours ago)
Scores higher than 97% of remote servers
Reachable. Last reached 6 Nov 2026.
Category Maps and Location
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security83
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Nothing on it is marked destructive, but we can't show that an anonymous caller can only read: full credit needs the server to list at least one tool and every tool to be verifiably read-only. We use a best-effort check of tool names and descriptions to tell read-only tools from tools that change things, so some genuinely read-only tools may not get full credit. Names that start with a read verb (get, list, read, search and similar) and accurate readOnlyHint annotations help. Meet that to earn full credit, or require authorisation. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability76
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 3926 tokens (~302/item across 13 items; 8 tools + 5 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 8 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 10 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Checks we ran (13)
- TLS certificate
- Authorization
- HTTPS
- HSTS header
- DNSSEC
- Transport
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
Does not apply to this hosted endpoint (2)
- Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
- Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
The score does not measure everything. What the score does not measure →
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 6 Nov 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 29 Oct 26 0
- The server rewrote its instructions, which are the text every model session reads security
- New resource “usgs-water-guide” functional
- Server version: 0.4.0 → 0.5.0 functional
- 20 Oct 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Server version: 0.3.0 → 0.4.0 functional
- New tool “water_get_site_data_catalog” functional
- 4 Oct 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Tool “water_dataframe_describe” rewrote its description, which is the text the model reads security
- Tool “water_dataframe_query” rewrote its description, which is the text the model reads security
- Server version: 0.2.6 → 0.3.0 functional
- 28 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Sept 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Tool “water_list_parameters” rewrote its description, which is the text the model reads security
- Tool “water_get_series” rewrote its description, which is the text the model reads security
- Tool “water_get_readings” rewrote its description, which is the text the model reads security
- Tool “water_get_conditions” rewrote its description, which is the text the model reads security
- Schema quality: 241 → 307 ▼ functional
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- Server version: 0.2.5 → 0.2.6 functional
- “water_list_parameters” added an optional parameter “query” cosmetic
- “water_get_series” added an optional parameter “statCd” cosmetic
- “water_get_series” added an optional parameter “methodId” cosmetic
- “water_get_series” reworded the description of “canvas_id” cosmetic
- “water_list_parameters” reworded the description of “group” cosmetic
- “water_get_readings” reworded the description of “parameterCd” cosmetic
- 22 Sept 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Tool “water_get_series” rewrote its description, which is the text the model reads security
- Tool “water_find_sites” rewrote its description, which is the text the model reads security
- Schema quality: 211 → 241 ▼ functional
- Server version: 0.2.4 → 0.2.5 functional
- “water_find_sites” added an optional parameter “offset” cosmetic
- “water_find_sites” added an optional parameter “limit” cosmetic
- “water_find_sites” reworded the description of “bbox” cosmetic
- “water_find_sites” reworded the description of “canvas_id” cosmetic
- “water_find_sites” reworded the description of “countyCd” cosmetic
- “water_find_sites” reworded the description of “huc” cosmetic
- “water_find_sites” reworded the description of “stateCd” cosmetic
- “water_get_series” reworded the description of “canvas_id” cosmetic
- 19 Sept 26 0
- Server version: 0.2.3 → 0.2.4 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 6 Nov 2026 · Probed https://usgs-water.caseyjhand.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=caseyjhand.com | CN=WE1,O=Google Trust Services,C=US | 2 Nov 2026 | 31 Jan 2027 | ECDSA 256 | ECDSA-SHA256 | 995a30681ab772540e934241ca1d576c |
| SANs: caseyjhand.com, *.caseyjhand.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC secure
Validation of usgs-water.caseyjhand.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | Trust anchor | 20326, 38696 | 8, 8 | Verified |
| com. | DS published | 19718 | 13 | Verified |
| caseyjhand.com. | DS published | 2371 | 13 | Verified |
| usgs-water.caseyjhand.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| x-content-type-options | nosniff |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://usgs-water.caseyjhand.com/mcp | Verified | 200 | |
| http (plaintext) | http://usgs-water.caseyjhand.com/mcp | HTTPS enforced | 301 | https://usgs-water.caseyjhand.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
water_dataframe_describe Water Dataframe Describe ~134
List tables and columns staged on a DataCanvas by water_get_series or water_find_sites. Call this after water_get_series or water_find_sites returns a canvas_id to discover the exact table name and column types before writing a query. Then pass the table name to water_dataframe_query, or to water_dataframe_drop (when this server enables it) to remove a table you no longer need. Requires DataCanvas to be enabled on this server instance. Returns an error if DataCanvas is not available.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | yes | Canvas ID returned by water_get_series or water_find_sites. Identifies the canvas to describe. |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | The canvas ID that was described — pass to water_dataframe_query. |
| error | object | – | Present when the call failed. Absent on success. |
| tables | array | – | Tables and views on this canvas. |
No examples provided.
water_dataframe_query Water Dataframe Query ~264
Run a read-only SQL SELECT against water data tables staged on a DataCanvas by water_get_series or water_find_sites. Workflow: run water_get_series or water_find_sites (get canvas_id + table_name) → water_dataframe_describe (confirm the table and its columns) → water_dataframe_query (SQL analysis), then optionally water_dataframe_drop (when this server enables it) to remove a table you are done with. Only SELECT statements are permitted. At most 10,000 rows are returned; a query matching more is capped and the response sets truncated=true — scope with WHERE/LIMIT, and use SELECT COUNT(*) or water_dataframe_describe to learn the true match count. Requires DataCanvas to be enabled on this server instance. Returns an error if DataCanvas is not available.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | yes | Canvas ID returned by water_get_series or water_find_sites. Identifies the canvas holding the data. |
| sql | string | yes | Read-only SELECT statement. Reference the table by the table_name from water_get_series or water_find_sites; columns vary by source table, so run water_dataframe_describe first for the exact schema.… |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| row_count | integer | – | Number of rows returned in the rows array (up to the 10,000-row cap), not the total matched by the query. When truncated is true the cap was reached, so row_count equals the returned count and underc… |
| rows | array | – | Result rows returned (up to 10,000). Column names match the SELECT clause. |
| truncated | boolean | – | True when the query matched more rows than the 10,000-row cap and the result was capped — rows and row_count then cover only the first 10,000 matches, and the rest are not in this response. False mea… |
No examples provided.
water_find_sites Water Find Sites ~873
Find USGS water monitoring sites by bounding box, state, county, or HUC watershed code, filtered by site type and parameter availability. Returns site numbers, names, coordinates, types, altitude, and (in expanded mode) drainage area. Call this first — water_get_readings, water_get_series, and water_get_conditions all require a site number. Supply exactly one major filter — bbox, stateCd, countyCd, or huc; siteType, parameterCd, and hasDataTypeCd only narrow within it and cannot stand alone. Page through matches with limit/offset (500 per page); truncated=true means matches remain after the returned window and upstreamTotal holds the full count. When the match set exceeds 500 and DataCanvas is enabled, the complete set also stages to a canvas (canvas_id/table_name) — inspect it with water_dataframe_describe, then retrieve it with water_dataframe_query.
| Name | Type | Req | Description |
|---|---|---|---|
| bbox | string | – | Bounding box as "west,south,east,north" in decimal degrees (e.g. "-77.5,38.5,-76.5,39.5" for the DC metro area). One of the four major filters — bbox, stateCd, countyCd, and huc are mutually exclusiv… |
| canvas_id | string | – | Canvas ID from a prior call to add this match set as a table on an existing canvas rather than creating a new one. Each distinct filter set gets its own table name, so re-running the identical query… |
| countyCd | string | – | FIPS county code(s) as bare 5-digit numbers — state and county digits concatenated, no separator (e.g. "51013" for Arlington, VA). Comma-separate up to 20 (e.g. "51059,51061"). The 5 digits already e… |
| hasDataTypeCd | string | – | Require sites with data of this type. Common values: "iv" (real-time/instantaneous), "dv" (daily values), "gw" (groundwater). Comma-separate multiple types. |
| huc | string | – | Hydrologic Unit Code (HUC) scoping results to a watershed. Either a 2-digit major HUC (e.g. "02" for the Mid-Atlantic region) or an 8-digit minor HUC (e.g. "02070008" for the Middle Potomac). NWIS ac… |
| limit | integer | – | Maximum sites to return inline, 1–500. Default 500 (the inline cap). |
| offset | integer | – | Number of matching sites to skip before returning results. Page through matches beyond the inline cap by advancing offset by limit. Default 0. |
| parameterCd | string | – | 5-digit parameter code to require at each returned site (e.g. "00060" for discharge). Use water_list_parameters to discover codes. Comma-separate multiple codes with no spaces (e.g. "00060,00065"). |
| siteOutput | string | – | "basic" returns core identification fields. "expanded" adds drainage area, altitude, contributing area, and other metadata. |
| siteType | string | – | Site type filter. Common codes: "ST" (stream), "GW" (groundwater well), "LK" (lake/reservoir), "SP" (spring), "AT" (atmosphere), "OC" (ocean), "ES" (estuary). Comma-separate multiple types (e.g. "ST,… |
| stateCd | string | – | 2-character US state abbreviation (e.g. "VA", "WA"). Returns all sites in the state for the given filters. Major filter — supply exactly one of bbox, stateCd, countyCd, huc. |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | Canvas ID for the DataCanvas holding the full, uncapped match set. Present only when the match set exceeded the 500-site cap and DataCanvas is enabled. Pass to water_dataframe_describe then water_dat… |
| error | object | – | Present when the call failed. Absent on success. |
| filters | object | – | Filters applied to this query. |
| notice | string | – | Advisory about the returned window: the staged canvas and how to read it, the filters to narrow by, the window actually returned, the valid offset range when the request landed past the end of the ma… |
| sites | array | – | The requested window of matching USGS monitoring sites — the slice starting at offset, at most limit long (500 max). upstreamTotal holds the full match count; canvas_id/table_name point to the staged… |
| table_name | string | – | DuckDB table name in the canvas holding all matching sites. Present when canvas_id is present. Use as the FROM target in water_dataframe_query SQL. |
| total | integer | – | Number of sites returned inline in this response — at most limit, and 0 when offset is at or past upstreamTotal. |
| truncated | boolean | – | True when matches remain after the returned window (offset + total < upstreamTotal) — false on the last page, and false for a window starting past the end of the match set, where the notice names the… |
| upstreamTotal | integer | – | Total number of sites matching the query upstream, before limit/offset windowing. Equals total when the whole match set fits in one window. |
No examples provided.
water_get_conditions Water Get Conditions ~300
Get a USGS site's current reading ranked against its full period-of-record daily-mean percentiles for the same calendar day — a "how unusual is this" percentileClass (record-high to record-low), not a flood-stage or drought determination (this tool fetches no authoritative thresholds). The reading is instantaneous but the percentiles are daily-mean, so the ranking is approximate (see historicalContext.comparisonBasis). When the record is too short to rank, returns the reading with historicalContext=null instead of an error. A reading NWIS reports as no data (a seasonal, discontinued, dry, or malfunctioning gage) returns an empty currentValue with the qualifiers naming why, and is not ranked. When the site measures the parameter with several sensors (methods), one reading is used and named by methodId/methodDescription — from the sensor its percentile series is described as when one is, otherwise the most recent across them; water_get_readings lists every method. Use water_find_sites and water_list_parameters to resolve inputs.
| Name | Type | Req | Description |
|---|---|---|---|
| parameterCd | string | yes | 5-digit USGS parameter code (e.g. "00060" for discharge, "00065" for gage height). Use water_list_parameters to discover codes. |
| site | string | yes | USGS site number (8–15 digits, e.g. "01646500" for Potomac River at Little Falls). Use water_find_sites to discover valid site numbers. |
| Name | Type | Req | Description |
|---|---|---|---|
| currentDateTime | string | – | ISO 8601 date-time of the most recent observation. |
| currentValue | string | – | Most recent observed value as a string. Empty string when NWIS reported no value for the reading — qualifiers then give the reason, and historicalContext does not rank it. A method with a measured la… |
| error | object | – | Present when the call failed. Absent on success. |
| historicalContext | – | – | Historical percentile context for the observation's calendar day. Non-null only when historicalContextStatus is "available"; see that field for why it is otherwise absent. |
| historicalContextStatus | string | – | Why historicalContext is or is not populated. 'available': percentiles for the observation's calendar day are present. 'no_matching_day': the stat table has rows but none for that calendar day. 'no_m… |
| methodDescription | string|null | – | NWIS description of that method (e.g. "From multiparameter sonde", "[(2)]"). Null when NWIS leaves it blank, as it does for the default series at most single-sensor sites. |
| methodId | string|null | – | NWIS method ID of the sensor series the current reading comes from. When the site reports the parameter from several, a method with a measured latest reading is preferred, then one whose description… |
| note | string | – | Informational note explaining why historicalContext is null or incomplete, that NWIS reported no value for the current reading, or which statistics series the percentiles came from when methodMatched… |
| parameterCd | string | – | 5-digit USGS parameter code that was queried (e.g. "00060"). |
| parameterName | string | – | Human-readable parameter name with units (e.g. "Streamflow, ft³/s"). |
| qualifiers | array | – | Data qualifier codes for the current reading. When currentValue is empty they name why NWIS has no value (e.g. "Ssn" seasonal, "Dis" discontinued, "Dry", "Eqp" equipment malfunction). |
| siteName | string | – | Human-readable USGS site name. |
| siteNumber | string | – | USGS site number (8–15 digits, e.g. "01646500"). |
| unitCode | string | – | Unit of measure for currentValue and the historical percentiles (e.g. "ft3/s", "ft"). |
No examples provided.
water_get_readings Water Get Readings ~369
Get the latest instantaneous (~15-min, real-time) values for up to 100 USGS sites in one call — per-site, per-parameter records with timestamp, value, unit, and provisional/approved qualifiers. Omitting parameterCd returns every parameter each site publishes. A site measuring one parameter with several sensors returns one series per method, each named by methodId and methodDescription. At most 100 series return per call — every site that returned data keeps at least one, and totalSeries reports how many NWIS returned; pass parameterCd or split the sites across calls to reach the rest. Each series returns only its 10 most recent records (totalValues reports the true count); truncated=true when either cap applied. Use water_get_series for a full date-range series. Sites NWIS returns nothing for are listed in missingSites, not dropped silently. Use water_find_sites first to discover site numbers and available parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| parameterCd | array | – | Parameter codes to return. Omit to get every parameter each site publishes — one series per site, parameter, and method, so a large batch can exceed the 100-series cap. Use water_list_parameters to d… |
| period | string | – | ISO 8601 duration for the lookback period (e.g. "PT2H" = last 2 hours, "P1D" = last 1 day, "P7D" = last 7 days). Default: "PT2H" (last 2 hours of readings). Widening it raises totalValues, but each s… |
| sites | array | yes | One or more USGS site numbers to query. Maximum 100 per call. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| missingSites | array | – | Requested site numbers NWIS returned no series for — the site may not exist, or may not measure the requested parameter(s) in the requested period. Empty when every requested site returned data. Veri… |
| query | object | – | Query parameters used for this request. |
| readings | array | – | Time series per site + parameter + method combination, in NWIS order (site, then parameter code, then method). A method block NWIS returned empty is omitted when another method of the same site and p… |
| total | integer | – | Number of site + parameter + method time series returned in readings (at most 100). |
| totalSeries | integer | – | Number of site + parameter + method time series before the 100-series cap — an empty method block omitted as described under readings is not counted. Greater than total exactly when the cap dropped s… |
| truncated | boolean | – | True when either cap applied. The series cap: totalSeries > total — pass parameterCd or split the sites across calls. The 10-record cap: some readings[].totalValues > values.length — use water_get_se… |
No examples provided.
water_get_series Water Get Series ~641
Get a daily or instantaneous time series for one USGS site and parameter over a date range, as time-ordered value records. NWIS can hold several series for one query — one per daily statistic (mean, maximum, minimum) and one per sensor (method); this returns one, reporting its statCd and methodId, and lists the rest in otherSeries so any can be re-requested with the statCd and methodId inputs. By default it returns the daily mean when NWIS returns one with values, and the method with the most records. Large sets (>500 records) return the most recent records inline with truncated=true — the last 500 without DataCanvas, and with DataCanvas enabled the complete series also spills to a canvas (canvas_id/table_name): inspect the staged table with water_dataframe_describe, then read the full series with water_dataframe_query. Use water_find_sites and water_list_parameters to resolve inputs.
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | Canvas ID from a prior call to add this series as a table on an existing canvas rather than creating a new one. Each distinct site, parameter code, series type, date range, and selected statistic and… |
| endDate | string | yes | End date in YYYY-MM-DD format (e.g. "2024-12-31"). |
| methodId | string | – | NWIS method ID of the sensor series to return — the methodId or an otherSeries[].methodId from a prior response for the same site, parameter, and seriesType. Omit for the method with the most records… |
| parameterCd | string | yes | A single 5-digit USGS parameter code (e.g. "00060" for discharge, "00065" for gage height). One code per call — this tool returns one series. Use water_list_parameters to discover available codes. |
| seriesType | string | – | "daily" returns one value per day (DV service, typically mean/max/min). "instantaneous" returns ~15-minute readings (IV service). Default: "daily". Use "instantaneous" for high-resolution analysis. |
| site | string | yes | USGS site number (8–15 digits, e.g. "01646500" for Potomac River at Little Falls). Use water_find_sites to discover valid site numbers. |
| startDate | string | yes | Start date in YYYY-MM-DD format (e.g. "2024-01-01"). |
| statCd | string | – | Daily statistic to return, as a 5-digit NWIS code: "00003" mean, "00001" maximum, "00002" minimum. Omit for the mean when NWIS returns one with values, otherwise the first statistic that has values;… |
| Name | Type | Req | Description |
|---|---|---|---|
| canvas_id | string | – | Canvas ID for the DataCanvas holding the full time series. Present only when truncated=true and DataCanvas is enabled. Pass to water_dataframe_describe then water_dataframe_query. |
| error | object | – | Present when the call failed. Absent on success. |
| methodDescription | string|null | – | NWIS description of that method (e.g. "From multiparameter sonde", "7.1 ft from riverbed (top), [Discontinued]"). Null when NWIS leaves it blank, as it does for the default series at most single-sens… |
| methodId | string|null | – | NWIS method ID of the sensor series returned. Pass it back as the methodId input to request this series again. Null only when NWIS returned the series with no method block. |
| notice | string | – | Advisory about this result: the staged canvas table and how to read it, the advice to narrow the date range when the series was truncated with no canvas available, or the fact that a supplied canvas_… |
| otherSeries | array | – | Every other statistic × method series NWIS returned for this query — re-request one with its statCd and methodId. Empty when the query produced a single series. A method block with no values over the… |
| parameterCd | string | – | 5-digit USGS parameter code (e.g. "00060" for discharge). |
| parameterName | string | – | Human-readable parameter name with units (e.g. "Streamflow, ft³/s"). |
| query | object | – | Query parameters used for this request. |
| seriesType | string | – | "daily" = one value per day (DV service); "instantaneous" = ~15-minute readings (IV service). |
| siteName | string | – | Human-readable USGS site name. |
| siteNumber | string | – | USGS site number (8–15 digits, e.g. "01646500"). |
| statCd | string | – | NWIS statistic code of the returned series: "00003" daily mean, "00001" daily maximum, "00002" daily minimum, "00000" for instantaneous values. |
| statName | string|null | – | Statistic name NWIS attaches to statCd (e.g. "Mean", "Maximum"). Null when NWIS gives none, as for instantaneous values. |
| table_name | string | – | DuckDB table name in the canvas holding all records. Present when canvas_id is present. Use as the FROM target in water_dataframe_query SQL. |
| totalRecords | integer | – | Total number of records in the upstream result set (before any truncation). |
| truncated | boolean | – | True when the result exceeds 500 records and only the most recent were returned inline. When canvas_id is present, inspect the staged table with water_dataframe_describe then read the full series wit… |
| unitCode | string | – | Unit of measure for all values in this series (e.g. "ft3/s", "ft"). |
| values | array | – | Time-ordered value records, oldest first within the slice. Holds every record when truncated is false; when truncated, the most recent records only — the last 500 without DataCanvas, or the last N th… |
No examples provided.
water_get_site_data_catalog Water Get Site Data Catalog ~270
Discover a USGS site’s parameters, sensors, statistics, and UTC record bounds before calling water_get_series. Find site numbers with water_find_sites. Each row is a distinct series; metadata bounds may contain gaps and lag observations. For water_get_series, take YYYY-MM-DD from beginDate/endDate, pass statCd only for daily rows, and obtain methodId from a water_get_series response; timeSeriesId is an OGC identifier, never an NWIS methodId. Rows with null seriesType are other computations and cannot be requested with water_get_series. Follow nextCursor with the same filters and limit until null.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Opaque nextCursor from the previous page; keep site, parameterCd, seriesType, and limit unchanged. |
| limit | integer | – | Maximum metadata rows per page (1–1000; default 100). Keep unchanged when using cursor. |
| parameterCd | string | – | Optional 5-digit parameter code from water_list_parameters, e.g. "00060". |
| seriesType | string | – | Limit to Daily computations or Points/Instantaneous computations. Omit to include all periods. |
| site | string | yes | USGS site number (8–15 digits), from water_find_sites; e.g. "01646500". |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| nextCursor | string|null | – | Continuation for the same filters and limit, or null when no next page exists. |
| series | array | – | One metadata page; distinct sensors/statistics remain separate. Empty when a known site has no matching rows. |
| siteName | string|null | – | Upstream site name, or null when unavailable. |
| siteNumber | string | – | USGS site number, preserving leading zeros. |
No examples provided.
water_list_parameters Water List Parameters ~324
Look up USGS parameter codes — the 5-digit codes every other tool's parameterCd takes. With no query, lists a curated set of well-known codes with names, units, and thematic group, from a built-in table (no network call): 00060 = "Discharge" (ft³/s), 00065 = "Gage height" (ft), 00010 = "Temperature, water" (°C), 72019 = "Depth to water level" (ft), and others; filter it with group. For anything else — turbidity, nitrate, chlorophyll, suspended sediment, salinity — pass query to search the full USGS parameter-code catalog (~19,600 codes) by name and description, or pass a 5-digit code to look it up. A query returns at most 25 entries, matching curated codes first, with total counting every match.
| Name | Type | Req | Description |
|---|---|---|---|
| group | string | – | Filter the curated list by thematic domain: "streamflow", "groundwater", "temperature", "meteorological", "water-quality", or "all" (default). Applies to the curated list only — leave it "all" when p… |
| query | string | – | Search the full USGS parameter-code catalog. Case-insensitive; every word must start a word in the parameter name or description (e.g. "turbidity", "nitrate filtered", "dissolved oxygen"). A bare 5-d… |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| note | string | – | Guidance when a query matched nothing or was truncated. Absent otherwise. |
| parameters | array | – | Matching parameter entries. Without query: the curated codes. With query: matching curated codes first (each once, as its curated entry), then catalog records whose name holds every query word, then… |
| query | string | – | The catalog query searched, trimmed. Absent when listing the curated codes. |
| total | integer | – | Number of entries that matched, before the 25-entry cap. |
| truncated | boolean | – | True when a query matched more than 25 entries and only the first 25 are listed — add words to narrow it. |
No examples provided.
How do I install the io.github.cyanheads/usgs-water-mcp-server server?
io.github.cyanheads/usgs-water-mcp-server is a hosted endpoint at https://usgs-water.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · usgs-water.caseyjhand.com
claude mcp add --transport http cyanheads-usgs-water-mcp-server 'https://usgs-water.caseyjhand.com/mcp'
What is the io.github.cyanheads/usgs-water-mcp-server server?
io.github.cyanheads/usgs-water-mcp-server is listed in the public MCP registry as io.github.cyanheads/usgs-water-mcp-server. Query real-time and historical USGS water data from ~8,000 stream gages and groundwater wells. This page covers its hosted endpoint (https://usgs-water.caseyjhand.com/mcp).
Is the io.github.cyanheads/usgs-water-mcp-server server safe to use?
io.github.cyanheads/usgs-water-mcp-server scores 89 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.cyanheads/usgs-water-mcp-server server expose?
io.github.cyanheads/usgs-water-mcp-server exposes 8 tools: water_list_parameters, water_find_sites, water_get_readings, water_get_series, water_get_site_data_catalog, and 3 more. Their descriptions and schemas cost roughly 3,175 tokens of context every time the server is loaded.
Does the io.github.cyanheads/usgs-water-mcp-server server require authentication?
No. We connected to io.github.cyanheads/usgs-water-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the io.github.cyanheads/usgs-water-mcp-server server still maintained?
io.github.cyanheads/usgs-water-mcp-server is still listed as active in the MCP registry. We last reached this channel on 6 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What did VerifyMCP test on the io.github.cyanheads/usgs-water-mcp-server server?
VerifyMCP ran 13 checks on io.github.cyanheads/usgs-water-mcp-server, covering TLS certificate, Authorization, HTTPS, HSTS header and 9 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.