MCP WordPress CrunchTools
Manage WordPress content securely through MCP, covering site info, posts, pages, media, comments, revisions, search, and scheduled publishing.
Check site information and test API connectivity.
List, search, get, create, update, edit, delete/trash posts; manage categories/tags; view revisions; schedule publishing; use version checks and draft-only edits.
List, get, create, update, edit, delete/trash pages; view page revisions; manage hierarchy, templates, menu order, and featured media.
List, get, upload, update, delete media; retrieve public media URLs.
List, get, create, update, delete/trash comments; moderate comments by approving, holding, marking spam, or trashing.
Use security-focused features such as credential protection, input validation, SSRF prevention, TLS enforcement, rate-limit handling, size limits, and timeouts.
Provides tools for managing WordPress content, including posts, pages, media, and comments, with capabilities such as listing, creating, updating, deleting, searching, scheduling, and moderating comments.
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., "@MCP WordPress CrunchToolscreate a new blog post summarizing my latest project"
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.
MCP WordPress CrunchTools
A secure MCP (Model Context Protocol) server for WordPress content management. Designed for developers publishing about their work.
Overview
This MCP server is designed to be:
Secure by default - Input validation, credential protection, and SSRF prevention
No third-party services - Runs locally via stdio, your credentials never leave your machine
Cross-platform - Works on Linux, macOS, and Windows
Automatically updated - GitHub Actions monitor for CVEs and update dependencies
Containerized - Available at
quay.io/crunchtools/mcp-wordpress
Related MCP server: TypeScript WordPress MCP Server
Naming Convention
Component | Name |
GitHub repo | |
Container |
|
Python package (PyPI) |
|
CLI command |
|
Module import |
|
Features
33 Tools for posts, pages, media, and comments
Security-focused: Credentials protected, input validation, SSRF prevention
Developer workflow: Scheduled publishing, revisions, search
Easy integration: Works with Claude Code and other MCP clients
Installation
With uvx (recommended)
uvx mcp-wordpress-crunchtoolsWith pip
pip install mcp-wordpress-crunchtools
mcp-wordpress-crunchtoolsWith Container
# Create a shared upload directory (required before first run)
mkdir -p ~/.local/share/mcp-uploads-downloads
podman run -v ~/.local/share/mcp-uploads-downloads:/tmp/mcp-uploads:z \
-e WORDPRESS_URL=https://example.com \
-e WORDPRESS_USERNAME=admin \
-e WORDPRESS_APP_PASSWORD='xxxx xxxx xxxx xxxx' \
quay.io/crunchtools/mcp-wordpressSELinux note: Use
:z(lowercase, shared) instead of:Z(uppercase, private). MCP servers run as long-lived stdio processes. With:Z, files copied into the directory after container start won't have the container's private MCS label and will be invisible inside the container. The:zflag sets a sharedcontainer_file_tcontext that all containers and the host can read/write.Tip: Use the same shared directory (
~/.local/share/mcp-uploads-downloads/) across multiple MCP container servers (e.g., mcp-wordpress and mcp-gemini) so generated files are immediately available for upload without copying.
From source
git clone https://github.com/crunchtools/mcp-wordpress.git
cd mcp-wordpress
uv sync --all-extras
uv run mcp-wordpress-crunchtoolsConfiguration
Set these environment variables:
Variable | Description | Example |
| WordPress site URL |
|
| WordPress username |
|
| Application password |
|
| Upload directory inside container (optional) |
|
Creating an Application Password
Log in to WordPress admin
Go to Users → Profile
Scroll to Application Passwords
Enter a name (e.g., "MCP Server") and click Add New
Copy the generated password (shown once)
Usage with Claude Code
Using uvx (recommended)
claude mcp add mcp-wordpress-crunchtools \
--env WORDPRESS_URL=https://example.com \
--env WORDPRESS_USERNAME=admin \
--env WORDPRESS_APP_PASSWORD="xxxx xxxx xxxx xxxx" \
-- uvx mcp-wordpress-crunchtoolsUsing pip
pip install mcp-wordpress-crunchtools
claude mcp add mcp-wordpress-crunchtools \
--env WORDPRESS_URL=https://example.com \
--env WORDPRESS_USERNAME=admin \
--env WORDPRESS_APP_PASSWORD="xxxx xxxx xxxx xxxx" \
-- mcp-wordpress-crunchtoolsUsing Container
# Create a shared upload directory (required before first run)
mkdir -p ~/.local/share/mcp-uploads-downloads
claude mcp add mcp-wordpress-crunchtools \
--env WORDPRESS_URL=https://example.com \
--env WORDPRESS_USERNAME=admin \
--env WORDPRESS_APP_PASSWORD="xxxx xxxx xxxx xxxx" \
-- podman run -i --rm \
-v ~/.local/share/mcp-uploads-downloads:/tmp/mcp-uploads:z \
-e WORDPRESS_URL \
-e WORDPRESS_USERNAME \
-e WORDPRESS_APP_PASSWORD \
quay.io/crunchtools/mcp-wordpressAvailable Tools
Site Tools
Tool | Description |
| Get site title, description, URL, timezone |
| Verify API credentials work |
Editing Model
Reads return the source the editor saved (context=edit), never the rendered page, so what
an agent reads is safe to write back. Changes go through the edit_* tools: the agent sends
the exact text to replace and its replacement, the server applies it to the current source,
and the post never round-trips through the agent. The post and page update and edit tools
take an optional expected_version (the version get_post or get_page returned); when
it is given, the write is refused if the item changed since. update_* refuses content that
is rendered output. edit_draft edits only draft or pending posts, so a gateway can grant
revision rights without the power to change published posts.
Post Tools
Tool | Description |
| List posts with filtering (status, category, search) |
| Get single post by ID with its saved source (block markup included) and version |
| Search posts by keyword |
| Create new post (supports scheduling) |
| Update existing post; refuses rendered HTML, and a stale |
| Replace text in a post's source without resending the post |
| Same as |
| Delete/trash a post |
| List revisions for a post |
| Get specific revision content |
| List available categories |
| List available tags |
Page Tools
Tool | Description |
| List pages with filtering |
| Get single page by ID with its saved source and version |
| Create new page |
| Update existing page; refuses rendered HTML, and a stale |
| Replace text in a page's source without resending the page |
| Delete/trash a page |
| List page revisions |
Media Tools
Tool | Description |
| List media items |
| Get media item details |
| Upload file from local path |
| Update media metadata |
| Delete media item |
| Get public URL for media |
Comment Tools
Tool | Description |
| List comments with filtering |
| Get single comment |
| Add a comment to a post |
| Update comment content/status |
| Delete a comment |
| Approve, hold, spam, or trash |
Examples
Create a Draft Post
Create a new WordPress post titled "My Technical Article" with the content below. Keep it as a draft.Schedule a Post
Update post ID 123 to publish on December 25, 2024 at 10:00 AM.Upload an Image
Upload this image to WordPress and set the alt text to "Architecture diagram".Find and Moderate Comments
List all comments in "hold" status and approve the legitimate ones.Security
Credential Protection: All credentials stored as
SecretStr, never loggedSSRF Prevention: REST API path hardcoded, cannot be overridden
Input Validation: All inputs validated via Pydantic models
Rate Limiting: Handles WordPress rate limits gracefully
TLS Enforcement: All requests use HTTPS with certificate validation
Size Limits: Response size limited to 10MB to prevent memory issues
Timeout: All requests timeout after 30 seconds
Development
# Install dev dependencies
uv sync --all-extras
# Run tests
uv run pytest
# Run linting
uv run ruff check src tests
# Run type checking
uv run mypy src
# Format code
uv run ruff format src testsLicense
AGPL-3.0-or-later
Credits
Built by crunchtools.com
Available Tools
33 toolswordpress_create_commentWordpress Create CommentC
Create a new comment on a WordPress post.
Inputs: post (required), content (required), parent, author_name, +1 more. Returns: object
wordpress_create_pageWordpress Create PageC
Create a new WordPress page.
Inputs: title (required), content (required), date, slug, +6 more. Returns: object
wordpress_create_postWordpress Create PostC
Create a new WordPress post.
Inputs: title (required), content (required), date, slug, +6 more. Returns: object
wordpress_delete_commentWordpress Delete CommentB
Delete or trash a WordPress comment.
Inputs: comment_id (required), force. Returns: object
wordpress_delete_mediaWordpress Delete MediaC
Delete a WordPress media item.
Inputs: media_id (required), force. Returns: object
wordpress_delete_pageWordpress Delete PageC
Delete or trash a WordPress page.
Inputs: page_id (required), force. Returns: object
wordpress_delete_postWordpress Delete PostC
Delete or trash a WordPress post.
Inputs: post_id (required), force. Returns: object
wordpress_edit_draftWordpress Edit DraftA
Replace text in a draft or pending WordPress post's source. Refuses any other status.
Inputs: post_id (required), new_text (required), old_text (required), replace_all, +1 more. Returns: object
wordpress_edit_pageWordpress Edit PageA
Replace text in a WordPress page's source, without resending the page.
Inputs: page_id (required), new_text (required), old_text (required), replace_all, +1 more. Returns: object
wordpress_edit_postWordpress Edit PostA
Replace text in a WordPress post's source, without resending the post.
Inputs: post_id (required), new_text (required), old_text (required), replace_all, +1 more. Returns: object
wordpress_get_commentWordpress Get CommentBRead-only
Get a single WordPress comment by ID.
Inputs: comment_id (required). Returns: object
wordpress_get_mediaWordpress Get MediaBRead-only
Get a single WordPress media item by ID.
Inputs: media_id (required). Returns: object
wordpress_get_media_urlWordpress Get Media UrlBRead-only
Get the public URL for a WordPress media item.
Inputs: media_id (required), size. Returns: object
wordpress_get_pageWordpress Get PageBRead-only
Get a single WordPress page by ID with its saved source.
Inputs: page_id (required). Returns: object
wordpress_get_postWordpress Get PostARead-only
Get a single WordPress post by ID with its saved source.
Inputs: post_id (required). Returns: object
wordpress_get_revisionWordpress Get RevisionCRead-only
Get a specific revision of a WordPress post.
Inputs: post_id (required), revision_id (required). Returns: object
wordpress_get_site_infoWordpress Get Site InfoARead-only
Get WordPress site information.
Returns site title, description, URL, timezone, and other settings.
Inputs: no named parameters. Returns: object
wordpress_list_categoriesWordpress List CategoriesCRead-only
List available WordPress categories.
Inputs: page, search, per_page. Returns: object
wordpress_list_commentsWordpress List CommentsCRead-only
List WordPress comments with filtering.
Inputs: page, post, order, search, +3 more. Returns: object
wordpress_list_mediaWordpress List MediaCRead-only
List WordPress media items with filtering.
Inputs: page, order, search, orderby, +3 more. Returns: object
wordpress_list_page_revisionsWordpress List Page RevisionsBRead-only
List revisions for a WordPress page.
Inputs: page_id (required). Returns: object
wordpress_list_pagesWordpress List PagesCRead-only
List WordPress pages with filtering and pagination.
Inputs: page, order, parent, search, +3 more. Returns: object
wordpress_list_postsWordpress List PostsCRead-only
List WordPress posts with filtering and pagination.
Inputs: page, tags, order, search, +4 more. Returns: object
wordpress_list_revisionsWordpress List RevisionsBRead-only
List revisions for a WordPress post.
Inputs: post_id (required). Returns: object
wordpress_list_tagsWordpress List TagsCRead-only
List available WordPress tags.
Inputs: page, search, per_page. Returns: object
wordpress_moderate_commentWordpress Moderate CommentC
Moderate a WordPress comment by changing its status.
Inputs: action (required), comment_id (required). Returns: object
wordpress_search_postsWordpress Search PostsARead-only
Search WordPress posts by keyword in title and content.
Inputs: keyword (required), page, per_page. Returns: object
wordpress_test_connectionWordpress Test ConnectionARead-only
Test connection to WordPress REST API.
Verifies API credentials and returns connection status.
Inputs: no named parameters. Returns: object
wordpress_update_commentWordpress Update CommentC
Update an existing WordPress comment.
Inputs: comment_id (required), status, content. Returns: object
wordpress_update_mediaWordpress Update MediaC
Update WordPress media item metadata.
Inputs: media_id (required), title, caption, alt_text, +1 more. Returns: object
wordpress_update_pageWordpress Update PageA
Update an existing WordPress page. To change part of the content, use edit_page.
Inputs: page_id (required), date, slug, title, +8 more. Returns: object
wordpress_update_postWordpress Update PostB
Update an existing WordPress post. To change part of the content, use edit_post.
Inputs: post_id (required), date, slug, tags, +8 more. Returns: object
wordpress_upload_mediaWordpress Upload MediaA
Upload a media file to WordPress from a local file path.
The file is read directly from disk, avoiding large base64 payloads over the MCP protocol. Provide an absolute path to the file.
CONTAINER NOTE: When running as a container, the file path refers to the container filesystem, not the host. Files must be placed in ~/.local/share/mcp-wordpress/uploads/ on the host (mounted to /tmp/mcp-uploads/ inside the container) to be accessible.
Inputs: file_path (required), title, caption, alt_text, +1 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
TDQS
Scored across 33 tools
Most tools map cleanly to a distinct resource and action, especially across posts, pages, media, and comments. The main ambiguity is among update_post/edit_post/edit_draft and update_page/edit_page, which all modify content, though the descriptions distinguish full updates from source-text replacement.
All tools consistently use the wordpress_ prefix followed by snake_case verb_noun naming, such as list_posts, create_page, delete_comment, and moderate_comment. Names are predictable and readable throughout the set.
At 33 tools, the surface is heavy for a single MCP server and exceeds the rubric's 25+ threshold for too many tools. The broad WordPress content domain justifies many operations, but the set could likely consolidate overlapping post/page edit variants and media helpers.
Core content lifecycle coverage is strong for posts, pages, media, and comments, including revisions and comment moderation. Remaining gaps include no get-page-revision operation, read-only categories/tags, and no broader WordPress admin tools such as users or settings.
Maintenance
Related MCP Connectors
WordPress MCP server: publish posts, AI images, SEO and full site management, self-hosted
Security-first WordPress MCP server. 129 tools for Claude, ChatGPT, Gemini. Free on wp.org.
WordPress MCP server: generate SEO posts, AI images, autoblog & WooCommerce on your self-hosted site
Free MCP server for WordPress: Claude and ChatGPT connect with OAuth. No account, cap or API key.
Related MCP Servers
- AlicenseCqualityDmaintenanceA lightweight MCP server that connects to WordPress via REST API, enabling content management (posts, pages, categories, etc.) and site configuration through natural language commands.49Apache 2.0
- AlicenseNot gradedqualityDmaintenanceMCP server for WordPress content management that provides a secure interface for AI assistants to interact with WordPress sites, enabling content creation, editing, and media management without destructive operations.MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that enables safe reconnaissance, mutation, and verification of WordPress sites through guarded, typed verbs with dry-run previews and change-packet audit records.MIT
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that bridges AI assistants to WordPress, enabling natural-language management of posts, pages, media, comments, users, plugins, and settings across multiple sites simultaneously.1-