← Back to search

io.github.cyanheads/usgs-water-mcp-server

cyanheads streamable_http Scanned 25d ago

Query real-time and historical USGS water data from ~8,000 stream gages and groundwater wells.

B
81 / 100

Versions

0.1.1latest
first seen Jun 5, 2026
PermissionsTool SafetyAuthAnnotationsCode QualityStabilitySpecVuln HistoryAuthorTransparencyCommunity

Tools 7

water_get_conditions
annotations: verified low

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. Use water_find_sites and water_list_parameters to resolve inputs.

input object output object siteName string siteNumber string currentDateTime string
readOnlyHint true openWorldHint true idempotentHint true
water_dataframe_describe
annotations: verified low

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. Requires DataCanvas to be enabled on this server instance. Returns an error if DataCanvas is not available.

kind enum type string input object output object nullable boolean
readOnlyHint true openWorldHint false idempotentHint true
water_get_series
annotations: verified low

Get a daily or instantaneous time series for one USGS site and parameter over a date range, as time-ordered value records. Large sets (>500 records) return the most recent 500 with truncated=true; with DataCanvas enabled they instead spill to a canvas (canvas_id/table_name) for SQL via water_dataframe_query. Use water_find_sites and water_list_parameters to resolve inputs.

input object output object siteName string siteNumber string parameterCd string
readOnlyHint true openWorldHint true idempotentHint true
water_list_parameters
annotations: verified low

List well-known USGS parameter codes with human-readable names, units, and thematic domain — a static, built-in catalog. Use this first to discover that 00060 = "Discharge" (ft³/s), 00065 = "Gage height" (ft), 00010 = "Temperature, water" (°C), 72019 = "Depth to water level" (ft), etc. Filter by group to narrow results.

input object total number output object
readOnlyHint true openWorldHint false idempotentHint true
water_dataframe_query
annotations: verified low

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). 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.

input object output object
readOnlyHint true openWorldHint false idempotentHint true
water_find_sites
annotations: verified low

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. Capped at 500 sites inline; when truncated=true, upstreamTotal holds the full count and, if DataCanvas is enabled, the complete match set stages to a canvas (canvas_id/table_name) for retrieval via water_dataframe_query — otherwise narrow the filters to get all matches.

input object
readOnlyHint true openWorldHint true idempotentHint true
water_get_readings
annotations: verified low

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. Each series returns only its ${VALUES_PER_SERIES_CAP} most recent records (totalValues reports the true count; truncated=true if any were capped); 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.

input object total number output object
readOnlyHint true openWorldHint true idempotentHint true

Permissions 2

shell high
Server uses shell capabilities via: child_process, spawn(), spawnSync()
env_vars low
Server uses env_vars capabilities via: process.env

Scan Findings 24

info
Tool 'water_get_conditions' annotations are consistent annotation_checker · 80%
info
Tool 'water_dataframe_describe' annotations are consistent annotation_checker · 80%
info
Tool 'water_get_series' annotations are consistent annotation_checker · 80%
info
Tool 'water_list_parameters' annotations are consistent annotation_checker · 80%
info
Tool 'water_dataframe_query' annotations are consistent annotation_checker · 80%
info
Tool 'water_find_sites' annotations are consistent annotation_checker · 80%
info
Tool 'water_get_readings' annotations are consistent annotation_checker · 80%
info
Sandbox failed to start for behavioral verification behavioral_verifier · 100%
info
package.json metadata manifest_parser · 100%
info
Tool: water_get_conditions manifest_parser · 75%
info
Tool: water_dataframe_describe manifest_parser · 75%
info
Tool: water_get_series manifest_parser · 75%
info
Tool: water_list_parameters manifest_parser · 75%
info
Tool: water_dataframe_query manifest_parser · 75%
info
Tool: water_find_sites manifest_parser · 75%
info
Tool: water_get_readings manifest_parser · 75%
info
Required env vars (4) manifest_parser · 80%
info
Sandbox failed to start for output poisoning scan output_poisoning · 100%
high
Permission: shell access detected permission_analyzer · 95%
low
Permission: env_vars access detected permission_analyzer · 90%
critical
Tool poisoning in 'water_dataframe_describe': Cross-tool sequencing directive poisoning · 85%
info
SBOM generated: 12 components sbom_generator · 100%
high
Hardcoded Password found in cyanheads-usgs-water-mcp-server-eb73e44/framework-skills/api-utils/references/security.md secret_scanner · 65%
medium
No build provenance detected (SLSA L0) slsa_assessor · 90%