Connecting MCP clients
Steps 3 and 4 on VX → AI → Setup connect your assistant: pick the client, then choose Quick setup (VX fills in the configuration and opens or copies it) or Manual setup (VX shows the steps and snippet for you to paste).
The credential
Assistants sign in with a WordPress Application Password, the same kind apps use for the WordPress REST API.
- Use an administrator account; every VX ability requires the
manage_optionscapability. A dedicated administrator account for AI is best: revoking its password disconnects every client at once, and the activity log shows clearly what the assistant did. - In that user's profile, under Application Passwords, create one named after the client ("Cursor on my laptop").
- Copy it. WordPress only shows it once.
WordPress only offers Application Passwords over HTTPS, or on hosts it recognizes as local development sites. If Quick setup can't create one, it tells you why: the site needs a secure connection, a security plugin has disabled them, they're disabled for your account, or your account can't create them.
Test before you connect
Every Quick setup dialog has Test connection, which makes a real connection with the password you pasted:
| Result | What to do |
|---|---|
| Connected | Nothing. The client will connect. |
| The credential was rejected | The password is wrong. Create a new one and paste it again. |
| That account is not an administrator | Create the password on an administrator account. |
| Nothing is served at the endpoint | MCP is off, or no abilities are exposed. Revisit steps 1 and 2 and save. |
| The endpoint could not be reached | Something in front of WordPress, such as a security plugin or proxy, is blocking the address or removing the Authorization header. |
Cursor
Add to Cursor opens Cursor with the server filled in. To add it by hand, open Cursor Settings → Tools & MCP → New MCP Server and merge this into mcp.json (~/.cursor/mcp.json for every project, .cursor/mcp.json for one):
json
{
"mcpServers": {
"vx": {
"url": "https://example.com/wp-json/vx-framework/mcp",
"headers": { "Authorization": "Basic <base64 of username:application-password>" }
}
}
}Claude Code
Copy Claude Code command copies a ready-to-run command. Run it in a terminal, outside a Claude session, then check with claude mcp list:
bash
claude mcp add --transport http --scope user vx "https://example.com/wp-json/vx-framework/mcp" \
--header "Authorization: Basic <base64 of username:application-password>"--scope user makes it available in every project. Never use --scope project: it writes the credential into a file meant to be committed to your repository.
VS Code
Add to VS Code opens VS Code and offers to install the server. By hand, run MCP: Add Server → HTTP, or add it to your user configuration:
json
{
"servers": {
"vx": {
"type": "http",
"url": "https://example.com/wp-json/vx-framework/mcp",
"headers": { "Authorization": "Basic <base64 of username:application-password>" }
}
}
}Then click Start above the entry.
Windsurf
Copy Windsurf config copies the snippet. In Windsurf Settings → Cascade → Manage MCPs → View raw config, merge it in, save, and click Refresh. Windsurf uses serverUrl, not url:
json
{
"mcpServers": {
"vx": {
"serverUrl": "https://example.com/wp-json/vx-framework/mcp",
"headers": { "Authorization": "Basic <base64 of username:application-password>" }
}
}
}Codex
Copy Codex config copies a block for ~/.codex/config.toml. Codex needs the header in http_headers; its bearer-token option sends a different kind of header that WordPress rejects.
toml
[mcp_servers.vx]
url = "https://example.com/wp-json/vx-framework/mcp"
http_headers = { Authorization = "Basic <base64 of username:application-password>" }Check with codex mcp get vx, then start a new session.
Other clients
Any client that supports MCP over Streamable HTTP can connect to https://example.com/wp-json/vx-framework/mcp. Copy authorization header gives you the header to paste into its settings. Clients that can't send headers need a local bridge such as mcp-remote.
Keeping the credential out of files
The Quick setup buttons build the header in your browser and don't store the password. If you'd rather not keep the credential in a config file, most clients can read it from an environment variable: for example ${env:VX_MCP_TOKEN} in Windsurf, or env_http_headers in Codex.
Technical details for LLMs
- Header:
Authorization: Basic base64(username:application_password). Spaces in the application password are optional (WordPress strips non-alphanumerics before comparing). Build by hand:echo -n 'admin:xxxx xxxx xxxx xxxx xxxx xxxx' | base64. - Transport: Streamable HTTP, POST only (GET → 405; the server advertises
tools.listChanged: false, so clients must reconnect to see a changed tool list). - Protocol versions:
2026-07-28(sessionless: revision, client capabilities and client info in each request'sparams._meta, plusMCP-Protocol-Version,Mcp-MethodandMcp-Nameheaders; opens withserver/discover) and2025-11-25(session frominitialize, sent back asMcp-Session-Id).initializealso accepts2025-06-18and2024-11-05and serves them as2025-11-25. Any other version → JSON-RPC-32022listing the supported ones. Both generations receive the same operating guide (instructions).initializerequiresclientInfo.nameandclientInfo.version; JSON-RPC batches are refused. - Test connection sends a real
initializewithout browser cookies (so a wrong password can't pass on the admin session); it creates a session that expires on its own. - Verify end to end: call
vx-framework/pingfrom the client (echoes the plugin version).