---
summary: "Framework bump to ^0.5.3; rewrites tool format() bodies to satisfy the new format-parity linter so content[] now carries every output-schema field"
breaking: false
---

# 0.4.0 — 2026-04-20

## Changed

- Bumped `@cyanheads/mcp-ts-core` ^0.3.5 → ^0.5.3 and `typescript` ^6.0.2 → ^6.0.3
- Regenerated `bun.lock` from scratch against current caret ranges
- Rewrote tool `format()` bodies to satisfy the new framework `format-parity` linter: every terminal field in each tool's `output` schema now appears in the rendered `content[]` text
  - `openalex_analyze_trends` now surfaces `meta.count`, `meta.groups_count`, and the `next_cursor` value
  - `openalex_search_entities` header now includes `per_page` alongside the total count
  - `openalex_resolve_name` always renders `works_count` (including a `n/a works` branch for null)
- Replaced `.toLocaleString()` on linted numeric fields with raw digits so the linter's sentinel-injection matcher passes
- Synced `skills/` from the framework: `add-tool` 1.3 → 1.6, `design-mcp-server` 2.2 → 2.4, `maintenance` 1.2 → 1.3, `setup` 1.2 → 1.3, `polish-docs-meta` 1.3 → 1.4, `field-test` 1.1 → 1.2, `api-config` 1.1 → 1.2
- Expanded the `CLAUDE.md` / `AGENTS.md` checklist with the upstream additions (form-client guards, `format()` parity, OpenAlex-wrapping invariants); added `add-app-tool`, `report-issue-framework`, and `report-issue-local` to the skills table
- `AGENTS.md` now mirrors `CLAUDE.md` verbatim so both agent entry points stay in lockstep

## Fixed

- Tool output no longer diverges between `structuredContent` (programmatic) and `content[]` (LLM-visible) surfaces — both carry the full payload the output schema declares
