Skip to main content
Glama

mcp-wordpress

Model Context Protocol server for WordPress — content, SEO and marketing automation

License: MIT Node Version

A Model Context Protocol server that gives Claude (or any MCP-compatible LLM) direct access to a self-hosted WordPress site over its REST API.

Status: v1.2.0 release candidate — 73 tools, 373 tests, full release pipeline ready.

v1.1 — what works today

System

  • wp_health_check — verify connectivity, detect REST namespaces, detect MCP Bridge and SEO plugins

Posts (full CRUD)

  • wp_posts_list — list with filters (status, search, author, categories, tags, date range, ordering, pagination)

  • wp_posts_get — fetch a single post by id with full content

  • wp_posts_create — create a draft (default) or any status (publish/future/private require publish tier)

  • wp_posts_update — partial update by id

  • wp_posts_publish — shortcut to set status=publish

  • wp_posts_schedule — schedule for future publication (date must be in the future)

  • wp_posts_delete — to trash by default; force+confirm for hard delete (MODE=full)

  • wp_posts_get_revisions — list revisions/autosaves of a post

Pages (full CRUD)

  • wp_pages_list — list with filters (parent for hierarchy, status, search, author, ordering)

  • wp_pages_get — fetch a single page by id with full content

  • wp_pages_create — create with hierarchy (parent) and ordering (menu_order)

  • wp_pages_update — partial update including re-parenting

  • wp_pages_delete — to trash by default; force+confirm for hard delete

Media (full CRUD)

  • wp_media_list — list with filters (media_type, mime_type, search, date range, parent post)

  • wp_media_upload — upload from URL or base64; optional title/alt_text/caption/description; max 25 MB

  • wp_media_set_alt_text — update alt_text + caption + description for accessibility and SEO

  • wp_media_delete — to trash by default; force+confirm for hard delete

Taxonomies

  • wp_taxonomies_list_categories — list with search, parent (hierarchy), hide_empty, ordering

  • wp_taxonomies_create_category — create with optional parent

  • wp_taxonomies_list_tags — list flat tags with post counts

  • wp_taxonomies_create_tag — create a tag

  • wp_taxonomies_assign_to_post — replace categories and/or tags on a post

  • wp_search_posts — full-text search via /wp/v2/search across posts, pages, CPTs, and terms

SEO meta

  • wp_seo_detect_provider — detect active provider (bridge / yoast / rankmath / null) and its capabilities

  • wp_seo_get_meta — read SEO meta for a post via the active provider

  • wp_seo_set_meta — write SEO meta (title, description, OG, Twitter, canonical, robots, JSON-LD, focus_keyword) via the active provider

  • wp_seo_analyze_post — readability (Flesch-Kincaid ES/EN/PT) + keyword density + headings hierarchy lint + length stats; optional focus_keyword for presence check

  • wp_seo_suggest_internal_links — ranked related-post suggestions from a keyword or post_id; title matches weighted 3x over excerpt + recency boost

Bulk operations (MODE=full)

  • wp_bulk_find_replace — find/replace literal substring across post content. Dry-run by default; apply with confirm token.

  • wp_bulk_update_seo — apply same SEO meta to many posts via active provider. Dry-run by default; apply with confirm token.

Both bulk tools require MODE=full (set MODE=full env var). The dry-run response includes the exact confirm_token you need to pass to actually apply the change.

