MCP WordPress
Manage posts, pages, media, users, comments and SEO on self-run WordPress sites over the REST API
Local stdio bridge from an MCP client to a WordPress site's MCP Adapter endpoint, with sign-in handled
Official · Automattic TypeScript Local · stdio ProductivityE-commerce
76 popularity score ★ 187 ↓ 54k/wk
Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs WP_API_URL. Replace each <NAME> with your value.
claude mcp add wordpress-remote -e WP_API_URL=<WP_API_URL> -- npx -y @automattic/mcp-wordpress-remote{
"mcpServers": {
"wordpress-remote": {
"command": "npx",
"args": [
"-y",
"@automattic/mcp-wordpress-remote"
],
"env": {
"WP_API_URL": "<WP_API_URL>"
}
}
}
}{
"mcpServers": {
"wordpress-remote": {
"command": "npx",
"args": [
"-y",
"@automattic/mcp-wordpress-remote"
],
"env": {
"WP_API_URL": "<WP_API_URL>"
}
}
}
}{
"servers": {
"wordpress-remote": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@automattic/mcp-wordpress-remote"
],
"env": {
"WP_API_URL": "<WP_API_URL>"
}
}
}
}[mcp_servers.wordpress-remote]
command = "npx"
args = ["-y", "@automattic/mcp-wordpress-remote"]
[mcp_servers.wordpress-remote.env]
WP_API_URL = "<WP_API_URL>"gemini mcp add --scope user -e WP_API_URL=<WP_API_URL> wordpress-remote npx -- -y @automattic/mcp-wordpress-remoteOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs WP_API_URL. Replace each <NAME> with your value.
git clone https://github.com/Automattic/mcp-wordpress-remote.git
cd mcp-wordpress-remote
npm install
npm run buildclaude mcp add wordpress-remote -e WP_API_URL=<WP_API_URL> -- node '<ABSOLUTE_PATH_TO_CLONE>/dist/proxy.js'{
"mcpServers": {
"wordpress-remote": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/proxy.js"
],
"env": {
"WP_API_URL": "<WP_API_URL>"
}
}
}
}{
"mcpServers": {
"wordpress-remote": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/proxy.js"
],
"env": {
"WP_API_URL": "<WP_API_URL>"
}
}
}
}{
"servers": {
"wordpress-remote": {
"type": "stdio",
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/proxy.js"
],
"env": {
"WP_API_URL": "<WP_API_URL>"
}
}
}
}[mcp_servers.wordpress-remote]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/dist/proxy.js"]
[mcp_servers.wordpress-remote.env]
WP_API_URL = "<WP_API_URL>"gemini mcp add --scope user -e WP_API_URL=<WP_API_URL> wordpress-remote node -- '<ABSOLUTE_PATH_TO_CLONE>/dist/proxy.js'WP_API_URL |
Required: Full URL of the site's MCP Adapter server, e.g. https://site/wp-json/mcp/mcp-adapter-default-server; a bare domain resolves to the default server. |
|---|---|
OAUTH_ENABLED |
Optional: Set to true to sign in through the browser with OAuth 2.1; off by default. |
JWT_TOKEN |
Optional: JWT sent to the site instead of OAuth. |
WP_API_USERNAME |
Optional: WordPress username for application-password sign-in. |
WP_API_PASSWORD |
Optional: WordPress application password, used with WP_API_USERNAME. |
CUSTOM_HEADERS |
Optional: Extra headers on every request, as JSON or Name:value pairs separated by commas. |
WOO_CUSTOMER_KEY |
Optional: WooCommerce consumer key, used with WOO_CUSTOMER_SECRET. |
WOO_CUSTOMER_SECRET |
Optional: WooCommerce consumer secret. |
OAUTH_CALLBACK_PORT |
Optional: Fixed port for the local OAuth callback; picked automatically when unset. |
WP_API_TIMEOUT_MS |
Optional: Timeout for forwarded requests, 120000 ms by default. |
HTTPS_PROXY |
Optional: Proxy for outgoing requests; SOCKS_PROXY, ALL_PROXY and HTTP_PROXY also work. |
LOG_FILE |
Optional: Path of a log file; LOG_LEVEL 0-3 sets the detail, 2 by default. |
MCP WordPress Remote is a small Node program from Automattic. It runs on your machine and passes messages back and forth between an MCP client that speaks stdio and the HTTP MCP endpoint on a WordPress site. That endpoint comes from the MCP Adapter plugin, which by default serves at /wp-json/mcp/mcp-adapter-default-server. The proxy has no tools of its own. The tools, resources and prompts the assistant sees are whatever the site's MCP Adapter exposes. The proxy forwards messages as they are and does not negotiate the protocol version itself.
What it adds is the connection layer. It can sign in by running an OAuth 2.1 browser flow with PKCE and saving the tokens. It can also send a JWT, a WordPress application password, WooCommerce consumer keys or any custom headers. Traffic can go through a SOCKS or HTTP proxy, or the macOS system proxy. Request and initialize timeouts can be tuned, and a file log can be kept. The README says to skip the proxy when your client can connect to the site's HTTP endpoint and sign in by itself.
One thing the README gets wrong: it lists 7665 as the default OAuth callback port and elsewhere says 3000. In the v0.5.1 source (src/lib/config.ts, src/lib/port-utils.ts), the port is left unset unless OAUTH_CALLBACK_PORT is given. The proxy then reuses a port saved from an earlier sign-in, or else picks one from a hash of the site URL in the range 3335-49151, and falls back to a random free port. The default OAuth scopes are read and write, which can be changed with OAUTH_SCOPES, a setting the README's table leaves out.
| Runtime | Node.js |
|---|
Node.js (the README says 22+; the v0.5.1 start-up check accepts 18 or later). A WordPress site with the MCP Adapter plugin installed and active, and a WordPress user account with enough permissions. One way to sign in: OAuth enabled on the site, a JWT that the site accepts, an application password, or custom headers. The OAuth flow opens a browser on the same machine.
It relays only what the site's MCP Adapter exposes and adds no tools itself. It does not translate between MCP protocol revisions. If the connection fails during initialize, it returns a degraded response with no capabilities, refuses later requests locally, and does not retry. The method-only request format of the archived wordpress-mcp plugin was removed, so sites still on that plugin need the MCP Adapter. OAuth is off unless OAUTH_ENABLED=true. The README says the licence is GPL v2 or later, but package.json and npm say MIT. The README's callback-port defaults (7665, 3000) do not match the code.
Suits people whose MCP client can only start local commands, or cannot sign in to their WordPress site, and who want OAuth, JWT, application-password or WooCommerce-key auth plus proxy and timeout settings. If your client already supports Streamable HTTP with headers, the README says to connect it straight to the site's MCP Adapter endpoint instead (listed here as mcp-adapter). That is the WordPress plugin that actually serves the tools, and you need it either way. What the assistant can do depends on that site's configuration, not on this package.