Everything you need to know
From your first install to advanced scope rotation and multi-site management. If something’s missing, tell us and we’ll add it.
Quick start
Already installed both pieces? Open Xaflo Desktop → + Add WordPress site → paste URL + token → Verify & continue. Restart Claude Code completely. In a new session run /mcp.
Fresh install? Three steps:
- Install the WordPress plugin. Download Xaflo WP Connect. Upload via wp-admin → Plugins → Add new → Upload. Activate.
- Install Xaflo Desktop. Download the installer for your OS. Run it. Open the app from the desktop shortcut.
- Bridge them. In WordPress admin: Xaflo → Settings → install signing secret. Then Xaflo → Tokens → New token (scopes:
content:read,media:read). Copy the token. In Xaflo Desktop: + Add site. Paste URL + token.
Architecture
Xaflo is three pieces working in sync:
- Xaflo WP Connect plugin — server-side PHP plugin on WordPress. Exposes
/wp-json/wpcb/v1/*with JWT auth, rate limiting, scopes and audit logging. - claude-wp-mcp — Node.js MCP server. Bridges Claude Code’s MCP protocol to the plugin’s REST API. Bundled with Xaflo Desktop.
- Xaflo Desktop — Electron + Svelte app. Manages every connection in your
~/.claude.json, runs health checks, hosts the prompt library and tool browser.
Claude Code reads ~/.claude.json at startup. Each entry becomes one MCP server. Each server registers its tools with prefix mcp__<name>__wp_*. You ask Claude “use wp_list_posts on movin”, Claude calls mcp__movin__wp_list_posts, the MCP server translates to HTTPS calls against your WordPress.
Token scopes
Every JWT carries a list of allowed scopes. Tools check their required scope before executing. Suggested starting set: content:read, media:read, seo:read, analytics:read, site:read.
Add write scopes only when needed. Dangerous scopes (db:write, cli:exec, plugin:install, system:backup, theme:write) trigger two-step confirmation on every call.
The 74 tools
Grouped by domain:
- Posts & Pages (10) — list, get, create, update, delete, publish, search across posts and pages
- Media (7) — list, upload, delete, set alt/caption/description, optimize, find unused
- SEO (6) — read/write Yoast/RankMath/AIOSEO meta, audit posts in bulk, sitemap status, broken links
- Analytics (9) — overview, top posts/keywords/referrers, zero-traffic pages, period compare, trends by category
- Multilingual (10) — list languages, get/set translations, audit string coverage
- Theme (13) — read/switch themes, edit Customizer, manage menus and widgets, inject custom CSS
- Plugins (8) — list, install from repo/zip, activate/deactivate, read/write files, scaffold new plugin
- Taxonomy (2) — list, create terms
- Site & System (7) — read/write settings, health, performance, backups
- Advanced (2) — SQL queries with guard, WP-CLI execution
Browse them all in Xaflo Desktop → Tools.
Prompt library
Xaflo Desktop ships with 17 curated prompts you can copy and paste into Claude Code. Categories:
- Audit & QA — full SEO audit, broken links, missing alt text, multilingual coverage
- Create & Publish — draft post from topic, translate existing post, scaffold landing page
- Manage — recent posts, empty trash, plugin update check, bulk category change
- Analytics — top posts this month, zero-traffic pages, trend by category
- Development — map active theme, add custom CSS via Customizer, scaffold a new plugin
You can also create your own — they’re saved to your userData/custom-prompts.json and appear at the top of the list under ⭐ My prompts.
Managing multiple sites
One Xaflo Desktop install handles unlimited WordPress sites. Each site gets its own entry in .claude.json with its own command, args (site URL + token), and unique slug like wp-movin or wp-podcast.
In Claude Code prompts you reference each site by its slug:
User: List my last 5 posts on wp-podcast Claude: [calls mcp__wp-podcast__wp_list_posts(per_page=5)] ✓ Found 5 posts on podcast.allincrypto.com…
Troubleshooting
“Verification failed: HTTP 404” — Xaflo Desktop is calling an endpoint the plugin doesn’t expose. Ensure both are on v1.0.0 or later. Re-download the latest desktop installer.
“Failed to create token” — usually the JWT secret is missing. Go to wp-admin → Xaflo → Settings, click “Install JWT secret”.
“Plugin file does not exist” on upload — your zip was built with backslash paths. Re-download from this site or rebuild with a UNIX zipper.
Claude Code doesn’t see my new connection — you must fully quit Claude Code (Cmd/Ctrl+Q, then restart). Reload-window (Cmd/Ctrl+R) doesn’t pick up .claude.json changes.
REST API reference
All endpoints live under https://your-site.com/wp-json/wpcb/v1/ and require the Authorization: Bearer <jwt> header (except /health which only returns metadata).
GET /health— plugin version, WP version, PHP version, multilingual adapter, scopes (public)GET /performance— system info, disk, MySQL, OPcache, plugins, theme (requiressite:read)GET /posts+POST /posts+PATCH /posts/{id}+DELETE /posts/{id}GET /media+POST /media/upload+PATCH /media/{id}+DELETE /media/{id}GET /seo/post/{id}+PUT /seo/post/{id}+POST /seo/audit/bulkGET /tokens+POST /tokens+DELETE /tokens/{jti}(cookie-auth admin only)POST /db/query— read withdb:read, write withdb:write+ confirmation token- …and 50 more — browse them all from Xaflo Desktop’s Tools page.
Security model
JWT signing — HS256 with a 32+ byte secret in WPCB_JWT_SECRET. Tokens include iss (your site URL), iat, exp, jti, sub (WP user id), scopes.
Revocation — every token has a unique jti. Revoking adds the jti to wp_wpcb_revoked; the middleware checks on every request.
Rate limits — sliding 2-bucket per-token per-minute counter. Configurable per scope. Global default 60 RPM.
HTTPS enforcement — refuses to issue tokens or accept requests over HTTP. Override only if you terminate TLS at a verified proxy.
SqlGuard — every SQL query is parsed and validated for tables outside the WordPress prefix, dangerous keywords, and write operations without confirmation tokens.
FileSandbox — theme and plugin file writes go through a sandbox that compares against an allowlist + backs up the file + verifies write succeeded.
Audit log — every request is recorded with timestamp, jti, user, IP, endpoint, scope required, result, payload (sanitized). Default 90-day retention.