Give AI assistants a safe, authenticated way into WordPress.
Self-hosted OAuth and API keys, per-tool capability checks, audit logging, and 111 always-on tools plus opt-in integrations.
Mordenhost MCP is a self-hosted Model Context Protocol server built into WordPress by Mordenhost. Claude, ChatGPT, Gemini, AI coding assistants, and any other MCP-compatible agent operate your site through typed, permission-checked tools — no screen scraping, no browser automation, no copy-paste.
Where a bare MCP bridge stops at exposing functions, Mordenhost MCP is built for sites that are actually in production. Every request authenticates through OAuth 2.0 or an API key, hits a per-IP rate limit, and passes a WordPress capability check inside the tool handler before it touches anything. Interactions are logged for audit — tool names and argument keys, never the argument values. Nothing leaves your database: no license server, no telemetry, no callback to Mordenhost or anyone else.
A standard installation exposes 111 always-on tools for WordPress core, Gutenberg blocks, and outbound webhooks. Compatible plugins can add specialized tools once an administrator enables their integration, while eleven high-impact plugin and theme lifecycle tools remain disabled until an administrator explicitly enables them. The live count depends on the active integrations and permissions and is shown in the Documentation panel, which reads the registry directly; every tool is reachable through the native MCP endpoint, the classic REST API, and the WordPress Abilities API on WordPress 6.9 or later.
- How it works
- Requirements
- Installation
- Tool inventory
- Plugin integrations
- Supported clients and platforms
- Security and privacy
- Frequently asked questions
- License
flowchart LR
C["MCP clients"] --> M["Streamable HTTP MCP endpoint"]
O["OAuth 2.0"] --> M
K["Mordenhost MCP API key"] --> M
R["REST clients"] --> API["Classic REST API"]
A["WordPress 6.9+ consumers"] --> AB["Abilities API"]
M --> G["Authentication, rate limiting, and origin checks"]
G --> T["Shared tool registry and handlers"]
API --> T
AB --> T
T --> P["WordPress capability checks"]
P --> W["WordPress core and Gutenberg APIs"]
P --> I["Detected plugin integrations"]
All three public tool surfaces route into the same registry and handlers, so capability checks and tool behavior remain consistent. The primary endpoint is:
https://yoursite.com/wp-json/mordenhost-mcp/v1/mcp
OAuth discovery and authorization endpoints live at the domain root.
MCP tools can read, create, update, and delete WordPress data. Mordenhost MCP protects that access with:
- OAuth 2.0 authorization code flow with PKCE and refresh-token rotation.
- Static API-key authentication for clients that do not support OAuth.
- Timing-safe credential comparison and authenticated session initialization.
- Origin validation and per-IP rate limiting of 60 requests per minute.
- WordPress capability checks inside every tool handler.
- Audit logging that records tool names and argument keys, never argument values.
- Read-after-write verification for mutation tools.
- Dry-run, confirmation, guard, and undo mechanisms on supported high-impact operations.
Cache-Control: no-storeacross the Mordenhost MCP namespace to prevent authenticated responses from being reused by URL-keyed edge caches.
| Area | What Mordenhost MCP provides |
|---|---|
| Authentication | OAuth 2.0 or a self-hosted Mordenhost MCP API key |
| Protocol | MCP 2025-11-25 over Streamable HTTP and JSON-RPC 2.0 |
| Tool count | 111 always registered; 11 opt-in lifecycle tools; plus opt-in integration tools (live count shown in the Documentation panel) |
| WordPress support | WordPress 5.8+; Abilities API integration on WordPress 6.9+ |
| Runtime | PHP 7.4+; PHP 8.0+ recommended |
| Data ownership | Credentials, tokens, sessions, and logs stay in your WordPress database |
| Vendor coupling | None—no license server, telemetry, or Mordenhost MCP cloud service |
- PHP 7.4 or later. PHP 8.0+ is recommended — it is what the plugin is developed and tested against, and PHP 7.4 reached end of life in November 2022, so it no longer receives security fixes from the PHP project.
- WordPress 5.8 or later. Tested up to WordPress 7.0.
- MySQL 5.6+ or MariaDB 10.1+ — activation creates five tables.
- HTTPS, for any client using the OAuth connector flow. The OAuth 2.0 specification requires it, and Claude Desktop's native connector will not complete a handshake over plain HTTP. Static API-key auth works without it but sends the key in a header, so HTTPS is strongly recommended there too.
- Pretty permalinks must be enabled (Settings → Permalinks, anything other than "Plain"). The OAuth endpoints are served from domain-root rewrite rules, which do not exist under the plain permalink structure.
- WordPress 6.9 or later for the Abilities API surface. This is optional — the MCP endpoint and the REST API work on 5.8+ regardless.
Mordenhost MCP is fully featured in its free, GPL-licensed release. There is no Pro version — all tools ship in the wp.org plugin, and updates go through the standard WordPress plugin updater.
Your credentials stay on your server. Mordenhost MCP runs entirely inside WordPress: API keys, OAuth tokens, and session state all live in your own database. Mordenhost MCP has no license check, no telemetry, and no traffic beacon. It contacts a third-party service only when an administrator turns on a feature that needs one (stock photos, SEO and analytics data, AI image generation), and each is listed under External services. If you prefer to keep AI inference local too, any MCP-capable client driving a local model (Ollama, LM Studio) can connect.
Every installation registers 111 always-on tools: 87 WordPress core tools, 21 Gutenberg block tools, and 3 outbound-webhook tools (none are gated on a third-party plugin). Opt-in integrations add more tools once an administrator enables them (WooCommerce alone adds 29), and eleven plugin/theme lifecycle tools appear only when an administrator enables them. Exact live counts are shown in the Documentation panel, which reads the registry directly.
WordPress Core (87 tools):
- Posts - create, read, update, delete, search, count (any registered public post type, featured images supported, sticky flag on posts)
- Pages - full CRUD with parent page support; the update tools for posts and pages can change the slug, and report whether WordPress redirects the old URL (it does for published posts, not for pages)
- Post Types - discover all registered public post types on the site
- Post Revisions - list revision history and roll a post back to any prior version
- Media - browse, upload from URL or base64, update alt text/caption/title/description, set as featured image, delete
- Comments - create, read, delete; full moderation suite (list pending, approve, mark spam, trash)
- Users - display names and roles (emails and usernames are not exposed)
- Categories & Tags & Custom Taxonomies - create, update (rename/re-slug/edit/move), delete, assign, count, discover all registered taxonomies
- Term Meta - read, update, delete raw
wp_termmetavalues. For SEO fields on a term, use the SEO Meta tools below instead: Yoast keeps taxonomy SEO in an option and All in One SEO in its own table, so neither is reachable through term meta - Menus - list menus, list menu items, create / update / delete / reorder menu items
- Post Meta - read, update, delete custom fields (works with ACF, MetaBox, JetEngine, Pods, CPT UI)
- SEO Meta - read and write title/description/focus keyword/noindex/canonical/OG/Twitter fields on posts and terms, across eight SEO plugins (Yoast SEO, Rank Math, All in One SEO, SEOPress, SiteSEO, SureRank, Slim SEO, The SEO Framework). Each field is routed to wherever the detected plugin actually stores it; a field that plugin does not store is refused by name rather than written to a plausible-looking key that would save cleanly and change nothing on the page
- GEO (AI discovery) -
wp_generate_llms_txt,wp_get_llms_txtandwp_update_llms_txtbuild, read and edit an llms.txt that WordPress serves at/llms.txtfrom the database (no file is written to the web root; nothing is taken fromadmin_email, so an identity or contact block is a section you write). While a staticllms.txt, Yoast SEO's llms.txt, Rank Math's LLMS Txt module, All in One SEO's llms.txt or the Website LLMs.txt plugin serves that URL, the copy here is not served and turning it on is refused.wp_get_schema,wp_upsert_schemaandwp_validate_schemastore per-post JSON-LD (validated for structure,@context/@typeand the required properties of common types before it is saved), join it to Yoast SEO's or Rank Math's schema graph when one of them is active instead of printing a duplicate, and check what a page renders. Writes are recorded in change history - Site Info - site name, description, WordPress version, timezone
- Site Status - full site health snapshot (WordPress version, PHP version, active theme, active plugins, cron activity) for AI-driven pre-write validation
- Error Log - read recent PHP error log entries so AI agents can diagnose silent failures without shell access
- Cron Schedule - list scheduled WP cron events with next-run timestamps and hook names
- Maintenance - regenerate rewrite rules (soft flush;
.htaccessis never written), delete expired transients, empty the object cache, and report table sizes, autoloaded options and expired transients (wp_flush_rewrite_rules,wp_delete_expired_transients,wp_flush_object_cache,wp_get_db_size). Each needs manage_options; emptying a multisite network's object cache needs manage_network_options - Connection Health - MCP session diagnostic returning route, auth method, session ID, and Mordenhost MCP version details for any authenticated caller
- Plugins & Themes - list installed plugins (with the plugin file path the lifecycle tools take) and themes (with their stylesheet and parent), with active status
- Theme Appearance - get active theme, read/write theme mods (gated by admin toggle + allowlist), read/write Custom CSS
- Render Context - list the templates a post can be rendered with (resolved live, so it covers the active theme's page templates, a block theme's custom templates, and Elementor's Canvas / Full Width / Theme options) and set which one renders a given post. A value outside the resolved list is refused by name rather than stored, because WordPress would accept any string and silently fall back to the default at render time
- Search - full-text content search across post types
- Permalink Structure - read and update permalink settings: the post structure and the category and tag bases (gated by admin toggle)
- Options - read allowlisted core options, read full plugin settings by slug (sensitive keys redacted), and write to allowlisted options when an admin enables it
Disabled by default. Turn on the "Plugin and theme management" switch under Mordenhost MCP → Access to expose these; while the toggle is off they are not listed to MCP clients at all.
These tools change the code running on your site, not just its content, so they are gated more tightly than anything else in the plugin:
- Every write requires the matching WordPress capability, re-checked inside the handler
- Every write requires a two-part confirmation:
confirm=trueANDconfirm_slugechoing the exact target. A call without confirmation returns a preview of what would change, so the first call is always a dry run wp_install_pluginandwp_install_themeaccept WordPress.org slugs only — package URLs are rejected rather than downloaded, and the preview shows name, author, version, and active-install count so a typo-squat is visible before you confirm. A child theme also installs its missing parent from WordPress.org (core's upgrader does this), and the preview says so- Mordenhost MCP cannot deactivate or delete itself; the
mordenhost_mcp_protected_pluginsfilter protects others - Deleting a plugin requires deactivating it first — deletion is irreversible, so deactivation is the checkpoint
- Sites whose filesystem needs FTP/SSH credentials are refused rather than prompted; credentials must never travel through MCP arguments
- Every operation returns the state read back afterwards, so an upgrader that silently no-ops is visible rather than reported as success
Plugins: list pending updates, activate, deactivate, update, install (wp.org), delete. Themes: list status with pending updates, install (wp.org, optionally activating it), activate (switch), update, delete.
Mordenhost MCP detects compatible plugins and can expose specialized MCP tools for them. Each integration is off by default and requires two things before its tools appear: the host plugin must be active, and an administrator must enable that integration under Mordenhost MCP → Access → Plugins. This opt-in is a deliberate safety gate — activating a plugin never silently widens the agent's reach until you turn the integration on. The toggle lives in the denylisted mordenhost_mcp_settings option, so it is set from the admin screen, not through MCP itself.
To check from a client: for an administrator whose connection may read the plugin list, mordenhost_mcp_connection_health returns an integrations block listing which integrations are active, which supported plugins are detected but not enabled (with the tool prefixes they would add), and the admin URL that enables them. Calling a tool of a disabled integration returns an error that names the integration and that screen.
The live integration catalogue is pinned by tests/integration-toggles-test.php (87 integrations at the time of writing); the per-integration tool counts below come from each integration's get_tools(). The maximum integration tool count depends on which plugins are installed and enabled and whether Elementor Pro modules are active — a ceiling, not a default. The live count is whatever the detected and enabled integrations actually contribute, and is shown directly in the Documentation panel.
WooCommerce Integration (29 tools): When WooCommerce is active, AI agents can manage your store end-to-end:
- Browse and search products by category, status, or type
- Create and update simple and variable products with prices, SKUs, stock levels
- Manage variable products — list, get, create, update, delete, and batch-update product variations
- Manage global attributes (
pa_*taxonomies) — list registered attributes, list attribute terms, register new attributes, assign attributes to a product as variation axes - Manage coupons — list, search by code, get, create, update, delete (trash or permanent), and bulk-purge trash; supports all standard WC coupon fields (discount type, expiry, usage limits, product/category restrictions, email allowlists)
- View orders, order details, and update order status
- List customers with order count and total spent
- Get store statistics — revenue, order count, average order value by period
Elementor Integration (21 tools, up to 31 with Elementor Pro): When Elementor (free or Pro) is active, AI agents can clone and customize existing Elementor pages without trying to generate page-builder JSON from scratch:
- Clone an existing Elementor page with a new title and fresh element IDs (so the duplicate opens in the editor without ID collisions)
- Bulk-replace text across heading, text-editor, button, image-box, icon-box, icon-list, testimonial, tabs, accordion, toggle, star-rating, call-to-action, and flip-box widgets
- Swap image URLs across image, image-box, background_image, and gallery widget settings
- Get a compact outline of any page (section/container hierarchy, widget types, text snippets) so Claude can reason over a full page in a few KB instead of the raw JSON
- Read full settings for a single widget/container/section/column by ID (for precise agent editing without loading the entire page tree)
- Add a widget or container to an existing page, either from curated parameters for the common widget types or from a full settings object
- Change one element's settings in place, addressed by element ID. Settings are merged by default, not replaced: an Elementor settings object holds content next to styling, so a caller fixing a heading typo does not discard the widget's colours and typography. A wholesale replace is available but has to be asked for
- Delete one element and its descendants, addressed by element ID. The response reports how many elements went, and a dry run reports it before anything is removed
- Move one existing element to a new location (before/after a reference element, or as its first/last child) within the same page, keeping the element's own settings and children. Supports a dry run
- Resolve a Loop Grid / Loop Carousel widget to the separate loop-item template it renders: returns the loop template's post ID and element outline, which you then edit with the ordinary Elementor tools by that post ID
- List local templates and import a template from a JSON payload, regenerating element IDs so the imported elements are addressable
- Read and update the active kit (Site Settings): global colors and typography, theme-style defaults, site identity, layout, background, lightbox, page transitions, and custom CSS
- Discover the live widget registry: list every widget type currently registered (including third-party addon packs) and read any widget's control schema, so installed addons become usable through the existing Elementor tools without a per-vendor adapter
- With Elementor Pro: manage Custom Fonts and Custom Icon sets (list, get, create/update/delete, regenerating the derived @font-face so the font actually renders), read site-wide Custom Code (list and get), write it through Elementor's own Custom Code feature when the "Site-wide code" switch is on (create, update, delete; off by default,
manage_optionsplusunfiltered_html, two-part confirmation, code stored byte for byte, undo on every write), and set Theme Builder template display conditions through Elementor's own save path so the template actually renders at its location - Both addressed writes take an
expected_widget_typeguard and emit an undo token. Element IDs are per-document and shift when a page is rebuilt, so a stale ID would otherwise edit or delete the wrong part of the page - Atomic widgets (Elementor 4.0+ Editor V4 elements) pass through opaque — we never decode atomic schemas because Elementor itself may shift them. Editing one is refused by name for that reason; deleting one is allowed, because removing a whole element needs only its boundaries, not its schema. Widget-level creation from scratch remains out of scope; the design commitment is to work from an existing-known-good source.
Divi Integration (5 tools):
- Read a compact positional outline from legacy Divi 4
et_pb_*shortcodes or native Divi 5divi/*blocks without rendering the page or executing shortcodes - Read one module or block by a dot-separated zero-based path returned by the outline
- Replace, insert, or delete one whole addressed node. Divi 4 writes accept raw balanced shortcode subtrees and preserve untouched bytes; Divi 5 writes accept whole
divi/*blocks and pass the Gutenberg round-trip check - All writes require
expected_type, object-leveledit_post, supportdry_run, emit undo tokens, re-read stored content, and invalidate Divi's derived resources through the source-verifiedET_Core_PageResourcecontract when available - Divi 4 attributes are never reconstructed or merged; Divi 5 attributes remain whole-block/verbatim. Mixed legacy regions remain opaque and descendants beneath them are not addressable
- Theme Builder management, Theme Options, presets, library layouts, rendering, migration, and live Divi verification remain separate follow-up work
Advanced Custom Fields Integration (4 tools): When ACF (free or Pro) is active, AI agents can read and write ACF fields with the field-type-aware formatting the ACF UI uses — instead of the raw serialized values WordPress meta returns:
- Read a single ACF field, formatted per its Return Format setting (hydrated post objects, parsed repeater rows, image arrays, etc.)
- Read every ACF field on a post in one call, with name/label/type/value bundled — the most efficient way for an AI to discover what fields exist and read them all
- Update an ACF field with type-aware value handling (scalar for text/number, array for repeaters and flex content, post ID for relationships, attachment ID for images)
- Enumerate ACF field groups on the site, optionally filtered by post type — for AI-driven discovery of available custom fields before reading/writing
Meta Box Integration (4 tools): When Meta Box is active, AI agents can read and write custom fields the same way the Meta Box UI does — rather than the raw serialized values WordPress meta returns:
- Read a single custom field with the Meta Box formatting applied
- Read every custom field on a post in one call, with name/label/type/value bundled
- Update a custom field with type-aware value handling
- Enumerate Meta Box field groups on the site for discovery before reading or writing
Cache Integration (8 providers, 19 tools): When a supported cache plugin is active, AI agents can purge cached content after a write so visitors do not see stale pages:
- LiteSpeed Cache (2 tools) — purge all or a specific URL. Purge is driven through LiteSpeed's public
litespeed_purge_all/litespeed_purge_urlaction hooks, not its internal classes, so the integration survives the plugin's internal refactors. No cache-stats tool is exposed because LiteSpeed has no stable public accessor for a file/size count across its disk, object-cache, and CDN layers - WP Rocket (3 tools) — purge all, purge a URL, or purge minified/optimized assets
- W3 Total Cache (4 tools) — purge all, purge a URL, purge minified assets, and read cache status
- Redis Object Cache (2 tools) — read cache status and flush the object cache
- Autoptimize (2 tools) — purge all and read cache stats
- WP-Optimize (2 tools) — purge the page cache and read cache status
- WP Super Cache (2 tools) — purge this site's page cache or a single URL, through the plugin's own
wp_cache_clean_cache()/wpsc_delete_post_cache() - WP Fastest Cache (2 tools) — purge the page cache or a single URL with its related pages, through the plugin's
wpfc_clear_all_cache()/wpfc_clear_post_cache_by_id()clearing-cache hooks
Purges drive each plugin's own public API, never direct file or option deletion, so the integration survives the plugin's internal refactors.
Redirection Integration (4 tools): When John Godley's Redirection plugin is active, AI agents can manage 301 / 302 / 307 redirects:
- List redirects with group + URL-substring filters
- Create new redirects (source, target, status code, regex, group, title)
- Update existing redirects (target, status, enabled state)
- List redirect groups
Rank Math Integration (8 tools):
When Rank Math is active, AI agents can read Rank Math's own reports, which the generic SEO tools do not cover. Reading and writing a post's SEO fields stays with wp_get_seo_meta / wp_update_seo_meta:
- List posts with the SEO score Rank Math stored for them and its band (great above 80, good 51-80, bad 50 or below), filtered the way Rank Math's post list filters them: by band, no focus keyword, never scored, or noindexed
- Read the inputs Rank Math's on-page tests check for one post: the tests that apply, SEO title and description, permalink, focus keywords, plain-text body, headings, image alt texts and links. Rank Math runs the tests in the browser editor, so this returns the material, not a new score
- Read the schema templates Rank Math stores for a post, plus its default type and FAQ/HowTo block schema (
seo_get_headstill returns the rendered JSON-LD) - Read a post's links from Rank Math's link counter, and the site-wide linking report: orphan posts and posts with no internal or external links, with Rank Math PRO's link audit when PRO provides one
- Read the result of the last SEO Analyzer run with each test's status, fix guidance and fix hint, and apply Rank Math's automatic fix for one test behind a two-part confirmation. Option changes need "Allow AI to write WordPress options"; Rank Math's own option rows must also be in the writable-options allowlist
- Read top search queries (clicks, impressions, CTR, position) from Rank Math's own Search Console connection
- Not included: starting a fresh SEO Analyzer run and the AI Visibility features, because both are served by rankmath.com rather than stored on the site
Analytics Integration (3 tools, read-only): When Site Kit by Google, Jetpack Stats, MonsterInsights, ExactMetrics, Burst Statistics, Matomo, Independent Analytics, or WP Statistics is active, AI agents can read normalized analytics status and reports through the installed plugin — never by owning vendor credentials or calling a vendor API directly:
- Read provider status: which providers are active, connection/configuration state, and non-secret identifiers (GA4 property, measurement ID, active modules). Credentials, OAuth tokens, and API keys are never returned
- Read a normalized traffic summary over a bounded date range through the plugin's own supported local report path
- Read top content by views through the same plugin-mediated path
- When a provider cannot expose reports without its authenticated flow (Site Kit's REST OAuth, for example), the tool returns an explicit
report_unavailableresult rather than guessing private storage or calling a vendor API
Forms & Lead Capture Integration (7 tools): When Gravity Forms, Fluent Forms, Contact Form 7, WPForms, Ninja Forms, Formidable Forms, Forminator, SureForms, Everest Forms, or Elementor Pro Forms is active, AI agents can work with forms and submissions through one normalized surface — the same tool shape regardless of which form plugin is installed (read-only where a provider stores no entries):
- List forms and read a form's normalized field schema (id, label, type, required)
- List submissions, paginated, returning privacy-safe summary rows only (id, date, status, read state), never field values, which can hold personal data
- Read one submission in full through an addressed call; sensitive metadata (IP, user agent, browser/device, payment/transaction fields) is redacted by default
- Read aggregate submission counts by status without returning any submission bodies
- Guarded writes: change a submission's status, or move a submission to trash (never a permanent delete). The trash tool takes a two-part confirmation (
confirm=trueplusconfirm_entry_id), and both writes go through the provider's own API and emit an undo token - An unsupported status for a given provider is refused by name rather than written to a plausible-looking value (SureForms keeps read / unread / trash only, so it has no spam state; Everest Forms keeps publish / trash / spam plus a separate viewed flag). Undo puts back the exact prior status, not the plugin's own restore default
Email / SMTP Integration (1 tool, read-only): When WP Mail SMTP, Easy WP SMTP, FluentSMTP, Post SMTP, GoSMTP, or SureMail is active, AI agents can read the site's outgoing-email configuration status:
- Read the active mailer slug, whether setup is complete, the non-secret From name and From email, and the last send-error summary when the plugin exposes one
- Credentials, API keys, and passwords are never returned. FluentSMTP, GoSMTP, and SureMail are read from their raw options (SureMail's secrets are encrypted at rest) so a plugin's own decrypting helper is never called
Security Integration (8 total, 26 tools, read-only): When a supported security plugin is active, AI agents can read security status — no secret is ever read or returned:
- Wordfence (5 tools) — security status, scan results, blocked IPs, and related diagnostics
- WP Defender (5 tools) — scan results, scan status, blocked IPs, and related diagnostics
- Solid Security (3 tools) — security status, findings, and lockouts
- Sucuri Security (1 tool) — security status
- Really Simple Security (2 tools) — security status and vulnerability feed
- All-In-One Security (AIOS) (5 tools) — security status, login lockouts, permanent IP blocks, audit log, and firewall settings summary
- Limit Login Attempts Reloaded (3 tools) — lockout status and policy, current lockouts, and lockout log with daily history
- Akismet (2 tools) — spam status and comment check
Backup Integration (5 total, 12 tools, read-only): When a supported backup plugin is active, AI agents can read backup status — package hashes, local storage paths, and log paths are never returned:
- UpdraftPlus (4 tools) — list backup sets, last backup summary, backup status, and start a backup
- BackWPup (2 tools) — list jobs and read a job
- Duplicator (2 tools) — list packages and read status
- WPvivid (2 tools) — list backups and read status
- All-in-One WP Migration (2 tools) — list backups and read status
CRM Integration (3 total, 16 tools): When a supported CRM plugin is active, AI agents can read marketing and contact data:
- FluentCRM (10 tools) — status, campaigns, list and tag catalogues, contacts (list with status/tag/list/search filters, get one with its tags and lists), and add or remove a contact's tags and lists through FluentCRM's own methods (which can start its automations)
- MailPoet (3 tools) — status and campaign list
- Groundhogg (3 tools) — status and campaign list
Membership Integration (5 total, 12 tools, read-only): When a supported membership plugin is active, AI agents can read membership structure:
- Paid Memberships Pro (2 tools) — status and membership levels
- Simple Membership (2 tools) — status and membership levels
- ProfilePress (2 tools) — status and subscription plans
- Restrict Content (2 tools) — status and membership levels
- Ultimate Member (4 tools) — status, roles, members by role and status, and forms
Donations Integration (2 total, 4 tools, read-only): When a supported donation plugin is active, AI agents can read giving data:
- GiveWP (2 tools) — status and campaigns
- Charitable (2 tools) — status and campaigns
Booking Integration (4 total, 8 tools, read-only): When a supported booking plugin is active, AI agents can read service and availability data:
- Amelia (2 tools) — status and service catalog
- LatePoint (2 tools) — status and service catalog
- Bookly (2 tools) — status and service catalog
- BookingPress (2 tools) — status and service catalog
LMS Integration (5 total, 21 tools): When a supported LMS plugin is active, AI agents can read course structure and the course catalogue, and with Tutor LMS manage enrolments:
- LearnPress (4 tools) — status, course structure, course catalogue, categories
- Sensei LMS (3 tools) — status, course structure, course catalogue
- Masteriyo LMS (3 tools) — status, course structure, course catalogue
- Tutor LMS (7 tools) — status, course structure, course catalogue, a course's enrolments, one learner's progress, and enroll (free courses only) / unenroll a learner
- LifterLMS (4 tools) — status, course structure, course catalogue, memberships
Events Integration (4 total, 12 tools, read-only): When a supported events plugin is active, AI agents can read events with hydrated detail:
- The Events Calendar (2 tools) — list events and read one event with venue and organizer detail
- Sugar Calendar (2 tools) — list events and read one event
- Events Manager (2 tools) — list events and read one event
- Modern Events Calendar (6 tools) — list events, read one event with its upcoming occurrences, list scheduled occurrences, and list locations, organizers, and categories
Multilingual Integration (3 total, 7 tools, read-only): When a supported multilingual plugin is active, AI agents can list languages and resolve a post's or term's language and its translation siblings:
- TranslatePress (1 tool) — read the configured language set and URL slugs
- Polylang (3 tools) — list languages, resolve a post's or term's language, and list its translations
- WPML (3 tools) — list languages, resolve a post's or term's language, and list its translations
No secret is read; WPML element types are validated before any filter fires.
E-commerce Integration (2 total, 4 tools, read-only): When a supported e-commerce plugin is active, AI agents can read storefront data:
- Easy Digital Downloads (2 tools) — status and download catalog
- FluentCart (2 tools) — status and product catalog
Custom Fields / Content Models (3 total, 6 tools, read-only): When a supported content-modeling plugin is active, AI agents can discover and read custom content structures:
- Pods (2 tools) — list content models and read one model
- Custom Post Type UI (2 tools) — list custom post types and taxonomies
- MB Custom Post Types (2 tools) — list custom post types and taxonomies
Code Snippets Integration (2 tools, read-only):
When the Code Snippets plugin or WPCode is active, AI agents can read the snippets it manages (a site running both names the provider):
snippet_listandsnippet_getrequiremanage_options- There is no tool that creates, edits, activates or deletes a snippet, so an agent can never insert executable PHP, JS or CSS through this integration; a human authors and activates snippets in the plugin's own admin
AI Media Integration (3 tools, off by default): When the "AI media generation" switch (Mordenhost MCP → Access) is on and WordPress 7.0 or later has an AI provider connected under Settings > Connectors, AI agents can generate images, alt text and captions through the WordPress AI Client:
ai_generate_image,ai_generate_alt_textandai_generate_captionask WordPress to run the request on the connected provider; Mordenhost MCP stores no provider key and never calls a provider itselfai_generate_captionsuggests a caption by default. It saves one only withwrite: trueandedit_poston the attachment, and replaces an existing caption only withoverwrite: true. When the attachment has stored attribution, a credit line ("Photo by ... on Unsplash") is built from it, not by the AI, and appended unlessappend_credit: false- Disabled behind the toggle because every call spends provider credits, and nothing is exposed until you turn it on
Instant Images Integration (1 tool, read-only): When Instant Images is active, AI agents can search Unsplash and Pexels for stock photos using the API keys the plugin already stores:
stock_search_imagesreturns candidates with license and required attribution, ready to hand towp_upload_media_from_url. No new credential store
Image Optimizer Integration (4 total, 18 tools): When a supported image optimizer is active, AI agents can read optimization status, settings and the pending queue, and with WP Smush or EWWW optimize or restore one image:
- Imagify (3 tools) — optimization status, settings, unoptimized queue
- EWWW Image Optimizer (6 tools) — optimization status (bytes saved, counts, average compression), settings, pending queue, one image's per-size state, and per-image optimize (preview first, then
confirm=true; queued when EWWW's background mode is on) and restore from EWWW's local or cloud backup - WP Smush (6 tools) — optimization status, settings, the Bulk Smush queue with counts, one image's state, and per-image optimize (preview first, then
confirm=true) and restore from Smush's backup - ShortPixel (3 tools) — optimization status, settings, pending queue
Where a vendor exposes no stable public accessor for a figure, that figure is reported null rather than guessed.
WordPress 6.9 shipped the Abilities API in November 2025 — a primitive that lets plugins register typed capabilities AI agents can call. Core ships three default abilities (site info, user info, environment info) and the wordpress/mcp-adapter package bridges abilities to the MCP protocol.
Every Mordenhost MCP tool also registers as a WordPress ability on WordPress 6.9 or later. You get three ways to reach the same tools: (1) Mordenhost MCP's native /wp-json/mordenhost-mcp/v1/mcp endpoint (unchanged and always available), (2) the WordPress MCP Adapter if you install it — Mordenhost MCP registers a named mordenhost-mcp-adapter alongside adapter's default server, or (3) WordPress core REST directly at /wp-json/wp-abilities/v1/abilities/{name}/run. Same handlers, three transports, one set of per-tool capability gates. The abilities layer can be disabled with a single option flag if needed.
Mordenhost MCP is a complete, production-ready MCP server that predates the official adapter. It runs the full Streamable HTTP transport, enforces API key authentication on every request, ships OAuth 2.0 for Claude Desktop's native connector flow, rate-limits per-IP, redacts sensitive data, and logs every interaction. Out of the box it registers 111 always-on tools for WordPress core, Gutenberg blocks, and outbound webhooks. Opt-in integrations add more tools once you enable them per product, and eleven lifecycle tools are available only after explicit administrator opt-in.
- Claude — Claude Desktop and other Claude clients with MCP support
- OpenAI / ChatGPT — ChatGPT and OpenAI clients that support remote MCP servers
- Google Gemini — Gemini clients and development tools with MCP support
- Groq — MCP-capable applications using Groq-hosted models
- Azure OpenAI — MCP-capable applications using Azure-hosted models
- AWS Bedrock — MCP-capable applications using Bedrock-hosted models
- Ollama / LM Studio - Local self-hosted models (no external data transmission)
- Custom MCP Servers - Connect to any MCP-compatible endpoint
Mordenhost MCP works with any MCP-compliant client, IDE, or AI agent framework — no per-tool configuration required. Each entry below describes the specific integration path Mordenhost MCP provides for that target, so customers can answer "will this work with the tool I already use?":
- Desktop AI apps - Claude Desktop (native MCP connector via OAuth 2.0), ChatGPT Desktop, Gemini Advanced.
- AI code IDEs - Claude Code, VS Code (with MCP extension), Cursor, Windsurf, Continue, Cline, Zed, JetBrains AI Assistant.
- API testing tools - Postman, Bruno, Insomnia (use the API key in the
MMCP-Keyheader). - Custom field plugins - Advanced Custom Fields (ACF) has dedicated
acf_*tools that return values formatted per each field's Return Format setting (the same way the ACF UI shows them). MetaBox, JetEngine, Pods, CPT UI, and Custom Field Suite are supported through thewp_get_post_meta/wp_update_post_metatools, so AI agents can populate custom fields just like a human editor. - Page builders - Elementor has dedicated clone-and-customize tools (plus Pro fonts/icons/code when Elementor Pro is active). Divi has structural read tools plus guarded whole-node replace/insert/delete for Divi 4 shortcodes and Divi 5 blocks. Beaver Builder, Bricks, Gutenberg, Spectra, and Stackable remain reachable through standard post or block content, but builder-specific storage is opaque unless covered by a dedicated integration.
- Multilingual - TranslatePress, Polylang, and WPML have dedicated read-only language tools (list languages, resolve a post's or term's language, list translation siblings). Translated posts also appear as separate posts and can be read or written via the standard post tools.
- AI agent frameworks - LangChain, AutoGen, CrewAI, LlamaIndex, Haystack - any MCP-compatible framework can call Mordenhost MCP's tools.
- AI app platforms - Anthropic Console, OpenAI Playground, Google AI Studio, Vertex AI, Azure AI Studio, Amazon Bedrock Console.
Mordenhost MCP implements the MCP 2025-11-25 Streamable HTTP transport specification:
- Single
/mcpendpoint for all JSON-RPC communication - POST for client messages, GET for server-sent events, DELETE for session termination
- Cryptographically secure session IDs with transient-based storage
- Origin header validation to prevent DNS rebinding attacks
- Proper CORS handling for browser-based MCP clients
- OAuth 2.1 with PKCE and dynamic client registration, plus the device authorization grant (RFC 8628) for headless clients:
POST /mcp-device/code, approve at/mcp-device, poll/token - MCP 2026-07-28 stateless requests (
server/discover,resultType,ttlMs/cacheScope, header validation) alongside the 2025-11-25 session flow - Credential hashing with an optional HMAC key, and every deployment setting pinnable from
wp-config.php
Mordenhost MCP does not operate a license server, send telemetry, or make vendor callbacks, and it stores no AI provider key. It runs inside your WordPress installation and responds only when an authenticated MCP or REST client makes a request. A few optional features call a third-party service after an administrator turns them on; each is documented here and in readme.txt:
| Service | Used for | Data sent, and when | Terms | Privacy |
|---|---|---|---|---|
| WordPress AI Client + the provider you connect (OpenAI, Google, Anthropic, ...) | ai_generate_image, ai_generate_alt_text, ai_generate_caption |
Prompt or the image to describe, when an assistant runs those tools | OpenAI, Google, Anthropic | OpenAI, Google, Anthropic |
| Unsplash | stock_search_images (key held by Instant Images) |
Search words and key, when the tool runs | Terms | Privacy |
| Pexels | stock_search_images (key held by Instant Images) |
Search words and key, when the tool runs | Terms | Privacy |
| Semrush | semrush_* |
Domain/keyword and your API key, when a tool runs | Terms | Privacy |
| SE Ranking | seranking_* |
Domain/keyword and your API key, when a tool runs | Terms | Privacy |
| Ahrefs | ahrefs_domain_rating |
Domain and your API key, when the tool runs | Terms | Privacy |
| DataForSEO | dataforseo_* |
Domain/keyword and your credentials, when a tool runs | Terms | Privacy |
| Google Search Console / Analytics 4 | gsc_*, ga4_* |
Signed token request, then site/property, date range and dimensions, when a tool runs | Terms | Privacy |
| WordPress.org | Plugin and theme lifecycle tools | Requested slug plus what WordPress core sends for updates, when an assistant installs or updates | Guidelines | Privacy |
Outbound webhooks post to URLs an administrator adds, and wp_upload_media_from_url downloads a URL an assistant supplies; both refuse private, loopback and reserved addresses.
A separately configured client may send tool results—including requested WordPress content—to its AI provider. That transfer is controlled by the client and the provider account you choose, not by an outbound Mordenhost MCP integration. Review the terms and privacy policy of your chosen client or provider before granting it access to your site.
Common client providers:
-
Claude — Common client provider for Claude-based MCP connections Terms of Service | Privacy Policy
-
OpenAI — Common client provider for ChatGPT and OpenAI-based MCP connections Terms of Use | Privacy Policy
-
Google Gemini — Common client provider for Gemini-based MCP connections Terms of Service | Privacy Policy
-
Groq — Provider used by MCP-capable clients running Groq-hosted models Terms of Service | Privacy Policy
-
Microsoft Azure OpenAI — Provider used by MCP-capable clients with Azure-hosted models Terms of Service | Privacy Policy
-
AWS Bedrock — Provider used by MCP-capable clients with Bedrock-hosted models Terms of Service | Privacy Policy
-
Ollama / LM Studio — Local self-hosted models (no external data transmission)
-
Custom MCP Servers — User-configured servers (data sent to user-specified endpoints only)
Requires PHP 7.4 or later (8.0+ recommended) and WordPress 5.8 or later. See Requirements in the description above for the full list, including the HTTPS and pretty-permalink prerequisites for OAuth connectors.
- Upload the
mordenhost-mcpfolder to/wp-content/plugins/. - Activate Mordenhost MCP from Plugins in WordPress.
- Open Mordenhost MCP → Settings and enable the server.
- Choose an authentication method:
- Use the native OAuth connector flow when your MCP client supports it.
- Otherwise, copy the generated Mordenhost MCP API key and send it in the
MMCP-Keyheader.
- Configure your MCP client with
https://yoursite.com/wp-json/mordenhost-mcp/v1/mcp.
The Settings page shows the exact MCP server URL, the API key, and the required request header for each supported client.
Model Context Protocol (MCP) is an open standard created by Anthropic that lets AI assistants interact with external data sources. Without MCP, AI tools like Claude or ChatGPT can only work with content you copy and paste into them. With Mordenhost MCP installed, these AI platforms can directly read your WordPress posts, create new content, manage your WooCommerce products, check your security status, and trigger backups — all through a structured, authenticated protocol.
Security is the whole point. Many WordPress MCP bridges expose their tools with little or no authentication, which on a live site is an open door. Mordenhost MCP requires OAuth 2.0 or an API key on every session, enforces a WordPress capability check inside each tool handler, applies a per-IP rate limit, and redacts sensitive data (user emails, PHP version, stored credentials) from responses. It is designed to be safe to point a production site at.
No. WordPress 6.9 added the Abilities API — a primitive for registering AI-callable functions — and the wordpress/mcp-adapter package bridges abilities to MCP. Mordenhost MCP remains a complete server with its own authenticated Streamable HTTP transport, OAuth 2.0 connector flow, per-IP rate limiting, audit logging, sensitive-data redaction, 111 always-registered WordPress-core, Gutenberg, and webhook tools, and more tools from integrations you enable.
Yes. When WooCommerce is active and you enable the WooCommerce integration under Mordenhost MCP → Access → Plugins, Mordenhost MCP adds 29 MCP tools spanning product management (simple and variable, including variation CRUD and global attribute management), full coupon management (list/get/create/update/delete + bulk trash purge), order management (view, update status), customer data, and store statistics. The integration is off until you enable it — activating WooCommerce alone does not expose the tools.
Yes, with safety controls. Mordenhost MCP exposes two tools for plugin configuration:
-
wp_get_plugin_settingslets AI read any plugin's stored settings by slug. Sensitive values (API keys, secrets, tokens, passwords, license keys, OAuth credentials) are automatically replaced with[REDACTED]before they leave your server, so AI assistants can understand a plugin's configuration without ever seeing stored credentials. -
wp_update_optionlets AI write to WordPress options, but only after passing three security gates:- The site admin must turn on the "Site options" switch under Mordenhost MCP → Access (off by default)
- The option name must be in a runtime allowlist. The default allowlist is intentionally tiny —
blogname,blogdescription,posts_per_page,date_format,time_format. Plugin authors opt their own settings in via themordenhost_mcp_writable_optionsfilter. - A hard denylist permanently blocks writes to sensitive option names (siteurl, home, license keys, secrets, salts, etc.) regardless of the allowlist or the toggle.
Plugin authors can opt in their settings with one line: add_filter('mordenhost_mcp_writable_options', fn($opts) => array_merge($opts, ['my_plugin_settings']));
Install and activate Mordenhost MCP, then open Mordenhost MCP → Settings. In Claude Desktop, use the native Add Connector flow with your site's MCP URL; Mordenhost MCP handles OAuth 2.0 and Dynamic Client Registration. For clients that do not support the connector flow, configure the same MCP URL and send the generated Mordenhost MCP API key in the MMCP-Key header.
Start with the common causes:
- Confirm HTTPS is working and pretty permalinks are enabled.
- Purge WordPress, host, CDN, and browser caches; exclude
/wp-json/mordenhost-mcp/and the domain-root OAuth endpoints from edge caching. - Temporarily disable conflicting plugins and switch to a default theme to isolate rewrite or security-layer interference.
- Check Mordenhost MCP → Activity Logs for the latest
oauth:entry and review Documentation → Troubleshooting in the plugin settings. - If the site was restored from backup or the client holds stale credentials, reset OAuth state in Mordenhost MCP, remove the connector from the client, wait briefly, and add it again.
Only move to host-specific checks—such as Cloudflare AI-bot rules or a host intercepting /.well-known/—after these basics are clean.
Yes, and it is off by default: turn on Access → Access control → Application Passwords, create a WordPress Application Password for the user the client should act as (Users → Profile → Application Passwords), and have the client send Authorization: Basic base64(username:application-password). WordPress core checks the password, the connection acts as that user with that user's capabilities, and the access level you set next to the switch (read-only until you change it) applies on top. Revoking the password on the profile screen ends access on the next request. The trade-off is that Basic authentication sends the password with every request, so it is accepted only over HTTPS; over plain HTTP it is refused unless the site's environment type is local, the same rule WordPress applies. Keep OAuth wherever it works.
A restored database may no longer contain the OAuth client and token state held by Claude. In Mordenhost MCP → Settings, use Reset OAuth State to remove stale client registrations, access/refresh tokens, pending authorization codes, and transport sessions. Then delete the existing connector in Claude, wait briefly, and add it again so the complete OAuth flow runs against the restored site. The reset does not change the Mordenhost MCP settings, static API key, or activity log.
These errors often indicate missing OAuth or session tables, stale connector state, or an edge cache replaying an earlier response. Load a WordPress admin page so Mordenhost MCP's runtime database healer can verify and recreate required tables, then inspect the activity log. Purge every cache layer and ensure the Mordenhost MCP namespace is never cached. Finally, remove the connector from Claude and add it again. If the problem remains, run mordenhost_mcp_connection_health with an authenticated client and compare the reported route, auth method, session ID, and plugin version.
I'm auditing my install and can't find the OAuth endpoints under /wp-json/mordenhost-mcp/v1/. Where are they?
By design, Mordenhost MCP's OAuth endpoints (/register, /token, /authorize) are registered as top-level WordPress rewrite rules at the site root, not as REST API routes under /wp-json/mordenhost-mcp/v1/. This is required by the OAuth 2.0 specification (RFC 6749) and the MCP discovery specs (RFC 8414 and RFC 9728), which mandate predictable site-root paths so OAuth-discovery-aware clients can find them without per-plugin configuration. If you're auditing rewrite rules instead of REST routes, you can see ours via wp rewrite list | grep mordenhost_mcp_oauth from WP-CLI. The /wp-json/mordenhost-mcp/v1/ namespace contains the JSON-RPC tool endpoint at /mcp plus supporting REST routes (/posts, /pages, /site, etc.) — but not the OAuth handshake endpoints themselves. Both routing layers are normal and both need to be reachable for the connector to work end-to-end.
Mordenhost MCP is designed with defense in depth. API key authentication is required for all MCP sessions. Rate limiting prevents abuse (60 requests per minute per IP). Activity logging records every tool call. Sensitive data is filtered — user emails, usernames, admin email, PHP version, and stored credentials inside plugin settings (api keys, secrets, tokens, passwords) are never exposed through MCP. Comment creation respects your WordPress moderation settings. Post meta values are sanitized before storage. Option writes are disabled by default and gated by three independent checks (admin toggle, allowlist, hard denylist) when enabled. The plugin itself starts disabled by default — nothing is accessible until you explicitly enable it.
Yes. Mordenhost MCP supports Ollama and LM Studio for fully local AI inference. When using local models, no data leaves your server — the AI model runs on your own hardware and communicates with WordPress through the MCP protocol on localhost.
Mordenhost MCP performs a clean uninstall. All plugin options, database tables (activity logs), transients, and user meta are removed. No orphaned data is left behind.
Yes. Any MCP-compliant client can connect to Mordenhost MCP. Configure your IDE or client with the MCP server URL (https://yoursite.com/wp-json/mordenhost-mcp/v1/mcp) and the API key (sent in the MMCP-Key header). Claude Desktop additionally supports the native "Add Connector" OAuth 2.0 flow, which Mordenhost MCP handles via Dynamic Client Registration (RFC 7591) — no manual API key management required on that path. The same OAuth flow works in any client that follows the MCP 2025-11-25 spec.
Yes. Mordenhost MCP exposes WordPress's standard wp_get_post_meta, wp_update_post_meta, and wp_delete_post_meta tools, which read and write any custom field — including Advanced Custom Fields (ACF), MetaBox, JetEngine, Pods, CPT UI, and Custom Field Suite. AI agents can populate ACF fields, set repeater rows, update flexible content blocks, and read computed fields just like a human editor working in the WordPress admin.
Mordenhost MCP's MCP transport runs when a client calls its endpoint; it is not part of ordinary visitor-facing template rendering. Tool calls still execute WordPress and database work, and activity logging adds a database write, so real cost depends on the tool and workload. The per-IP limit of 60 requests per minute helps contain accidental request bursts. Monitor your site under representative client traffic, especially when using expensive searches, media operations, or third-party integrations.
Yes, on a per-site basis. Each site in a multisite network has its own API key, its own activity log, and its own settings. AI clients connect to a specific site's MCP endpoint — Mordenhost MCP does not bridge requests between sites in the network.
Yes. The wp_get_posts and wp_create_post tools accept a post_type parameter and validate it against registered public post types, so private or internal post types are not exposed by default. A site owner can opt specific non-public types in with the mordenhost_mcp_allowed_post_types filter, for example add_filter('mordenhost_mcp_allowed_post_types', fn($types) => array_merge($types, ['elementor_snippet']));. Opted-in types appear in wp_get_post_types with public: false, listing one requires that type's own edit_posts capability, and the usual per-type capability checks still apply on writes. For Elementor Pro Custom Code, prefer the dedicated elementor_*_code tools: a snippet's code lives in post meta rather than post content, so a plain wp_create_post is not enough to make it load. Plugin authors can disable specific tools entirely with the mordenhost_mcp_disabled_tools filter, or scope the option-write allowlist with mordenhost_mcp_writable_options. WordPress's standard capability checks also apply to every tool call.
Yes. Translated posts appear as separate WordPress posts (each with its own ID and language meta) and are readable or writable via the standard wp_get_posts, wp_create_post, and wp_update_post tools. AI agents can list posts in a specific language by filtering on the language meta key, or translate a post and write the corresponding translation by ID.
Every authenticated MCP request is logged to the Mordenhost MCP activity log with timestamp, client IP, tool name, parameters (sensitive values redacted), and response status. The log is filterable by time range, client, tool, or status code, and exportable to CSV. The log page refreshes via AJAX so you can watch active sessions in real time.
More MCP is free software licensed under the GNU General Public License v2.0 or later.
