---
summary: "water_find_sites enforces NWIS's one-major-filter rule and adds limit/offset paging; water_get_series canvas previews now show the most recent records; both tools derive deterministic per-query canvas table names, resolve a supplied canvas_id before the upstream call, and point staged-data notices at water_dataframe_describe first."
breaking: false
security: false
---

# 0.2.5 — 2026-09-22

## Added

- **`water_find_sites`** gains `limit`/`offset` paging — `truncated` now means matches remain after the returned window; an out-of-range `offset` returns an empty page with a notice naming the valid range instead of `no_sites_found` (#29)

## Fixed

- **`water_find_sites`** rejects zero or more than one of `bbox`/`stateCd`/`countyCd`/`huc` before any NWIS call, with typed `missing_major_filter`/`conflicting_major_filters` reasons (#36)
- **`water_get_series`**'s canvas-path preview now holds the most recent records instead of the oldest, matching the no-canvas path's direction (#27)
- Staged canvas table names on both tools now carry every filter or query dimension that changes the rows, so a reused `canvas_id` no longer silently replaces unrelated data (#28)
- Both tools resolve a supplied `canvas_id` before the upstream request — a stale id now fails without an NWIS round trip — and declare `canvas_not_found`/`canvas_capacity_exhausted` in their error contracts (#39, #40)
- Staged-data notices on both tools name `water_dataframe_describe` ahead of `water_dataframe_query` (#34)
- `water_find_sites`'s truncation notice no longer names the `CANVAS_PROVIDER_TYPE` env var (#35)

## Dependencies

- `@types/node` (dev) `^26.6.1` → `^26.6.2`
