WordPress MCP

Live

OAUTH 2.1

SITE MANAGEMENT

Marketing

WordPress MCP gives agents authenticated access to your WordPress.com sites: manage posts and pages, moderate comments, handle media, and adjust site settings under the owner's own account.

  • Per-user credentials: each publish and settings change runs as the actual site owner, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
WordPress MCP
agent · Acme Q3
Run
Publish the draft launch post and set its featured image.
S
wordpressmcp_wpcom_user_sites
88ms
WordPress agent
Published the launch post to the marketing site, set the featured image, and scheduled a social share. Live now.
Sites: 1, posts: 1
wordpressmcp
1 post
18:29
Message Claude...

Tools your marketing agent reaches for in WordPress, scoped per user.

CALL ANY TOOL
Manage your WordPress.com sites end to end: create and publish posts and pages, moderate comments, handle media, and manage domains and site settings.
wordpressmcp_wpcom_mcp_site
Wpcom mcp site
Manage site-level settings and infrastructure for a WordPress.com site : not content (use wpcom-mcp-content-authoring for posts, pages, media). Covers: settings, statistics, plugins, users, activity log, and theme management (theme.list to browse available themes, theme.set to activate one). Use wpcom-user-sites first if you need to find the target site ID. Workflow: "list" to discover operations, "describe" for parameter schema, "execute" to run. Always share results with the user. SAFETY PROTOCOL: Before ANY write operation (settings.update, theme.set), you MUST: (1) Describe exactly what you plan to change. (2) Ask the user for confirmation and wait for their response. Never auto-execute write operations without user approval.
Parameters
Name
Type
Required
Description
action
string
Required
The operation to perform: "list" to discover available operations, "describe" to get the schema for a specific operation, "execute" to run an operation.
operation
string
Optional
The operation name (required for describe/execute). Format: "resource.action" (e.g., "settings.get", "theme.list"). Use action "list" to see all available operations.
params
object
Optional
Operation parameters (required for execute). Use action "describe" first to see available parameters for the operation.
wpcom_site
string
Optional
The target site for all operations. Can be a site ID (numeric) or URL (e.g., "myblog.wordpress.com"). Required for execute : all site operations need a target site. Use wpcom-user-sites to list sites the user has access to.
wordpressmcp_wpcom_plans_list
Wpcom plans list
wordpressmcp_wpcom_user_sites
Wpcom user sites
wordpressmcp_wpcom_ai_agent_sites_list
Wpcom ai agent sites list
wordpressmcp_wpcom_mcp_account
Wpcom mcp account
wordpressmcp_wpcom_checkout_url
Wpcom checkout url
wordpressmcp_wpcom_domain_purchase
Wpcom domain purchase
wordpressmcp_wpcom_mcp_create_site
Wpcom mcp create site
wordpressmcp_wpcom_mcp_site_editing
Wpcom mcp site editing
wordpressmcp_wpcom_mcp_send_feedback
Wpcom mcp send feedback
wordpressmcp_wpcom_mcp_content_authoring
Wpcom mcp content authoring
wordpressmcp_wpcom_mcp_plugin_management
Wpcom mcp plugin management
wordpressmcp_wpcom_domain_update_nameservers
Wpcom domain update nameservers
wordpressmcp_wpcom_domain_set_mail_service
Wpcom domain set mail service
wordpressmcp_wpcom_mcp_site_editor_context
Wpcom mcp site editor context
wordpressmcp_wpcom_mcp_jetpack_search_voice
Wpcom mcp jetpack search voice
wordpressmcp_wpcom_domain_update_dns_records
Wpcom domain update dns records
wordpressmcp_wpcom_domain_restore_default_dns_records
Wpcom domain restore default dns records
wordpressmcp_wpcom_mcp_user_management
Wpcom mcp user management
Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// WordPress tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["wordpressmcp"], toolNames: [
    "wordpressmcp_wpcom_mcp_site",
    "wordpressmcp_wpcom_plans_list",
    "wordpressmcp_wpcom_user_sites"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Publish the draft launch post and set its featured image." }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["wordpressmcp"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Publish the draft launch post and set its featured image." }],
  tools,
});

