Passepartout
FreeNot checkedEnables AI assistants to manage content on self-hosted WordPress sites via the WordPress REST API, supporting multiple sites with custom key authentication and
About
Enables AI assistants to manage content on self-hosted WordPress sites via the WordPress REST API, supporting multiple sites with custom key authentication and tools for posts, pages, media, and taxonomies.
README
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 sites
Why 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.
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 |
|---|---|
PASSEPARTOUT_SITES_FILE |
Absolute path to a JSON array of sites (recommended). |
PASSEPARTOUT_SITES |
Inline JSON array of sites. |
WP_URL + WP_KEY (+ WP_SITE_ID, WP_LABEL) |
Single-site shorthand. |
Each site object: { "id", "url", "key", "label?" }.
Tools
| Tool | What it does | Destructive |
|---|---|---|
wp_list_sites |
List configured sites (never exposes keys) | no |
wp_list_posts / wp_get_post |
Browse and read posts | no |
wp_create_post / wp_update_post |
Author and edit posts (draft by default) | no |
wp_delete_post |
Trash (or force-delete) a post | yes |
wp_list_pages / wp_get_page |
Browse and read pages | no |
wp_create_page / wp_update_page |
Author and edit pages | no |
wp_list_terms / wp_create_term |
Manage categories and tags | no |
wp_list_media / wp_upload_media_from_url |
Browse media; import an image by URL | no |
wp_search |
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 above
Inspect tools interactively with the MCP Inspector:
npx @modelcontextprotocol/inspector node dist/index.js
Roadmap
- 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)
Installing Passepartout
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/AlessandroB1989/passepartout-mcpFAQ
Is Passepartout MCP free?
Yes, Passepartout MCP is free — one-click install via Unyly at no cost.
Does Passepartout need an API key?
No, Passepartout runs without API keys or environment variables.
Is Passepartout hosted or self-hosted?
A hosted option is available: Unyly runs the server in the cloud, no local setup required.
How do I install Passepartout in Claude Desktop, Claude Code or Cursor?
Open Passepartout on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
Omni Video
An MCP server that transforms LLM-enabled IDEs into professional video editors by pre-processing footage into text proxies, generating motion graphics via HTML/
by buildwithtazaARA
Generate images, video and audio from any AI agent — one connector.
by ARAYouTube
Transcripts, channel stats, search
by YouTubeEverArt
AI image generation using various models.
by modelcontextprotocolCompare Passepartout with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All media MCPs
