---
summary: "Adopts mcp-ts-core ^0.13.6: canvas_id inputs validate before any canvas lookup, water_dataframe_query classifies engine-side SQL failures, and a SQL-comment ReDoS fix reaches that same tool's sql input. Skill tree moves to framework-skills/."
breaking: false
security: false
---

# 0.2.4 — 2026-09-19

## Changed

- **`canvas_id` inputs** (`water_dataframe_describe`, `water_dataframe_query`, `water_find_sites`, `water_get_series`) now validate against the framework's minted `^[A-Za-z0-9_-]{10}$` shape at argument validation, before any canvas lookup — a malformed value returns a validation error instead of `canvas_not_found`.
- **`water_dataframe_query`** classifies an engine-side SQL failure (a parse error, a read-only violation, or a failed cast on staged data) as `invalid_sql` with a recovery hint, instead of rethrowing the raw DuckDB message unclassified.
- **HTTP session posture** (`stateless`) is declared in `src/index.ts` via `createApp({ sessionMode })` rather than left to `MCP_SESSION_MODE`, which still overrides it when set.
- **Skill tree** moved from `skills/` to `framework-skills/` — Claude Code and Codex auto-load a plugin's root `skills/`, so installing this server no longer hands an agent its development skills.
- **`README`** reorganized around an Overview and a per-tool/resource capability reference.
- **Runtime floor** — `engines.bun` raised to `>=1.4.0`, matching the framework.

## Dependencies

- `@cyanheads/mcp-ts-core` `^0.12.3` → `^0.13.6` — brings a linear-time fix for the SQL-comment scan `water_dataframe_query`'s `sql` input runs through, an SSRF DNS-guard hardening on outbound NWIS requests, and upstream error responses that omit the request URL by default.
- `zod` `^4.4.3` → `^4.6.5`
- `@duckdb/node-api` `^1.5.5-r.4` → `^1.5.5-r.5`
- `vitest` (dev) `^4.1.11` → `^5.0.1`
- `@biomejs/biome` (dev) `^2.5.9` → `^2.5.14`
- `@types/node` (dev) `^26.2.0` → `^26.6.1`
- `ignore` (dev) `^7.0.6` → `^7.0.9`
- `tsc-alias` (dev) `^1.9.2` → `^1.9.5`
