Skip to content

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.

  1. Use an administrator account; every VX ability requires the manage_options capability. 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.
  2. In that user's profile, under Application Passwords, create one named after the client ("Cursor on my laptop").
  3. 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:

ResultWhat to do
ConnectedNothing. The client will connect.
The credential was rejectedThe password is wrong. Create a new one and paste it again.
That account is not an administratorCreate the password on an administrator account.
Nothing is served at the endpointMCP is off, or no abilities are exposed. Revisit steps 1 and 2 and save.
The endpoint could not be reachedSomething 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's params._meta, plus MCP-Protocol-Version, Mcp-Method and Mcp-Name headers; opens with server/discover) and 2025-11-25 (session from initialize, sent back as Mcp-Session-Id). initialize also accepts 2025-06-18 and 2024-11-05 and serves them as 2025-11-25. Any other version → JSON-RPC -32022 listing the supported ones. Both generations receive the same operating guide (instructions). initialize requires clientInfo.name and clientInfo.version; JSON-RPC batches are refused.
  • Test connection sends a real initialize without 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/ping from the client (echoes the plugin version).

Documentation for the VX Framework.