// Execute the tool call with the user's vaulted WordPress credential
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["wordpressmcp"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Publish the draft launch post and set its featured image." }],
  tools,
});

// Tool call runs with the user's vaulted WordPress credential
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["wordpressmcp"] }, pageSize: 100,
});

const agent = new Agent({
  name: "wordpress_agent",
  model: "gemini-2.5-pro",
  instruction: "Manage WordPress for the signed-in user.",
  tools,
});

await agent.run("Publish the draft launch post and set its featured image.");
Try these prompts
Copy any prompt into your agent. Each maps directly to a WordPress tool. Click to copy, paste into your agent, done.
Publish
Copy the prompt
Copied
Publish the draft launch post.
Copy the prompt
Copied
Set the featured image on this post.
Copy the prompt
Copied
Schedule the newsletter post for Monday 9am.
Moderate
Copy the prompt
Copied
Which comments are pending moderation?
Copy the prompt
Copied
Approve the comments from known readers.
Copy the prompt
Copied
Mark this comment as spam.
Site admin
Copy the prompt
Copied
Which sites am I an admin on?
Copy the prompt
Copied
List the plans on this site.
Copy the prompt
Copied
Update the tagline on the marketing site.
SEE HOW AUTH WORKS
Your users connect once. Their WordPress credentials stay vaulted, every call is scope-checked, and every action is logged.
1
Authorize
Your user connects
WordPress MCP
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
WordPress MCP
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
WordPress MCP
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
WordPress MCP
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other marketing connectors.
People Ops and HR teams
New Hire Provisioning Agent
Open-source Python template. Creates or detects the hire in Deel, provisions their Workspace account, builds the Notion onboarding page, posts the welcome.
People Ops and HR teams
PTO & Leave Request Agent
Open-source Python template. Resolves the employee in Deel, validates against their real entitlement, submits the request for approval, blocks the calendar.
Engineering Teams
Incident Response Agent
Open-source Python template. Triggers the PagerDuty page, opens the Jira incident, notifies the on-call Slack channel, and drafts the Confluence postmortem.
GTM and RevOps Teams
Competitive intelligence briefing agent
Scans Gong calls for competitor mentions, matches each one to its Notion battlecard, and DMs every affected rep a single Slack digest per cycle. Every call runs as the PMM who owns the briefing, never a shared bot.
Test other agents
See the same per-user auth pattern across other marketing connectors.
SALES
Outbound prospecting agent
Search Apollo for ICP matches, rank them, draft personalised Gmail outreach, and log every send to Google Sheets.
GTM
HubSpot to Slack updates agent
Watch HubSpot deal stage changes and post structured updates to the right Slack channel. Reps stop checking the CRM all day.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
A shared key can publish as anyone
A shared WordPress token looks fine in a demo. In production every publish and settings change comes from one account, with no way to tell which owner acted on customer-facing content. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
WordPress today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions

Does the agent access WordPress as the user or as a shared key?
As the user. Each workspace member authorizes once and Scalekit resolves their credential at request time. Audit logs attribute every action to that user, not a shared service account.

Where is the WordPress OAuth token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. Refresh is automatic. Revocation is a single dashboard action. Tokens never appear in prompts, logs, or LLM context.

Can I limit what the agent is allowed to do in WordPress?
Yes. Pass a tool name filter to listScopedTools so the marketing agent only sees the subset you authorize. Pre-API-call scope checks block out-of-policy actions before the request reaches WordPress.

What happens when a user revokes WordPress access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.

Does the agent respect WordPress permissions?
Yes. Every call runs as the authorizing user. Native roles, sharing settings, and scope restrictions in WordPress apply to each request, and actions log to the audit chain.

Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""wordpressmcp"": {
""url"": ""https://mcp.scalekit.com/wordpressmcp"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.wordpressmcp]
url = ""https://mcp.scalekit.com/wordpressmcp""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""wordpressmcp"": {
""url"": ""https://mcp.scalekit.com/wordpressmcp"",
""type"": ""http""
}
}
}