v2.4.0
What's new
Per-field wire-format spec
BlueprintsRouter::get now emits a _format_spec per field describing the exact wire format — shape, allowed node types/marks, set handles, recursive set definitions, and canonical examples. Covers bard (inline + full), replicator, grid, group, markdown, scalar, select/checkbox, relationship, asset, table, and date fields. This eliminates the guessing game that caused agents to produce malformed bard/replicator payloads. (#29)
Configurable confirmation actions
New confirmation.actions config block allows per-domain control over which MCP actions require confirmation tokens. Operators can now gate entries.update, entries.publish, globals.update, etc. without forking the package. Domains not listed fall back to default. * gates every action; [] disables the gate. Shipped defaults preserve existing behaviour. (#26)
Client-safe exception messages
FieldFormatException, ValidationException, FieldtypeNotFoundException, and BlueprintNotFoundException messages now survive production sanitization — agents get actionable error messages instead of a generic placeholder.
Bug fixes
- Entry slug self-collision on update —
updateEntry()no longer fails with "slug already taken" when updating an entry without changing its slug (#28) - Table cell normalization —
SanitizesFieldDatanow correctly normalizes{value: …}objects in table cells to plain strings, preventing[object Object]rendering in the CP - Playwright CI stability — Browser tests now use shared auth state (single login per run), preventing Statamic's login throttle from failing tests
Full Changelog: v2.3.0...v2.4.0