---
summary: "Adopt @cyanheads/mcp-ts-core ^0.10.6 — truncation enrichment on browse, machine-name identity, packaging hardening"
breaking: false
security: false
---

# 0.1.2 — 2026-06-12

Adopts `@cyanheads/mcp-ts-core` `^0.10.6` and its new primitives, with the supporting vendored tooling and skill sync.

## Added

- **`ctx.enrich.truncated()` on `gutenberg_browse_popular`** — when the catalog holds more matches than the returned page, the response now discloses `truncated`, `shown`, `cap`, and `truncationCeiling` (download count of the least-popular book shown), with guidance to raise `limit` (max 32) or page via `gutenberg_search_books`.
- **`name` / `title: 'gutenberg-mcp-server'`** set explicitly in `createApp()` — display identity is the unscoped machine name on every surface, not the scoped npm name.
- **`scripts/clean-mcpb.ts`** — post-pack bundle cleaner wired into the `bundle` script; runs `mcpb clean` and strips dependency-shipped agent-doc entries (`skills/`, `.claude/`, `.agents/`, `SKILL.md`) nested under `node_modules/` that root-anchored `.mcpbignore` patterns cannot reach.
- **`Dockerfile` `HEALTHCHECK`** — bun-native `fetch` against `/healthz` (the slim image ships no curl/wget); plus an `APP_VERSION` build arg surfaced as the `org.opencontainers.image.version` OCI label, and writable `.cache` / `.mirror` dirs owned by the runtime user.

## Changed

- **`gutenberg_get_text` error codes** — `audio_book` and `offset_out_of_range` reclassified from `InvalidParams` (-32602) to `ValidationError` (-32007); both describe a failed validation of the resolved book, not a malformed JSON-RPC params object.
- **`scripts/lint-packaging.ts`** — added bundle-content guards (root dev dirs excluded; `.mcpbignore` patterns anchored so they don't strip runtime paths under `node_modules/`; built `.mcpb` carries zero agent-doc entries) and an identity check (`name`/`title` in `createApp()` and manifest `display_name` must equal the unscoped package name).
- **`scripts/check-framework-antipatterns.ts`** — added a `z.coerce.boolean()` rule (env booleans can't be disabled — `Boolean("false")` is `true`; use `z.stringbool()`), scoped to `src/` so it fires in consumer config; comment-line matches are skipped as mentions.
- **`.codex-plugin/plugin.json` `interface.displayName`** — `@cyanheads/gutenberg-mcp-server` → `gutenberg-mcp-server`.
- **`README.md` MCP client config key** — `gutenberg` → `gutenberg-mcp-server` in the stdio, npx, and Docker install snippets.
- **`.mcpbignore`** — root dev-dir patterns anchored with a leading `/` so they no longer match nested `node_modules/**` runtime paths.
- Vendored skills resynced to the installed framework version; added `skills/orchestrations/` and `skills/techniques/`.

### Dependencies

- `@cyanheads/mcp-ts-core` `^0.9.19` → `^0.10.6`
- `@biomejs/biome` `^2.4.7` → `^2.4.16`
- `@types/node` `^25.6.0` → `^25.9.3`
- `tsc-alias` `^1.8.16` → `^1.8.17`
