Drive the site with MCP tools
Run real operations through the MCP server, in the right order, with the right wrappers, without turning fifty items into fifty round-trips.
Connecting an agent gives you the tools. This page is about using them: the sequence a session follows, the write shapes, and the batching that decides whether an import takes two minutes or twenty.
The opening sequence, every session
get-skills, thenget-skillon everything relevant to the task.get-site-settingsfor the types that exist on this site.get-navigations-with-pageswhen you are going to touch pages.
Skipping step 1 is what produces plausible YAML that does not match the platform. Skipping step 2 is what produces a call against a type that does not exist here.
Read before you write
| You want | Call |
|---|---|
| The site's types | get-site-settings, with type to keep the payload small |
| A page and its blocks | get-page-with-content |
| A lightweight sitemap | get-navigations-with-pages |
| Collection entries | get-itemset-items |
| Global field values | get-global-fields-data |
The write shapes
The three rules behind most 422s:
- Wrapper:
update-contentwrites undercustom:,update-itemset-itemunderdata:. - References come in two shapes: media fields (
image,file) take[{id: '<uuid>'}], every reference by id (items,smartselecton a collection,page) takes a flat['<uuid>']. Never a bare UUID or a URL. - One locale per write: main data plus one
translations.<locale>, never a translation alone.
Full catalogue and per-tool notes in MCP tools.
Order of operations
Dependencies are real, and getting them wrong produces errors that look like something else.
- collections, because a form's
saveand a query both target one by key. - Content-types and page-types.
- Routes.
- Pages, which freeze their page-type at creation.
- Content: blocks and items.
update-settings-partial replaces the whole target block. Read the current YAML, merge your change into it, write it back entire. And target must equal the top-level key of what you send, otherwise it fails silently.Batching
Start from the shape of the work, not from a parallelism number. Most of what looks like a batching decision is actually a fan-out the API has already decided for you:
| Work | What it costs |
|---|---|
| Reading — settings, pages, items, media | One call each, all independent. Fan them out. |
| An alt-text pass over a folder | One update-media per asset. There is no bulk endpoint. |
| A page or a content block, plus translations | Root data and one locale in the same call. N locales, N calls. |
| A collection entry, plus translations | Root and each locale in separate calls — the opposite rule. N locales, N+1 calls. |
So a bilingual collection of twenty-six entries is fifty-two writes, not twenty-six, and no amount of batching changes that. Sizing the session on the entry count is how a "quick import" turns into an afternoon.
The discipline that matters is not the width of the fan, it is what you send into it. Get one call of a shape to succeed and read what came back, then fan out the other forty-nine. A wrong wrapper or a mis-shaped reference fails identically on the first call and on the fiftieth, and the fiftieth costs you the cleanup.
Serialise on purpose in two cases: when the calls depend on each other, which the order of operations above already tells you, and when you are debugging a shape and want each response attributable to one input.
Verify, do not assume
A tool call returning 200 means the write was accepted, not that the site renders. Close every session with a read-back:
get-site-settingsto confirm the types you created exist;get-page-with-contenton one page you touched;quilium runplus a curl on the affected URLs.
Related
Last updated September 6, 2026.