mcp-wordpress
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| WP_SITE_URL | Yes | WordPress site URL (e.g. https://your-site.com) | |
| WP_USERNAME | Yes | WordPress username | |
| WP_APP_PASSWORD | Yes | Application Password | |
| WP_FLUSH_ENDPOINT | No | Custom REST endpoint for cache flush (default: wp-mcp/v1/flush-cache) | wp-mcp/v1/flush-cache |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| wp_list_pagesB | List WordPress pages with ID, title, slug and status. |
| wp_list_postsB | List WordPress posts with ID, title, slug and status. |
| wp_get_pageA | Get full content of a WordPress page by ID or slug. Returns raw content with shortcodes visible. |
| wp_get_postA | Get full content of a WordPress post by ID. Returns raw content. |
| wp_update_page_contentA | Replace the entire raw content of a WordPress page. Read the page first and pass its full replacement content. |
| wp_update_post_contentA | Replace the entire raw content of a WordPress post. |
| wp_list_mediaA | List media files in the WordPress media library with URLs. |
| wp_create_postB | Create a WordPress post. Supports dry-run previews. |
| wp_update_postB | Update selected fields on a WordPress post by ID or slug. |
| wp_delete_postA | Trash a WordPress post, or permanently delete it with force:true. |
| wp_create_pageB | Create a WordPress page. Supports dry-run previews. |
| wp_update_pageB | Update selected fields on a WordPress page by ID or slug. |
| wp_delete_pageA | Trash a WordPress page, or permanently delete it with force:true. |
| wp_list_categoriesC | List WordPress categories with IDs, slugs, and usage counts. |
| wp_create_categoryC | Create a WordPress category. |
| wp_ensure_categoryA | Return an existing category, or create it. Safe to call repeatedly. |
| wp_update_categoryC | Update a WordPress category. |
| wp_delete_categoryB | Permanently delete a WordPress category. |
| wp_list_tagsB | List WordPress tags with IDs, slugs, and usage counts. |
| wp_create_tagC | Create a WordPress tag. |
| wp_ensure_tagA | Return an existing tag, or create it. Safe to call repeatedly. |
| wp_update_tagC | Update a WordPress tag. |
| wp_delete_tagB | Permanently delete a WordPress tag. |
| wp_upload_mediaB | Upload media from a local path, URL, or base64 source, then set attachment metadata. |
| wp_get_mediaA | Get a media attachment by ID. |
| wp_update_mediaC | Update media attachment metadata. |
| wp_delete_mediaA | Permanently delete a media attachment. WordPress requires force:true. |
| wp_set_featured_imageB | Assign a media attachment as the featured image of a post or page. |
| wp_list_shortcodesC | Parse and list all shortcodes found in a page's content. Useful for understanding page structure. |
| wp_replace_shortcodeC | Find a specific shortcode in a page and replace it with new content. Optionally match an attribute value. |
| wp_insert_shortcodeC | Insert new content before or after an existing shortcode in a page. |
| wp_elementor_get_shortcode_contentC | Experimental and currently unavailable: Elementor protected meta is not exposed safely by WordPress REST. |
| wp_elementor_update_shortcode_contentA | Experimental and currently unavailable: direct _elementor_data writes are silently discarded by WordPress REST. |
| wp_blocks_listC | List a post/page Gutenberg outline. Use paths to read and hashes to edit. |
| wp_blocks_getB | Get one Gutenberg block by path, hash, anchor, metadata name, or unambiguous query. |
| wp_blocks_findB | Find all matching Gutenberg blocks and return paths and hashes for safe follow-up edits. |
| wp_blocks_insertB | Insert Gutenberg block(s). Hash references prevent overwriting a block changed since it was read. Supports dry-run. |
| wp_blocks_replaceA | Replace one Gutenberg block with zero or more blocks. Hash references prevent overwriting a block changed since it was read. Supports dry-run. |
| wp_blocks_updateA | Update Gutenberg block attributes or inner HTML. Hash references prevent overwriting a block changed since it was read. Supports dry-run. |
| wp_blocks_deleteA | Delete one Gutenberg block. Hash references prevent overwriting a block changed since it was read. Supports dry-run. |
| wp_blocks_moveA | Move one Gutenberg block relative to another. Hash references prevent overwriting a block changed since it was read. Supports dry-run. |
| wp_list_revisionsB | List revisions of a WordPress post or page with pagination. |
| wp_get_revisionB | Get one post/page revision, including its raw title, excerpt, and content. |
| wp_diff_revisionC | Compare the current raw content of a post/page with one revision. |
| wp_restore_revisionC | Restore a revision. Prefers the optional wp-mcp companion endpoint; otherwise rewrites core REST title, excerpt, and content. |
| wp_list_sidebarsA | List registered classic-theme sidebars and their ordered widget IDs. |
| wp_list_widgetsB | List widgets, optionally by sidebar, including structured advertisement inventory metadata. |
| wp_get_widgetB | Get a widget with rendered output, raw instance, sidebar, and advertisement metadata. |
| wp_create_widgetB | Create a block widget. Supply exactly one of block_content or structured ad_creative. Supports dry-run and automatic cache purge when available. |
| wp_update_widgetA | Update widget content and/or move it to another sidebar. Supply at most one of block_content or ad_creative. Supports dry-run. |
| wp_delete_widgetA | Remove a widget. force:false moves it to wp_inactive_widgets; force:true permanently deletes it. |
| wp_move_widgetB | Move and precisely order a widget in a sidebar. position is a zero-based final index. |
| wp_list_content_blocksB | List existing Blocksy Content Blocks, including slug/hook clues and structured advertisement inventory. Does not create positioning slots. |
| wp_get_content_blockA | Get one existing Blocksy Content Block by ID or slug with raw content and ad inventory metadata. |
| wp_update_content_blockA | Update an existing positioned Blocksy Content Block. Supply exactly one of content or structured ad_creative. Never creates orphan slots. |
| wp_list_menusB | List classic navigation menus and assigned theme locations. |
| wp_get_menuA | Get a classic menu by ID or slug. |
| wp_create_menuC | Create classic menu. Supports dry-run. |
| wp_update_menuC | Update classic menu. Supports dry-run. |
| wp_delete_menuB | Permanently delete a classic menu; WordPress requires force:true. |
| wp_list_menu_locationsA | List read-only theme menu locations and their assigned menu IDs. |
| wp_assign_menu_locationA | Assign a location through the menu's writable locations field. The menu-locations endpoint itself is read-only. |
| wp_list_menu_itemsC | List classic menu items in menu order. |
| wp_get_menu_itemB | Get one classic menu item. |
| wp_create_menu_itemC | Create classic menu item. Supports dry-run. |
| wp_update_menu_itemC | Update classic menu item. Supports dry-run. |
| wp_delete_menu_itemB | Permanently delete a classic menu item. |
| wp_get_settingsA | Read WordPress site settings, including static-front-page configuration. |
| wp_update_settingsC | Update WordPress settings. Changing the front page is site-wide and supports dry-run. |
| wp_set_blocksy_page_layoutB | Set a Blocksy page to a right sidebar, left sidebar, or no sidebar through the optional companion. Reads the current protected page option and supports dry-run. |
| wp_list_synced_patternsB | List reusable synced patterns stored in wp_block. |
| wp_get_synced_patternA | Get a synced pattern with raw Gutenberg content. |
| wp_create_synced_patternC | Create synced pattern. Supports dry-run. |
| wp_update_synced_patternC | Update synced pattern. Supports dry-run. |
| wp_delete_synced_patternC | Permanently delete a synced pattern. |
| wp_list_block_patternsB | List registered read-only core, theme, and plugin patterns; optionally filter client-side. |
| wp_get_block_patternA | Get one registered read-only pattern by its exact namespace/name. |
| wp_whoamiA | Show the authenticated WordPress user and granted capabilities. Useful for diagnosing 403 errors. |
| wp_flush_cacheA | Flush WordPress, Elementor, and page caches. Requires the optional cache helper mu-plugin. |
| wp_site_infoB | Get basic WordPress site information. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 80 tools
Tools are generally organized around explicit resource+action pairs, so posts, pages, media, menus, widgets, blocks, patterns, and settings are easy to tell apart. A few edges could confuse an agent: wp_create_category vs wp_ensure_category have overlapping behavior, and the two Elementor tools are listed but marked unavailable. Overall, however, overlapping purposes are rare.
The dominant pattern is wp_verb_noun (wp_list_posts, wp_create_menu, wp_delete_media) and most tools follow it predictably. The wp_blocks_* family breaks the pattern by placing the noun before the verb (wp_blocks_list, wp_blocks_update), and plugin-prefixed tools like wp_elementor_update_shortcode_content add a module prefix. These are readable deviations, not chaotic naming.
80 tools is far beyond the comfortable agent-facing range and imposes heavy selection overhead even though the WordPress domain is broad. Several families (blocks, menus, widgets, patterns) could be consolidated with parameterized operations, and the two unavailable Elementor tools should not be included. As a set, it feels more like a full SDK surface than a curated MCP toolkit.
The content lifecycle is unusually thorough: posts, pages, media, terms, revisions, blocks, patterns, widgets, menus, and settings all have meaningful CRUD coverage. However, WordPress's core comments and user-management surfaces are absent, and the Elementor tools are dead ends because they are explicitly unavailable. That makes the set broad but uneven rather than complete.