---
summary: "Definition-language pass over every tool and resource: concatenated description strings collapse to single strings, and inaccurate ones are corrected — the water_dataframe_* tools now name water_find_sites as a canvas producer, row_count describes what it actually counts, and water_get_conditions explains both of its data-gap cases."
breaking: false
security: false
---

# 0.2.1 — 2026-07-19

## Changed

- **Descriptions are single strings** — every `description` and `.describe()` across the seven tool definitions, both resource definitions, and `createApp()`'s `instructions` is one string or template literal instead of `+`-concatenated fragments, matching the description convention in `CLAUDE.md` / `AGENTS.md`.
- **Four tool descriptions rewritten shorter** — `water_find_sites`, `water_get_readings`, `water_get_series`, and `water_get_conditions` state the same capability, workflow, and cap/spillover semantics in roughly half the words. `water_list_parameters` leads with what it returns rather than "Static lookup".

## Fixed

- **`water_dataframe_describe` / `water_dataframe_query` named only `water_get_series` as a canvas producer** — `water_find_sites` has staged its full match set to a canvas since 0.1.12, so a client reading either tool's description had no way to learn a find-sites `canvas_id` was queryable. Both descriptions and both `canvas_id` inputs now name `water_find_sites` alongside `water_get_series`.
- **`water_dataframe_query`'s `sql` input listed series-only columns** — the hardcoded `date_time` / `value` / `qualifiers` / `site_number` / `parameter_cd` / `unit_code` list holds for series tables but not for the site tables `water_find_sites` stages. Replaced with a pointer to `water_dataframe_describe` for the actual schema.
- **`water_dataframe_query`'s `row_count` described the wrong quantity** — documented as "Total rows matched by the query before the 10,000-row cap", it carries the number of rows returned, so a query matching more than 10,000 rows undercounts with no error. The description now states what the field counts, discloses the silent truncation, and points at `SELECT COUNT(*)` or `water_dataframe_describe` for the true total.
- **`water_get_conditions` blamed the site for a missing percentile record** — the `no_record` note attributed an empty stat table to a new or short-record gage, but NWIS publishes no daily-statistics percentile product at all for some parameters (commonly gage height, `00065`). The note now offers that cause alongside a too-new or too-short record.
- **`water_get_conditions`'s no-current-reading error gave no window and no next step** — `No current reading for site <site> parameter <parameterCd>.` now names the two-hour lookback the tool queries, states that the site does report the parameter, and points at `water_get_series` for historical values.
- **Server instructions misnamed parameter `00065`** — `GageHeight` → `Gage height`, matching `water_list_parameters` and the NWIS parameter name.

## Dependencies

- `@biomejs/biome` ^2.5.0 → 2.5.4 (exact pin, no range)
