Pod

Available as Markdown and JSON. Pod is also available over MCP.

Reported issues for usgs-water-mcp-server

Pod holds 14 of 14 GitHub reports that passed its relevance review. This can include external user reports, maintainer-confirmed bugs, and concrete feature gaps. Treat them as evidence to inspect, not a count of distinct defects.

Back to usgs-water-mcp-server.

Most discussed

fix(nwis): a truncated 200 response escapes as a raw SyntaxError instead of upstream_error

Server version

0.2.5

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

1.4.0

Transport

stdio

OS

macOS

Description

getReadings and getSeries in src/services/nwis/nwis-service.ts call JSON.parse on the NWIS body unguarded. NWIS sometimes answers HTTP 200 with a body cut off mid-document, so JSON.parse throws a raw SyntaxError. classifyNwisFailure maps only McpError codes and returns null for it, and the caller gets a generic internal…

Read the thread · 2026-09-25 · closed · 1 comment

fix(nwis): the -999999 no-data sentinel is reported as a measurement and ranked record-low

Server version

0.2.5

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

1.4.0

Transport

stdio

OS

macOS

Description

NWIS reports a reading it cannot provide as -999999, the series' variable.noDataValue, with a qualifier giving the reason (Ssn seasonal, Dis discontinued, Dry, Rat rating in development, Eqp equipment). parseWaterml in src/services/nwis/nwis-service.ts never reads noDataValue, so the sentinel passes through as a…

Read the thread · 2026-09-25 · closed · 1 comment

fix(water_get_conditions): a value outside p25–p75 is classified normal or unknown when an outer percentile is blank

Server version

0.2.5

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

1.4.0

Transport

stdio

OS

macOS

Description

classifyPercentile in water-get-conditions.tool.ts tests each band only when both of its bounds are present, and the normal band never checks its upper bound. NWIS leaves p05_va, p10_va, and p95_va blank on short records, so a value above p75 is reported as normal ("25th–75th percentile"), and a value below p25 as…

Read the thread · 2026-09-25 · closed · 1 comment

fix(nwis): WaterML parser drops every method block after the first; water_get_series returns the first daily statistic

Server version

0.2.5

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

1.4.0

Transport

stdio

OS

macOS

Description

parseWaterml in src/services/nwis/nwis-service.ts reads only ts.values[0]. A WaterML timeSeries carries one values[] block per method (sensor), so every block after the first is dropped. Separately, the daily-values service returns one timeSeries per statistic code, and water_get_series answers with seriesList[0] whatever…

Read the thread · 2026-09-25 · closed · 1 comment

bug(water_get_series,water_find_sites): supplied canvas_id is resolved after the NWIS fetch and ignored when the result fits inline

Server version

0.2.4

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

Bun 1.4.x

Transport

stdio

Description

Both canvas producers handle a supplied canvas_id only inside the branch that stages data, after the NWIS fetch. Two consequences:

Read the thread · 2026-09-22 · closed · 1 comment

bug(water_get_series,water_find_sites): errors[] omits the canvas reasons acquire() throws

Server version

0.2.4

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

Bun 1.4.x

Transport

stdio

Description

water_get_series and water_find_sites call canvas.acquire(input.canvas_id, ctx) uncaught, but neither declares the reasons it throws in errors[]. A canvas_id that is well-formed but expired or never minted returns canvas_not_found (-32001); omitting canvas_id while the tenant is at its active-canvas cap…

Read the thread · 2026-09-19 · closed · 1 comment

feat(water_find_sites): validate the NWIS major-filter requirement locally instead of relaying the raw 400

water_find_sites forwards a request with no major filter straight to NWIS, which rejects it, and the raw upstream text is relayed:

NWIS rejected the request: HTTP Status 400 - no major-filter pairs supplied by user, server=[vaas01]

A call with only siteType (or only parameterCd) is enough to trigger it — NWIS requires one "major filter" (bbox, stateCd, countyCd, or huc in this tool's surface). The generic invalid_request recovery hint makes it worse: "Read the NWIS…

Read the thread · 2026-08-21 · closed · 1 comment

bug(water_find_sites): major-filter rule unenforced and undocumented; countyCd/bbox descriptions mislead

Server version

0.2.2

mcp-ts-core version

0.10.14

Runtime

Bun

Runtime version

Bun 1.3.x

Transport

stdio

Description

NWIS accepts exactly one major filter per /nwis/site/ request — one of stateCd, countyCd, huc, bBox in this tool's surface. water_find_sites neither enforces nor documents that, and the countyCd description recommends the one pairing NWIS rejects outright ("Use with stateCd for clarity").

Gap Effect
…

Read the thread · 2026-08-18 · closed · 1 comment

Most recent

ux(water_find_sites): truncation notice exposes CANVAS_PROVIDER_TYPE env var

Server version

0.2.4

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

Bun 1.4.0

Transport

stdio

Description

The truncated/no-canvas branch of water_find_sites's enrichment notice names the operator-set CANVAS_PROVIDER_TYPE env var. #2 removed it from tool descriptions and #8 removed it from the canvas_disabled error; this is the one remaining agent-facing occurrence, and it reaches both structuredContent (the enrichment field) and content[]…

Read the thread · 2026-08-13 · closed · 1 comment

ux(canvas): staged-data notices name only water_dataframe_query, omitting water_dataframe_describe

Use case

water_get_series and water_find_sites both stage their full result set to a DataCanvas table and return canvas_id + table_name. The runtime notice each emits on that path names water_dataframe_query and stops there — water_dataframe_describe, the only tool that exposes the staged table's columns, is never named in the response. An agent reading the notice goes to SQL with no column names, and then either guesses them or abandons the canvas and re-calls the producing…

Read the thread · 2026-08-13 · closed · 1 comment

feat(water_list_parameters): search the full USGS parameter-code catalog, not the 11-entry table

Use case

Every tool's parameterCd description sends callers to water_list_parameters, which serves 11 codes duplicated across water-list-parameters.tool.ts and water-parameters.resource.ts. USGS publishes 19,617 (as of 2026-09-25). Turbidity, nitrate, chlorophyll, suspended sediment, and salinity have no entry, and nothing says the list is partial.

Related: #32 (OGC API port), #30 (its parameterName join can reuse this reader)

Proposed behavior

{}…

[Read the thread](https://github.com/cyanheads/usgs-water-mcp-server/issues/31) · 2026-08-10 · closed · 1 comment

### feat(water_find_sites): add limit/offset so matches past the 500-site cap are reachable without DataCanvas

### Use case

`water_find_sites` caps inline results at 500 with no escape hatch in either direction. Without DataCanvas enabled — the default for stdio and `.mcpb` installs — a match set past 500 has no retrieval path at all: `stateCd: "RI"` alone matches 4,000+ sites, and the filter set runs out long before the cap does. A caller who wants ten gages in a state also has no way to ask for fewer than 500.

Related: #6 (added the cap; pagination was left open)

### Proposed behavior

Add…

[Read the thread](https://github.com/cyanheads/usgs-water-mcp-server/issues/29) · 2026-08-10 · closed · 1 comment

### bug(canvas): staged table names omit query dimensions, so a reused canvas_id silently replaces prior data

### Server version

0.2.2

### mcp-ts-core version

0.10.14

### Runtime

Bun

### Runtime version

Bun 1.3.x

### Transport

stdio

### Description

Both canvas producers build a table name from a subset of the query, so two different queries can land on the same name. `registerTable` is `DROP TABLE IF EXISTS` + `CREATE TABLE`, so reusing a `canvas_id` — which both tools advertise as the way to accumulate results — replaces the earlier table in place with no warning in the response.

| Tool |…

[Read the thread](https://github.com/cyanheads/usgs-water-mcp-server/issues/28) · 2026-08-10 · closed · 1 comment

### bug(water_get_series): canvas preview drops the newest records, the no-canvas path drops the oldest

### Server version

0.2.2

### mcp-ts-core version

0.10.14

### Runtime

Bun

### Runtime version

Bun 1.3.x

### Transport

stdio

### Description

`water_get_series` truncates from opposite ends depending on whether DataCanvas is enabled. Without a canvas the handler returns `ts.values.slice(-SPILLOVER_THRESHOLD)` — the **most recent** 500 records. With a canvas, `spillover()` fills its preview from the head of the source by construction, so `values` holds the **oldest** records that fit the…

[Read the thread](https://github.com/cyanheads/usgs-water-mcp-server/issues/27) · 2026-08-10 · closed · 1 comment

The remaining reports are on [the project's issue tracker](https://github.com/cyanheads/usgs-water-mcp-server/issues).