A WordPress plugin that exposes content management capabilities via the WordPress 6.9 Abilities API, enabling AI assistants to create, read, update, and delete WordPress content through the MCP protocol.
This plugin uses WordPress 6.9's Abilities API, which is a new and evolving feature. The API may change in future WordPress releases, potentially requiring updates to this plugin.
This plugin is designed for developers and technical users who are comfortable with:
- Command-line tools and API interactions
- WordPress plugin management
- Application Passwords and authentication
- The Model Context Protocol (MCP)
- Application Passwords grant full API access with your user's permissions
- Only create Application Passwords for trusted automation tools
- Use accounts with minimal required permissions (Editor role for content management)
- Regularly audit and revoke unused Application Passwords
- HTTPS is strongly recommended for all API communications
This plugin is provided "as is" without warranty of any kind. Use at your own risk. Always backup your WordPress site before installing new plugins.
| Requirement | Version | Purpose |
|---|---|---|
| WordPress | 6.9+ | Provides the Abilities API framework |
| PHP | 8.0+ | Required by WordPress 6.9 |
| Plugin | Source | Purpose |
|---|---|---|
| MCP Adapter | WordPress AI Team | Provides HTTP transport for MCP protocol at /wp-json/mcp/mcp-adapter-default-server |
| Plugin | Source | Purpose |
|---|---|---|
| AI Experiments | wordpress/ai | Provides additional AI-focused abilities (get-post-details, get-post-terms) |
The plugin uses WordPress's built-in authentication. For programmatic access:
- Create an Application Password in WordPress (Users → Your Profile → Application Passwords)
- Use Basic Auth with your username and application password
- Upload
wp-content-abilities.phpto/wp-content/plugins/wp-content-abilities/ - Activate the plugin through the 'Plugins' menu
- Ensure MCP Adapter plugin is also installed and activated
- Create an Application Password for API access
| Ability | Description |
|---|---|
content/list-posts |
List posts with filters (status, category, tag, author, date range) |
content/get-post |
Get a single post by ID with full content |
content/create-post |
Create a new post with all fields |
content/update-post |
Update an existing post |
content/delete-post |
Delete a post (move to trash or force delete) |
content/get-post-revisions |
Get revision history for a post |
| Ability | Description |
|---|---|
content/list-pages |
List pages with filters |
content/get-page |
Get a single page by ID |
content/create-page |
Create a new page |
content/update-page |
Update an existing page |
content/delete-page |
Delete a page |
| Ability | Description |
|---|---|
content/list-categories |
List all categories with hierarchy |
content/list-tags |
List all tags with post counts |
| Ability | Description |
|---|---|
content/upload-media |
Upload images via base64 or URL |
content/list-media |
List media library items with filters |
| Ability | Description |
|---|---|
content/get-site-info |
Get site title, tagline, URL, timezone, and more |
The content/create-post ability supports all WordPress post fields:
{
"title": "Post Title",
"content": "<p>HTML content</p>",
"excerpt": "Optional excerpt",
"status": "draft|publish|pending|private|future",
"slug": "custom-url-slug",
"categories": ["category-slug-1", "category-slug-2"],
"tags": ["Tag Name 1", "Tag Name 2"],
"date": "2025-12-25T09:00:00",
"featured_image_id": 123,
"format": "standard|aside|gallery|link|image|quote|status|video|audio|chat",
"sticky": false,
"comment_status": "open|closed",
"ping_status": "open|closed",
"author": "username"
}curl -s -u "username:app-password" -X POST \
-H "Content-Type: application/json" \
-D headers.txt \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"claude","version":"1.0.0"}}}' \
"https://your-site.com/wp-json/mcp/mcp-adapter-default-server"SESSION_ID=$(grep -i "mcp-session-id" headers.txt | awk '{print $2}' | tr -d '\r')
curl -s -u "username:app-password" -X POST \
-H "Content-Type: application/json" \
-H "Mcp-Session-Id: $SESSION_ID" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' \
"https://your-site.com/wp-json/mcp/mcp-adapter-default-server"curl -s -u "username:app-password" -X POST \
-H "Content-Type: application/json" \
-H "Mcp-Session-Id: $SESSION_ID" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"mcp-adapter-execute-ability","arguments":{"ability_name":"content/create-post","parameters":{"title":"My New Post","content":"<p>Post content here</p>","status":"draft"}}}}' \
"https://your-site.com/wp-json/mcp/mcp-adapter-default-server"- Ensure MCP Adapter plugin is active
- Check that abilities have
mcp.public: truein their meta - Verify you're using the correct endpoint:
/wp-json/mcp/mcp-adapter-default-server
- Verify Application Password is correctly formatted (spaces removed)
- Use format:
username:xxxx xxxx xxxx xxxx xxxx xxxx - Ensure user has appropriate capabilities (editor or admin role)
- Check upload directory permissions
- Ensure file size is within WordPress limits
- Verify MIME type is allowed
This plugin uses WordPress's Abilities API hooks:
wp_abilities_api_categories_init- Register ability categorieswp_abilities_api_init- Register individual abilities
Each ability requires:
labelanddescriptionfor documentationcategoryfor groupinginput_schemadefining expected parameterscallbackfunction to execute the abilitymeta.mcp.public = truefor MCP exposure
See CHANGELOG.md for version history.
Issues and pull requests welcome at GitHub.
This plugin is licensed under the GPL v2 or later.
Jim Christian - jimchristian.net
This plugin is not affiliated with or endorsed by Automattic, WordPress.org, or the WordPress Foundation. "WordPress" is a registered trademark of the WordPress Foundation.