Tool Overview
Tool Overview
Every tool follows the same pattern: send an action parameter to specify what operation to perform, along with action-specific parameters. All tools return a standardized response.
Response Format
{
"success": true,
"data": { },
"meta": {
"tool": "statamic-blueprints",
"timestamp": "2026-03-12T12:00:00Z",
"statamic_version": "6.0.0",
"laravel_version": "12.0.0"
}
}
The statamic_version and laravel_version fields in meta are only included when security.expose_versions is enabled (defaults to false).
On error, the response includes an error key with a human-readable message and a code key with a machine-readable error code.
Finding the tools
Only three tools are listed in the catalog a client loads at connect time:
statamic-entries, statamic-blueprints and statamic-system-discover. Everything else
documented below is reached through two built-in tools:
search_tools— describe what you want; get back matching tools and their schemas.execute_tools— run one or more of them by name.
This keeps roughly 18 KB of JSON schema out of the client's context on every connection.
The hidden tools are not restricted in any way: same token scopes, same resource policy,
same permissions, same confirmation gate. If your client handles search_tools poorly,
set STATAMIC_MCP_SEARCHABLE_CATALOG=false to have all of them listed directly — see
the configuration reference.
statamic-system-discover maps an intent to the right tool and tells you which of the two
ways to reach it.
Domain Routers
statamic-blueprints
Manage blueprint definitions, field schemas, and type generation.
| Action | Description | Key Parameters |
|---|---|---|
list |
List blueprints | namespace, include_details, include_fields |
get |
Get a specific blueprint | handle, namespace, field, include_config, include_format_spec, max_format_depth |
create |
Create a blueprint | handle, namespace, fields |
update |
Update a blueprint | handle, namespace, fields |
delete |
Delete a blueprint | handle, namespace, confirm |
scan |
Scan all blueprints | include_fields |
generate |
Generate a blueprint | handle, namespace, fields |
types |
Generate TypeScript/PHP types | handle, output_format |
validate |
Validate a blueprint | handle, namespace |
statamic-entries
Dedicated entry operations with advanced filtering, search, and pagination.
| Action | Description | Key Parameters |
|---|---|---|
list |
List with filtering | collection, filters, include_unpublished, limit, offset |
get |
Get entry | collection, id, version |
create |
Create entry | collection, slug, data |
update |
Update entry | collection, id, data, merge_sets, revision_message |
localize |
Create the entry's localization in another site | collection, id, site, data |
delete |
Delete entry | collection, id |
publish |
Publish entry | collection, id, revision_message |
unpublish |
Unpublish entry | collection, id, revision_message |
list_revisions |
List an entry's revisions | collection, id |
get_revision |
Read one revision | collection, id, revision_id |
restore_revision |
Restore a revision | collection, id, revision_id |
publish_working_copy |
Publish the working copy | collection, id, revision_message |
Narrowing a blueprint response
A page builder's format spec is proportional to every set it can hold, so the
full response for a large blueprint can exceed the response size limit at any
useful depth. Pass field to statamic-blueprints get with a dot path to scope
the response to one field or set:
{ "action": "get", "namespace": "collections", "collection_handle": "pages",
"handle": "pages", "field": "page_builder.ContentSection.media" }
Segments are the handles the spec already reports — allowed_set_types for a
set, group_fields for a group. An unresolvable path lists the valid segments
at the level it failed, so a client can walk down without guessing.
Setting a template or layout per entry
template and layout are entry data that Statamic reads back itself
(Entry::template() falls back to $this->get('template')), but neither has to
be a blueprint field. Send either in data on create, update or localize
and it is stored:
{ "action": "update", "collection": "pages", "id": "home",
"data": { "template": "pages/landing" } }
Send null to clear it and fall back to the collection's template. A non-string
value is refused. parent is not writable this way — an entry's parent comes
from the structure tree, not its data.
Updating one section of a page builder
By default a replicator field in data replaces the stored array outright, so
changing one section means resending every other. With merge_sets: true the
incoming items are merged into the stored array by their id: an id that
already exists is replaced in place, a new one is appended, and stored items
you did not send are left untouched.
Every item sent must carry an id. Removing or reordering items still requires
sending the full array with merge_sets off, where the intent is unambiguous.
Applies to top-level replicator fields only — not bard, whose nodes are not all
addressable by id.
statamic-terms
Taxonomy term management with slug conflict prevention and dependency validation.
| Action | Description | Key Parameters |
|---|---|---|
list |
List terms | taxonomy, search, page, per_page |
get |
Get term | taxonomy, slug |
create |
Create term | taxonomy, slug, data |
update |
Update term | taxonomy, slug, data |
delete |
Delete term | taxonomy, slug |
statamic-globals
Global set structure and values management with multi-site support.
| Action | Description | Key Parameters |
|---|---|---|
list |
List global sets | — |
get |
Get global set | handle, site |
update |
Update values | handle, site, data, merge_strategy |
statamic-structures
Manage collections, taxonomies, navigations, and site configuration. Requires a resource_type parameter (collection, taxonomy, navigation, site, globalset).
| Action | Type | Description | Key Parameters |
|---|---|---|---|
list |
collection | List collections | — |
get |
collection | Get collection | handle |
create |
collection | Create collection | handle, title, config |
list |
taxonomy | List taxonomies | — |
get |
taxonomy | Get taxonomy | handle |
list |
navigation | List navigations | — |
get |
navigation | Get a navigation and its trees | handle |
create |
navigation | Create a navigation, optionally with a tree | handle, data |
update / configure |
navigation | Change settings and replace trees | handle, data |
list |
site | List sites | — |
get |
site | Get site | handle |
Navigation trees
get returns a navigation's menus as trees: [{site, items}]. A write accepts that
same list back, so the usual edit is: read, change the items, send the list as
data.trees. A map of site to items, or a single data.tree with an optional
data.site, works too. A tree replaces the whole menu for its site.
Each item is {id?, entry?, url?, title?, data?, children?} and needs at least an
entry, a url or a title. Items without an id get one. The whole payload is
checked before anything is saved: unknown keys, entries that do not exist, duplicate
ids, unknown sites and items deeper than max_depth are refused with the path that
failed, e.g. trees.default[1].children[0] is 3 levels deep.
{
"action": "update",
"resource_type": "navigation",
"handle": "main",
"data": {
"tree": [
{"id": "home", "entry": "91fc9bb6-..."},
{"title": "Contact", "url": "/contact"}
]
}
}
statamic-assets
Asset container and file operations. Requires a resource_type parameter (container, asset).
| Action | Type | Description | Key Parameters |
|---|---|---|---|
list |
container | List containers | — |
get |
container | Get container | handle |
create |
container | Create container | data |
update |
container | Update container | handle, data |
delete |
container | Delete container | handle |
list |
asset | List assets | container, folder |
get |
asset | Get asset | container, path |
upload |
asset | Upload a file | container, folder, one of source_url / content+encoding+filename / file_path |
move |
asset | Move asset | container, path, destination |
copy |
asset | Copy asset with its data | container, path, destination |
upload takes the file one of three ways:
source_url— the server downloads it. This is the way for a remote client such as Claude or ChatGPT to add an image without sending it as base64. Only publichttp/httpshosts on default ports can be fetched, never the server's own network; seesecurity.url_import.contentwithencoding: base64and afilename— the bytes in the call itself. Fine for small files; a photo of a few megabytes is too much for most clients.file_path— a file understorage/app, for local CLI clients.
folder places the file, e.g. uploads/cases. Every upload goes through Statamic's
own allowed-extensions check, as a Control Panel upload does; a site widens it with
statamic.assets.additional_uploadable_extensions.
For move and copy, destination is the new path with the filename:
archive/old-hero.jpg. End it with / to keep the filename. The extension cannot
change. copy refuses to overwrite an existing file.
| delete | asset | Delete asset | container, path |
statamic-users
User CRUD with role and group management. Requires a resource_type parameter (user, role, group).
| Action | Description | Key Parameters |
|---|---|---|
list |
List users/roles/groups | type |
get |
Get by ID/handle | type, id or handle |
create |
Create user/role | type, data |
update |
Update user/role | type, id, data |
delete |
Delete user/role | type, id |
assign-role |
Assign role to user | user_id, role |
statamic-system
System information, health checks, cache management, and configuration access.
| Action | Description | Key Parameters |
|---|---|---|
info |
Get system information | — |
health |
Health check status | — |
cache_status |
Check cache status and statistics | include_details |
cache_clear |
Clear system caches | cache_type (all, stache, static, views, app, config, route) |
cache_warm |
Warm system caches | cache_type |
config_get |
Read config value | config_key |
config_set |
Set config value | config_key, config_value |
statamic-content-facade
High-level analysis workflows that orchestrate multiple router calls.
| Action | Description | Key Parameters |
|---|---|---|
content_audit |
Report content volume and coverage gaps across collections, taxonomies, and globals | filters |
content_validate |
Validate stored content against its blueprints and report schema drift | scope, collection, taxonomy, severity, limit, offset, max_findings |
cross_reference |
Analyze relationships and dependencies between content types | filters |
Schema accepts action (required, enum: content_audit, content_validate, cross_reference) and the parameters listed above.
content_validate
Writes made through this addon are validated on the way in. content_validate is
the read-side sweep for everything else — git merges, hand-edited YAML, and
blueprints changed after the content was written.
Each record gets two passes: the blueprint's own validation rules, evaluated the same way a Control Panel save evaluates them, plus structural checks the rule engine cannot express.
| Finding type | Severity | What it means |
|---|---|---|
rule_violation |
error | A blueprint validation rule fails against the stored value |
unknown_set_type |
error | A replicator/bard block names a set that is no longer defined; it is dropped at render |
unknown_field |
warning | A set or grid row stores a key that is no longer a field in its blueprint |
invalid_option |
error | A select/radio/button_group/checkboxes value is outside the declared options |
missing_asset |
error | An assets field references a file that no longer exists in its container |
dangling_reference |
error | A navigation item links to an entry that was deleted |
rule_engine_error |
warning | A stored value made a fieldtype's rule builder throw; the structural pass usually names the cause |
Parameters:
scope—all(default),entries,terms,globals, ornavigationscollection/taxonomy— restrict the entry or term sweep to one handleseverity— return onlyerroror onlywarningfindingslimit/offset— records scanned per call (default 100, max 500). Records are walked in a fixed order (entries → terms → globals → navigations) and the offset addresses that combined stream, so paging a large site means repeating the call with a rising offset untilpagination.has_moreis false.max_findings— cap on findings returned per call (default 200, max 2000).summary.findingsstays accurate when the list is truncated.
Non-blueprint keys at the top level of an entry (template, layout, parent, …)
are legitimate and never reported; the unknown_field check applies only inside
sets and grid rows.
statamic-system-discover
Intent-based tool discovery. Describe what you want to do and the tool suggests which MCP tool and action to use.
statamic-system-schema
Inspect the full JSON schema of any registered tool. Useful for AI agents to understand available parameters.
Resources
Alongside tools, the server exposes MCP resources — read-only views a client can browse without spending a tool call.
| URI | Contents |
|---|---|
statamic://blueprints |
Every readable blueprint, with its namespace, handle, title, and URI |
statamic://blueprints/{namespace}/{handle} |
One blueprint's fields, including type, display, and validation rules |
Read statamic://blueprints first to discover the URIs, then read the one you need.
Namespaces include the per-collection and per-taxonomy forms Statamic uses for entry
and term blueprints, so a URI often looks like
statamic://blueprints/collections.pages/article.
Resources enforce the same authorization as the equivalent tool call: the domain
must be enabled, the token must carry blueprints:read, the resource policy must
allow the handle, and the underlying Statamic user must have permission. A blueprint
the resource policy hides does not appear in the index at all.
Tool Annotations
Tools declare behavior annotations:
#[IsReadOnly]— Tool only reads data and has no side effects#[IsIdempotent]— Tool can be called multiple times safely with the same result
Tools also declare a #[Title] — the human-readable name a client shows in its
UI, distinct from the protocol name (statamic-entries → "Statamic Entries").