Skip to content

v1.0.0

tagged this 27 Jul 13:13
Serves /api/mcp/v1, the endpoint frameworc-mcp calls to create and edit
FrameworC pages from a chat client. Lives in its own plugin so the page
builder stays untouched; requires CRSCompany.FrameworC for its blueprints.

Writing a block is not a JSON insert. A block is a RepeaterItem row with
the BaseBlock mixin flattened onto it, a NestedFormItem row for its
content, and further repeater rows below that — Columns recurses back
into the full block catalogue. PageWriter walks that recursively through
the model layer so Tailor's afterRelation hook can attach the right
fieldset before each row is filled, and PageSerializer re-nests it back
into the {base, content} shape the MCP expects.

BlockSchema derives the catalogue from the live blueprints and doubles as
the payload validator, so a blueprint change cannot leave the API
accepting a shape the CMS is unable to store. Media fields are rejected
rather than written; a human assigns files in the backend.

Multisite is explicit throughout: every handler runs inside
Site::withContext for a caller-supplied site_id, because the fallback
resolves the site from the request hostname and would silently write to
the wrong language on a route-prefixed install. Pages expose their
translation siblings and can spawn new ones.

Auth is a bearer token in Settings > FrameworC > MCP API. An unset token
disables the API with a 503 rather than reading as "no auth required".
Assets 2
Loading