Let AI agents do real WordPress work via MCP. 61 core abilities, 12 add-ons, 280+ ecosystem abilities for content, builders, SEO, security, files, and operations.
39
stars
147
commits
PHP
primary language
Aug 22, 2026
updated
Let AI assistants edit your WordPress site via MCP.
Tested up to: 7.0 Stable tag: 3.0.84 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html
This plugin exposes WordPress functionality through MCP (Model Context Protocol), enabling AI assistants to directly interact with your WordPress site. No more copy-pasting between chat and admin.
Example: "Fix the phone numbers in these 25 articles to be clickable tel: links." - Done in 30 seconds, all 25 articles.
In practice, the human should not have to memorize the whole ecosystem.
The normal pattern is:
The human's job is mostly to describe the goal. The agent's job is to figure out the mechanics.
Most WordPress AI demos still leave you doing the boring part yourself.
This ecosystem is different because the agent can actually do the work inside WordPress:
That changes the experience from:
Here is what you should do in wp-adminto:
Tell the agent what needs doing, and let it carry out the workThat difference is the whole point of this ecosystem.
This is a good fit for:
It is especially useful when work gets postponed simply because the manual version is boring.
If you want the more specific buyer case, start here:
For setup and troubleshooting beyond the quick start, use the wiki:
If you are using an AI agent, the simplest instruction is often just:
Read https://github.com/bjornfix/mcp-expose-abilities and figure out the stack before making changes.If you are new to the stack, use this order:
If you skip step 4 and start installing add-ons immediately, troubleshooting gets harder than it needs to be.
For a minimal working setup, you only need:
Everything else in the ecosystem is optional.
Before adding Elementor, Cloudflare, Gmail, or anything else, confirm the core stack works.
Good first tests:
If those work, the stack is wired correctly. If they do not, fix the core stack before adding add-ons.
Version 3.0 introduced a modular architecture. The core plugin provides WordPress-native abilities, while vendor-specific features are available as separate add-on plugins:
| Plugin | Abilities | Description |
|---|---|---|
| MCP Expose Abilities (core) | 79 | WordPress core: content, menus, users, media, widgets, plugins, options, comments, taxonomy, system |
| MCP Abilities - Filesystem | 11 | File operations with security hardening |
| MCP Abilities - Elementor | 40 | Elementor page builder integration |
| MCP Abilities - GeneratePress | 26 | GeneratePress theme + GenerateBlocks |
| MCP Abilities - Cloudflare | 4 | Cloudflare cache management |
| MCP Abilities - Google Workspace | 16 | Gmail API via Workspace service account |
| MCP Abilities - Rank Math | 23 | Rank Math SEO metadata access |
| MCP Abilities - Wordfence | 11 | Wordfence security status + blocks |
| MCP Abilities - Brevo | 22 | Brevo contacts, lists, campaigns |
| MCP Abilities - Advanced Ads | 17 | Advanced Ads management |
| MCP Abilities - Toolset | 38 | Toolset post types, custom fields, taxonomies, relationships |
| MCP Abilities - SitePress | 10 | WPML translation mapping, language-switcher recovery, and QA checks |
| MCP Abilities - Formidable | 6 | Formidable Forms settings, usage tracing, styles, and CSS cache controls |
| MCP Abilities - Store Locator | 9 | Store Locator settings, templates, store records, categories, and transient cleanup |
Total ecosystem: 312 abilities
Install only what you need. Running GeneratePress? Install that add-on. Don't use Elementor? Skip it.
Install add-ons only when your site actually uses that product:
mcp-abilities-elementormcp-abilities-generatepressmcp-abilities-cloudflaremcp-abilities-workspacemcp-abilities-rankmathmcp-abilities-wordfencemcp-abilities-brevomcp-abilities-toolsetmcp-abilities-sitepressmcp-abilities-formidablemcp-abilities-store-locatorDo not install every add-on by default. Most sites only need one or two.
The most common onboarding mistake is treating this like one plugin instead of a stack.
When something does not work, check in this order:
plugins/install-directory use for confirmed installs from the official WordPress.org directory without requiring the global arbitrary-code opt-in.media/upload-base64 so the existing core Media Ability verifies the uploaded bytes, rejects unsupported SVG uploads, checks access to an optional parent post, and cleans up failed attachments.users/revoke-current-application-password for revoking only the Application Password that authenticated the current request.revoke_current_application_password confirmation, accepts no credential selector, and verifies deletion before reporting success.users/create-restricted-application-password for creating one WordPress Application Password when the caller can manage users, edit the exact target user, and that user has no generic WordPress Core write authority.create_restricted_application_password confirmation and returns the secret only as a libsodium sealed box for the supplied recipient key.content/create-page or content/update-page mutates WordPress.content_write_mode: "full_rebuild" as explicit replacement intent without letting it bypass page design validation.content_write_mode: "full_rebuild" support to content/update-post and content/update-page for intentional complete design replacements. The default guarded mode still blocks accidental design-markup loss.comments/update-author-url for narrowly updating or clearing one comment author URL with per-comment permission checks and write verification.plugins/update can run through MCP only with explicit confirmation and either the global code-write opt-in or approval from a registered update-policy adapter; generic plugin code writes remain disabled by default.options/update now blocks theme bootstrap options template and stylesheet.MCP_EXPOSE_ENABLE_PLUGIN_CODE_WRITES.manage_options via adapter capability filters.plugins/upload, plugins/upload-base64, and options/update calls now require explicit per-ability confirmation.elementor/* abilities for Elementor document writes.Plugin_Upgrader instead of direct plugin-directory unzip/copy operations.plugins/update so plugins that were active before a WordPress-native update are reactivated if WordPress leaves them inactive after the upgrader run.active_before, active_after, and reactivated fields to the plugins/update response.plugins/upload no longer defines a temporary get_current_screen() stub, avoiding a fatal redeclare when WordPress loads admin screen helpers during REST/MCP plugin installs.plugins/list filtering with a search parameter and null-safe no-argument input handling.content/update-discussion-status for opening or closing comments and pings on posts/pages.media/upload-base64 for uploading local or generated media files into the WordPress media library through MCP.date support to content/update-post for updating local post publish dates.content/create-post, content/update-post, meta/update-post-meta, and meta/delete-post-meta.edit_post_meta / delete_post_meta capabilities before modifying metadata.Claude mention from the README workflow wording.plugins/search-directory so WordPress.org search results are populated correctly when the API returns array-shaped plugin rows.plugins/list-updates so it accepts no-argument execution through the MCP proxy like the older null-safe list abilities.plugins/search-directory to search the official WordPress.org plugin directory from MCP.plugins/install-directory to install WordPress.org plugins by slug.plugins/list-updates and plugins/update for WordPress-native plugin update discovery and execution.plugins/switch to toggle between installed plugins with rollback if the target activation fails.Start Here, setup order, first-success checks, and add-on selection guidance.plugins/upload or plugins/upload-base64 payloads fail with a direct ZIP-validation error.| Ability | Description |
|---|---|
content/list-posts | List posts with filtering by status, category, author, search |
content/get-post | Get single post by ID or slug |
content/get-next-post | Find the next existing post after an ID, even when IDs have gaps |
content/create-post | Create new post, including featured_image_id |
content/update-post | Update an existing post, including guarded or explicit full-rebuild content replacement and featured_image_id |
content/delete-post | Delete post (trash or permanent) |
content/restore-post | Restore a post, page, or custom post type from trash |
content/patch-post | Find/replace in post content |
content/list-pages | List pages with filtering |
content/get-page | Get single page by ID or slug |
content/create-page | Create new page, including featured_image_id |
content/update-page | Update an existing page, including guarded or explicit full-rebuild content replacement and featured_image_id |
content/update-discussion-status | Open or close comments and pings for posts/pages |
content/delete-page | Delete page |
content/patch-page | Find/replace in page content |
content/list-categories | List all categories |
content/create-category | Create new category |
content/update-category | Update existing category |
content/list-tags | List all tags |
content/create-tag | Create new tag |
content/list-media | List media items |
content/list-users | List users |
content/search | Search across posts, pages, media |
content/list-revisions | List revisions for a post/page |
content/get-revision | Get specific revision details |
content/restore-revision | Restore one exact post or page revision |
content/update-tag | Update an existing tag name, slug, or description |
| Ability | Description |
|---|---|
menus/list | List all menus and theme locations |
menus/get-items | Get items from a menu |
menus/create | Create new menu |
menus/add-item | Add item to menu |
menus/update-item | Update menu item |
menus/upsert-item | Create or update an item by object identity or custom URL |
menus/delete-item | Delete menu item |
menus/assign-location | Assign menu to theme location |
| Ability | Description |
|---|---|
users/list | List users with roles |
users/get | Get user by ID, login, or email |
users/create | Create new user |
users/update | Update user |
users/delete | Delete user (can reassign content) |
users/create-restricted-application-password | Create one sealed Application Password after explicit confirmation for an exact editable user without generic WordPress Core write authority |
users/revoke-current-application-password | Revoke only the Application Password authenticating the current request after explicit confirmation and deletion readback |
| Ability | Description |
|---|---|
media/upload | Upload media from URL |
media/upload-base64 | Upload media from base64-encoded bytes |
media/get | Get media item details and sizes |
media/update | Update title, alt, caption |
media/delete | Delete media item |
| Ability | Description |
|---|---|
meta/get-post-meta | Read one exact post meta key |
meta/update-post-meta | Update one permitted post meta key |
meta/delete-post-meta | Delete one permitted post meta key |
| Ability | Description |
|---|---|
widgets/list-sidebars | List all widget areas |
widgets/get-sidebar | Get widgets in a sidebar |
widgets/list-available | List available widget types |
| Ability | Description |
|---|---|
plugins/upload | Upload plugin from URL |
plugins/upload-base64 | Upload plugin from local file (base64 or zip path) |
plugins/search-directory | Search the official WordPress.org plugin directory |
plugins/install-directory | Install plugin from the official WordPress.org plugin directory by slug |
plugins/list | List installed plugins |
plugins/list-updates | List available plugin updates |
plugins/update | Update an installed plugin |
plugins/activate | Activate installed plugin |
plugins/deactivate | Deactivate active plugin |
plugins/switch | Activate one plugin and deactivate one or more others |
plugins/delete | Delete inactive plugin |
| Ability | Description |
|---|---|
comments/list | List comments with filtering |
comments/get | Get single comment details |
comments/update-author-url | Update or clear one comment author URL |
comments/create | Create top-level comment |
comments/reply | Reply to existing comment |
comments/update-status | Update comment status (approve, spam, trash) |
comments/delete | Delete comment |
| Ability | Description |
|---|---|
options/get | Get option value |
options/update | Update option (protected options blocked) |
options/list | List all options |
| Ability | Description |
|---|---|
system/get-transient | Get transient value |
system/ability-timings | Read recent slow or failed ability timings |
system/debug-log | Read debug.log file |
system/toggle-debug | Toggle WP_DEBUG, WP_DEBUG_LOG, WP_DEBUG_DISPLAY |
| Ability | Description |
|---|---|
taxonomy/associate-with-post-type | Associate a taxonomy with a post type and persist the mapping |
| Ability | Description |
|---|---|
filesystem/get-changelog | Get plugin/theme changelog |
filesystem/read-file | Read file contents (security hardened) |
filesystem/write-file | Write file (PHP code blocked) |
filesystem/append-file | Append to file |
filesystem/list-directory | List directory contents |
filesystem/delete-file | Delete file (creates backup) |
filesystem/delete-directory | Delete directory (optional recursive) |
filesystem/file-info | Get file metadata |
filesystem/create-directory | Create directory |
filesystem/copy-file | Copy file |
filesystem/move-file | Move/rename file |
See the add-on readme for the full list. Common abilities:
| Ability | Description |
|---|---|
elementor/get-data | Get Elementor JSON for a page |
elementor/update-data | Replace Elementor JSON |
elementor/patch-data | Find/replace in Elementor JSON |
elementor/update-element | Update specific element by ID |
elementor/list-templates | List saved templates |
elementor/clear-cache | Clear CSS cache |
See the add-on readme for the full list. Common abilities:
| Ability | Description |
|---|---|
generatepress/get-settings | Get theme settings |
generatepress/update-settings | Update theme settings |
generatepress/get-typography | Get typography rules and font manager |
generatepress/list-elements | List GeneratePress Elements |
generatepress/list-modules | List module statuses |
generateblocks/get-global-styles | Get global styles |
generateblocks/update-global-styles | Update global styles |
generateblocks/clear-cache | Clear CSS cache |
| Ability | Description |
|---|---|
cloudflare/clear-cache | Clear Cloudflare cache (entire site or specific URLs) |
cloudflare/get-zone | Get resolved Cloudflare zone context |
cloudflare/get-development-mode | Read development mode status |
cloudflare/set-development-mode | Enable/disable development mode |
| Ability | Description |
|---|---|
gmail/configure | Set up Gmail API service account credentials |
gmail/status | Check API connection status and configuration |
gmail/list-labels | List labels |
gmail/get-label | Get label by ID |
gmail/create-label | Create label |
gmail/update-label | Update label |
gmail/delete-label | Delete label |
gmail/list | List inbox messages with filtering |
gmail/list-threads | List threads |
gmail/get | Get full email content by ID |
gmail/get-thread | Get thread details |
gmail/get-attachment | Fetch attachment as base64 |
gmail/send | Send email with HTML, attachments, CC, BCC |
gmail/modify | Modify labels (archive, mark read/unread, etc.) |
gmail/reply | Reply to an existing email thread |
email/send | Send email via WordPress wp_mail (non-Gmail fallback) |
WordPress Admin → Users → Your Profile → Application Passwords
Configure your MCP client to connect to:
https://yoursite.com/wp-json/mcp/mcp-adapter-default-server
Use HTTP transport with a Basic Auth header generated from your WordPress username and application password.
Your MCP client can now edit your WordPress site through conversation.
{
"ability_name": "content/create-page",
"parameters": {
"title": "About Us",
"content": "<!-- wp:paragraph --><p>Hello world!</p><!-- /wp:paragraph -->",
"status": "publish"
}
}
{
"ability_name": "menus/add-item",
"parameters": {
"menu_id": 5,
"title": "Contact",
"url": "/contact/"
}
}
{
"ability_name": "media/upload",
"parameters": {
"url": "https://example.com/image.jpg",
"title": "Hero Image",
"alt_text": "Beautiful sunset"
}
}
{
"ability_name": "content/patch-post",
"parameters": {
"id": 123,
"find": "+44 203 3181 832",
"replace": "<a href=\"tel:+442033181832\">+44 203 3181 832</a>"
}
}
Three-plugin stack plus optional add-ons:
media/upload-base64 so the existing core Media Ability verifies the uploaded bytes, rejects unsupported SVG uploads, checks access to an optional parent post, and cleans up failed attachments.users/revoke-current-application-password with Core authentication-hook binding, no caller-selected credential identity, explicit confirmation, and deletion readback before success.users/create-restricted-application-password with edit_users plus exact-target edit_user authorization, denial for generic-write targets, explicit confirmation, and a sealed credential response containing WordPress' UUID and stored verifier.content/create-page and content/update-page through the canonical registered validation Interface.content_write_mode: "full_rebuild" to content/update-post and content/update-page so callers can intentionally replace a complete design while ordinary guarded writes still block accidental design-markup loss.content/patch-post and content/patch-page so stale invalid
assigned-template metadata is cleared immediately before content writes,
preventing successful patches from returning an Invalid page template
error.comments/update-author-url for narrowly updating or clearing one comment author URL with per-comment permission checks and write verification.content/patch-post to pass correctly slashed Gutenberg content into
WordPress, so approved design-neutral source patches keep the same content
hash through the downstream publish gate.content/patch-post writes so registered site policy can
carry hash-bound approval through downstream save guards.content/patch-post support for an explicitly justified
design-neutral patch on source content when the registered site policy confirms it does
not worsen source-design validation.content/update-post and content/update-page so featured-image-only
or taxonomy-only updates do not call wp_update_post() and trigger unrelated
publish/design hooks.content/update-tag for correcting tag names, slugs, and descriptions through MCP without direct REST or database access.content/update-post and content/update-page so generic post/page
updates protect translated sibling content and critical Elementor/featured
image meta from WPML/Polylang-style sync hooks.translation_guard details to content update responses so callers can
verify which translated siblings were protected and restored.meta/update-post-meta and meta/delete-post-meta so updates to
_yoast_wpseo_* fields trigger a post refresh for SEO indexable rebuilds.meta/get-post-meta for narrow, read-only inspection of explicit post
meta keys with per-post capability checks.content/restore-post and content/update-page so stale invalid
assigned page-template metadata is cleared before WordPress status/content
writes, allowing legacy trashed pages from old themes to be restored safely.content/list-pages so the documented search parameter is accepted
and passed through to the WordPress page query.content/list-posts now supports status:trash for explicit trash inspection.content/restore-post restores posts, pages, and custom post types from trash with per-post edit permission checks.overwrite:true now recover from empty stale target directories left by failed installs.content/restore-revision ability for restoring posts, pages, and custom post types through WordPress revisions without transporting block content through JSON.system/ability-timings when they fail or exceed the timing threshold, including method/tool context for discovery and tools/list diagnostics.content/patch-page and content/patch-post now use a short per-post write lock so concurrent patch calls against the same item cannot overwrite each other with stale content.system/ability-timings exposes a bounded read-only log of slow or failed ability calls.menus/upsert-item creates or updates menu items idempotently by page/post/category identity or custom URL.menus/add-item now validates page/post/category object IDs before creating non-custom menu items.menus/update-item now preserves existing menu item fields when only changing title, URL, parent, position, target, or classes.plugins/update can run through MCP only with explicit confirmation and either the global code-write opt-in or a registered update-policy approval; generic plugin code writes remain disabled by default.options/update now blocks theme bootstrap options template and stylesheet.MCP_EXPOSE_ENABLE_PLUGIN_CODE_WRITES.manage_options via adapter capability filters.plugins/upload, plugins/upload-base64, and options/update calls now require explicit per-ability confirmation.elementor/* abilities for Elementor document writes.Plugin_Upgrader instead of direct plugin-directory unzip/copy operations.plugins/update now preserves active plugin state across WordPress-native plugin updates and reports the before/after activation state.plugins/list now supports a search parameter for filtering installed plugins by file, slug, name, author, or description.plugins/list now accepts no-argument execution through the MCP proxy like the other null-safe list abilities.content/update-discussion-status for opening or closing comments and pings on posts/pages.media/upload-base64 for uploading local/generated media files into the WordPress media library through MCPcontent/update-post now supports updating the local post date with the date parametercontent/create-post, content/update-post, meta/update-post-meta, and meta/delete-post-metaedit_post_meta / delete_post_meta capabilities before modifying metadataClaude mention from the GitHub README workflow wordingplugins/search-directory now handles WordPress.org directory rows correctly when plugin data is returned as arrays instead of objectsplugins/list-updates now accepts no-argument execution through the MCP proxy like the other null-safe list abilitiesplugins/search-directory to search the official WordPress.org plugin directory from MCPplugins/install-directory to install plugins from the official WordPress.org directory by slugplugins/list-updates and plugins/update for WordPress-native plugin update discovery and executionplugins/switch to toggle between installed plugins with rollback if the target activation failsStart Here, setup order, first-success checks, and add-on selection guidanceplugins/upload-base64 requests are not rejected or truncated at the MCP proxy layerplugins/upload and plugins/upload-base64 now fall back to copy_dir() when filesystem move() fails after unzipcontent/update-post now clears stale invalid assigned page-template metadata before unrelated post updatescontent/update-page now clears stale invalid assigned templates on update and validates explicit template inputcontent/create-page now validates explicit page-template slugs before saving themfeatured_image_id support to post/page create and update abilitiesfeatured_image_id to content/get-post and content/get-pagecontent/get-next-post now applies the after_id floor correctly by allowing the query filter to runcontent/get-next-post to find the next existing post after an ID, even when IDs have gapscontent/list-posts now accepts case-insensitive order values and friendly orderby aliases like id and slugcontent/get-post now accepts post_type for slug lookups and returns clearer missing-post contextusers/delete now loads wp-admin/includes/user.php before calling wp_delete_user() in REST/MCP contextsoptions/get blocks sensitive option names (tokens, keys, secrets)content/update-category abilityinclude_totals flag plus has_more/returned output for list-posts/list-pages/list-media to avoid expensive counts by defaultzip_path for server-local zip installscontent/create-category abilityplugins/activate ability to activate installed pluginsplugins/deactivate ability to deactivate active pluginscomments/create ability for top-level commentsplugins/delete ability to remove inactive pluginscontent/list-revisions, content/get-revision)author_id parameter for content creationelementor/update-element for targeted element updatesPRs welcome! For vendor-specific abilities, consider creating an add-on plugin.
GPL-2.0+
Devenia - We've been doing SEO and web development since 1993.
If this ecosystem saves you time, gives your team a saner way to handle WordPress work, or helps you finally get through the repetitive maintenance nobody wants to do, please:
Why do it?
Because this is good for the WordPress ecosystem as a whole. The more people use agent-friendly open WordPress tooling, the more of the boring but important work actually gets done instead of sitting in a backlog forever.
147 commits
PHP
95.9%
Shell
3.1%
JavaScript
1.1%
Let AI agents do real WordPress work via MCP. 61 core abilities, 12 add-ons, 280+ ecosystem abilities for content, builders, SEO, security, files, and operations.
39
stars
147
commits
PHP
primary language
Aug 22, 2026
updated
Let AI assistants edit your WordPress site via MCP.
Tested up to: 7.0 Stable tag: 3.0.84 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html
This plugin exposes WordPress functionality through MCP (Model Context Protocol), enabling AI assistants to directly interact with your WordPress site. No more copy-pasting between chat and admin.
Example: "Fix the phone numbers in these 25 articles to be clickable tel: links." - Done in 30 seconds, all 25 articles.
In practice, the human should not have to memorize the whole ecosystem.
The normal pattern is:
The human's job is mostly to describe the goal. The agent's job is to figure out the mechanics.
Most WordPress AI demos still leave you doing the boring part yourself.
This ecosystem is different because the agent can actually do the work inside WordPress:
That changes the experience from:
Here is what you should do in wp-adminto:
Tell the agent what needs doing, and let it carry out the workThat difference is the whole point of this ecosystem.
This is a good fit for:
It is especially useful when work gets postponed simply because the manual version is boring.
If you want the more specific buyer case, start here:
For setup and troubleshooting beyond the quick start, use the wiki:
If you are using an AI agent, the simplest instruction is often just:
Read https://github.com/bjornfix/mcp-expose-abilities and figure out the stack before making changes.If you are new to the stack, use this order:
If you skip step 4 and start installing add-ons immediately, troubleshooting gets harder than it needs to be.
For a minimal working setup, you only need:
Everything else in the ecosystem is optional.
Before adding Elementor, Cloudflare, Gmail, or anything else, confirm the core stack works.
Good first tests:
If those work, the stack is wired correctly. If they do not, fix the core stack before adding add-ons.
Version 3.0 introduced a modular architecture. The core plugin provides WordPress-native abilities, while vendor-specific features are available as separate add-on plugins:
| Plugin | Abilities | Description |
|---|---|---|
| MCP Expose Abilities (core) | 79 | WordPress core: content, menus, users, media, widgets, plugins, options, comments, taxonomy, system |
| MCP Abilities - Filesystem | 11 | File operations with security hardening |
| MCP Abilities - Elementor | 40 | Elementor page builder integration |
| MCP Abilities - GeneratePress | 26 | GeneratePress theme + GenerateBlocks |
| MCP Abilities - Cloudflare | 4 | Cloudflare cache management |
| MCP Abilities - Google Workspace | 16 | Gmail API via Workspace service account |
| MCP Abilities - Rank Math | 23 | Rank Math SEO metadata access |
| MCP Abilities - Wordfence | 11 | Wordfence security status + blocks |
| MCP Abilities - Brevo | 22 | Brevo contacts, lists, campaigns |
| MCP Abilities - Advanced Ads | 17 | Advanced Ads management |
| MCP Abilities - Toolset | 38 | Toolset post types, custom fields, taxonomies, relationships |
| MCP Abilities - SitePress | 10 | WPML translation mapping, language-switcher recovery, and QA checks |
| MCP Abilities - Formidable | 6 | Formidable Forms settings, usage tracing, styles, and CSS cache controls |
| MCP Abilities - Store Locator | 9 | Store Locator settings, templates, store records, categories, and transient cleanup |
Total ecosystem: 312 abilities
Install only what you need. Running GeneratePress? Install that add-on. Don't use Elementor? Skip it.
Install add-ons only when your site actually uses that product:
mcp-abilities-elementormcp-abilities-generatepressmcp-abilities-cloudflaremcp-abilities-workspacemcp-abilities-rankmathmcp-abilities-wordfencemcp-abilities-brevomcp-abilities-toolsetmcp-abilities-sitepressmcp-abilities-formidablemcp-abilities-store-locatorDo not install every add-on by default. Most sites only need one or two.
The most common onboarding mistake is treating this like one plugin instead of a stack.
When something does not work, check in this order:
plugins/install-directory use for confirmed installs from the official WordPress.org directory without requiring the global arbitrary-code opt-in.media/upload-base64 so the existing core Media Ability verifies the uploaded bytes, rejects unsupported SVG uploads, checks access to an optional parent post, and cleans up failed attachments.users/revoke-current-application-password for revoking only the Application Password that authenticated the current request.revoke_current_application_password confirmation, accepts no credential selector, and verifies deletion before reporting success.users/create-restricted-application-password for creating one WordPress Application Password when the caller can manage users, edit the exact target user, and that user has no generic WordPress Core write authority.create_restricted_application_password confirmation and returns the secret only as a libsodium sealed box for the supplied recipient key.content/create-page or content/update-page mutates WordPress.content_write_mode: "full_rebuild" as explicit replacement intent without letting it bypass page design validation.content_write_mode: "full_rebuild" support to content/update-post and content/update-page for intentional complete design replacements. The default guarded mode still blocks accidental design-markup loss.comments/update-author-url for narrowly updating or clearing one comment author URL with per-comment permission checks and write verification.plugins/update can run through MCP only with explicit confirmation and either the global code-write opt-in or approval from a registered update-policy adapter; generic plugin code writes remain disabled by default.options/update now blocks theme bootstrap options template and stylesheet.MCP_EXPOSE_ENABLE_PLUGIN_CODE_WRITES.manage_options via adapter capability filters.plugins/upload, plugins/upload-base64, and options/update calls now require explicit per-ability confirmation.elementor/* abilities for Elementor document writes.Plugin_Upgrader instead of direct plugin-directory unzip/copy operations.plugins/update so plugins that were active before a WordPress-native update are reactivated if WordPress leaves them inactive after the upgrader run.active_before, active_after, and reactivated fields to the plugins/update response.plugins/upload no longer defines a temporary get_current_screen() stub, avoiding a fatal redeclare when WordPress loads admin screen helpers during REST/MCP plugin installs.plugins/list filtering with a search parameter and null-safe no-argument input handling.content/update-discussion-status for opening or closing comments and pings on posts/pages.media/upload-base64 for uploading local or generated media files into the WordPress media library through MCP.date support to content/update-post for updating local post publish dates.content/create-post, content/update-post, meta/update-post-meta, and meta/delete-post-meta.edit_post_meta / delete_post_meta capabilities before modifying metadata.Claude mention from the README workflow wording.plugins/search-directory so WordPress.org search results are populated correctly when the API returns array-shaped plugin rows.plugins/list-updates so it accepts no-argument execution through the MCP proxy like the older null-safe list abilities.plugins/search-directory to search the official WordPress.org plugin directory from MCP.plugins/install-directory to install WordPress.org plugins by slug.plugins/list-updates and plugins/update for WordPress-native plugin update discovery and execution.plugins/switch to toggle between installed plugins with rollback if the target activation fails.Start Here, setup order, first-success checks, and add-on selection guidance.plugins/upload or plugins/upload-base64 payloads fail with a direct ZIP-validation error.| Ability | Description |
|---|---|
content/list-posts | List posts with filtering by status, category, author, search |
content/get-post | Get single post by ID or slug |
content/get-next-post | Find the next existing post after an ID, even when IDs have gaps |
content/create-post | Create new post, including featured_image_id |
content/update-post | Update an existing post, including guarded or explicit full-rebuild content replacement and featured_image_id |
content/delete-post | Delete post (trash or permanent) |
content/restore-post | Restore a post, page, or custom post type from trash |
content/patch-post | Find/replace in post content |
content/list-pages | List pages with filtering |
content/get-page | Get single page by ID or slug |
content/create-page | Create new page, including featured_image_id |
content/update-page | Update an existing page, including guarded or explicit full-rebuild content replacement and featured_image_id |
content/update-discussion-status | Open or close comments and pings for posts/pages |
content/delete-page | Delete page |
content/patch-page | Find/replace in page content |
content/list-categories | List all categories |
content/create-category | Create new category |
content/update-category | Update existing category |
content/list-tags | List all tags |
content/create-tag | Create new tag |
content/list-media | List media items |
content/list-users | List users |
content/search | Search across posts, pages, media |
content/list-revisions | List revisions for a post/page |
content/get-revision | Get specific revision details |
content/restore-revision | Restore one exact post or page revision |
content/update-tag | Update an existing tag name, slug, or description |
| Ability | Description |
|---|---|
menus/list | List all menus and theme locations |
menus/get-items | Get items from a menu |
menus/create | Create new menu |
menus/add-item | Add item to menu |
menus/update-item | Update menu item |
menus/upsert-item | Create or update an item by object identity or custom URL |
menus/delete-item | Delete menu item |
menus/assign-location | Assign menu to theme location |
| Ability | Description |
|---|---|
users/list | List users with roles |
users/get | Get user by ID, login, or email |
users/create | Create new user |
users/update | Update user |
users/delete | Delete user (can reassign content) |
users/create-restricted-application-password | Create one sealed Application Password after explicit confirmation for an exact editable user without generic WordPress Core write authority |
users/revoke-current-application-password | Revoke only the Application Password authenticating the current request after explicit confirmation and deletion readback |
| Ability | Description |
|---|---|
media/upload | Upload media from URL |
media/upload-base64 | Upload media from base64-encoded bytes |
media/get | Get media item details and sizes |
media/update | Update title, alt, caption |
media/delete | Delete media item |
| Ability | Description |
|---|---|
meta/get-post-meta | Read one exact post meta key |
meta/update-post-meta | Update one permitted post meta key |
meta/delete-post-meta | Delete one permitted post meta key |
| Ability | Description |
|---|---|
widgets/list-sidebars | List all widget areas |
widgets/get-sidebar | Get widgets in a sidebar |
widgets/list-available | List available widget types |
| Ability | Description |
|---|---|
plugins/upload | Upload plugin from URL |
plugins/upload-base64 | Upload plugin from local file (base64 or zip path) |
plugins/search-directory | Search the official WordPress.org plugin directory |
plugins/install-directory | Install plugin from the official WordPress.org plugin directory by slug |
plugins/list | List installed plugins |
plugins/list-updates | List available plugin updates |
plugins/update | Update an installed plugin |
plugins/activate | Activate installed plugin |
plugins/deactivate | Deactivate active plugin |
plugins/switch | Activate one plugin and deactivate one or more others |
plugins/delete | Delete inactive plugin |
| Ability | Description |
|---|---|
comments/list | List comments with filtering |
comments/get | Get single comment details |
comments/update-author-url | Update or clear one comment author URL |
comments/create | Create top-level comment |
comments/reply | Reply to existing comment |
comments/update-status | Update comment status (approve, spam, trash) |
comments/delete | Delete comment |
| Ability | Description |
|---|---|
options/get | Get option value |
options/update | Update option (protected options blocked) |
options/list | List all options |
| Ability | Description |
|---|---|
system/get-transient | Get transient value |
system/ability-timings | Read recent slow or failed ability timings |
system/debug-log | Read debug.log file |
system/toggle-debug | Toggle WP_DEBUG, WP_DEBUG_LOG, WP_DEBUG_DISPLAY |
| Ability | Description |
|---|---|
taxonomy/associate-with-post-type | Associate a taxonomy with a post type and persist the mapping |
| Ability | Description |
|---|---|
filesystem/get-changelog | Get plugin/theme changelog |
filesystem/read-file | Read file contents (security hardened) |
filesystem/write-file | Write file (PHP code blocked) |
filesystem/append-file | Append to file |
filesystem/list-directory | List directory contents |
filesystem/delete-file | Delete file (creates backup) |
filesystem/delete-directory | Delete directory (optional recursive) |
filesystem/file-info | Get file metadata |
filesystem/create-directory | Create directory |
filesystem/copy-file | Copy file |
filesystem/move-file | Move/rename file |
See the add-on readme for the full list. Common abilities:
| Ability | Description |
|---|---|
elementor/get-data | Get Elementor JSON for a page |
elementor/update-data | Replace Elementor JSON |
elementor/patch-data | Find/replace in Elementor JSON |
elementor/update-element | Update specific element by ID |
elementor/list-templates | List saved templates |
elementor/clear-cache | Clear CSS cache |
See the add-on readme for the full list. Common abilities:
| Ability | Description |
|---|---|
generatepress/get-settings | Get theme settings |
generatepress/update-settings | Update theme settings |
generatepress/get-typography | Get typography rules and font manager |
generatepress/list-elements | List GeneratePress Elements |
generatepress/list-modules | List module statuses |
generateblocks/get-global-styles | Get global styles |
generateblocks/update-global-styles | Update global styles |
generateblocks/clear-cache | Clear CSS cache |
| Ability | Description |
|---|---|
cloudflare/clear-cache | Clear Cloudflare cache (entire site or specific URLs) |
cloudflare/get-zone | Get resolved Cloudflare zone context |
cloudflare/get-development-mode | Read development mode status |
cloudflare/set-development-mode | Enable/disable development mode |
| Ability | Description |
|---|---|
gmail/configure | Set up Gmail API service account credentials |
gmail/status | Check API connection status and configuration |
gmail/list-labels | List labels |
gmail/get-label | Get label by ID |
gmail/create-label | Create label |
gmail/update-label | Update label |
gmail/delete-label | Delete label |
gmail/list | List inbox messages with filtering |
gmail/list-threads | List threads |
gmail/get | Get full email content by ID |
gmail/get-thread | Get thread details |
gmail/get-attachment | Fetch attachment as base64 |
gmail/send | Send email with HTML, attachments, CC, BCC |
gmail/modify | Modify labels (archive, mark read/unread, etc.) |
gmail/reply | Reply to an existing email thread |
email/send | Send email via WordPress wp_mail (non-Gmail fallback) |
WordPress Admin → Users → Your Profile → Application Passwords
Configure your MCP client to connect to:
https://yoursite.com/wp-json/mcp/mcp-adapter-default-server
Use HTTP transport with a Basic Auth header generated from your WordPress username and application password.
Your MCP client can now edit your WordPress site through conversation.
{
"ability_name": "content/create-page",
"parameters": {
"title": "About Us",
"content": "<!-- wp:paragraph --><p>Hello world!</p><!-- /wp:paragraph -->",
"status": "publish"
}
}
{
"ability_name": "menus/add-item",
"parameters": {
"menu_id": 5,
"title": "Contact",
"url": "/contact/"
}
}
{
"ability_name": "media/upload",
"parameters": {
"url": "https://example.com/image.jpg",
"title": "Hero Image",
"alt_text": "Beautiful sunset"
}
}
{
"ability_name": "content/patch-post",
"parameters": {
"id": 123,
"find": "+44 203 3181 832",
"replace": "<a href=\"tel:+442033181832\">+44 203 3181 832</a>"
}
}
Three-plugin stack plus optional add-ons:
media/upload-base64 so the existing core Media Ability verifies the uploaded bytes, rejects unsupported SVG uploads, checks access to an optional parent post, and cleans up failed attachments.users/revoke-current-application-password with Core authentication-hook binding, no caller-selected credential identity, explicit confirmation, and deletion readback before success.users/create-restricted-application-password with edit_users plus exact-target edit_user authorization, denial for generic-write targets, explicit confirmation, and a sealed credential response containing WordPress' UUID and stored verifier.content/create-page and content/update-page through the canonical registered validation Interface.content_write_mode: "full_rebuild" to content/update-post and content/update-page so callers can intentionally replace a complete design while ordinary guarded writes still block accidental design-markup loss.content/patch-post and content/patch-page so stale invalid
assigned-template metadata is cleared immediately before content writes,
preventing successful patches from returning an Invalid page template
error.comments/update-author-url for narrowly updating or clearing one comment author URL with per-comment permission checks and write verification.content/patch-post to pass correctly slashed Gutenberg content into
WordPress, so approved design-neutral source patches keep the same content
hash through the downstream publish gate.content/patch-post writes so registered site policy can
carry hash-bound approval through downstream save guards.content/patch-post support for an explicitly justified
design-neutral patch on source content when the registered site policy confirms it does
not worsen source-design validation.content/update-post and content/update-page so featured-image-only
or taxonomy-only updates do not call wp_update_post() and trigger unrelated
publish/design hooks.content/update-tag for correcting tag names, slugs, and descriptions through MCP without direct REST or database access.content/update-post and content/update-page so generic post/page
updates protect translated sibling content and critical Elementor/featured
image meta from WPML/Polylang-style sync hooks.translation_guard details to content update responses so callers can
verify which translated siblings were protected and restored.meta/update-post-meta and meta/delete-post-meta so updates to
_yoast_wpseo_* fields trigger a post refresh for SEO indexable rebuilds.meta/get-post-meta for narrow, read-only inspection of explicit post
meta keys with per-post capability checks.content/restore-post and content/update-page so stale invalid
assigned page-template metadata is cleared before WordPress status/content
writes, allowing legacy trashed pages from old themes to be restored safely.content/list-pages so the documented search parameter is accepted
and passed through to the WordPress page query.content/list-posts now supports status:trash for explicit trash inspection.content/restore-post restores posts, pages, and custom post types from trash with per-post edit permission checks.overwrite:true now recover from empty stale target directories left by failed installs.content/restore-revision ability for restoring posts, pages, and custom post types through WordPress revisions without transporting block content through JSON.system/ability-timings when they fail or exceed the timing threshold, including method/tool context for discovery and tools/list diagnostics.content/patch-page and content/patch-post now use a short per-post write lock so concurrent patch calls against the same item cannot overwrite each other with stale content.system/ability-timings exposes a bounded read-only log of slow or failed ability calls.menus/upsert-item creates or updates menu items idempotently by page/post/category identity or custom URL.menus/add-item now validates page/post/category object IDs before creating non-custom menu items.menus/update-item now preserves existing menu item fields when only changing title, URL, parent, position, target, or classes.plugins/update can run through MCP only with explicit confirmation and either the global code-write opt-in or a registered update-policy approval; generic plugin code writes remain disabled by default.options/update now blocks theme bootstrap options template and stylesheet.MCP_EXPOSE_ENABLE_PLUGIN_CODE_WRITES.manage_options via adapter capability filters.plugins/upload, plugins/upload-base64, and options/update calls now require explicit per-ability confirmation.elementor/* abilities for Elementor document writes.Plugin_Upgrader instead of direct plugin-directory unzip/copy operations.plugins/update now preserves active plugin state across WordPress-native plugin updates and reports the before/after activation state.plugins/list now supports a search parameter for filtering installed plugins by file, slug, name, author, or description.plugins/list now accepts no-argument execution through the MCP proxy like the other null-safe list abilities.content/update-discussion-status for opening or closing comments and pings on posts/pages.media/upload-base64 for uploading local/generated media files into the WordPress media library through MCPcontent/update-post now supports updating the local post date with the date parametercontent/create-post, content/update-post, meta/update-post-meta, and meta/delete-post-metaedit_post_meta / delete_post_meta capabilities before modifying metadataClaude mention from the GitHub README workflow wordingplugins/search-directory now handles WordPress.org directory rows correctly when plugin data is returned as arrays instead of objectsplugins/list-updates now accepts no-argument execution through the MCP proxy like the other null-safe list abilitiesplugins/search-directory to search the official WordPress.org plugin directory from MCPplugins/install-directory to install plugins from the official WordPress.org directory by slugplugins/list-updates and plugins/update for WordPress-native plugin update discovery and executionplugins/switch to toggle between installed plugins with rollback if the target activation failsStart Here, setup order, first-success checks, and add-on selection guidanceplugins/upload-base64 requests are not rejected or truncated at the MCP proxy layerplugins/upload and plugins/upload-base64 now fall back to copy_dir() when filesystem move() fails after unzipcontent/update-post now clears stale invalid assigned page-template metadata before unrelated post updatescontent/update-page now clears stale invalid assigned templates on update and validates explicit template inputcontent/create-page now validates explicit page-template slugs before saving themfeatured_image_id support to post/page create and update abilitiesfeatured_image_id to content/get-post and content/get-pagecontent/get-next-post now applies the after_id floor correctly by allowing the query filter to runcontent/get-next-post to find the next existing post after an ID, even when IDs have gapscontent/list-posts now accepts case-insensitive order values and friendly orderby aliases like id and slugcontent/get-post now accepts post_type for slug lookups and returns clearer missing-post contextusers/delete now loads wp-admin/includes/user.php before calling wp_delete_user() in REST/MCP contextsoptions/get blocks sensitive option names (tokens, keys, secrets)content/update-category abilityinclude_totals flag plus has_more/returned output for list-posts/list-pages/list-media to avoid expensive counts by defaultzip_path for server-local zip installscontent/create-category abilityplugins/activate ability to activate installed pluginsplugins/deactivate ability to deactivate active pluginscomments/create ability for top-level commentsplugins/delete ability to remove inactive pluginscontent/list-revisions, content/get-revision)author_id parameter for content creationelementor/update-element for targeted element updatesPRs welcome! For vendor-specific abilities, consider creating an add-on plugin.
GPL-2.0+
Devenia - We've been doing SEO and web development since 1993.
If this ecosystem saves you time, gives your team a saner way to handle WordPress work, or helps you finally get through the repetitive maintenance nobody wants to do, please:
Why do it?
Because this is good for the WordPress ecosystem as a whole. The more people use agent-friendly open WordPress tooling, the more of the boring but important work actually gets done instead of sitting in a backlog forever.
147 commits
PHP
95.9%
Shell
3.1%
JavaScript
1.1%