System

  • wp_health_check (covered earlier) — REST namespaces + bridge + SEO plugin detection

  • wp_get_site_info — title, tagline, URL, language, timezone, sitemap URL, posts-per-page

  • wp_detect_page_builder — warn when Elementor/Divi/Beaver/WPBakery is active (their content can't be edited via posts tools)

Comments (5)

  • wp_comments_list — filter by post/author/status/type

  • wp_comments_get — single comment with full author details

  • wp_comments_create — create or reply (parent)

  • wp_comments_update — moderate (approve/spam/trash) or edit

  • wp_comments_delete — trash or hard delete

Users (6)

  • wp_users_list — search, filter by role, who=authors

  • wp_users_get — single user

  • wp_users_get_current — whoami (current Application Password user)

  • wp_users_create — new user with role

  • wp_users_update — partial update including role changes

  • wp_users_delete — permanent delete with content reassignment (MODE=full)

Discovery (4)

  • wp_get_post_types — all registered post types (built-in + custom)

  • wp_get_taxonomies — all taxonomies (built-in + custom), optional type filter

  • wp_get_post_statuses — available post statuses

  • wp_get_site_capabilities — single-call summary of types + taxonomies + namespaces + plugin detection

Custom Post Types — Generic CRUD (5)

  • wp_cpt_list — list any CPT (WooCommerce products, events, custom)

  • wp_cpt_get, wp_cpt_create, wp_cpt_update, wp_cpt_delete

Taxonomies — completeness (6 new in v1.1)

  • wp_taxonomies_get_category / _update_category / _delete_category

  • wp_taxonomies_get_tag / _update_tag / _delete_tag

Reusable Blocks (5)

  • wp_blocks_list / _get / _create / _update / _delete — Gutenberg reusable block CRUD

Revisions detail + restore (4 — extending posts and pages)

  • wp_posts_get_revision — fetch one revision

  • wp_posts_restore_revision — rollback a post to an earlier state

  • wp_pages_get_revisions — list revisions of a page

  • wp_pages_get_revision / _restore_revision — same for pages

Media completeness (2)

  • wp_media_get — full media metadata

  • wp_media_update — generic partial update of any media field

System (1 new)

  • wp_update_site_settings — write title, tagline, timezone, language, posts_per_page, etc.

Batch (1)

  • wp_batch — execute up to 25 REST requests in one round-trip

Related MCP server: ItchWPMCP

Architecture

  • TypeScript / Node ≥22, ESM modules

  • @modelcontextprotocol/sdk over stdio transport

  • Application Password authentication (native since WP 5.6)

  • Rate limiting (Bottleneck), retry with exponential backoff, in-memory LRU+TTL cache

  • Three operational modes: read-only / safe (default) / full

  • Audit log of all write operations

See docs/superpowers/specs/2026-06-01-mcp-wordpress-design.md for the full design.

Installation

npm install -g @iamsamuelfraga/mcp-wordpress

Or via npx (no installation):

npx -y @iamsamuelfraga/mcp-wordpress

Setup

1. Create an Application Password in WordPress

Go to WP Admin → Users → Your Profile → Application Passwords. Enter a name (e.g., "Claude MCP") and click "Add New Application Password". Copy the 24-character password (formatted as 6 groups of 4 characters).

2. Configure Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "wordpress": {
      "command": "npx",
      "args": ["-y", "@iamsamuelfraga/mcp-wordpress"],
      "env": {
        "WP_URL": "https://your-site.com",
        "WP_USER": "your_admin_username",
        "WP_APP_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx",
        "MODE": "safe"
      }
    }
  }
}

Restart Claude Desktop.

3. Verify

In Claude, ask: "Run a health check on my WordPress site." — you should see your site title, the detected REST namespaces, and whether SEO plugins are present.

