Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the WordPress MCP server

Vendor MCP
Open markdown

The WordPress MCP connector routes your AI agent's tool calls to WordPress's own MCP server through Scalekit. Each user signs in to WordPress once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 19 tools.

Tools
19
What they doRead · write · destructive
5 · 5 · 95 read5 write9 destructive
Users sign in with
OAuth app
Your own WordPress MCP server app

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the WordPress MCP connection

    In AgentKit > Connections, create a WordPress MCP connection and copy its redirect URI. The name you give it is the connection_name your code passes. See Configure connections.

  4. Register an OAuth app

    WordPress MCP server connections use your own OAuth app. Register one with WordPress MCP server and add the redirect URI you copied.

    Then enter the app's Client ID and Client Secret on the WordPress MCP connection.

  5. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'wordpressmcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize WordPress MCP:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'wordpressmcp_wpcom_ai_agent_sites_list',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • wordpressmcp_wpcom_ai_agent_sites_listLists public production WordPress.com sites whose owners enabled AI Agent Access.Read-only

    List AI Agent Access Sites

    Lists public production WordPress.com sites whose owners enabled AI Agent Access. Use this when the user asks to list, find, discover, or show sites/blogs that opted into AI agents, AI Agent Access, Blog Talks Back, or sites available for Jetpack Search Voice. Pass query or keywords to filter by what a site is about, matched against existing site metadata like title, description, site vertical, and site intent. This is the discovery/listing tool; it does not search within a blog. Page with after_blog_id/per_page until pagination.has_more is false.

    Inputs

    after_blog_idinteger
    Keyset cursor into the AI Agent Access discovery index. Returns sites with blog_id strictly greater than this value. Use pagination.next_after_blog_id from the previous response when pagination.has_more is true; omit or pass 0 to start from the beginning.default 0
    keywordsarray
    Optional topic keywords to filter opted-in sites by. Matched against existing site metadata including title, description, site_vertical, site_intent, and vertical stickers.
    per_pageinteger
    Number of sticker-indexed site candidates to evaluate per page. Returned sites can be fewer because private, staging, test, coming-soon, and otherwise ineligible candidates are filtered out.default 25
    querystring
    Optional natural-language topic query for discovering opted-in sites, such as "food blogs", "education", or "newsletter". Matched against existing site metadata, not post content.
  • wordpressmcp_wpcom_mcp_jetpack_search_voiceReturns search results from a public, opted-in blog plus its Guidelines (site + additional) in a single call.Read-only

    Search Blog Voice (Jetpack Search)

    Returns search results from a public, opted-in blog plus its Guidelines (site + additional) in a single call. Use this only for reader-facing requests to answer from a public blog URL in that blog's voice, for example "Talk to this blog <blog_url>" or "Chat with this blog <blog_url>". Do not use this for private/internal content, WordPress.com site or account management, or owner/admin content operations. Use keyword-focused search queries, then compose answers in the blog author's voice with grounded citations.

    Inputs

    blog_urlstringrequired
    Full URL of the blog to search (e.g. https://example.wordpress.com/).
    querystringrequired
    Keyword-focused search query derived from the reader's question. Short, specific, noun-heavy queries work best because this is backed by Jetpack Search rather than semantic retrieval. Prefer place names, post topics, and distinctive terms over conversational filler. If a first call returns no search_results, retry once with a shorter keyword-only query.
    num_resultsinteger
    Max number of search results (default 5, max 20).default 5
  • wordpressmcp_wpcom_mcp_site_editor_contextQuery site design context.Read-only

    Get Site Editor Context

    Query site design context. Operations: theme.active (active stylesheet slug), theme.presets (color palette, fonts, spacing tokens), theme.styles (applied block/element styles), blocks.allowed (registered block types). theme.presets and theme.styles auto-resolve the stylesheet from the active theme if omitted. Use action "list" to discover operations, "describe" for schema, "get" to fetch data. Call this BEFORE wpcom-mcp-content-authoring when building pages or posts — start with theme.active to get the stylesheet slug, then theme.presets for design tokens. Use preset slugs instead of hard-coded values.

    Inputs

    actionstringrequired
    The operation to perform: "list" to discover available context operations, "describe" to get the schema for a specific operation, "get" to fetch specific context data.one of listdescribeget
    wpcom_sitestringrequired
    The site to query context for. Can be a site ID (numeric) or URL (e.g., "myblog.wordpress.com"). Use wpcom-user-sites to list sites the user has access to.
    operationstring
    The context operation name (required for describe/get). Format: "resource.action" (e.g., "theme.presets", "blocks.allowed"). Use action "list" to see all available operations.one of theme.activetheme.presetstheme.stylesblocks.allowed
    paramsobject
    Operation parameters (optional for get). Use action "describe" to see available parameters for the operation.
  • wordpressmcp_wpcom_plans_listUse this to help users select or upgrade WordPress.com hosting.Read-only

    List Hosting Plans

    Use this to help users select or upgrade WordPress.com hosting. Returns the hosting plan catalogue (Personal, Premium, Business, Ecommerce) with prices in the user's currency and a per-tier feature list (storage, themes, plugins, SFTP/SSH, custom code, online store, etc.) so you can answer questions like "where can I host my website?", "how much does WordPress.com cost?", "can I install plugins?", or "which plan lets me sell products on my site?". For capability questions, compare plan_card_features across tiers to find which tier unlocks the feature the user needs. Pass "wpcom_site" (numeric blog ID or site URL/slug like "example.wordpress.com") to also receive intro offers, downgrade paths, and a ready-to-purchase checkout_url on each row. Without "wpcom_site" checkout_url is null on every row — ask the user which site to upgrade before starting checkout.

    Inputs

    currencystring
    ISO 4217 currency code (e.g. "USD", "EUR"). Defaults to the current user's billing currency.
    intervalstring
    Billing interval. Defaults to "yearly".one of monthlyyearly2-year3-yeardefault yearly
    wpcom_sitestring
    Optional WordPress.com site (numeric blog ID or site URL/slug like "example.wordpress.com"). When supplied, intro offers, downgrade paths, and a site-bound checkout_url are included on each plan row. When omitted, the catalogue is returned siteless: plan_card_features and prices in the user's currency are still included; per-site enrichment is omitted; checkout_url is null on every row.
  • wordpressmcp_wpcom_user_sitesList the authenticated user's accessible sites across WordPress.com and self-hosted Jetpack-connected sites.Read-only

    List User Sites

    List the authenticated user's accessible sites across WordPress.com and self-hosted Jetpack-connected sites. Returns blog IDs, URLs, names, platform type, MCP access status, and optional metrics. Use this to discover which site IDs exist before calling site-scoped abilities.

    Inputs

    environmentstring
    Filter by site environment. "production" excludes staging/test/deleted/migration-hidden sites (default). "staging" shows only staging sites. "test" shows only test sites. "all" includes everything.one of productionstagingtestalldefault production
    filtersobject
    No description.
    include_metricsboolean
    Include site metrics in the response.default false
    ownershipstring
    Filter by site ownership. Only "user" is available - shows your accessible sites.one of userdefault user
    pageinteger
    Page number for pagination.default 1
    per_pageinteger
    Number of sites per page.default 10
    platformstring
    Filter by platform type. "simple" shows classic WordPress.com sites. "atomic" shows WordPress.com sites with SSH/SFTP access. "jetpack" shows self-hosted Jetpack-connected sites. "all" shows every platform type.one of allsimpleatomicjetpackdefault all
    sortobject
    No description.
  • wordpressmcp_wpcom_checkout_urlUse this to generate a WordPress.com checkout link — for plan purchases, domain registrations, or subscription renewals.Write

    Generate Checkout URL

    Use this to generate a WordPress.com checkout link — for plan purchases, domain registrations, or subscription renewals. Returns a ready-to-use checkout_url the user can open to complete the transaction. Three modes (provide exactly one): (1) "products" — an array of up to 10 items with "product_slug" (plus optional "meta" for domain names and "quantity" for per-seat plans) to start a new checkout; optionally pass "wpcom_site" to tie the checkout to an existing site. (2) "subscription_id" — direct renewal when the subscription ID is known. (3) "renewal_product" + "wpcom_site" — direct renewal when only the product (slug or ID) and the site are known; the tool resolves the active subscription. For plan slugs, prefer those returned by wpcom/plans-list. Premium's plan slug is "value_bundle" (underscore); all other plan slugs use hyphens.

    • Idempotent

    Inputs

    productsarray
    Products to add to the cart for a new purchase. Provide exactly one of: products, subscription_id, or renewal_product.
    renewal_productstring
    Product slug or numeric product ID to renew. Requires "wpcom_site". Looks up the current user's active subscription for this product on the specified site.
    subscription_idinteger
    Store subscription ID for a direct renewal URL. Use when the ID is known.
    wpcom_sitestring
    WordPress.com site identifier (numeric blog ID or site URL/slug). Required with "renewal_product". Optional with "products" to bind the checkout to an existing site.
  • wordpressmcp_wpcom_mcp_accountManage the current user's WordPress.com account — profile, notifications, achievements, domains, subscriptions, connections, and security.Write

    Manage WordPress.com Account

    Manage the current user's WordPress.com account — profile, notifications, achievements, domains, subscriptions, connections, and security. To list all your sites, use the standalone wpcom-user-sites tool. Workflow: "list" to discover available operations, "describe" for parameter schema, "execute" to run. Always share results with the user. SAFETY PROTOCOL: Before ANY write operation (profile.update, notifications.update), 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.

    Inputs

    actionstringrequired
    The operation to perform: "list" to discover available operations, "describe" to get the schema for a specific operation, "execute" to run an operation.one of listdescribeexecute
    operationstring
    The operation name (required for describe/execute). Format: "resource.action" (e.g., "profile.get", "notifications.update"). Use action "list" to see all available operations.
    paramsobject
    Operation parameters (required for execute). Use action "describe" first to see available parameters for the operation.
    wpcom_sitestring
    Optional site identifier, passed through to sub-abilities that need it (e.g., notifications scoped to a specific site). Not required at the account facade level.
  • wordpressmcp_wpcom_mcp_create_siteCreate a new WordPress.com site.Write

    Create WordPress.com Site

    Create a new WordPress.com site. This tool is the ONLY entry point the agent should use to create a site. CORE RULES (apply without calling site.instructions): - The subdomain is DERIVED from `title` automatically. NEVER ask the user for a URL slug, subdomain, or custom site address — it is not an input field. Show a subdomain preview derived from the title for confirmation only. - Ask ONE direct question for the title. Do NOT ask about site type, audience, tone, topic, or goals — those are NOT required to create a site. - After the site is created, share the URL and STOP. Do NOT auto-chain into theme picking or homepage authoring; offer them only if the user asks. WORKFLOW: 1. action="execute", operation="site.instructions" (no params) — returns the runbook: field schema, conversational rules, confirmation policy (including the deterministic subdomain-derivation rule), the handoff to site.provision, and a list of next actions available after creation. When the user has not enabled the create-site capability, the runbook also surfaces a `preflight_required` block — walk the user to the link in that block BEFORE asking any interview question. Call site.instructions ONCE, up front. 2. Ask the user a single direct question for the title (or detect test-site intent — see the runbook rules — and skip to step 3 with "Test site" as the title). 3. Derive the subdomain slug from `title` locally per the `subdomain_derivation_rule` in the runbook (lowercase, strip diacritics, remove every non-alphanumeric character). Then call action="execute", operation="subdomain.check", params: { slugs: [ <derived slug> ] }. Read the first entry in `results`; it reports whether the slug is valid + available, plus the `would_be_url` the user will actually receive (which may carry a numeric suffix when the base slug is taken). Show the user the actual `results[0].would_be_url` verbatim before asking for title confirmation. If `results[0].is_valid` is false (empty slug, blacklisted, invalid characters), ask the user for a different title and re-derive — do NOT proceed to site.provision. 4. (Optional) Ask once whether the user wants a short tagline; accept "skip" / "not now" cleanly. 5. Summarize the collected fields — especially the title and the `would_be_url` from subdomain.check — and ask for explicit confirmation. 6. action="execute", operation="site.provision", params: { spec: { title: <confirmed title>, [description: <tagline if provided>] }, user_confirmed: true }. `title` is the only required field on `spec`; `description` is the only common optional field. `user_confirmed` MUST be the boolean `true` (or one of the strings `"true"` / `"yes"` / `"on"` / `"1"`) after the user has approved the title and subdomain preview. 7. On success, share the returned site_url and stop. On `invalid_spec` errors, the error message lists each offending field on its own line (for example `- spec.title: missing field`); fix only the listed fields and retry site.provision. On `empty_subdomain_after_derivation` errors, the title strips to an empty subdomain (subdomain.check should have caught this earlier) — ask the user for a different title and retry. SPEC SHAPE: only `title` is required. `description` (one-sentence tagline) is optional. `locale` is auto-defaulted from the user's account locale. SAFETY: site.provision creates a real site on the user's account. Only call it after the user has explicitly confirmed the title and subdomain preview.

    Inputs

    actionstringrequired
    The STRAP action: "list" to see operations and workflow, "describe" for an operation's schema, "execute" to run an operation.one of listdescribeexecute
    operationstring
    Operation name (required for describe/execute). "site.instructions" returns the runbook; "subdomain.check" reports whether a candidate slug is valid + available (caller derives the slug from title per the runbook rule); "site.provision" creates the site.one of site.instructionssite.provisionsubdomain.check
    paramsobject
    Operation parameters (required for execute). See action="describe" for each operation's schema.