There are 28 tools. Every agent session should start with statamic_overview. Open a tool to see its parameters, the permission it needs, and a response recorded from a real server running the version in the header. The parameter text and “what the agent reads” are the exact text the server sends to the client.
What exists, what the user may do, and the shape of every field.
statamic_overview read Call this first. Sites, resources, your capability flags, and the site's guidelines.
None.
{
"sites": [
{
"handle": "en",
"name": "English",
"url": "/",
"locale": "en_US"
}
],
"collections": [
{
"handle": "blog",
"title": "Blog",
"dated": false,
"revisions": false,
"blueprints": [
"article"
],
"can_create": true,
"can_edit": true,
"can_publish": true
},
"… 2 more collections"
],
"taxonomies": [
{
"handle": "tags",
"title": "Tags",
"blueprints": [
"tag"
],
"can_create": true,
"can_edit": true
}
],
"globals": [
{
"handle": "settings",
"title": "Settings",
"can_edit": true
}
],
"asset_containers": [
{
"handle": "images",
"title": "Images",
"can_upload": true,
"can_edit": true
}
],
"navigations": [
{
"handle": "main",
"title": "Main",
"max_depth": null,
"can_edit": true
}
],
"forms": [
{
"handle": "contact",
"title": "Contact",
"stores_submissions": true,
"submissions": 0
}
],
"user": {
"id": "9d054fa4-8d21-40db-a721-10bc2b48b1fd",
"email": "[email protected]",
"roles": [],
"is_super": true
},
"server": {
"read_only": false,
"deletes": false,
"timezone": "UTC"
}
}What the agent reads about this tool
Start here — zero parameters. Returns the sites; the collections, taxonomies, global sets, asset containers, and navigations (menus, with their max_depth, and the sites they have a tree in on multisite), and forms (with stores_submissions, false when the form only sends email, and their submission count) exposed to MCP and visible to you; your capability flags per resource (can_create, can_edit, can_publish, can_upload, can_delete — delete flags appear only when deletes are enabled; collections whose blueprint has an author field add can_edit_other_authors, can_publish_other_authors, and can_delete_other_authors, which apply to entries you are not an author of); on dated collections, date_behavior (future/past: public, unlisted, or private — a published entry dated in the future is scheduled only where future is private); on multisite, each collection's sites, propagate (whether entries_create makes a localization in every site at once), and origin_behavior (root: entries_localize always localizes from the root entry); the acting user (id, email, roles, is_super — compare id with an entry's author); and the server block: read_only, deletes, and timezone (the zone a date without an offset is read in). When the site has guidelines for agents (voice, tone, rules for all content), they come back in guidelines — follow them in everything you write.
blueprints_get read A blueprint's fields, page builder blocks, and a valid example payload.
view {collection} entries Follows the resource: view {collection} entries, view {taxonomy} terms, edit {global} globals, view {nav} nav, or view {form} form submissions.
typestring required collection | taxonomy | global | form | navigation- Resource type the handle belongs to.
handlestring required- Collection, taxonomy, global set, form, or navigation handle (see statamic_overview).
blueprintstring- Blueprint handle. Defaults to the one the create tools use: a collection's first blueprint that is not hidden, otherwise the resource's first.
setstring- A set handle from the sets of a replicator or Bard field. Returns only that set, with its fields and an example row, instead of the whole blueprint. When a handle has different fields in different places, the error lists their paths; pass one of those instead.
{
"type": "collection",
"handle": "landing",
"blueprint": "landing_page",
"set": {
"handle": "section_hero",
"display": "Section - Hero",
"group": "Website",
"fields": [
{
"handle": "heading",
"type": "text",
"required": true,
"rules": [
"required"
]
},
{
"handle": "image",
"type": "assets",
"required": false,
"rules": [
"array",
"max:1",
"nullable"
],
"container": "images",
"max_files": 1
}
]
},
"example": {
"type": "section_hero",
"heading": "Example text",
"image": "REPLACE-WITH-REAL-ASSET-PATH"
},
"example_notes": {
"image": "stores asset paths relative to the container root (container 'images') — max_files is 1, so pass a single string path. Find existing paths with assets_list, or upload new files with assets_upload, then use the returned path."
}
}What the agent reads about this tool
Returns a blueprint's fields (handle, type, rules, required, options, instructions; time_enabled on date fields — without it the Control Panel shows only the day, not the time; on multisite, localizable: only such a field can hold a value of its own in a localization) plus a valid example payload for writes. Pass type (collection|taxonomy|global|form|navigation) and the resource handle from statamic_overview; optionally a specific blueprint handle (defaults to the one entries_create and terms_create use). For a form, the fields are the keys of its submissions' data; nothing writes a submission. For a navigation, the fields are what a branch's data takes in navigations_update, and example is one branch's data; title and url are branch keys beside data, as example_notes says when the blueprint defines them. Relation-field examples are placeholders — replace them with real IDs. Fields with a null example carry a note in example_notes; read a real value from existing content for those. On collection and taxonomy blueprints, slug (and date on dated collections) is left out of the example: the entries_* and terms_* write tools take it as a top-level parameter, as example_notes says. Cross-check each field's rules — examples satisfy shape, not every validation rule. Replicator and Bard fields list their sets (page builder blocks) with each set's display name, group, and instructions — follow a set's instructions when choosing and filling it, and never add a set marked hidden. Pass set with a set's handle to get its fields and an example row. Notes on nested values are keyed by path, like seo.meta_title. Tabs and sections that carry instructions come back in tabs, with the handles of the fields under them — follow those when filling the fields they name. When the site's guidelines for agents cover this collection or taxonomy, they come back in guidelines — follow them.
Read, draft, update, localize, preview, publish, and delete.
entries_list read Paginated summaries of a collection's entries, never field data.
view {collection} entries On multi-site, also access {site} site.
collectionstring required- Collection handle — see statamic_overview for what is available.
sitestring- Site handle. Defaults to the default site.
statusstring published | draft | scheduled | expired- Filter by status. scheduled and expired exist only on dated collections whose date_behavior.future or .past is private (see statamic_overview); elsewhere a future-dated entry is published.
searchstring- Only entries whose title contains this text.
limitinteger- Page size. Defaults to the server default (25); hard-capped at 100.
pageinteger default 1- Page number, starting at 1.
{
"entries": [
{
"id": "cd6fb094-92a7-4293-a2b0-1e46ac56a597",
"title": "Tours",
"slug": "tours",
"status": "published",
"url": "/landing/tours",
"date": null,
"updated_at": "2026-11-01T12:00:00+00:00"
}
],
"pagination": {
"page": 1,
"per_page": 5,
"total": 1,
"total_pages": 1,
"next_page": null
}
}What the agent reads about this tool
List entries in a collection — summary columns only (id, title, slug, status, url, date, updated_at); field data is never included, use entries_get for that. Paginated: the response carries total, total_pages, and next_page (null on the last page). Ordering is deterministic: dated collections newest-first by date, others alphabetical by title, with id as tiebreaker.
entries_get read One entry in full. Large values come back as previews and set indexes.
view {collection} entries On multi-site, also access {site} site.
idstring- Entry id. Either id, or collection + slug, is required.
collectionstring- Collection handle — used with slug when id is omitted.
slugstring- Entry slug — used with collection when id is omitted. When several entries of the site share it, as pages under different parents can, the call fails and lists their ids and URLs.
sitestring- Site handle. With an id it must match that entry's own site (omit it otherwise); with collection + slug it selects the localization. Defaults to the default site.
formatstring raw | augmented- raw (default): $entry->data(), writable. augmented: rendered values, display only — never writable.
fieldsarray- Top-level field handles to return in full — a large value listed here skips the preview. handle.id, with a set id from the field's index, returns one set of a Replicator or Grid field as an object keyed by its id: the shape the update tool merges by id.
working_copyboolean- Revision-enabled collections: false returns the live entry instead of the staged working copy, which is the default whenever changes are staged. When nothing is staged, the entry itself is returned either way.
{
"id": "cd6fb094-92a7-4293-a2b0-1e46ac56a597",
"collection": "landing",
"blueprint": "landing_page",
"slug": "tours",
"site": "en",
"status": "published",
"published": true,
"url": "/landing/tours",
"format": "raw",
"data": {
"title": "Tours",
"page_builder": {
"__preview": "16 sets",
"truncated": true,
"sets": [
{
"id": "hero0001",
"type": "section_hero",
"preview": "Bike tours along the Silver Coast"
},
{
"id": "text0002",
"type": "section_text_block",
"preview": "Block 2 describes one part of the tour in detail, with pract..."
},
{
"id": "text0003",
"type": "section_text_block",
"preview": "Block 3 describes one part of the tour in detail, with pract..."
},
"… 13 more sets"
],
"note": "NOT writable — fetch one set with entries_get fields: [\"page_builder.<id>\"], or the whole field with fields: [\"page_builder\"]. The update tool merges into one set with {\"page_builder\": {\"<id>\": {...}}}, and adds, removes, or reorders sets with the list of ids in their new order, a new set where it goes: [{\"id\": \"<id>\"}, {\"type\": \"...\", ...}]"
},
"body": {
"__preview": "The coastal route runs north from the harbour, past the lighthouse and along the dunes. Every stage has a place to stop,…",
"truncated": true,
"note": "NOT writable — fetch raw field before editing: entries_get with fields: [\"body\"]"
}
},
"cp_edit_url": "https://example.com/cp/collections/landing/entries/cd6fb094-92a7-4293-a2b0-1e46ac56a597"
}What the agent reads about this tool
Get a single entry by id, or by collection + slug. Returns raw field data by default — the round-trippable shape for entries_update. format=augmented returns rendered values for display only: NEVER send augmented data back into entries_update. Large values are truncated to preview objects unless requested via fields (an array of top-level field handles): Bard and Markdown over 500 bytes, and any other value over 4 KB, a Grid excepted. A large Replicator field (a page builder) comes back as an index of its sets — id, type, and a short preview each — unless requested via fields: e.g. "page_builder" fetches the whole field, "page_builder.<id>" one set (of a Replicator or Grid), as an object keyed by its id that entries_update merges back by id. fields selects blueprint fields, and in raw format any other key the entry stores — augmented-only keys such as permalink are not selectable. On revision-enabled entries, has_working_copy reports whether staged (unpublished) changes exist, and the returned data is the staged working copy when there is one, as in the Control Panel's edit form: exactly what entries_update builds on and entries_publish would promote. working_copy: false returns the live entry instead, and source says which one you got. On a collection in more than one site, localizations lists each site you can access with the id and status of the entry there, or null where it has none — add one with entries_localize.
entries_create write Creates an entry from raw data. Always an unpublished draft.
create {collection} entries On multi-site, also access {site} site.
collectionstring required- Collection handle.
dataobject required- Raw field values keyed by blueprint field handle. Unknown keys are rejected.
slugstring- URL slug. Generated from data.title when omitted; rejected on a collection with slugs turned off, whose entries have none.
parentstring- Entry id of the page to nest the new entry under, on a structured collection. Omit it, or pass "", for the top level.
sitestring- Site handle. Defaults to the default site. The entry exists in this site only; entries_localize adds it to others.
datestring- Entry date: 2026-07-09, or 2026-07-09T15:30:00+02:00 with a time. A time without an offset is read in server.timezone from statamic_overview. Required for dated collections; rejected otherwise.
{
"id": "05633d1d-24ff-4069-a07e-32dbac64ec70",
"slug": "first-ride",
"site": "en",
"status": "draft",
"url": "/blog/first-ride",
"result": "saved as draft — not live",
"cp_edit_url": "https://example.com/cp/collections/blog/entries/05633d1d-24ff-4069-a07e-32dbac64ec70"
}What the agent reads about this tool
Create a new entry from raw field data (call blueprints_get first for the shape — never send augmented data). Always saves an unpublished draft — nothing goes live here; call entries_publish afterwards. On revision-enabled collections the draft gets an initial revision attributed to you. slug is generated from data.title when omitted, except on a collection with slugs turned off, whose entries have none. Dated collections require date. On a structured collection the entry joins its tree at the top level, or under parent: the id of an entry of the same collection and site. A new Replicator or Grid set whose id is blank, 0, or shared with another new set gets a fresh id; entries_get shows the stored ids. When the blueprint has an author field, you become the author unless data names one; naming anyone else needs 'edit other authors {collection} entries'. On a collection in more than one site the entry exists in site only: add it to another site with entries_localize. When the collection's propagate is on (see statamic_overview), every site gets a localization at once, and the response lists them under localizations.
entries_update write Merges raw data, single page builder sets, or a find and replace. Never changes publish state.
edit {collection} entries Moving an entry with parent also needs reorder {collection} entries. On a blueprint with an author field, someone else's entry needs edit other authors {collection} entries.
On multi-site, also access {site} site.
idstring required- Entry id.
dataobject required- Raw field values to merge over the current top-level data. Unknown keys are rejected; null clears a field. A Replicator or Grid field also takes {"<set id>": {...}} to merge into single sets, or a list of [{"id": "<set id>"}, ...] with new sets where they go. A Bard, Markdown, text, or textarea field also takes {"find": "...", "replace": "..."} to change one piece of its text. May be an empty object when only changing slug, date, or parent.
slugstring- New slug. Rejected on a collection with slugs turned off, whose entries have none.
datestring- New date, dated collections only: 2026-07-09, or 2026-07-09T15:30:00+02:00 with a time. A time without an offset is read in server.timezone from statamic_overview.
sitestring- Selector only: must match the entry's own site, or be omitted. To add the entry to another site, call entries_localize.
parentstring- Entry id to move this entry under, or "" for the top level. Omit it, or send null, to leave the entry where it is.
{
"id": "cd6fb094-92a7-4293-a2b0-1e46ac56a597",
"slug": "tours",
"status": "published",
"url": "/landing/tours",
"result": "published",
"cp_edit_url": "https://example.com/cp/collections/landing/entries/cd6fb094-92a7-4293-a2b0-1e46ac56a597"
}What the agent reads about this tool
Update an entry with a shallow top-level merge of raw field data: nested structures (Bard, arrays) are replaced wholesale, never deep-merged — always send the complete new value for a nested field. To change one piece of Bard, Markdown, text, or textarea text, send {"find": "...", "replace": "..."} instead of the whole value: find must match the stored text exactly once, inside one formatting run for Bard, and only that piece changes, also in a set addressed by id. The exception is a Replicator or Grid field (a page builder), whose sets are addressed by the id entries_get shows: an object keyed by set id merges into just those sets — e.g. {"page_builder": {"wKJQXf2s": {"variant": "centered"}}} changes one field of one block; send only the fields you change, and null to remove a set. A list sets the order: an item with a stored id merges into that set the same way, so {"id": "wKJQXf2s"} keeps it as it is, an item in another type replaces its set, an item without an id is a new set, and the sets you leave out are removed — add a block by sending the ids in order with the new set where it goes, never the whole page. Inside a set the merge is shallow: each named field is replaced whole, a Group included, null clears it, and a Replicator or Grid nested in the set merges by id the same way. The whole field is then validated and saved as the Control Panel saves it: keys a set already stores pass, also ones its blueprint no longer defines, but a block that no longer passes its blueprint's rules blocks the write and is named by id in the error. The result lists the ids of new sets under added; a new set whose id is blank, 0, or sent twice gets a fresh one. null clears the field, and an empty list or object is refused. Explicit null clears a field (stores a local null); resetting a field to inherit from its origin localization is not supported in v1. Publish state is never changed here — that is entries_publish / entries_unpublish. Without revisions, re-dating a published entry on a collection whose date_behavior is private (see statamic_overview) can schedule or expire it; status and result report the outcome. On revision-enabled collections, edits to a published entry are staged as a working copy attributed to you (the live entry stays unchanged — promote it with entries_publish); when a working copy already exists the edit rebases onto it (created vs amended is stated in the result), and unpublished drafts are saved directly. site is a selector only — it must match the entry's own site; entries_localize adds an entry to another site. On a localization, data may only name fields the blueprint marks localizable: every other field shows the origin's value in every site, so change it on the origin entry. If the merged result equals the current entry, nothing is saved. When the blueprint has an author field, editing an entry you are not an author of needs 'edit other authors {collection} entries', and so does changing its author. parent moves the entry, with its children, in a structured collection's tree: pass the id of an entry of the same collection and site to make it that entry's last child, or "" for the top level; omitted or null, the entry stays where it is. Moving needs reorder {collection} entries, like the CP's tree, on top of the edit permission and its author rule. A move saves the live tree at once, also when the data goes to a working copy: working copies never stage tree position. The result reports the move under move and the new parent under parent.
entries_localize write multi-site only Adds an entry to another site as a draft that inherits what it does not override.
edit {collection} entries Also needs access {site} site for the target site.
On multi-site, also access {site} site.
idstring required- Id of the entry to localize. The new entry inherits from it.
sitestring required- Handle of the site to add the entry to.
dataobject- Raw values this site gets of its own, keyed by blueprint field handle — localizable fields only; everything else is inherited. May be omitted.
slugstring- Slug in the target site. Defaults to the origin's slug; rejected on a collection with slugs turned off, whose entries have none.
{
"id": "eabd2f29-ea43-4695-ae1b-0e9362cdae54",
"slug": "first-ride",
"site": "de",
"origin_id": "2c7b4c54-ea76-4e3e-af4e-15443ebad22e",
"status": "draft",
"url": "/de/blog/first-ride",
"result": "saved as draft — not live",
"cp_edit_url": "https://example.com/cp/collections/blog/entries/eabd2f29-ea43-4695-ae1b-0e9362cdae54",
"localizations": {
"en": {
"id": "2c7b4c54-ea76-4e3e-af4e-15443ebad22e",
"status": "draft"
},
"de": {
"id": "eabd2f29-ea43-4695-ae1b-0e9362cdae54",
"status": "draft"
}
}
}What the agent reads about this tool
Add an entry to another site of its collection, the way the Control Panel's Localize action does. The new entry is a localization of the one passed: it inherits every field it does not override, and data holds the values of its own, such as a translated title and content. A new Replicator or Grid set whose id is blank, 0, or shared with another new set gets a fresh id; entries_get shows the stored ids. Only fields marked localizable in the blueprint take a value of their own; the rest show the origin's value in every site, and the Control Panel makes them read-only there. The origin is the entry passed, or the root entry when the collection's origin_behavior is root (see statamic_overview), as in the Control Panel. slug defaults to the origin's slug, and the date of a dated collection is inherited. Always saves an unpublished draft — nothing goes live here; call entries_publish afterwards. On a structured collection the localization joins the target site's tree under the localization of the origin's parent, or at the top level when the parent has none there. Needs the edit permission for the origin entry, as in the Control Panel, and access to the target site. A site that already has the entry is an error naming that entry: change it with entries_update. Collections whose propagate is on (see statamic_overview) get a localization in every site from entries_create already, and entries_get lists them under localizations. Only registered on multisite installs.
entries_preview read A Live Preview URL, valid for an hour. Stays available under read_only.
edit {collection} entries On multi-site, also access {site} site.
idstring required- Entry id.
sitestring- Selector only: must match the entry's own site, or be omitted.
targetstring- Preview target label, as listed in targets. Defaults to the collection's first preview target.
{
"id": "05633d1d-24ff-4069-a07e-32dbac64ec70",
"url": "https://example.com/blog/first-ride?live-preview=…&token=…",
"expires_at": "2026-11-01T13:00:00+00:00",
"target": "Entry",
"targets": [
"Entry"
]
}What the agent reads about this tool
Get a URL that renders an entry through the site's own templates, so you can check how your changes look without a human opening the browser. Fetch the URL to see the page. It uses Statamic's Live Preview, so unpublished drafts render even though the public site returns 404 for them. On revision-enabled entries with a staged working copy, the page shows the working copy, not the live entry. The URL works for anyone who has it until expires_at, an hour after the call, so share it only with people who may see the draft. Requires the collection's edit permission, as Live Preview does in the Control Panel, or 'edit other authors {collection} entries' for an entry you are not an author of when the blueprint has an author field. Entries of a collection without a route have no page to preview. target picks a preview target by label and defaults to the collection's first; targets lists them all. Each call creates a new preview token and changes no content.
entries_publish write Makes an entry live, or schedules it. The only tool that publishes.
publish {collection} entries On multi-site, also access {site} site.
idstring required- Entry id.
{
"id": "05633d1d-24ff-4069-a07e-32dbac64ec70",
"slug": "first-ride",
"status": "published",
"url": "/blog/first-ride",
"result": "published",
"cp_edit_url": "https://example.com/cp/collections/blog/entries/05633d1d-24ff-4069-a07e-32dbac64ec70"
}What the agent reads about this tool
Make an entry live by id. Requires the publish permission for the collection, or 'publish other authors {collection} entries' for an entry you are not an author of when the blueprint has an author field. On revision-enabled collections this promotes the staged working copy (or the draft itself when nothing is staged) and records a publish revision attributed to you — the same flow as the Control Panel's Publish button. On a dated collection whose date_behavior.future is private (see statamic_overview), an entry dated in the future is scheduled instead: status and result say scheduled, and Statamic takes it live on that date with no further call. To schedule a post, set its date with entries_create or entries_update, then publish it. An already-published entry with nothing staged is a no-op. This is the only tool that publishes: entries_create and entries_update never change publish state.
entries_unpublish write Takes a live entry offline. Statamic has no separate unpublish permission.
publish {collection} entries On multi-site, also access {site} site.
idstring required- Entry id.
{
"id": "05633d1d-24ff-4069-a07e-32dbac64ec70",
"slug": "first-ride",
"status": "draft",
"url": "/blog/first-ride",
"result": "unpublished — not live",
"cp_edit_url": "https://example.com/cp/collections/blog/entries/05633d1d-24ff-4069-a07e-32dbac64ec70"
}What the agent reads about this tool
Take a live entry offline by id. Requires the publish permission for the collection (Statamic has no separate unpublish permission — the Control Panel gates both on publish), or 'publish other authors {collection} entries' for an entry you are not an author of when the blueprint has an author field. On revision-enabled collections this records an unpublish revision attributed to you; a staged working copy is applied to the entry and cleared, exactly like the Control Panel. An entry that is already a draft is a no-op.
entries_delete delete needs deletes Permanently deletes an entry, and its localizations when it is an origin.
delete {collection} entries On multi-site, also access {site} site.
idstring required- Entry id.
{
"id": "a4aaf9b6-11e1-40a9-ac34-b009a2647ba6",
"collection": "blog",
"slug": "to-remove",
"site": "en",
"result": "deleted — this cannot be undone"
}What the agent reads about this tool
Permanently delete an entry by id. When the blueprint has an author field, deleting an entry you are not an author of needs 'delete other authors {collection} entries'. Deleting an origin also deletes all of its localizations (this requires site access to every localization's site); the response lists everything that was removed. On revision-enabled collections the entry's revision and working-copy files stay on disk as orphans (the Control Panel behaves the same way). This cannot be undone.
Terms have no draft state, so writes are live at once.
terms_list read Paginated term summaries. Terms have no status to filter on.
view {taxonomy} terms On multi-site, also access {site} site.
taxonomystring required- Taxonomy handle, e.g. "tags" — see statamic_overview for what is available.
sitestring- Site handle. Defaults to the default site.
searchstring- Only terms whose title contains this text.
limitinteger- Page size. Defaults to the server default (25); hard-capped at 100.
pageinteger default 1- Page number, starting at 1.
{
"taxonomy": "tags",
"site": "en",
"total": 1,
"page": 1,
"per_page": 25,
"next_page": null,
"terms": [
{
"id": "tags::gravel",
"title": "Gravel",
"slug": "gravel",
"url": "/tags/gravel",
"updated_at": "2026-11-01T12:00:00+00:00"
}
]
}What the agent reads about this tool
List taxonomy terms with summary columns only (id, title, slug, url, updated_at) — never field data; use terms_get for a term's field data. Terms have no publish state, so there is no status filter. Paginated: the response carries total and next_page (null on the last page). Ordering is deterministic: alphabetical by title, with id as tiebreaker.
terms_get read One term, with local overrides and inherited values on multi-site.
view {taxonomy} terms On multi-site, also access {site} site.
idstring- Term id: "{taxonomy}::{slug}", e.g. "tags::php". Or pass taxonomy + slug instead.
taxonomystring- Taxonomy handle — use together with slug when id is not passed.
slugstring- Term slug — use together with taxonomy when id is not passed.
sitestring- Site handle — selects the localization view of the term (term ids are the same in every site). Defaults to the default site.
formatstring raw | augmented- raw (default): local data overrides, writable. augmented: rendered values, display only — never writable.
fieldsarray- Top-level field handles to return in full — a large value listed here skips the preview. handle.id, with a set id from the field's index, returns one set of a Replicator or Grid field as an object keyed by its id: the shape the update tool merges by id.
{
"id": "tags::gravel",
"taxonomy": "tags",
"slug": "gravel",
"site": "en",
"format": "raw",
"data": {
"title": "Gravel"
},
"updated_at": "2026-11-01T12:00:00+00:00",
"cp_edit_url": "https://example.com/cp/taxonomies/tags/terms/gravel/en"
}What the agent reads about this tool
Get one taxonomy term by id ("{taxonomy}::{slug}") or by taxonomy + slug. format=raw (default) returns the round-trippable data shape for terms_update; format=augmented is read-only — never send augmented values back into terms_update. With site, data holds that site's local overrides and inherited holds what comes from the term's origin site (the taxonomy's first configured site — a term's localizations are data overrides within one term). Terms have no publish state, so there is no status. Large values are truncated to preview objects (Bard and Markdown over 500 bytes, any other value over 4 KB, a Grid excepted), and a large Replicator field to an index of its sets, unless requested via fields (an array of top-level field handles, or handle.id for one set, as in entries_get).
terms_create write Creates a term in the taxonomy's origin site. Live immediately.
create {taxonomy} terms On multi-site, also access {site} site.
taxonomystring required- Taxonomy handle, e.g. "tags".
dataobject required- Raw field values keyed by blueprint field handle. Unknown keys are rejected.
slugstring- URL slug. Generated from data.title when omitted.
sitestring- Must be the taxonomy's origin site (its first configured site) when given — terms are created there and localized via terms_update.
{
"id": "tags::gravel",
"taxonomy": "tags",
"slug": "gravel",
"site": "en",
"result": "created — live",
"cp_edit_url": "https://example.com/cp/taxonomies/tags/terms/gravel/en"
}What the agent reads about this tool
Create a taxonomy term from raw field data (get the shape from blueprints_get; never send augmented data). Slug is generated from data.title when omitted. A new Replicator or Grid set whose id is blank, 0, or shared with another new set gets a fresh id; terms_get shows the stored ids. Terms are created in the taxonomy's origin site (its first configured site) — localize afterwards with terms_update and its site parameter. Terms have no draft state: a created term is live immediately.
terms_update write Same merge contract as entries. A slug renames the term.
edit {taxonomy} terms On multi-site, also access {site} site.
idstring required- Term id: "{taxonomy}::{slug}", e.g. "tags::php".
dataobject required- Raw field data to merge, keyed by blueprint field handle. A Replicator or Grid field also takes {"<set id>": {...}} to merge into single sets, or a list of [{"id": "<set id>"}, ...] with new sets where they go. A Bard, Markdown, text, or textarea field also takes {"find": "...", "replace": "..."} to change one piece of its text. May be empty when only changing the slug.
slugstring- New slug. On the default site this changes the term id; on other sites it stores a localized slug override.
sitestring- Site handle. Defaults to the default site. Writes that site's data override.
{
"id": "tags::gravel",
"taxonomy": "tags",
"slug": "gravel",
"site": "en",
"result": "updated — live",
"cp_edit_url": "https://example.com/cp/taxonomies/tags/terms/gravel/en"
}What the agent reads about this tool
Update a taxonomy term with a shallow top-level-key merge of raw field data onto that site's local overrides (the terms_get raw shape) — nested structures are replaced wholesale; explicit null clears a field. A Replicator or Grid field takes an object keyed by set id that merges into just those sets, or a list of sets in their order where an item with a stored id merges into that set, and a Bard, Markdown, text, or textarea field takes {"find": "...", "replace": "..."} to change one piece of its text, as in entries_update. A new set whose id is blank, 0, or shared with another new set gets a fresh id; terms_get shows the stored ids. With site, writes that site's localized data override, creating it transparently on first write. slug renames the term: on the default site this changes the term id ("{taxonomy}::{slug}") and moves the yaml file; on other sites it stores a localized slug override. An update that changes nothing is a no-op. Terms have no draft state — changes are live immediately. Never send augmented data.
terms_delete delete needs deletes Removes the term from every site at once.
delete {taxonomy} terms idstring required- Term id: "{taxonomy}::{slug}", e.g. "tags::php".
{
"deleted": true,
"id": "tags::gravel",
"taxonomy": "tags",
"slug": "gravel",
"sites": [
"en"
],
"result": "term permanently deleted from every site listed (localizations are data overrides within the term — none survive) — this cannot be undone",
"note": "references to this term in entry fields are removed by Statamic's reference updater (runs on the queue; skipped when statamic.system.update_references is false) — an immediate re-read may still show the slug in entry fields; do not rewrite references manually"
}What the agent reads about this tool
Permanently delete a taxonomy term by id. A term's site localizations are data overrides inside the term itself, so deleting it removes the term from every site at once. Deleting a term that entries still reference is allowed (Control Panel behavior); Statamic's reference updater then strips those references (runs on the queue; skipped when statamic.system.update_references is false). This cannot be undone. Only available when deletes are enabled in config/statamic/mcp.php.
Read and merge-patch global variables per site.
globals_get read One global set, or every set you can access, in the raw shape.
edit {global} globals Statamic 6 has no view permission for globals, so edit is the only gate.
On multi-site, also access {site} site.
handlestring- Global set handle, e.g. "settings". Omit to list every readable set.
sitestring- Site handle. Defaults to the default site.
{
"handle": "settings",
"title": "Settings",
"site": "en",
"data": {
"site_name": "Acme"
},
"cp_edit_url": "https://example.com/cp/globals/settings"
}What the agent reads about this tool
Read global variables in the raw round-trippable shape for globals_update. Pass handle for one set, or omit it to get every set you can access (others are silently omitted). With site, data holds that site's localization; when the set localizes through an origin site, inherited holds the values falling back from it. Globals have no publish state — values are always live.
globals_update write Merge-patches a set's variables per site. Live immediately.
edit {global} globals On multi-site, also access {site} site.
handlestring required- Global set handle, e.g. "settings".
dataobject required- Raw variables to merge, keyed by field handle. A Replicator or Grid variable also takes {"<set id>": {...}} to merge into single sets, or a list of [{"id": "<set id>"}, ...] with new sets where they go. A Bard, Markdown, text, or textarea field also takes {"find": "...", "replace": "..."} to change one piece of its text.
sitestring- Site handle. Defaults to the default site. A missing localization is created on first write.
{
"handle": "settings",
"site": "en",
"result": "updated — live",
"cp_edit_url": "https://example.com/cp/globals/settings"
}What the agent reads about this tool
Update a global set's variables with a shallow top-level-key merge of raw data (the globals_get raw shape) — nested structures are replaced wholesale; explicit null clears a variable. A Replicator or Grid field takes an object keyed by set id that merges into just those sets, or a list of sets in their order where an item with a stored id merges into that set, and a Bard, Markdown, text, or textarea field takes {"find": "...", "replace": "..."} to change one piece of its text, as in entries_update. A new set whose id is blank, 0, or shared with another new set gets a fresh id; globals_get shows the stored ids. With site, writes that site's localization, creating it transparently on first write. An update that changes nothing is a no-op. Globals have no draft state: saved values are live immediately. Never send augmented data.
List, read, upload, annotate, and delete files.
assets_list read Paginated asset summaries per container, ordered by path.
view {container} assets containerstring required- Asset container handle — see statamic_overview for what is available.
folderstring- Only assets under this folder (subtree), e.g. 'blog' or 'blog/2026'.
limitinteger- Page size. Defaults to the server default (25); hard-capped at 100.
pageinteger default 1- Page number, starting at 1.
{
"assets": [
{
"path": "hero.jpg",
"url": "/assets/images/hero.jpg",
"is_image": true,
"size": 70,
"dimensions": [
1,
1
],
"alt": null
}
],
"pagination": {
"page": 1,
"per_page": 25,
"total": 1,
"total_pages": 1,
"next_page": null
}
}What the agent reads about this tool
List assets in a container — summary columns only (path, url, is_image, size, dimensions, alt); use assets_get for full metadata. Optionally filter to a folder subtree. Paginated: the response carries total, total_pages, and next_page (null on the last page); ordered by path.
assets_get read One asset's detail and raw metadata, the shape assets_update accepts.
view {container} assets containerstring required- Asset container handle — see statamic_overview.
pathstring required- Asset path relative to the container root, e.g. 'blog/hero.jpg'.
{
"path": "blog/2026/route-map.png",
"url": "/assets/images/blog/2026/route-map.png",
"is_image": true,
"size": 70,
"dimensions": [
1,
1
],
"alt": null,
"data": [],
"mime_type": "image/png",
"last_modified": "2026-11-01T12:00:00+00:00",
"cp_edit_url": "https://example.com/cp/assets/browse/images/blog/2026/route-map.png/edit"
}What the agent reads about this tool
Read one asset's full detail: the assets_list summary columns plus raw blueprint data (alt text and custom fields — the shape assets_update accepts), mime_type, last_modified, and cp_edit_url. Raw values only, never augmented.
assets_upload write Uploads from a URL or inline base64. Never overwrites. Live immediately.
upload {container} assets containerstring required- Asset container handle — see statamic_overview.
source_urlstring- Public http(s) URL to download. Exactly one of source_url / content_base64.
content_base64string- Base64-encoded file contents, for small files. Exactly one of source_url / content_base64.
filenamestring- Target filename with extension, e.g. 'hero.jpg'. Required with content_base64; with source_url it defaults to the URL's basename.
folderstring- Destination folder inside the container, e.g. 'blog/2026'. Defaults to the container root; created on demand.
{
"path": "blog/2026/route-map.png",
"url": "/assets/images/blog/2026/route-map.png",
"is_image": true,
"size": 70,
"dimensions": [
1,
1
],
"alt": null,
"result": "uploaded — live",
"cp_edit_url": "https://example.com/cp/assets/browse/images/blog/2026/route-map.png/edit"
}What the agent reads about this tool
Upload a file into an asset container, from a source_url (the server downloads it — http/https, public hosts only) or inline content_base64 (small files only). filename is required with content_base64, optional with source_url (derived from the URL). Optional folder (e.g. "blog/2026") is created on demand. Existing paths are never overwritten — a collision is an error. Uploads are live immediately; set alt text afterwards with assets_update.
assets_update write Merge-patches alt text and custom fields. The file itself is untouched.
edit {container} assets containerstring required- Asset container handle — see statamic_overview.
pathstring required- Asset path relative to the container root, e.g. 'blog/hero.jpg'.
dataobject required- Raw metadata to merge, keyed by blueprint field handle, e.g. {"alt": "…"}.
{
"id": "images::blog/2026/route-map.png",
"path": "blog/2026/route-map.png",
"data": {
"alt": "Map of the coastal route"
},
"result": "updated — live",
"cp_edit_url": "https://example.com/cp/assets/browse/images/blog/2026/route-map.png/edit"
}What the agent reads about this tool
Update an asset's metadata (alt text and any custom fields on the container's asset blueprint) with a shallow top-level-key merge of raw data (the assets_get raw shape) — nested structures are replaced wholesale; explicit null clears a field. The file itself is untouched. An update that changes nothing is a no-op. Assets have no draft state: saved metadata is live immediately. Never send augmented data.
assets_delete delete needs deletes Removes the file and its metadata.
delete {container} assets containerstring required- Asset container handle — see statamic_overview.
pathstring required- Asset path relative to the container root, e.g. 'blog/hero.jpg'.
{
"deleted": true,
"id": "images::blog/2026/route-map.png",
"container": "images",
"path": "blog/2026/route-map.png",
"result": "asset permanently deleted — file and metadata removed; this cannot be undone",
"note": "references to this asset in entry fields are removed by Statamic's reference updater (runs on the queue; skipped when statamic.system.update_references is false) — an immediate re-read may still show the path in entry fields; do not rewrite references manually"
}What the agent reads about this tool
Permanently delete an asset — the file AND its metadata. References to it in entry fields are removed by Statamic's reference updater (runs on the queue; skipped when statamic.system.update_references is false). This cannot be undone. Only available when deletes are enabled in config/statamic/mcp.php.
Read what visitors sent. Nothing creates or edits a submission.
submissions_list read A form's submissions, newest first, each with its full data.
view {form} form submissions or configure formsformstring required- Form handle, e.g. "contact" (statamic_overview lists them).
searchstring- Substring match over the text, textarea, and integer fields, as in the Control Panel. Use since and before for dates.
sincestring- Only submissions on or after this date, e.g. 2026-09-20 or 2026-09-20T09:00:00+02:00.
beforestring- Only submissions before this date (exclusive), e.g. 2026-09-27 for everything up to the end of the 26th.
limitinteger- Page size. Defaults to the server default (25); hard-capped at 100.
pageinteger default 1- Page number, starting at 1.
{
"form": "contact",
"total": 2,
"page": 1,
"per_page": 25,
"next_page": null,
"submissions": [
{
"id": "1790330400",
"date": "2026-09-25T10:00:00+00:00",
"data": {
"name": "Ana",
"email": "[email protected]",
"message": "Can we book a tour for six?"
}
},
{
"id": "1790242200",
"date": "2026-09-24T09:30:00+00:00",
"data": {
"name": "Rui",
"email": "[email protected]",
"message": "Do you rent e-bikes?"
}
}
],
"cp_url": "https://example.com/cp/forms/contact"
}What the agent reads about this tool
List a form's submissions, newest first, each with its id, date, and full data keyed by field handle (blueprints_get with type form describes the fields; a field the visitor did not send is absent from data). search is the Control Panel's search: a substring match over the text, textarea, and integer fields, where % matches any run of characters and _ any single character, and over the date in its stored form, YYYY-MM-DD HH:MM:SS in UTC. To filter by date use since (inclusive) and before (exclusive) instead: a time without an offset is read in the server timezone from statamic_overview, and a date alone means midnight, so before 2026-09-27 covers everything up to the end of the 26th. Paginated: the response carries total and next_page (null on the last page). Submissions are not per site. Nothing edits a submission, as in the Control Panel; submissions_delete removes one when deletes are enabled.
submissions_get read One submission by form handle and id.
view {form} form submissions or configure formsformstring required- Form handle, e.g. "contact".
idstring required- Submission id, e.g. "1758794400.1234".
{
"form": "contact",
"id": "1790330400",
"date": "2026-09-25T10:00:00+00:00",
"data": {
"name": "Ana",
"email": "[email protected]",
"message": "Can we book a tour for six?"
},
"cp_url": "https://example.com/cp/forms/contact/submissions/1790330400"
}What the agent reads about this tool
Get one form submission by form handle and submission id (ids come from submissions_list or the Control Panel URL). Returns its date and full data keyed by field handle, plus cp_url. Nothing edits a submission, as in the Control Panel.
submissions_delete delete needs deletes Removes a submission. Files it uploaded stay in their container.
delete {form} form submissions or configure formsformstring required- Form handle, e.g. "contact".
idstring required- Submission id from submissions_list.
{
"deleted": true,
"form": "contact",
"id": "1790330400",
"date": "2026-09-25T10:00:00+00:00",
"result": "submission permanently deleted — this cannot be undone"
}What the agent reads about this tool
Permanently delete one form submission by form handle and submission id. Needs 'delete {form} form submissions', or 'configure forms'. Files the submission uploaded stay in their asset container, as when deleting in the Control Panel. This cannot be undone.
How many tools a server offers#
| Install | Tools |
|---|---|
| Single site, default | 23 |
Single site, deletes on | 27 |
| Multi-site, default | 24 |
Multi-site, deletes on | 28 |
read_only on, any install | 13 |
read_only keeps 13 tools, and it wins over deletes. Those counts come from the server’s own tools/list under each configuration.
Reading a response#
A tool answers in one of two ways.
A success is a JSON document in result.content[0].text. Write responses state whether the change is live, in result, and link the Control Panel’s edit page in cp_edit_url. Drafts and publishing lists every result.
A refusal is an HTTP 200 with isError: true and a sentence written for the agent to act on.
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "collection 'landing' not found — available: blog"
}
],
"isError": true
}
} A tool that doesn’t exist on this server answers HTTP 400 with a JSON-RPC error instead. Troubleshooting covers the others.
Pagination#
List tools take limit and page. limit defaults to per_page from your config, 25 by default, and it’s capped at 100.
next_page is null on the last page. The envelope differs a little between tools, so don’t assume one shape.
{
"entries": ["…"],
"pagination": { "page": 1, "per_page": 25, "total": 1, "total_pages": 1, "next_page": null }
} {
"taxonomy": "tags",
"site": "en",
"total": 1,
"page": 1,
"per_page": 25,
"next_page": null,
"terms": ["…"]
} entries_list and assets_list use the first shape. terms_list and submissions_list use the second.
Ordering#
entries_list is deterministic: dated collections newest first, others alphabetical, with id as tiebreaker. terms_list is alphabetical by title with id as tiebreaker, assets_list is ordered by path, and submissions_list is newest first.
Raw and augmented#
Reads return raw data by default, the shape you can send back. format=augmented on entries_get and terms_get returns rendered values for display only. Writes accept raw field data only.
Calling a tool without a client#
The endpoint takes JSON-RPC over POST, so you can script it. The curl tab on each tool has a working command.
curl https://example.com/mcp/statamic
-H 'Authorization: Bearer mcp_...'
-H 'Accept: application/json, text/event-stream'
-H 'Content-Type: application/json'
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"statamic_overview","arguments":{}}}'