---
summary: "disabledTool/DisabledMetadata re-exported from package root (#109); new tool-defs-analysis skill (#111); Worker-runtime test harness via @cloudflare/vitest-pool-workers; example definitions polished; storage provider behavior table in README."
breaking: false
---

# 0.8.14 — 2026-05-04

Polish release. The `disabledTool` re-export gap promised by the 0.8.11 changelog is closed; a new audit skill walks the LLM-facing language across every definition in a server; example tool/resource definitions get a top-to-bottom title/description/recovery scrub so scaffolded servers ship with prose worth keeping; and a Workers-runtime test harness now exercises `createWorkerHandler` inside Miniflare instead of mocked stubs.

## Added

- **`disabledTool` and `DisabledMetadata` re-exported from the package root** ([#109](https://github.com/cyanheads/mcp-ts-core/issues/109)) — the 0.8.11 changelog claimed this surface but only the deep import path worked. `import { disabledTool, type DisabledMetadata } from '@cyanheads/mcp-ts-core'` now resolves; deep imports remain unchanged.
- **`tool-defs-analysis` skill** ([#111](https://github.com/cyanheads/mcp-ts-core/issues/111)) — read-only audit of MCP definition language across an existing surface. Walks every tool/resource/prompt and checks 10 categories the LLM reads to decide whether and how to call (voice, internal leaks, audience leaks, defaults, recovery hints, output descriptions, cross-references, sparsity, examples, structure). Produces grouped findings with `file:line` citations and a numbered options list. Complements `field-test` (behavior testing) and `security-pass` (security audit).
- **Storage Behavior Snapshot table in `README.md`** — six providers × two columns (delete-count accuracy, list-TTL filtering) so consumers can see the trade-offs at a glance without reading provider source.
- **Worker-runtime test harness** — new `vitest.worker.ts` config, `tests/fixtures/worker-runtime.fixture.ts`, and `tests/worker/create-worker-handler.worker.test.ts` exercise `createWorkerHandler` inside Miniflare via `@cloudflare/vitest-pool-workers`. Pinned to the system Node binary because the pool's loader hooks don't run under bun-node. Wired into `bun run test:worker` and the `test:all` chain.
- **`tests/integration/package-consumer.int.test.ts`** — verifies that a downstream project consuming `@cyanheads/mcp-ts-core` from `node_modules` resolves every documented subpath export and the package-root re-exports actually exist at runtime.
- **`tests/unit/linter/server-json-rules.test.ts`** — closes the test gap on `src/linter/rules/server-json-rules.ts`; the file is now pinned at 100% line/statement and 90% branch coverage.

## Changed

- **Example tool/resource/prompt definitions polished across the board** — titles trimmed of "Template" prefix (`Template Echo Message` → `Echo Message`, `Template Cat Fact` → `Random Cat Fact`, `Async Countdown (Task Demo)` → `Async Countdown`); descriptions rewritten in active voice with concrete behavior (`"Demonstrates the MCP Tasks API with a countdown timer"` → `"Run a countdown timer for the requested number of seconds, reporting progress as it ticks. Cancellable mid-run."`); ad-hoc `throw new Error(...)` replaced with `serviceUnavailable`/`validationError` factories carrying contract-style `recovery.hint`s. The same tightening flows through `templates/` so `npx @cyanheads/mcp-ts-core init` scaffolds servers that already meet `tool-defs-analysis` review standards.
- **JSDoc on `IStorageProvider` and `StorageOptions.ttl` documents per-provider behavior** — exact vs. idempotent delete counts, exact vs. native/eventual list-TTL filtering, and the `cloudflare-r2` `list()` opt-out. `cloudflare-d1` row appears alongside the existing providers; `in-memory` description corrected to "timers and lazy filtering on get/list" instead of "setTimeout for proactive deletion."
- **"Declare contracts inline on each tool" guidance** added to `AGENTS.md`/`CLAUDE.md`, `templates/AGENTS.md`/`templates/CLAUDE.md`, `skills/add-tool` (v2.6→2.7), and `skills/api-errors` (v1.4→1.5). Per-tool repetition of the `errors[]` contract is the intended cost of locality; a code-cleanup pass that suggests consolidating contracts into a shared module should be declined.
- **`skills/api-workers` (v1.2→1.3)** — Workers storage allowlist documentation tightened: `filesystem` and unknown provider types throw `ConfigurationError` in serverless environments instead of silently falling back to `in-memory`. The "silent force to in-memory" claim was outdated.
- **Coverage thresholds raised** in `vitest.config.ts` — global `lines 80→89`, `functions 75→90`, `branches 70→79`, `statements 80→88`. Per-file pins added: `src/linter/rules/server-json-rules.ts` at 100/100/90/100 and `src/storage/providers/supabase/supabaseProvider.ts` at 95/100/60/85 to lock in the new test coverage.
- **`@cloudflare/vitest-pool-workers ^0.15.2`** added to `devDependencies`; corresponding type packages added to `tsconfig.json` and `tsconfig.test.json` `types` arrays.
- **`devcheck.config.json`** — `cloudflare:*` added to depcheck `ignoreMatches` so `cloudflare:test` and `cloudflare:workers` virtual specifiers stop tripping the unused-deps check.
- **Stale `docs/audit/` and `docs/server-ideas/` removed** along with `docs/conformance-test-plan.md` and `docs/resource-notifications.md` — historical scaffolding that was no longer referenced from anywhere.
- **Dependency bumps** — `zod ^4.4.2 → ^4.4.3` (peer), `@cloudflare/workers-types ^4.20260503.1 → ^4.20260505.1`, `@supabase/supabase-js ^2.105.1 → ^2.105.3`, `openai ^6.35.0 → ^6.36.0`. `zod` removed from `dependencies` (it was already declared as a peer dep; the duplicate listing is gone).

## Fixed

- **Package-root export of `disabledTool`/`DisabledMetadata`** ([#109](https://github.com/cyanheads/mcp-ts-core/issues/109)) — see Added.
