---
summary: "Security: DataCanvas SQL gate fails closed on non-SELECT and denies pragma_* table functions; scaffold/packaging fixes and actionable scheduler peer error."
breaking: false
security: true
agent-notes: |
  Existing servers don't inherit scaffold fixes — on the next maintenance pass, anchor `.mcpbignore` dev-dir patterns (`/skills/`, `/.agents/`, `/.claude/`) and switch `package.json` scripts to `bun run scripts/*.ts`. #210 (canvas) and #200 (scheduler) are framework `src/` changes that apply on upgrade.
---

# 0.10.1 — 2026-06-08

## Fixed

- **Scaffold build scripts** now run under Bun, dropping the `tsx` dependency ([#205](https://github.com/cyanheads/mcp-ts-core/issues/205)) — template `package.json` used `tsx` (fails under Bun: `Cannot find module './cjs/index.cjs'`); switched to `bun run scripts/*.ts`.
- **Template manifest ships a valid `repository` object** ([#206](https://github.com/cyanheads/mcp-ts-core/issues/206)) — added in mcpb's required object form so scaffolded servers pack cleanly.
- **Anchored `.mcpbignore` dev-dir patterns** ([#207](https://github.com/cyanheads/mcp-ts-core/issues/207)) — patterns in `templates/_.mcpbignore` re-anchored to root (regression of [#172](https://github.com/cyanheads/mcp-ts-core/issues/172)) so they can't strip nested `node_modules` runtime paths; `lint:packaging` now guards bundle content.
- **Actionable error when the `node-cron` peer is missing** ([#200](https://github.com/cyanheads/mcp-ts-core/issues/200)) — `SchedulerService` no longer crash-loops the server with a raw module-not-found; the lazy import throws a `configurationError` naming the peer (`^4.2.1`).

## Security

- **DataCanvas SQL gate fails closed** ([#210](https://github.com/cyanheads/mcp-ts-core/issues/210)) — non-preparable statements (e.g. bare `PRAGMA`) previously returned a generic `InternalError` (-32603) instead of the documented `non_select_statement` `ValidationError`. Additionally, `pragma_*` table functions (`SELECT * FROM pragma_table_info(...)`) bypassed the SELECT-only guarantee. The gate now rejects anything it cannot prove is a single SELECT and denies the entire `pragma_*` namespace across both the pre-plan scan and the plan walk.

## Changed

- `hono` ^4.12.23 → ^4.12.24
- `@modelcontextprotocol/ext-apps` ^1.7.3 → ^1.7.4
- `@cloudflare/workers-types` (dev) 4.20260605.1 → 4.20260608.1
- `@types/node` (dev) ^25.9.1 → ^25.9.2
- `@supabase/supabase-js` (dev) ^2.107.0 → ^2.108.0
