A Model Context Protocol (MCP) server for managing WordPress sites via the REST API. This server provides 20 tools for managing posts, users, media, categories, tags, and site settings.
- list_posts: List posts with filtering options (status, date, author, categories, tags)
- retrieve_post: Get detailed information about a specific post
- create_post: Create new posts with full metadata support
- update_post: Update existing posts with selective field updates
- delete_post: Delete posts (with trash/permanent delete options)
- list_users: List site users (admin permission required)
- get_me: Get current user information and capabilities
- validate_credential: Test WordPress authentication
- list_media: List media files with filtering options
- update_media: Update media metadata (title, slug, author)
- delete_media: Delete media files
- list_categories: List categories with search and filtering
- create_category: Create new categories with hierarchy support
- update_category: Update existing category information
- delete_category: Remove categories
- list_tags: List tags with search and filtering
- create_tag: Create new tags
- update_tag: Update existing tag information
- delete_tag: Remove tags
- get_site_settings: Get WordPress site settings (admin required)
- WordPress.com sites are NOT supported - only self-hosted WordPress sites (TODO: verify this)
- Permalinks must be configured - go to Settings > Permalinks and choose any structure other than "Plain"
- Application Password required - regular WordPress passwords won't work
- Go to your WordPress admin dashboard
- Navigate to Users > Your Profile
- Scroll to "Application Passwords" section
- Click "Add New Application Password"
- Give it a name (e.g., "MCP Server") and click "Add New Application Password"
- Copy the generated password - you'll need this for the
WORDPRESS_PASSWORDenvironment variable
- Clone or download this project
- Install dependencies using uv:
uv syncWORDPRESS_SITE: The full URL to your WordPress site (with https:// or http://)WORDPRESS_USERNAME: Your WordPress username (not email)WORDPRESS_PASSWORD: The application password you created (NOT your regular WordPress password)
uv run python main.pyThis runs FastMCP over stdio.
The container uses mmmcp to expose the
same tools over Streamable HTTP at http://localhost:8099/.
Export the three WordPress environment variables above, then run:
docker build -t wordpress-mcp .
docker run --rm -p 127.0.0.1:8099:8099 \
-e WORDPRESS_SITE -e WORDPRESS_USERNAME -e WORDPRESS_PASSWORD \
wordpress-mcpPython dependencies are installed from uv.lock during the image build;
starting the container does not download dependencies. The container runs as
UID/GID 1000:1000. mmmcp stores its SQLite event database in
/var/lib/mmmcp, which must remain writable. Mount a named volume there if
event storage should persist across container replacements.
/healthz checks liveness and /readyz checks the MCP catalog and event store.
These probes do not validate WordPress credentials; use validate_credential
for that. Existing MCP sessions reconnect when the container is replaced.
Run the unit test and, optionally, the container integration suite:
uv sync --frozen
uv run --frozen python -m unittest discover -s tests -v
docker build -t wordpress-mcp:test .
WORDPRESS_TEST_IMAGE=wordpress-mcp:test uv run --frozen python -m unittest discover -s tests -vContainer tests use an isolated Docker network and a mock WordPress API. They do not need real credentials or access to a WordPress site. PR CI runs them on both amd64 and arm64.
The project structure:
wordpress-mcp/
├── src/
│ ├── config.py # Configuration and WordPress client
│ ├── server.py # FastMCP server setup
│ └── tools/ # Individual tool implementations
│ ├── posts.py # Posts management
│ ├── users.py # Users management
│ ├── media.py # Media management
│ ├── categories.py # Categories management
│ ├── tags.py # Tags management
│ └── site.py # Site settings
├── main.py # Server entry point
└── pyproject.toml # Dependencies and configuration