Woodpresser
This server exposes a WordPress site’s core content and administration through 19 REST-backed tools; no PHP, SQL, filesystem, snippet, or Elementor tools are present in this schema.
Inspect site identity, capabilities, versions, and layered connectivity/auth/bridge health.
List, fetch, create, update, trash or force-delete posts and pages, including meta, terms, templates, and featured media.
List and upload media, using a local path or remote URL sideloading.
List and create categories/tags.
List users with roles.
List plugins and activate, deactivate, install, or delete them; deletion requires confirmation.
List themes and switch the active theme; activation requires confirmation.
Read and update REST-exposed site settings such as title, description, front page, posts per page, and timezone.
Search across posts, pages, and media.
Provides tools for reading and manipulating Elementor page data stored in _elementor_data: inspecting available widgets and page status, building full page trees from a compact spec (sections/columns/widgets or flexbox containers), deep-merging patches into existing elements by path, and taking/restoring five-deep snapshots of previous page data, plus cache clearing.
Provides typed, Zod-validated tools for interacting with a real WordPress site through the REST API and a companion bridge plugin: managing posts, pages and content (create, read, update, delete, search), media uploads and listings, terms and taxonomy, users, plugins and themes, and site settings. It can also inspect site info and health, manage post meta, and with the bridge read/write files inside wp-content, run SQL statements, execute PHP (as programs or templates with captured output), manage snippet-like PHP, and read the audit log.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Woodpresserlist the 5 most recent draft posts on my WordPress site"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Woodpresser
A WordPress MCP server for coding agents. Give Claude, opencode, Cursor or any MCP client structured access to a real WordPress site — content, plugins, PHP, the database, the filesystem, and Elementor page data — through one typed tool surface.
npx woodpresser-mcp initYou need three things: the site URL, a username, and an Application Password. Everything else is automated.
Why
WordPress is where a huge share of the web lives, but agents are bad at it. They guess at REST routes, paste PHP into the wrong file, or rewrite an Elementor page by hand-editing JSON they do not understand. Woodpresser gives them:
A typed tool surface — 39 tools, Zod-validated, with descriptions written for a model, not a human.
Mode gating — a content-only site never gets a PHP execution tool registered. No dead tools, no accidental damage.
A companion bridge plugin for the things REST cannot do: evaluating PHP with captured output, running SQL, reading and writing files inside
wp-content, managing snippet-like PHP, and reading/writing Elementor's_elementor_data.Safety rails — destructive tools require an explicit
confirmliteral,wp_el_builddefaults to a dry run, every write is audited locally and on the site, and secrets are scrubbed from every payload before it reaches the transcript.
Related MCP server: WordPress MCP Server
Install
npm i -g github:a-saeedia/woodpresser-mcp
woodpresser initThat form works today and always builds from source (prepare runs tsc), so it needs git on PATH and about a minute. Once woodpresser-mcp is on the registry (tracked in the changelog), npm i -g woodpresser-mcp and npx woodpresser-mcp init do the same thing faster.
Node >= 22 is the only prerequisite.
Install it globally. The MCP entry install-mcp writes contains an absolute path to the install, so a clone inside a temp directory works until something cleans temp and then your client cannot start the server.
After your credentials, init asks whether to enable php + elementor. The default is no: you get 19 content tools and nothing that can execute code. Answer y when you actually want PHP, SQL and filesystem access, or be explicit in a script with --modes core,php,elementor.
init walks through:
Credentials — verifies the Application Password against
/wp/v2/users/me.Bridge detection — probes
/wp-json/woodpresser/v1/ping.Claim — binds the bridge to your token (constant-time compared on the server).
Config — writes
~/.woodpresser/config.json(mode0600).MCP registration — adds the server to opencode, Claude Code and/or VS Code, preserving your comments and formatting.
If the bridge is not installed yet, init writes woodpresser-bridge.php to the current directory and prints the three-step upload. Re-run woodpresser bridge claim once it is active.
Register only
woodpresser install-mcp --target all --scope user
woodpresser install-mcp --target opencode --scope project
woodpresser uninstall-mcp --target opencodeClient | File | Key |
opencode |
|
|
Claude Code |
|
|
VS Code |
|
|
The entry looks like this:
{
"mcp": {
"woodpresser": {
"type": "local",
"command": ["C:/Program Files/nodejs/node.exe", "/path/to/woodpresser/dist/cli.js", "mcp", "--site", "example-com"],
"enabled": true
}
}
}Restart the client afterwards.
The bridge plugin
The core REST API covers posts, media, terms, users, plugins, themes and settings. It cannot evaluate PHP, inspect the database, or touch files. The bridge fills that gap.
Single file.
bridge/woodpresser-bridge.php, no build step, no Composer.Upload once.
woodpresser initwriteswoodpresser-bridge.zipnext to you when the bridge is missing; upload it at wp-admin → Plugins → Add New → Upload Plugin and activate. The archive already contains thewoodpresser-bridge/folder wp-admin expects. No SFTP needed;npm run bridge:zipbuilds the same file intodist/.Or pin the token in
wp-config.phpand skip the claim flow entirely:
define( 'WOODPRESSER_TOKEN', 'your-token' );The token source is reported by wp_bridge_status as constant or option.
Authentication
Three factors, all required:
A valid WordPress user with
manage_options(Application Password over Basic auth).A matching
X-Woodpresser-Token.A per-user rate limit of 240 requests/minute.
The token is compared with hash_equals. Without WOODPRESSER_TOKEN, the first POST /claim stores it in an option; the route requires manage_options, so only an administrator can claim a fresh bridge.
Modes
Set per site. A new site starts in core only; add php and/or elementor at init time (--modes core,php,elementor), in ~/.woodpresser/config.json, or via WOODPRESSER_MODES.
A mode you did not enable registers no tools at all. The model cannot call what is not in its tool list, so the safest configuration is also the one with the smallest prompt.
Mode | Tools | Use when |
| 19 | Content editing, media, users, plugins, settings. No code execution. |
| 11 | PHP eval, SQL, filesystem, snippets, post meta, audit log. Requires the bridge. |
| 9 | Read, build, patch, snapshot and restore Elementor pages. |
Tools from a mode you did not enable are not registered — the model never sees them.
Tools
Core (core)
wp_site_info · wp_health_check · wp_content_list · wp_content_get · wp_content_create · wp_content_update · wp_content_delete · wp_media_list · wp_media_upload · wp_terms_list · wp_term_create · wp_users_list · wp_plugins_list · wp_plugin_action · wp_themes_list · wp_theme_activate · wp_settings_get · wp_settings_set · wp_search
PHP / site (php)
wp_bridge_status · wp_bridge_flags · wp_php_run · wp_db_query · wp_fs · wp_snippet_list · wp_snippet_save · wp_snippet_run · wp_snippet_delete · wp_post_meta · wp_audit_log
wp_php_run takes code plus mode: php (a PHP program; return is serialized back) or template (HTML with inline <?php ?> blocks). Output buffering, fatal-error capture, a 512 KB source cap and a shell-function blocklist apply in both.
wp_fs is jailed to wp-content. Reads are broad; writes are limited to an extension allowlist, and .htaccess, .user.ini and index.php are never writable. Overwrites are backed up to wp-content/woodpresser-backups (last 40 kept).
Elementor (elementor)
wp_el_status · wp_el_widgets · wp_el_get · wp_el_build · wp_el_set · wp_el_patch · wp_el_snapshots · wp_el_restore · wp_el_clear_cache
wp_el_build accepts a compact spec and expands it into Elementor's tree (section → column → widget, or flexbox containers), generating 7-hex ids:
{
"layout": "section",
"page_settings": { "template": "elementor_canvas" },
"sections": [
{
"settings": { "layout": "boxed", "gap": "extended" },
"columns": [
{ "size": 60, "widgets": [{ "type": "heading", "settings": { "title": "Hello", "header_size": "h1" } }] },
{ "size": 40, "widgets": [{ "type": "button", "settings": { "text": "Go", "link": { "url": "#" } } }] }
]
}
]
}It defaults to dry_run: true and returns the tree without writing. Set dry_run: false and confirm: "overwrite" to persist. Every write snapshots the previous data (five deep) into woodpresser_el_snap_<post_id>, so wp_el_restore can put it back.
wp_el_patch takes paths from wp_el_get (e.g. 0/1/2) and deep-merges settings, so changing typography_font_size.size does not erase unit.
Safety model
Control | Behaviour |
|
|
Dry run |
|
Feature flags |
|
SQL | Single statement only; |
Filesystem | Realpath jail under |
Secrets |
|
Audit | Local |
The bridge is a deliberate remote-code-execution surface guarded by an administrator credential. Treat the token like a root password, keep allow_* flags off on production until you need them, and read wp_audit_log after an agent session.
Configuration
Precedence, highest first:
Environment:
WOODPRESSER_SITE_URL,WOODPRESSER_USER,WOODPRESSER_APP_PASSWORD,WOODPRESSER_BRIDGE_TOKEN,WOODPRESSER_MODES,WOODPRESSER_SITE,WOODPRESSER_CONFIG,WOODPRESSER_BRIDGE_FILE.Project file:
./.woodpresser.json.User file:
~/.woodpresser/config.json.
Multiple sites live side by side; each MCP entry pins one with --site <name>.
woodpresser sites
woodpresser sites default clinic
woodpresser doctor --site clinicdoctor reports REST, auth, bridge, WordPress and PHP versions, Elementor presence and every flag — the fastest way to tell whether a failure is credentials, a plugin, or a permission.
Troubleshooting
Symptom | Cause | Fix |
| Login password instead of an Application Password, or the | Create one at Users → Profile → Application Passwords; on LiteSpeed/Apache check that |
| Config and bridge disagree after a re-init or restore |
|
| A second machine pointed at a site whose bridge another machine already claimed; the bridge only rotates its token for the current holder | On the owning machine run |
|
| Put that same value in the client config ( |
| Bridge installed but not activated, or the plugin folder was uploaded inside another folder | Activate it in Plugins; the plugin file must be |
| Bridge is active but no token was ever claimed |
|
| More than 240 requests in a minute from one administrator | Batch your calls; the bucket resets after 60s |
| The site, usually via a security plugin, turned Application Passwords off | Enable them in Users → Profile, or define |
| Path resolved outside the jail, or a symlinked upload directory | Pass paths relative to |
Tools missing in the client | Mode not enabled, or the client has not reloaded the server |
|
| Node older than 22 |
|
| Application Passwords are only offered over HTTPS unless the site sets | Use the |
You must point a second machine at a site already configured | Re-running | Run |
woodpresser doctor --site <name> prints each layer — REST, auth, bridge, versions, flags — and says which one failed. On a rejected login it also prints the one curl command that separates a wrong Application Password from a host that strips the Authorization header.
Requirements
Node.js >= 22 (uses
zlib.crc32,node:testglobbing,AbortSignal.timeout). Older runtimes exit at startup with an upgrade line.WordPress >= 6.0 with Application Passwords (HTTPS or a
localenvironment).PHP >= 7.4 for the bridge.
Development
npm install
npm run build # tsc
npm test # unit tests (node:test)
npm run test:integration
npm run bridge:ziptest:integration boots a real WordPress in WordPress Playground (PHP-WASM, no Docker, no PHP install), mounts bridge/, activates the plugin, and drives the actual MCP tool handlers through 50+ assertions: auth, claim, PHP eval, SQL guard rails, filesystem jail, snippets, content CRUD, Elementor build/patch/snapshot/restore, meta and audit.
@wp-playground/cli is a dev dependency, so npm run test:integration works after npm install. To use a different build, set WOODPRESSER_PLAYGROUND_CLI to its path.
License
MIT (c) Arman Saeedi
Change history: CHANGELOG.md. Contributing: CONTRIBUTING.md. Security: SECURITY.md.
Available Tools
19 toolswp_content_createCreate a post or pageC
Create content. Returns the new ID and link. Supports meta, taxonomy terms and page templates.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ISO date, required for status=future | |
| meta | No | ||
| slug | No | ||
| tags | No | ||
| type | No | post | |
| title | Yes | ||
| parent | No | ||
| status | No | draft | |
| content | No | Block or classic HTML | |
| excerpt | No | ||
| template | No | Page template, e.g. elementor_header_footer | |
| categories | No | ||
| menu_order | No | ||
| featured_media | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint, idempotentHint=false and destructiveHint=false, so the mutation semantics are partly covered. The description adds genuinely useful context by stating the return value (new ID and link), which matters because there is no output schema, but it omits defaults (status=draft, type=post), auth requirements, and what happens if creation fails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the key return-value information front-loaded; nothing is padded. The lead sentence 'Create content.' is close to a tautology of the name, but the remainder earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter mutation tool with no output schema, the description is thin: it covers the return shape (a real plus) but says nothing about the draft-by-default status, the post-vs-page type switch, required title, or the arbitrary meta object. An agent can call it, but only by reading the schema closely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 21%, so the description must carry the load for 14 parameters, and it largely does not. It mentions meta, taxonomy terms (tags/categories) and page templates, which loosely maps to three params, but leaves slug, parent, menu_order, featured_media, excerpt, status, type and title undocumented beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title and description together give a clear verb+resource ('Create a post or page' / 'Create content'), which separates it from wp_content_get, wp_content_update and wp_content_delete. However, the description alone says only 'Create content', which is broad enough that the sibling differentiation comes mostly from the title rather than the body text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given: it never says to use this instead of wp_content_update for existing posts, or to use wp_term_create/wp_post_meta for related resources. The capability note about meta, taxonomy terms and templates hints at scope but does not tell the agent when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_content_deleteDelete (trash) a post or pageADestructiveIdempotent
Moves to trash by default. force=true bypasses trash forever and requires confirm:"delete".
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| type | No | post | |
| force | No | ||
| confirm | No | Must be "delete" when force=true |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds critical nuance: deletion is reversible by default (trash) and irreversible only when force=true, which also requires confirm:"delete". This is meaningful operational context beyond the annotations, though it does not mention permissions or post-deletion side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the default behavior before the force/confirm caveat. Every phrase earns its place and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with no output schema and helpful annotations, the description supplies the key safety facts: default trash behavior, permanent deletion path, and the confirmation requirement. Only minor gaps remain around id/type semantics and broader usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%, so the description must carry more weight. It adds important meaning for force and confirm (including their conditional relationship), but leaves id and type semantics entirely to the schema, which is only partially documented there.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Delete') and resource ('a post or page'), and the title confirms the trash semantics. It is immediately distinguishable from sibling content tools like wp_content_get, wp_content_create, and wp_content_update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the default behavior (moves to trash) and the condition for permanent deletion (force=true), which tells an agent when to use the force path. It does not name alternatives such as wp_snippet_delete or explain when to prefer trash over permanent deletion beyond the parameter behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_content_getGet a post or pageBRead-only
Fetch a single item by ID or slug, including raw and rendered content plus open Graph-ish fields.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| slug | No | ||
| type | No | post | |
| context | No | edit |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint) and scope (openWorldHint). The description adds useful context about the return payload ('raw and rendered content plus open Graph-ish fields'), which matters since there is no output schema. It still omits that context=edit vs view changes what content is returned, a behavioral detail an agent would want.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the core action front-loaded and no filler. It is appropriately sized for a simple read tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 0% schema coverage, the description does well to name the returned content fields, but it leaves the context parameter and key-precedence behavior unexplained. Adequate but with clear gaps for a 4-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It addresses id/slug ('by ID or slug') and implicitly the type enum ('post or page'), but says nothing about the context enum (view vs edit), which governs whether raw or rendered content comes back. Three of four parameters get partial coverage and the most consequential one is silent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and resource ('single item'/post or page) with the lookup keys (ID or slug). It clearly reads as the single-item counterpart to wp_content_list, though it doesn't name that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The single-vs-list framing implicitly tells the agent when to reach for this tool rather than wp_content_list. However, there is no explicit when-to-use/when-not guidance, no mention of required permissions, and no note on which lookup key takes precedence if both id and slug are supplied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_content_listList posts or pagesARead-only
List content with filters. Returns compact rows by default (no full content). Use wp_content_get for the body.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| slug | No | Exact slug | |
| tags | No | ||
| type | No | post or page | post |
| order | No | ||
| author | No | ||
| parent | No | Parent ID (pages) | |
| search | No | Free-text search | |
| status | No | Post status filter | |
| orderby | No | ||
| per_page | No | ||
| categories | No | ||
| include_content | No | Include rendered content |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and openWorldHint already present in annotations, the description adds useful default behavior: it returns compact rows and omits full content unless otherwise requested. It does not describe pagination behavior or permission needs, but the annotation coverage lowers the bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no waste. The default return behavior is front-loaded, and the routing to wp_content_get follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter read-only list tool with no output schema, the description covers the key list-vs-get distinction and default compact return, but it leaves out filter meanings, pagination details, and compact-row field structure. It is minimally sufficient but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 46% across 13 parameters, so the description must compensate, but it only says 'with filters' and 'no full content' generically. It does not clarify filter semantics, pagination, ordering, or most parameters, adding little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource ('List content with filters') and explicitly distinguishes itself from the sibling retrieval tool by saying to use wp_content_get for the body. An agent can identify the tool's core purpose without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative for full body retrieval ('Use wp_content_get for the body') and implies the default compact-list context. However, it does not explain when to use include_content instead of wp_content_get, nor does it state when not to use this listing tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_content_updateUpdate a post or pageBIdempotent
Patch an existing item. Only supplied fields change. For a full Elementor rewrite use wp_el_set instead.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| meta | No | ||
| slug | No | ||
| tags | No | ||
| type | No | post | |
| title | No | ||
| parent | No | ||
| status | No | ||
| content | No | ||
| excerpt | No | ||
| template | No | ||
| categories | No | ||
| menu_order | No | ||
| featured_media | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only openWorldHint and idempotentHint supplied, the description adds a meaningful behavioral fact: 'Only supplied fields change,' i.e. true patch semantics consistent with idempotentHint. It does not disclose what a status change does, whether revisions are created, or auth requirements, so it is useful but incomplete for a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the core patch semantic and the key alternative both front-loaded. Nothing to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter mutation with no output schema and no destructive/readOnly annotations, the description is too thin: it never enumerates updatable fields, never states side effects of status/parent/content changes, and leaves 13 optional parameters undocumented in both schema and prose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 14 parameters, so the schema documents none of them and the description names none either. 'Only supplied fields change' conveys the general optional-field contract, but an agent gets no per-parameter meaning (meta, status, template, menu_order, featured_media, etc.) from either source.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'Patch' plus the sibling routing to wp_el_set makes the update intent clear, and the title names the resource (post or page). However, the description itself calls the target a generic 'item' rather than naming post/page, forcing the agent to rely on the title for the resource identity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit alternative for one case ('For a full Elementor rewrite use wp_el_set instead'), which is genuine routing value. But it offers no guidance against the many other closely related siblings (wp_content_create, wp_el_patch, wp_el_build), so the when-to-use picture is only partially drawn.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_health_checkWordPress health checkARead-only
Diagnose connectivity in layers: REST reachable, credentials accepted, bridge claimed, Elementor present, permalinks, and debug log size. Use before blaming the code.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety profile is covered. The description adds real behavioral value by disclosing the layered probe order and that it reads the debug log size, but it says nothing about failure modes, error semantics, or what the diagnostic report looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, front-loaded with the enumerated diagnostic layers followed by the usage cue. Every listed item carries distinct information about what is probed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only diagnostic with no output schema, the description supplies everything an agent needs to decide to call it and understand what surfaces it inspects. The only mild gap is the exact shape of the returned report, which is not required to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline for this dimension is 4. Nothing in the schema requires further explanation, and the description correctly spends no words on inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Diagnose') and enumerates exactly what is checked: REST reachability, credentials, bridge claim, Elementor presence, permalinks, debug log size. That is far more specific than siblings like wp_bridge_status or wp_el_status, though it never names them to sharpen the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use before blaming the code' gives a loose trigger condition (run this when connectivity problems are suspected), which is better than nothing. But it never routes between this tool and the narrower siblings (wp_bridge_status, wp_el_status, wp_site_info), so the agent must infer the boundary itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_media_listList mediaCRead-only
List attachments with optional MIME filter and search.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| search | No | ||
| per_page | No | ||
| mime_type | No | e.g. image/jpeg |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds no behavioral context beyond that – no pagination behavior, default ordering, or result limits, despite per_page/page existing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with no waste and the key filtering capability front-loaded. Its brevity is appropriate, though it is arguably too terse given the missing pagination details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with annotations covering safety, the description is minimally adequate. It omits pagination behavior and return shape, which matters since no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25% (only mime_type documented inline). The description compensates by naming the MIME filter and search, covering two of four parameters, but leaves page and per_page entirely unexplained in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'List attachments' gives a clear verb+resource, and 'attachments' is specific WordPress media terminology. It does not distinguish itself from the sibling wp_content_list, but the resource is unambiguous enough that an agent can identify it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says nothing about when to use this versus wp_content_list, wp_media_upload, or wp_search. No prerequisites or context are given, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_media_uploadUpload mediaB
Upload a local file to the media library. Provide path, or url to sideload a remote file.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Remote URL to download then upload | |
| path | No | Local absolute path | |
| title | No | ||
| alt_text | No | ||
| filename | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply only openWorldHint=true, so the description carries most of the behavioral burden. It discloses that url means sideloading (download-then-upload), but says nothing about overwrite/duplicate-filename behavior, permission requirements, size limits, or success/failure semantics for a mutating upload.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action and followed by the input-mode clarification. No filler, though it could be marginally more informative without growing much.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description should convey what happens on success/failure, but it doesn't. Combined with sparse annotations and partial parameter documentation, it is adequate for a basic upload but leaves real gaps around results and edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is low at 40%, so the description should compensate. It does explain the two primary parameters (path and url) and their mutual exclusivity, but title, alt_text, and filename remain undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Upload a local file to the media library') and clarifies the two intake modes (local path vs remote url). An agent can easily distinguish this from wp_media_list, but the description never names or contrasts a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence 'Provide path, or url to sideload a remote file' gives concrete guidance on the two mutually-exclusive input modes, which is implied usage context. However, it offers no when-to-use vs. alternatives, no prerequisites, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_plugin_actionPlugin actionADestructive
Activate, deactivate, install (from wordpress.org by slug) or delete a plugin. Deletion requires confirm:"delete". Activating an untrusted plugin is a security decision.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | wordpress.org slug, for install | |
| action | Yes | ||
| plugin | No | Plugin file, e.g. elementor/elementor.php | |
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true. The description adds useful behavioral detail beyond those: a delete confirmation guard, the install source, and a security warning about activation. It does not cover authentication needs, reversibility, or per-action return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words, with the important destructive-action prerequisite front-loaded after the action list. Every sentence adds necessary meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-action mutating tool with destructive/open-world annotations and no output schema, the description covers the key safety prerequisites and install source. It leaves some per-action parameter mapping implicit, but the schema supplies the plugin-file parameter and enum action values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, and the description adds meaning for the action enum, the slug parameter's install use, and the confirm value for deletion. It does not add semantics for the plugin parameter beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names four specific verbs (activate, deactivate, install, delete) and the resource (plugin), and it specifies that install uses a wordpress.org slug. It does not explicitly contrast itself with siblings such as wp_plugins_list, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear action-specific context: install comes from wordpress.org by slug, deletion requires confirm:"delete", and activating an untrusted plugin is a security decision. It does not state when not to use this tool or name a specific alternative for listing/viewing plugins.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_plugins_listList pluginsARead-only
List installed plugins with status and available updates.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe-read profile (readOnlyHint=true, openWorldHint=true), so the description's remaining burden is low. It adds genuine value by disclosing what the payload contains — plugin status and available updates — which matters since no output schema exists. It does not mention permissions or pagination, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, tightly scoped sentence with the resource front-loaded and the returned fields listed after. No filler, no redundancy with the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list operation whose safety profile is covered by annotations, the description supplies purpose and a summary of returned fields. Without an output schema it would be marginally better to name the exact fields (e.g. version, active/inactive), but nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so there is nothing for the description to disambiguate; the baseline for a zero-parameter tool is 4. Schema coverage is 100% and the empty schema is consistent with the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List installed plugins') plus the scope of data returned ('status and available updates'). This is clearly distinguishable from the mutating sibling wp_plugin_action and from wp_themes_list, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance, and no pointer to siblings like wp_plugin_action for changing plugin state. For a zero-parameter read-only listing tool the usage is self-evident from the purpose, so implied usage is adequate but not helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_searchSearch the siteBRead-only
Search across posts, pages and media in one call. Use this to locate content before editing it.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| subtype | No | any | |
| per_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and reach are covered. The description adds the useful 'single call across three content types' nuance, but says nothing about result ordering/ranking, pagination behavior, or what a match contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, purpose front-loaded ahead of usage. The second sentence is short and earns its place as routing guidance; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search with no output schema and paging parameters (per_page 1-50, default 20), the agent is left guessing about result shape and how to page through matches. Acceptable minimum, but incomplete for a tool whose return format is entirely undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description documents none of the three parameters — no guidance on query syntax, the sub-type selector, or the per_page cap. Worse, it advertises 'media' as searchable while the subtype enum only offers post/page/any, so it adds confusion rather than compensating.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and the resources it spans (posts, pages, media), plus the aggregation angle 'in one call' that separates it from the per-type listers like wp_content_list and wp_media_list. It stops short of explicitly naming those siblings, so the differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this to locate content before editing it' gives a clear intent and implicitly points at the edit flow (wp_content_update). However it names no alternatives and gives no when-not — nothing tells the agent why to search here versus wp_content_list or wp_media_list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_settings_getRead site settingsARead-only
Read the REST-exposed site settings (title, description, timezone, permalinks, front page).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds a useful boundary by specifying 'REST-exposed' settings, implying non-REST settings are omitted, but gives no detail on return shape or size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The parenthetical field list is the most informative part and is placed immediately after the scope statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description reasonably compensates by naming the settings returned. The 'REST-exposed' qualifier hints that the result set is partial, which is a useful caveat, though it stops short of clarifying whether sensitive settings are excluded.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies. The description has no parameters to explain and correctly does not fabricate any, keeping it consistent with the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (read) and resource (site settings) and enumerates concrete settings returned (title, description, timezone, permalinks, front page). This clearly distinguishes it from its write sibling wp_settings_set, though it does not name that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the read-only nature and the presence of wp_settings_set in the sibling list, but the description never says when to call this versus wp_site_info or other read tools. No prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_settings_setUpdate site settingsBIdempotent
Update REST-exposed settings. Arbitrary options need wp_php_run or wp_db_query.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| description | No | ||
| page_on_front | No | ||
| show_on_front | No | ||
| page_for_posts | No | ||
| posts_per_page | No | ||
| timezone_string | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true and idempotentHint=true, so safety/idempotency is covered structurally. The description adds the meaningful scope constraint that only REST-exposed settings can be touched, but says nothing about required capabilities, what happens to omitted settings, or whether updates are partial or full replacement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler. The primary action leads, and the fallback routing follows immediately after the scoping clause that motivates it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A mutation tool with 7 fully undocumented parameters, no output schema, and only partial annotation coverage. The description should at least indicate which settings class it targets or what a successful update returns; as written, an agent cannot confidently populate the body from the definition alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 7 parameters, and the description names none of them. 'REST-exposed settings' only indirectly implies the WordPress settings endpoint fields; an agent gets no help distinguishing title/description/page_on_front/show_on_front from the other options, nor any hint about the enum values or integer expectations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Update REST-exposed settings') and scopes it precisely to settings reachable through the REST API, which separates it from the sibling wp_settings_get and from arbitrary option manipulation. It is clear what the tool does, though it stops short of naming wp_settings_get explicitly as its read counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives a real routing rule: arbitrary/non-REST options must go through wp_php_run or wp_db_query instead. That is an explicit alternative with a condition, not just implied usage. It lacks only a stated 'use wp_settings_get first' or prerequisite/permission guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_site_infoWordPress site infoARead-only
Identify the connected site: name, description, URL, REST namespaces, the authenticated user and their capabilities, plus bridge/Elementor/plugin versions. Start here when you inherit a project.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered by structured data rather than the prose. The description adds useful scope context by disclosing that an authenticated user's capabilities are exposed, but says nothing about permissions required, caching, or whether the call is cheap to repeat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The data returned is front-loaded in a dense noun list and the usage cue is placed last, which is the right emphasis for an entry-point tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return-value burden, and it does so by enumerating the site identity, version, and capability fields an agent needs to orient itself. For a zero-parameter read-only tool, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 by rule; there is nothing for the description to clarify beyond the empty input schema. The description does not waste words re-explaining absent inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (identify) and resource (the connected site), then enumerates the concrete data surface: name, description, URL, REST namespaces, authenticated user and capabilities, and bridge/Elementor/plugin versions. That is clearly distinguishable from sibling tools like wp_content_list or wp_plugins_list, which address subsets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Start here when you inherit a project" gives a concrete trigger for calling this tool first, which is genuine usage guidance. It does not name alternatives or state when not to use it, so it stops short of a full when/when-not routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_term_createCreate a termC
Create a category or tag.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| slug | No | ||
| parent | No | ||
| taxonomy | No | categories | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide only openWorldHint=true, so they carry almost none of the behavioral burden. The description does not say what happens on duplicate names/slugs, whether an existing term is mutated, what permissions are required, or how the default taxonomy is applied. For a mutation tool with near-zero annotation coverage this is a real gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence with no wasted words, which is good. But the brevity comes from under-specification rather than discipline — there is simply nothing to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation tool with no output schema, no readOnly/destructive hints, and 0% schema coverage, the description is far too sparse. An agent cannot tell from this definition whether the call is safe, what it returns, or how the non-required parameters behave.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across five parameters, and the description compensates for none of them: slug, parent, and description are never explained, and the crucial 'taxonomy' parameter is only obliquely referenced via 'category or tag' without noting it defaults to 'categories'. Parent (integer, implies hierarchy) is entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a category or tag'), so the agent knows it makes a new taxonomy term. However, it never names or distinguishes itself from the closest sibling, wp_terms_list, and gives no indication of what a 'term' maps to beyond the category/tag gloss. The purpose is understandable but thin.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no statement of prerequisites (e.g. capability/permission needs), and no alternative named against wp_terms_list or wp_content_create. The agent is left to infer that this is the tool for adding taxonomy terms.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_terms_listList taxonomy termsCRead-only
List categories, tags or any public taxonomy.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| search | No | ||
| per_page | No | ||
| taxonomy | No | categories |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds nothing behavioral — no pagination behavior, no defaults, no auth context — and its claim of 'any public taxonomy' is subtly misleading since the schema enum restricts taxonomy to 'categories' and 'tags' only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no wasted words, but it is under-specified rather than genuinely concise — it omits essential parameter and behavioral detail needed to invoke the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With four parameters at 0% schema coverage, no output schema, and no annotations explaining returns, the description is far too thin. It should at minimum explain pagination, the taxonomy default, and what a returned term looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for four undocumented parameters (page, search, per_page, taxonomy). It only vaguely gestures at taxonomy via 'categories, tags' and says nothing about pagination or search semantics, leaving the agent to guess parameter meaning from names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (List) and resource (taxonomy terms), and enumerates the main term types: categories and tags. It clearly identifies this as a read operation on taxonomy terms, though it doesn't explicitly name the sibling it differs from (e.g., wp_term_create is the write counterpart).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus alternatives such as wp_search or wp_content_list, nor any mention of prerequisites. The agent must infer that this is the read-side of wp_term_create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_theme_activateActivate a themeADestructive
Switch the active theme. Changing themes on a live site is high-impact; prefer a staging copy.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be "activate" | |
| stylesheet | Yes | Theme directory slug |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuinely new context beyond that: the change is 'high-impact' and should be staged first. It doesn't mention reversibility or auth requirements, keeping it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler. The core action is front-loaded and the risk warning follows immediately, which is exactly the right ordering for a destructive operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with full schema coverage and annotations covering the destructive profile, the description supplies the one thing structured fields can't: the operational risk advisory. Nothing critical is missing, though naming the inspect-first sibling would have made it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (stylesheet slug, confirm='activate') are fully documented in the schema. The description adds no syntax, format, or validation detail beyond that, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Switch the active theme.' An agent immediately knows this mutates the site's active theme, distinguishing it from read-oriented siblings like wp_themes_list. It stops short of naming any sibling explicitly, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a caution condition ('on a live site... prefer a staging copy') but never states when to call this tool versus the alternatives (e.g., wp_themes_list to inspect first, or wp_plugin_action for plugin counterparts). Usage is implied through the risk warning rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_themes_listList themesARead-only
List installed themes and which one is active.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that the response reveals the active theme, which is useful, but says nothing about ordering, counts, or whether inactive/broken themes are included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Both the action and the notable return detail are stated in one pass.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-argument read tool with annotations covering the safety profile and no output schema, this is nearly complete. Minor gap: no hint about response shape or whether the call reaches the live site (openWorldHint).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; no parameter semantics are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('List') plus resource ('installed themes') and an extra payload detail ('which one is active'). It is clearly distinguishable from wp_plugins_list and wp_terms_list by resource, but it never names or contrasts with its obvious sibling wp_theme_activate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: a read-only inventory of themes, contrasted only implicitly with wp_theme_activate for state changes. No explicit when-to-use, when-not-to-use, or prerequisite statement is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wp_users_listList usersCRead-only
List users with roles. Requires administrator credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| roles | No | ||
| search | No | ||
| per_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safe-read nature is established. The description usefully adds the administrator-credential requirement, which annotations do not convey, but says nothing about result volume, pagination, or what user fields are returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler, and the core action is front-loaded before the auth caveat. Size is appropriate, though the terseness leaves room that could have been spent on the undocumented parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With four entirely undocumented parameters and no output schema, the description should carry more of the burden, but it only covers roles and credentials. Missing filtering/pagination behavior leaves the definition under-specified for a list tool with this many knobs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across four parameters. The description only alludes to 'roles' and says nothing about page, per_page (max 100), or search, so an agent must guess at filtering and pagination semantics from bare property names and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list users) plus a returned attribute (roles), which distinguishes it from sibling list tools like wp_content_list and wp_media_list that target other resources. It does not mention pagination or search scope, so the picture is slightly incomplete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides the prerequisite (administrator credentials) but gives no guidance on when to use this versus wp_search or other listing tools, and no exclusions or conditions. An agent has little to infer beyond 'this lists users'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
20 tool updates
v0.1.2- Removed
wp_audit_log - Removed
wp_bridge_flags - Removed
wp_bridge_status - Removed
wp_db_query - Removed
wp_el_build - Removed
wp_el_clear_cache - Removed
wp_el_get - Removed
wp_el_patch - Removed
wp_el_restore - Removed
wp_el_set - Removed
wp_el_snapshots - Removed
wp_el_status - Removed
wp_el_widgets - Removed
wp_fs - Removed
wp_php_run - Removed
wp_post_meta - Removed
wp_snippet_delete - Removed
wp_snippet_list - Removed
wp_snippet_run - Removed
wp_snippet_save
39 tool updates
v0.1.0- First observed
wp_audit_log - First observed
wp_bridge_flags - First observed
wp_bridge_status - First observed
wp_content_create - First observed
wp_content_delete - First observed
wp_content_get - First observed
wp_content_list - First observed
wp_content_update - First observed
wp_db_query - First observed
wp_el_build - First observed
wp_el_clear_cache - First observed
wp_el_get - First observed
wp_el_patch - First observed
wp_el_restore - First observed
wp_el_set - First observed
wp_el_snapshots - First observed
wp_el_status - First observed
wp_el_widgets - First observed
wp_fs - First observed
wp_health_check - First observed
wp_media_list - First observed
wp_media_upload - First observed
wp_php_run - First observed
wp_plugin_action - First observed
wp_plugins_list - First observed
wp_post_meta - First observed
wp_search - First observed
wp_settings_get - First observed
wp_settings_set - First observed
wp_site_info - First observed
wp_snippet_delete - First observed
wp_snippet_list - First observed
wp_snippet_run - First observed
wp_snippet_save - First observed
wp_term_create - First observed
wp_terms_list - First observed
wp_theme_activate - First observed
wp_themes_list - First observed
wp_users_list
TDQS
Scored across 19 tools
Most tools map cleanly to a resource+action pair (content CRUD, media, terms, plugins, themes, settings), so selection is usually obvious. Minor overlaps exist: wp_search vs wp_content_list both locate content, and wp_site_info vs wp_settings_get both expose title/description, which could cause a misselection. Descriptions do enough disambiguating work to keep this mostly clean.
A consistent wp_ + resource + action convention runs through nearly all tools (wp_content_get, wp_media_upload, wp_plugin_action, wp_settings_set). Deviations are small: wp_terms_list is plural while wp_term_create is singular, and a few names are noun-only (wp_site_info, wp_health_check, wp_search). Still readable and predictable overall.
19 tools is on the heavy side but each covers a distinct slice of WordPress administration (content, media, terms, users, plugins, themes, settings, diagnostics, search). No obvious filler tools; the count is driven by genuine domain breadth rather than redundancy.
Content has full CRUD, but media and taxonomy are half-finished: no wp_media_get/delete and no wp_term_update/delete, leaving dead ends. Worse, descriptions reference tools that do not exist (wp_el_set, wp_php_run, wp_db_query), which will send an agent chasing phantom operations, especially for the Elementor workflow the server advertises.
Maintenance
Related MCP Connectors
Manage WordPress blogs and WooCommerce shops from Claude, ChatGPT, Cursor and other MCP apps.
Run all of WordPress from Claude, ChatGPT or Cursor: SEO, security, your WooCommerce shop and Elementor pages, on up to 10 websites in one connector. Start free. SEO: titles, descriptions and focus keywords for every page, post and product. Security & updates: core, plugin and theme updates with a live test, site health and HTTPS checks, users and roles. WooCommerce shop: products, prices, orders, coupons and customers. Elementor and many more page builders: texts, links and images. Blog posts, pages, media, comments and menus. 10 websites in one connector: all your sites in the same chat. Deploy (Agency): build a site locally and push it to your own server. Just say it: "Write SEO titles for every product." "Install all updates and check that the site still works." "Show today's orders and create a weekend coupon." You choose what your AI may change, with one switch. Install the free AlphaBridge MCP plugin from WordPress.org, connect and approve on your own site. No account, no key to copy.
Run every WordPress site you look after from Claude or ChatGPT. Nothing goes live until you approve it, every change gets a receipt you can undo, and the whole fleet sits in one tamper-evident log.
Manage a WordPress site from your AI assistant: read, search, propose edits, Search Console data.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to manage WordPress sites via ~74 capabilities including content, media, plugins, themes, and more.-
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to manage WordPress sites through the WordPress REST API, supporting content, media, users, settings, and Elementor management with safety policies for production use.MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to read and edit WordPress sites over the REST API, including Divi 4, Divi 5, and Gutenberg content, with safety features like round-trip verification, draft-based editing, and dry-run previews.45MIT
- AlicenseAqualityCmaintenanceEnables an AI design agent to connect to any WordPress site, inspect its real rendered CSS/JS/theme, and create or update pages through the WordPress REST API and optional companion plugin routes.614 npmMIT