For full SEO functionality (rendering meta description, Open Graph, Twitter Card, JSON-LD, and per-post robots directives in your site's <head>), install the MCP WordPress Bridge companion plugin on your WordPress site.

Install via GitHub Releases

  1. Download mcp-wordpress-bridge-X.Y.Z.zip from the Releases page.

  2. In wp-admin, go to Plugins → Add New → Upload Plugin → choose the zip → Install → Activate.

  3. No further configuration needed. The plugin auto-detects Yoast / Rank Math / AIOSEO / SEOPress and defaults to coexist mode (no double-rendering).

Mode constants (optional, in wp-config.php)

define('MCP_BRIDGE_MODE', 'coexist'); // default: skip if another SEO plugin is active
// define('MCP_BRIDGE_MODE', 'override'); // always render our meta
// define('MCP_BRIDGE_MODE', 'disable');  // don't render anything (data layer only)

What the plugin exposes

Once installed, the MCP server detects the bridge via wp_health_check (look for bridge.installed: true). New REST endpoints become available under /wp-json/mcp/v1/*:

  • GET /info — plugin version, capabilities, detected SEO plugins

  • GET|POST|DELETE /seo/{post_id} — read/write/clear our SEO meta for a post

  • GET /plugins — active plugins list

  • GET /theme — active theme info

  • GET /permalinks — read-only permalink structure

  • GET /health — health check (no auth)

Configuration

All settings via environment variables:

Variable

Required

Default

Description

WP_URL

yes

—

Base URL of your WordPress site

WP_USER

yes

—

WordPress username

WP_APP_PASSWORD

yes

—

Application Password (24 chars, with or without spaces)

MODE

no

safe

read-only | safe | full

TOOLSETS

no

all

Comma-separated: posts,pages,media,taxonomies,search,seo,bulk,system

RATE_LIMIT_RPS

no

10

Requests per second cap

CACHE_TTL_SECONDS

no

300

In-memory cache TTL

LOG_LEVEL

no

info

debug | info | warn | error

SEO_PROVIDER

no

auto

auto | bridge | yoast | rankmath | null

TIMEOUT_MS

no

30000

Per-request timeout

AUDIT_LOG_PATH

no

~/.local/state/mcp-wordpress/audit.log

Where write ops are logged

Development

git clone https://github.com/iamsamuelfraga/mcp-wordpress.git
cd mcp-wordpress
npm install
npm run build
npm test

Integration tests (Docker)

# 1. Start the Dockerized WordPress
docker compose -f docker-compose.test.yml up -d

# 2. Seed WP and capture an Application Password (printed on stdout)
APP_PASSWORD=$(./tests/integration/wp-seed.sh)

# 3. Run integration tests
WP_URL=http://localhost:8080 \
WP_USER=admin \
WP_APP_PASSWORD="$APP_PASSWORD" \
npm run test:integration

# 4. Tear down
docker compose -f docker-compose.test.yml down -v

Releases

This project uses semantic-release to automate versioning, changelog generation, and publishing. Every push to main runs the release workflow:

  • Inspects commits using Conventional Commits (feat:, fix:, chore:, docs:, refactor:, etc.).

  • Bumps the version accordingly (patch / minor / major).

  • Updates CHANGELOG.md.

  • Publishes to npm as @iamsamuelfraga/mcp-wordpress.

  • Creates a GitHub Release with the companion plugin .zip attached.

To enable npm publishing, the repository owner must add an NPM_TOKEN secret in GitHub repo settings.

License

MIT © 2026 Samuel Fraga

Available Tools

73 tools
wp_batchA

Execute up to 25 WP REST requests in a single round-trip via /wp/v2/batch/v1. Use for performance when applying many independent writes. validation="require-all-validate" (default) rejects the batch if any request fails validation; "normal" runs everything best-effort.

Inputs: requests (required), validation.

wp_blocks_createA

Create a new reusable block. Content should be Gutenberg block markup (e.g., text). Status defaults to publish (reusable blocks are typically immediately available for embedding).

Inputs: title (required), content (required), slug, status.

wp_blocks_deleteA

Delete a reusable block. Default trash. force=true with confirm="DELETE_PERMANENTLY_" hard-deletes (MODE=full). WARNING: posts/pages referencing this block will show an empty block placeholder.

Inputs: id (required), force, confirm.

wp_blocks_getA

Fetch a single reusable block by id with full content (Gutenberg block markup).

Inputs: id (required), context.

wp_blocks_listB

List reusable Gutenberg blocks (post type wp_block). These are user-created reusable block compositions, used to insert the same content across multiple posts/pages.

Inputs: page, order, search, status, +2 more.

wp_blocks_updateA

Partially update a reusable block. NOTE: editing a reusable block updates its content in every post/page that uses it.

Inputs: id (required), slug, title, status, +1 more.

wp_bulk_find_replaceA

Find and replace a literal substring across post content. Requires MODE=full. Dry-run by default (returns count + sample of changes). To apply, set dry_run=false and provide the confirm token returned by the dry-run. Operates on rendered post_content only; does not touch titles, excerpts, or meta.

Inputs: find (required), replace (required), status, confirm, +2 more.

wp_bulk_update_seoA

Apply the same SEO meta to many posts at once. Requires MODE=full. Dry-run by default (returns count + sample). To apply, set dry_run=false with the confirm token from dry-run. Writes via the active SEO provider — fields unsupported by the provider are silently dropped.

Inputs: meta (required), filter (required), confirm, dry_run, +1 more.

wp_comments_createA

Create a comment (or reply via parent). When author is omitted, author_name + author_email are required.

Inputs: post (required), content (required), date, author, +7 more.

wp_comments_deleteA

Delete a comment. Default to trash (recoverable). force=true with confirm="DELETE_PERMANENTLY_" permanently deletes (requires MODE=full).

Inputs: id (required), force, confirm.

wp_comments_getA

Fetch a single comment by id, including author email (edit context).

Inputs: id (required), context.

wp_comments_listA

List comments with filters: post, parent, author, status (approved/hold/spam/trash/any), type, search, ordering. Hold status = pending moderation.

Inputs: page, post, type, order, +6 more.

wp_comments_updateA

Update a comment. Moderation actions: status=approved (publish), hold (pending), spam, trash. Can also edit content and author fields.

Inputs: id (required), status, content, author_url, +2 more.

wp_cpt_createA

Create a new item of any Custom Post Type. Required: post_type, title. Defaults to draft status. Pass meta object to set custom fields (subject to register_post_meta + show_in_rest registration on the WP side).

Inputs: title (required), post_type (required), meta, slug, +3 more.

wp_cpt_deleteA

Delete an item of any CPT. Default to trash. force=true with confirm="DELETE_PERMANENTLY_" for hard delete (requires MODE=full).

Inputs: id (required), post_type (required), force, confirm.

wp_cpt_getA

Fetch a single item of a Custom Post Type by id. post_type must match rest_base from wp_get_post_types.

Inputs: id (required), post_type (required), context.

wp_cpt_listA

List items of any registered Custom Post Type. The post_type parameter must match the rest_base value returned by wp_get_post_types (e.g., "product" for WooCommerce, "event" for The Events Calendar). For built-in posts/pages, prefer wp_posts_list / wp_pages_list.

Inputs: post_type (required), page, order, search, +3 more.

wp_cpt_updateB

Partially update an item of any CPT. Only fields provided are changed.

Inputs: id (required), post_type (required), meta, slug, +4 more.

wp_detect_page_builderA

Detect whether Elementor, Divi, Beaver Builder, or WPBakery (visual page builders) are active. These store content outside of post_content, which limits what the MCP can edit. Requires the mcp-wordpress-bridge companion plugin to enumerate plugins.

Inputs: no named parameters.

wp_get_post_statusesA

List all available post statuses (built-in: publish/draft/pending/private/future and any custom statuses).

Inputs: no named parameters.

wp_get_post_typesA

List all post types registered on this site, including built-in (post, page) and custom (WooCommerce products, ACF CPTs, etc.). Returns rest_base, hierarchy, supported features, taxonomies. Use this before wp_cpt_* tools.

Inputs: no named parameters.

wp_get_site_capabilitiesA

High-level summary of what this WP install supports: list of post types (slugs only), taxonomies (slugs only), REST API namespaces, whether the mcp-wordpress-bridge plugin is installed. Useful as a single "what can I do here?" probe.

Inputs: no named parameters.

wp_get_site_infoA

Read site-level configuration: title, tagline, URL, language, timezone, date/time formats, posts-per-page, sitemap URL, and admin email (if accessible). Combines /wp-json/ root with /wp-json/wp/v2/settings (admin-only). Sitemap URL points to the native /wp-sitemap.xml (WP 5.5+).

Inputs: no named parameters.

wp_get_taxonomiesA

List all taxonomies registered on this site, including custom (e.g., product_cat for WooCommerce). Optional type filter to list only taxonomies associated with a given post type.

Inputs: type.

wp_health_checkA

Verify connectivity, authentication, and capabilities of the configured WordPress site. Returns reachability, REST API namespaces, and whether the MCP Bridge companion plugin is installed.

Inputs: no named parameters.

wp_media_deleteA

Delete a media item. Default sends to trash (recoverable). Pass force=true with confirm="DELETE_PERMANENTLY_" to permanently delete (requires MODE=full). Note: WP's native UI offers no trash recovery for media by default — many sites have ATTACHMENT_DEFAULT_TRASH disabled. Verify your site's behavior before relying on the trash.

Inputs: id (required), force, confirm.

wp_media_getA

Fetch a single media item by id with all metadata: dimensions, file size, thumbnails, alt text, caption, attached post.

Inputs: id (required), context.

wp_media_listA

List media library items with filters. Filter by media_type (image/video/audio/file), exact mime_type (e.g. "image/png"), search text, date range, or parent post. Returns normalized media including source_url and thumbnails.

Inputs: page, after, order, before, +6 more.

wp_media_set_alt_textA

Update accessibility and descriptive metadata of a media item: alt_text (required), caption and description (optional). Useful for bulk SEO improvements on existing media. Empty alt_text is allowed (explicitly clearing).

Inputs: id (required), alt_text (required), caption, description.

wp_media_updateA

Generic partial update of media item fields: title, alt_text, caption, description, attached post, slug, status. Use wp_media_set_alt_text for the focused alt+caption+description tool when that's all you need.

Inputs: id (required), post, slug, title, +4 more.

wp_media_uploadA

Upload a file to the WordPress media library. Provide EITHER url (the server will fetch the URL and forward the bytes) OR data (a base64-encoded string) with filename and mime_type. Optional metadata: title, alt_text, caption, description, post (attach to a post). Max 25 MB.

Inputs: url, data, post, title, +5 more.

wp_pages_createA

Create a new page. Default status="draft" (safe). Supports hierarchy via parent (page id) and ordering via menu_order. Publish/future/private require publish tier.

Inputs: title (required), content (required), date, meta, +8 more.

wp_pages_deleteA

Delete a page. Default sends it to the trash (recoverable). Pass force=true with confirm="DELETE_PERMANENTLY_" to permanently delete (requires MODE=full). Deleting a parent page with children: WP behavior is to orphan children (their parent becomes 0); the MCP does not auto-cascade.

Inputs: id (required), force, confirm.

wp_pages_getA

Fetch a single page by ID with full content. Use context=edit (default) for raw fields, context=view for the public rendered version only.

Inputs: id (required), context.

wp_pages_get_revisionC

Fetch a single revision of a page by id.

Inputs: page_id (required), revision_id (required).

wp_pages_get_revisionsA

List revisions/autosaves of a page.

Inputs: page_id (required).

wp_pages_listA

List pages with filters. Pages support a hierarchy via parent (use parent=N to list direct children of page N, parent=0 for top-level). Default orders by menu_order ascending — the typical navigation order.

Inputs: page, order, author, parent, +4 more.

wp_pages_restore_revisionA

Restore a previous revision of a page (writes revision title/content/excerpt back to the parent page).

Inputs: page_id (required), revision_id (required).

wp_pages_updateA

Partially update an existing page by id. Only provided fields are changed. Status transitions to publish/future/private require the publish tier. Use parent to re-parent the page in the hierarchy.

Inputs: id (required), date, meta, slug, +9 more.

wp_posts_createA

Create a new blog post. Default status is "draft" (safe). Use status="publish" to publish immediately (requires publish tier), or status="future" with date to schedule.

Inputs: title (required), content (required), date, meta, +9 more.

wp_posts_deleteA

Delete a post. Default sends it to the trash (recoverable). Pass force=true with confirm="DELETE_PERMANENTLY_" to permanently delete (requires MODE=full).

Inputs: id (required), force, confirm.

wp_posts_getA

Fetch a single blog post by ID. Returns the normalized post with full content (rendered HTML). Use context=edit (default) to include raw fields when available; context=view for the public-facing rendered version only.

Inputs: id (required), context.

wp_posts_get_revisionA

Fetch a single revision of a post by id. Use wp_posts_get_revisions to list revisions, then this to read a specific one's content for diffing or restoration.

Inputs: post_id (required), revision_id (required).

wp_posts_get_revisionsA

List revisions of a post (autosaves + manual revisions). Returns each revision with id, parent post id, author, dates, and rendered title/content/excerpt. Read-only.

Inputs: post_id (required).

wp_posts_listA

List blog posts with filters: status, search, author, categories, tags, date range, ordering. Returns normalized post summaries (id, title, excerpt, slug, status, dates, author, taxonomies). Use wp_posts_get to fetch full content.

Inputs: page, tags, after, order, +7 more.

wp_posts_publishA

Publish an existing post by id (sets status to "publish"). Shortcut for wp_posts_update with status="publish". Requires publish tier.

Inputs: id (required).

wp_posts_restore_revisionA

Restore a previous revision of a post. Reads the revision content + title + excerpt, then writes them back to the parent post. The previous state of the parent becomes a new revision automatically.

Inputs: post_id (required), revision_id (required).

wp_posts_scheduleA

Schedule a post for future publication by setting status="future" and date. The date must be in the future. Requires publish tier.

Inputs: id (required), date (required).

wp_posts_updateA

Partially update an existing post by id. Only fields provided are changed. Status transitions to publish/future/private require the publish tier.

Inputs: id (required), date, meta, slug, +9 more.

wp_search_postsA

Full-text search across posts, pages, custom post types, and terms via the WP /wp/v2/search endpoint. Returns a lightweight result shape (id, title, url, type, subtype). Filter by type=post (default search target) or type=term (taxonomies). For richer content fetch the hit by id via wp_posts_get / wp_pages_get.

Inputs: query (required), page, type, subtype, +1 more.

wp_seo_analyze_postA

Run SEO/content analysis on a post: readability (Flesch-Kincaid in ES/EN/PT), keyword density, headings hierarchy lint, content length stats. Optionally pass focus_keyword to get presence stats (in title, first paragraph, headings) and density of that exact term.

Inputs: post_id (required), language, focus_keyword.

wp_seo_detect_providerA

Detect which SEO provider is active for this WordPress site (bridge / yoast / rankmath / null) and report its capabilities. Use this before calling wp_seo_set_meta to know what fields will actually be persisted and rendered.

Inputs: no named parameters.

wp_seo_get_metaA

Read the current SEO meta for a post (title, description, OG, Twitter, canonical, robots, JSON-LD, focus_keyword). The meta is read from whichever SEO provider is active — call wp_seo_detect_provider first to know which one.

Inputs: post_id (required).

wp_seo_set_metaA

Write SEO meta for a post via the active provider. Pass any subset of: title, description, og_title, og_description, og_image (URL), og_type, twitter_card, canonical (URL), robots ({noindex,nofollow,noarchive,nosnippet,noimageindex}), json_ld_article (object), focus_keyword. Fields not supported by the active provider are silently ignored — call wp_seo_detect_provider to know which features apply.

Inputs: meta (required), post_id (required).

wp_taxonomies_assign_to_postA

Replace the categories and/or tags of a post. The arrays REPLACE existing taxonomies (use wp_posts_get first if you want to preserve existing terms and add to them).

Inputs: post_id (required), tag_ids, category_ids.

wp_taxonomies_create_categoryA

Create a new blog category. Supports hierarchy via parent (category id). The name is required; slug auto-generated from name if omitted.

Inputs: name (required), slug, parent, description.

wp_taxonomies_create_tagA

Create a new blog tag. Tags are flat (no parent). The name is required; slug auto-generated from name if omitted.

Inputs: name (required), slug, description.

wp_taxonomies_delete_categoryA

Delete a category (WP REST has no trash for terms — always permanent). Required: confirm="DELETE_CATEGORY_". Requires MODE=full. Posts in this category are NOT deleted; they lose the category assignment.

Inputs: id (required), confirm (required).

wp_taxonomies_delete_tagA

Delete a tag (always permanent — no trash). Required: confirm="DELETE_TAG_". Requires MODE=full.

Inputs: id (required), confirm (required).

wp_taxonomies_get_categoryB

Fetch a single category by id.

Inputs: id (required).

wp_taxonomies_get_tagA

Fetch a single tag by id.

Inputs: id (required).

wp_taxonomies_list_categoriesA

List blog categories with filters: search, parent (for hierarchical children), hide_empty (categories with no posts), ordering. Returns terms with post counts.

Inputs: page, order, parent, search, +3 more.

wp_taxonomies_list_tagsA

List blog tags. Tags are flat (no hierarchy). Returns terms with post counts. Filter by search text or hide tags with zero posts.

Inputs: page, order, search, orderby, +2 more.

wp_taxonomies_update_categoryA

Update a category. Can change name, slug, description, or re-parent.

Inputs: id (required), name, slug, parent, +1 more.

wp_taxonomies_update_tagA

Update a tag. Can change name, slug, or description.

Inputs: id (required), name, slug, description.

wp_update_site_settingsA

Update site-wide settings (title, tagline, URL, language, timezone, default category, posts_per_page, etc.). Requires manage_options capability. Treats this as a publish-tier change because it affects every visitor to the site.

Inputs: url, email, title, language, +9 more.

wp_users_createA

Create a new WordPress user. Required: username, email, password. Optional: name, first_name, last_name, url, description, roles. Roles default to subscriber.

Inputs: email (required), password (required), username (required), url, +8 more.

wp_users_deleteA

Delete a user (WP REST has no trash for users — always permanent). Required: id, reassign (user id to inherit deleted user's content), confirm="DELETE_USER_". Requires MODE=full.

Inputs: id (required), confirm (required), reassign (required).

wp_users_getA

Fetch a single user by id. Edit context returns email, locale, capabilities (requires manage_options).

Inputs: id (required), context.

wp_users_get_currentA

Return the user associated with the Application Password used to authenticate. Useful for "whoami" checks and discovering current role/capabilities.

Inputs: no named parameters.

wp_users_listA

List users. Filter by search text, roles (comma-separated array), who=authors (only users who have published posts). Context=edit returns email + locale + capabilities (requires manage_options).

Inputs: who, page, order, roles, +4 more.

wp_users_updateA

Partially update a user by id. Can change profile fields, password, or roles. Self-update permitted; updating other users requires elevated capabilities.

Inputs: id (required), url, name, slug, +8 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 73 tools

    Disambiguation4/5

    Most tools have clearly distinct resource+action pairs, and descriptions explicitly disambiguate overlapping areas (e.g., wp_media_update vs wp_media_set_alt_text, wp_cpt_* vs wp_posts_*). A few near-duplicates like wp_posts_publish/schedule vs wp_posts_update exist, but they are shortcuts with clear purposes.

    Naming Consistency3/5

    The dominant pattern is wp_<resource>_<action> (e.g., wp_pages_get, wp_taxonomies_create_tag), which is consistent and readable. However, there are notable exceptions: a cluster of wp_get_* tools (wp_get_site_info, wp_get_post_types, wp_get_taxonomies), plus standalone wp_health_check, wp_batch, wp_search_posts, and wp_detect_page_builder, mixing conventions.

    Tool Count2/5

    At 73 tools, the server is extremely large and likely overwhelming for agents to navigate efficiently. While WordPress is a broad domain, many tools are thin wrappers or convenience shortcuts (e.g., wp_posts_publish, wp_media_set_alt_text) that could be consolidated without losing functionality.

    Completeness5/5

    The tool set provides comprehensive CRUD coverage for posts, pages, media, comments, users, taxonomies, CPTs, and blocks, plus SEO, site settings, batch operations, search, and health checks. It covers the full lifecycle of WordPress content management with no obvious dead ends.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers