---
summary: "NWIS series are read per statistic and sensor method, the -999999 no-data value reads as missing, and water_list_parameters searches the full USGS parameter-code catalog."
breaking: false
security: false
---

# 0.2.6 — 2026-09-24

## Changed

- **`water_list_parameters`** takes a `query` that searches the full USGS parameter-code catalog (~19,600 codes) by name, description, or 5-digit code. Results carry `source` (`curated` | `usgs-catalog`) and are capped at 25 with `total`/`truncated`. The catalog is cached for 24 hours; a failed fetch is a retryable `upstream_error`. The tool now declares `openWorldHint: true`, since a query reads the live catalog ([#31](https://github.com/cyanheads/usgs-water-mcp-server/issues/31))
- **`usgs-water://parameters`** now describes itself as the curated subset and shares one table with `water_list_parameters`. `USGS_USER_AGENT` and `USGS_REQUEST_TIMEOUT_MS` also apply to the catalog request ([#31](https://github.com/cyanheads/usgs-water-mcp-server/issues/31))
- **`water_get_series`** returns one named series. It defaults to the daily mean and the method with the most records, takes `statCd`/`methodId` to pick another, and lists the rest in `otherSeries`. Staged tables gain `stat_cd`/`method_id` columns ([#43](https://github.com/cyanheads/usgs-water-mcp-server/issues/43))
- **`water_get_readings`** returns at most 100 series per call, kept round-robin across sites, with the pre-cap count in `totalSeries`; `truncated` now covers both this cap and the 10-record cap ([#33](https://github.com/cyanheads/usgs-water-mcp-server/issues/33))
- **`water_get_conditions`** names the reporting method and matches percentiles to it by description (`statSeriesId`, `statSeriesDescription`, `methodMatched`). A new `historicalContextStatus` value, `no_matching_method`, reports a stat table with several sensor series where none matches ([#43](https://github.com/cyanheads/usgs-water-mcp-server/issues/43))
- **`acquireCanvas()`** resolves a caller-supplied `canvas_id` for all four canvas tools, replacing four copies of the `canvas_not_found` rethrow. The dataframe tools' recovery hints now name `water_find_sites` alongside `water_get_series` ([#41](https://github.com/cyanheads/usgs-water-mcp-server/issues/41))

## Fixed

- **WaterML parsing** reads every method block, not just the first. `water_get_readings` returns one series per sensor (`methodId`, `methodDescription`), and `water_get_conditions` no longer reports `no_data_for_parameter` when the current reading sits in a later block ([#43](https://github.com/cyanheads/usgs-water-mcp-server/issues/43))
- **`water_get_series`** no longer answers a multi-statistic daily query with whichever statistic NWIS listed first, unlabeled ([#43](https://github.com/cyanheads/usgs-water-mcp-server/issues/43))
- **NWIS no-data value (`-999999`)** now reads as a missing value with its qualifiers kept (`Ssn`, `Dis`, `Dry`, `Eqp`). `water_get_conditions` no longer ranks it as `record-low`, and staged canvas rows hold `NULL` ([#45](https://github.com/cyanheads/usgs-water-mcp-server/issues/45))
- **Truncated or non-JSON 200 responses** from the IV/DV services are retried and then surface as a retryable `upstream_error` instead of a raw `SyntaxError` ([#46](https://github.com/cyanheads/usgs-water-mcp-server/issues/46))
- **`water_get_conditions`** classifies by the percentiles NWIS published when p05, p10, or p95 is blank. A value above p75 is no longer reported `normal`, nor one below p25 `unknown`, and the label names the missing threshold ([#44](https://github.com/cyanheads/usgs-water-mcp-server/issues/44))
- **Curated parameter labels**: `62610` is groundwater level above NGVD 1929, and `72150` is groundwater level above LMSL ([#31](https://github.com/cyanheads/usgs-water-mcp-server/issues/31))

## Dependencies

- `@socketsecurity/bun-security-scanner` (dev) `^1.1.2` → `^1.1.3`
