---
summary: "Adds the opt-in water_dataframe_drop tool, stops the server at startup on an invalid USGS_REQUEST_TIMEOUT_MS, and moves to mcp-ts-core 0.13.11, whose tool errors end with their request id."
breaking: false
security: false
---

# 0.3.0 — 2026-10-03

## Added

- **`water_dataframe_drop`** drops one table, by name (matched case-insensitively), from a DataCanvas staged by `water_get_series` or `water_find_sites`; the canvas and its other tables stay. Returns `row_count` and `remaining_tables`, and a name that is not staged fails with `table_not_found` and changes nothing.
- **`WATER_DATAFRAME_DROP_ENABLED`** (default `false`) opts in to `water_dataframe_drop`, since dropping a table discards staged data. Off, the tool is listed as disabled on the landing page and in the startup log and is absent from `tools/list`; a call also needs `CANVAS_PROVIDER_TYPE=duckdb`.

## Changed

- **`water_dataframe_describe` and `water_dataframe_query` descriptions**, and the server instructions, name `water_dataframe_drop` as the cleanup step where the server enables it.
- **Tool error text closes with the request id** — `(reason invalid_arguments · request <id>)` where 0.2.6 printed `(reason invalid_arguments)` (mcp-ts-core 0.13.10, [cyanheads/mcp-ts-core#576](https://github.com/cyanheads/mcp-ts-core/issues/576)).
- **A malformed `canvas_id`** is rejected with a plain-language message ("Expected a canvas ID exactly as an earlier response on this server returned it…") instead of the bare regex; the advertised JSON Schema is unchanged (mcp-ts-core 0.13.9, [cyanheads/mcp-ts-core#483](https://github.com/cyanheads/mcp-ts-core/issues/483)).
- **An integer sent for a string field, or a JSON-stringified object for an object field, is repaired before validation** — `water_list_parameters` with `query: 60` is accepted where 0.2.6 rejected it (mcp-ts-core 0.13.9, [cyanheads/mcp-ts-core#487](https://github.com/cyanheads/mcp-ts-core/issues/487), [cyanheads/mcp-ts-core#479](https://github.com/cyanheads/mcp-ts-core/issues/479)).
- **Declared recovery hints** are filled in by the framework instead of forwarded by hand at each throw site; the hints callers receive are the same (mcp-ts-core 0.13.10, [cyanheads/mcp-ts-core#579](https://github.com/cyanheads/mcp-ts-core/issues/579)).
- **Docker image** installs dependencies in a `deps` stage on the build platform, so multi-arch builds stop running Bun under emulation (mcp-ts-core 0.13.10, [cyanheads/mcp-ts-core#575](https://github.com/cyanheads/mcp-ts-core/issues/575)), and prunes musl-only packages from the glibc runtime image (0.13.11, [cyanheads/mcp-ts-core#608](https://github.com/cyanheads/mcp-ts-core/issues/608)). The unused `MCP_FORCE_CONSOLE_LOGGING` env is gone.
- **`server.json` npm entries** drop the `run start:*` arguments and set `runtimeHint: "npx"`, and the `streamable-http` entry pins `MCP_TRANSPORT_TYPE` to `http` (scaffold change in mcp-ts-core 0.13.11, [cyanheads/mcp-ts-core#622](https://github.com/cyanheads/mcp-ts-core/issues/622)).
- **Env docs** — `.env.example` documents `MCP_REQUEST_STATE_KEY`, `LOG_TOOL_FAILURE_PAYLOADS` / `LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES`, and the per-signal OTLP endpoint variables, and the README env table adds `LOG_TOOL_FAILURE_PAYLOADS` (options from mcp-ts-core 0.13.7, 0.13.8, and 0.13.10).
- **Housekeeping** — framework skills and scripts resynced from mcp-ts-core 0.13.11; CodeQL runs one job per language; `.gitignore` ignores every env file but the templates and `.dockerignore` every env file plus the MCP registry token files; `.mcpbignore` excludes `docs/idea.md` and `logs/`; `package.json` `files` excludes `dist/*.mcpb`; README tool sections and `CLAUDE.md`/`AGENTS.md` refreshed.

## Fixed

- **An invalid `USGS_REQUEST_TIMEOUT_MS` stops the server at startup** (exit 1, naming the variable). On 0.2.6 the server started and every call that reached USGS failed with `Server config validation failed`; the server config is now parsed when the server loads.

## Dependencies

- `@cyanheads/mcp-ts-core` ^0.13.6 → ^0.13.11, which brings these framework changes to this server:
  - DataCanvas scratch files live in a private directory created inside `CANVAS_TEMP_PATH` (now a parent directory) or the OS temp directory (0.13.9, [cyanheads/mcp-ts-core#554](https://github.com/cyanheads/mcp-ts-core/issues/554))
  - Concurrent canvas spills no longer corrupt each other (0.13.9, [cyanheads/mcp-ts-core#561](https://github.com/cyanheads/mcp-ts-core/issues/561))
  - `ctx.log`'s mirror to the client honors `MCP_LOG_LEVEL` and masks sensitive fields (0.13.11, [cyanheads/mcp-ts-core#621](https://github.com/cyanheads/mcp-ts-core/issues/621), [cyanheads/mcp-ts-core#630](https://github.com/cyanheads/mcp-ts-core/issues/630))
  - MCP SDK `@modelcontextprotocol/server` ^2.2.0 (0.13.9, 0.13.11)
- `@duckdb/node-api` ^1.5.5-r.5 → ^1.5.6-r.1
- Bun 1.4.0 → 1.4.2 (`packageManager`, Docker base images)
- Dev: `@biomejs/biome` ^2.5.14 → ^2.5.15, `@types/node` ^26.6.2 → ^26.6.3, `ignore` ^7.0.9 → ^7.0.11, `tsc-alias` ^1.9.5 → ^1.9.7, `vitest` ^5.0.1 → ^5.0.3
