Passepartout
Allows reading and writing content (posts, pages, media, taxonomies) across all of your self-hosted WordPress sites.
Click on "Install 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., "@Passepartoutcreate a draft post titled 'Hello World' on baair"
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.
ποΈ Passepartout
The master key for piloting self-hosted WordPress from any AI client.
Passepartout is a Model Context Protocol (MCP) server that lets an AI assistant β Claude Desktop today, any MCP client tomorrow β read and write content (posts, pages, media, taxonomies) across all of your self-hosted WordPress sites, using a simple shared key instead of WordPress Application Passwords.
AI client ββMCPβββΊ Passepartout ββREST + X-Passepartout-KeyβββΊ your WordPress sitesWhy this exists
If you run self-hosted WordPress and tried to connect it to an AI agent, you have probably hit this wall:
Application Passwords silently disappear. Behind a reverse proxy (most managed hosts), WordPress' internal
is_ssl()check fails, the "Application Passwords" section vanishes from the profile screen, and nothing tells you why.No OAuth for self-hosted. The official tooling assumes WordPress.com-style OAuth, which self-hosted installs don't have out of the box.
The web connector is left out. Most self-hosted MCP paths only work with a local desktop proxy.
The lock jammed. So Passepartout is a skeleton key: a tiny companion plugin
validates a secret you control (X-Passepartout-Key), and the server speaks the
plain WordPress REST API. No Application Passwords, no SSL-detection roulette, and
one server drives every site you own.
Named after Jules Verne's tireless globe-trotting valet β and after the French passe-partout, the key that opens every door.
Related MCP server: WordPress MCP Server
Features
π Custom-key auth β bypasses Application Passwords entirely.
π Multi-site β manage many WordPress installs from a single server; target one with a
siteargument.π Content tools β list/get/create/update/delete posts and pages, manage categories/tags, search, and upload media from a URL.
π Safe by default β new posts/pages default to
draft; destructive deletes are explicitly annotated and trash-first.π§± Clean TypeScript β MCP SDK, Zod-validated inputs, strict mode, MIT-licensed.
Quick start
1. Install the companion plugin (per site)
Copy wp-plugin/passepartout-auth.php to
wp-content/mu-plugins/passepartout-auth.php on each WordPress site, then add the
secret to wp-config.php (above the "That's all, stop editing!" line):
define( 'PASSEPARTOUT_KEY', 'a-long-random-secret' );
// Optional β act as a specific user instead of the first administrator:
// define( 'PASSEPARTOUT_USER_ID', 1 );Use a long, random secret and serve the site over HTTPS.
2. Configure the server
Create a sites.json (see sites.example.json):
[
{ "id": "baair", "label": "BAAIR Solutions", "url": "https://baair.solutions", "key": "a-long-random-secret" }
]The key here must match PASSEPARTOUT_KEY on that site.
3. Add it to your MCP client
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"passepartout": {
"command": "npx",
"args": ["-y", "passepartout-mcp@latest"],
"env": {
"PASSEPARTOUT_SITES_FILE": "/absolute/path/to/sites.json"
}
}
}
}Restart the client fully, then try: "List the draft posts on baair."
Configuration
Pick one of three styles:
Variable | Meaning |
| Absolute path to a JSON array of sites (recommended). |
| Inline JSON array of sites. |
| Single-site shorthand. |
Each site object: { "id", "url", "key", "label?" }.
Tools
Tool | What it does | Destructive |
| List configured sites (never exposes keys) | no |
| Browse and read posts | no |
| Author and edit posts (draft by default) | no |
| Trash (or force-delete) a post | yes |
| Browse and read pages | no |
| Author and edit pages | no |
| Manage categories and tags | no |
| Browse media; import an image by URL | no |
| Search posts and pages | no |
Security model
The companion plugin authenticates a request only when
X-Passepartout-KeymatchesPASSEPARTOUT_KEY, using a constant-time comparison.The server never logs or returns your keys;
wp_list_sitesomits them.Capabilities follow the WordPress role of the resolved user β use a dedicated machine user with the least privilege you need.
Always serve sites over HTTPS. Rotate a key by changing it on both sides.
Build from source
npm install
npm run build
node dist/index.js # expects the env config aboveInspect tools interactively with the MCP Inspector:
npx @modelcontextprotocol/inspector node dist/index.jsRoadmap
Streamable HTTP transport + OAuth, for the claude.ai web connector
Custom post types & ACF fields
WP-CLI-over-SSH fallback adapter
Structured (
outputSchema) responses
Contributions welcome β see CONTRIBUTING.md.
License
MIT Β© Alexandre Bruneau (BAAIR)
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/AlessandroB1989/passepartout-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server