=== Sokket – MCP Server: Connect Claude, ChatGPT, Cursor & Any AI Agent to WordPress ===
Contributors: beautifulplugins
Tags: mcp, mcp server, ai agent, claude, chatgpt
Requires at least: 6.4
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.4.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Self-hosted MCP server for WordPress. Connect Claude, ChatGPT, Cursor & any AI agent to your site — with the tools and permissions you control.

== Description ==

**Sokket turns your WordPress site into its own MCP server.**

MCP — the Model Context Protocol — is the standard AI clients use to work with outside systems. Install Sokket and your site becomes one: a single endpoint that **Claude, ChatGPT, Cursor, VS Code, Windsurf** and any other MCP-compatible AI agent can connect to and actually *use*.

Instead of copying error logs and post content into a chat window, the agent reads them itself. Instead of describing your site to an AI, you connect it — and every tool call runs through a permission model you control.

= Stop pasting your site into a chat window =

Ask your AI agent to do the work directly:

* *"Why is this site throwing a 500 error?"* — it reads the PHP error log, checks the environment, and lists which plugins updated recently.
* *"Which plugins have updates available, and what versions are we on?"* — it tells you, with the WordPress and PHP versions to match.
* *"Find every post mentioning the old pricing and fix it."* — it searches, reads, and updates the content.
* *"Draft a post from these notes and set a featured image."* — it creates the draft, uploads the image, and attaches it.
* *"Clear the comment moderation queue."* — it reads the pending queue, approves the real ones, and spams the rest.
* *"Tidy up our categories and tag these twelve posts properly."* — it lists terms, creates what's missing, and assigns them.
* *"Put a call-to-action above the footer on every page."* — it reads the theme's footer template part, edits the block markup, and saves it as a customisation you can revert.
* *"Make the buttons use our brand colour."* — it reads the theme's palette, adds the colour, and points the button block at it.
* *"Build a landing page and make it the home page."* — it writes the page, checks its own block markup against the block registry, sets it as the front page, and adds it to the menu.

**This is not an AI content generator.** Sokket writes nothing by itself and calls no AI provider. It is the *connector* that lets the AI client you already pay for reach your site safely.

= Works with every MCP client =

The endpoint speaks Streamable HTTP with JSON-RPC 2.0, so any MCP-compatible client works. The built-in setup generator produces the exact command or config for yours, with your endpoint already filled in:

* **Claude Code** — one `claude mcp add` command
* **Claude Desktop** — a custom connector via OAuth, or a bearer token through `mcp-remote`
* **ChatGPT** — a developer-mode connector with bearer authentication
* **Cursor** — a ready-made `.cursor/mcp.json` block
* **VS Code** — a ready-made `.vscode/mcp.json` block
* **Windsurf** — a ready-made `mcp_config.json` block
* **Any other MCP client** — the raw endpoint, transport, and auth header

= No AI keys. No SaaS. No data leaving your site. =

This is the part most "AI for WordPress" plugins can't say:

* **100% self-hosted.** The MCP server runs inside your WordPress install. There is no SaaS component, no account to create, and no middleman marking up API calls.
* **No external service calls.** This plugin makes **no outbound requests to any AI provider or any other external service**. It never sends your data anywhere. It only *receives* inbound connections from the AI clients you configure, on an endpoint you can switch off at any time.
* **No AI API keys.** Sokket is provider-agnostic and stores no AI credentials. Your AI client authenticates to *your site* — not the other way around.

= Two ways to connect =

**Bearer tokens** — create a token in the admin, bind it to a WordPress user, and tick exactly which tools it may call. Tokens are stored as SHA-256 hashes and shown in plaintext exactly once. This is the option with the finest control, and it works with Claude Code, ChatGPT, Cursor, VS Code, and Windsurf.

**OAuth 2.1** — for connector interfaces that have no field for a token, such as Claude Desktop's custom connectors. Turn it on and clients configure themselves from the endpoint URL alone: RFC 9728 and RFC 8414 discovery, dynamic client registration, PKCE (S256) required, and refresh tokens. The person connecting signs in to WordPress, approves on a consent screen, and chooses read-only or full access. Every grant is listed in the admin and revocable in one click.

WordPress **Application Passwords** are accepted too, for quick local testing.

= Security model =

Sokket is built on the assumption that you should never have to simply trust the agent.

* The server is **disabled by default** after activation, and rejects every request until you switch it on.
* Every credential is **bound to a WordPress user** — a request can never do anything that user could not do in wp-admin.
* **Three independent gates** on every single tool call: the connection's tool allowlist, a **read-only ceiling**, and a real `current_user_can()` capability check. The token is never trusted on its own.
* **Every write tool is off by default** and must be enabled explicitly, one at a time.
* Tools that **remove content** are marked with a `delete` badge in the allowlist, and are announced to the client with the MCP `destructiveHint` annotation so it can ask you to confirm before calling one. They count as writes, so a read-only connection can never call them.
* Rate limiting, origin validation (DNS-rebinding protection), timing-safe token comparison, and session handling per the MCP spec.
* A capped **audit log** of every tool call: user, tool, outcome, and the object id it acted on. Tool arguments are never stored.
* **Instant revocation** of any token or OAuth connection.
* Deliberately **no filesystem-write, database-query, or command-execution tools** — the free plugin's attack surface stays small on purpose. The template and global styles tools are no exception: they write database rows, exactly as the Site Editor does, and **never modify a theme's files**. Every design change they make is revertible from the plugin, from the Site Editor, or by switching theme.
* Content written through the tools is **filtered the way WordPress filters it** — callers who can already post unfiltered HTML are not filtered, matching core's behaviour for those same users in the block editor, and everyone else is filtered block by block so the filtering cannot corrupt valid block markup.

= Included tools =

39 tools, grouped by area, each individually switchable per connection — plus 2 more when a supported SEO plugin is active.

**Site & diagnostics**

* `get_site_info` — WordPress/PHP/DB versions, active theme, environment, debug flags
* `list_plugins` — installed plugins, versions, update availability
* `list_themes` — installed themes
* `get_php_error_log_tail` — last lines of the server-configured PHP error log (admins only)
* `get_site_settings` — general, writing, reading, discussion, and permalink settings from a fixed allowlist
* `update_site_settings` — change the site title, tagline, front page, posts per page, and date, time and timezone formats (off by default, per token; a fixed allowlist that can never reach the site address, the admin email, registration defaults, or the permalink structure)

**Content**

* `list_posts`, `get_post`, `search_content` — content inspection
* `create_post`, `update_post` — content writes (off by default, per token)
* `delete_post` — move a post or page to the trash (off by default, per token; permanent deletion is refused unless the site opts in, and the front page and posts page are always refused)
* `restore_post` — bring a trashed post back to its previous status (off by default, per token)
* `set_post_meta` — assign a page template to a page (off by default, per token; an allowlist of meta keys, not an arbitrary meta writer)

**Media**

* `list_media` — browse the media library
* `upload_media` — add an image from base64 data (off by default, per token)
* `set_featured_image` — set or clear a post's featured image (off by default, per token)

**Templates & parts** — block themes

* `list_block_templates` — every template and template part available to the active theme, including the ones that exist only as theme files
* `get_block_template` — a template's block markup, or the original theme file version of one that has been customised
* `update_block_template` — create a template or override a theme-provided one (off by default, per token; the theme's files are never modified)
* `revert_block_template` — discard a customisation so the theme file takes over again (off by default, per token)

**Global styles** — block themes

* `get_theme_json` — the active theme's palette, gradients, spacing scale, font sizes and font families, with the exact reference strings for each, plus the layout widths and which blocks the theme styles
* `update_global_styles` — change colours, typography, spacing, and per-block styling (off by default, per token; writes the same user layer the Site Editor saves to)
* `reset_global_styles` — discard the style customisations and fall back to the theme (off by default, per token)

**Blocks & validation** — block themes

* `list_block_types` — every block registered on the site, including ones a theme or plugin adds, with their attribute schemas
* `validate_block_markup` — check block markup against the registry before saving it: unregistered blocks, attributes that do not exist, values outside what an attribute accepts, blocks used outside the parent they need, unbalanced delimiters
* `render_block_template` — render markup or a template to HTML, so the agent can see what its own output actually produces

**Navigation menus** — block themes

* `list_navigation_menus` — menus with their items as a nested list rather than raw block markup
* `create_navigation_menu` — build a menu from a list of items and get back the id a template's navigation block needs (off by default, per token)
* `update_navigation_menu` — replace a menu's items or rename it (off by default, per token)

**Taxonomies & terms**

* `list_taxonomies`, `list_terms` — taxonomy inspection
* `create_term`, `assign_terms`, `update_term` — term writes (off by default, per token)
* `delete_term` — remove a term (off by default, per token; posts using it are never deleted, they simply lose the assignment)

**Comments**

* `list_comments` — review the moderation queue
* `moderate_comment` — approve, unapprove, spam, unspam, trash, untrash (off by default, per token)
* `reply_to_comment` — reply as the connected user (off by default, per token)

**SEO** — registered only when Yoast SEO, Rank Math, or SEOPress is active

* `get_seo_meta` — read the meta description and focus keyword for a post or page
* `update_seo_meta` — write them back through the active SEO plugin's own post meta (off by default, per token)

= Who it's for =

* **Developers and agencies** debugging and maintaining sites with an AI coding assistant instead of a support ticket queue.
* **Site owners** who want an AI assistant that can actually see the site it's advising them about.
* **Content teams** letting an agent draft, update, illustrate, and categorise posts under editorial control.
* **Anyone** who wants AI help with WordPress without shipping their content to another SaaS platform.

= Built for developers =

Register your own tools with a single filter, `sokket_register_tools`. Anything you add inherits the whole permission model, the audit log, and the transport for free, and shows up in the admin allowlist automatically. Filters are also provided for rate limits, upload restrictions, audit retention, the settings-read allowlist, and OAuth authorization rights.

Full documentation: [beautifulplugins.com/docs/sokket-site-connector-for-mcp/](https://beautifulplugins.com/docs/sokket-site-connector-for-mcp/)

== Installation ==

= Install the plugin =

1. Go to **Plugins → Add New**, search for **"Sokket"**, click **Install Now**, then **Activate**. (Or upload the ZIP under **Plugins → Add New → Upload Plugin**.)
2. Nothing is exposed yet — the MCP server is disabled by default.

= Turn on the server =

1. Go to **Sokket → Settings → General**.
2. Tick **Enable MCP server** and save.
3. Copy the **Endpoint URL**, and click **Test connection** to confirm the endpoint is reachable and enforcing authentication.

= Create a credential =

1. Go to **Sokket → Settings → Access**.
2. Give the token a label, pick the WordPress user it runs as, leave **Read-only** ticked to start with, and choose which tools it may call.
3. Copy the token — it is shown exactly once.

Prefer sign-in based connections? Tick **Enable OAuth 2.1** on the General tab instead, and clients configure themselves from the endpoint URL.

= Connect your AI client =

1. Go to **Sokket → Connections → Connect your AI client**.
2. Choose your client and copy the generated command or config.

For Claude Code, that is a single command:

`claude mcp add --transport http sokket-site-connector-for-mcp https://example.com/wp-json/sokket/v1/mcp --header "Authorization: Bearer YOUR_TOKEN"`

Then ask your agent what versions the site is running — and watch the call appear in the audit log.

== Frequently Asked Questions ==

= What is MCP? =

The Model Context Protocol is the standard way for an AI client to work with an external system. The system exposes *tools* — named operations with typed arguments — and the AI decides which to call. Sokket makes your WordPress site one of those systems, so an AI agent can read and manage it directly instead of being told about it second-hand.

= Does this plugin send my content to an AI company? =

No. The plugin makes no outbound requests to AI providers or any other external service. AI clients that *you* configure connect *to your site*, authenticate with a credential you created, and can only use the tools that credential allows.

= Do I need an OpenAI or Anthropic API key? =

No. Sokket is provider-agnostic and stores no AI credentials at all. Your AI client brings its own subscription and authenticates to your site with a token or an OAuth connection you approve.

= Which AI clients work with it? =

Any MCP-compatible client that supports remote servers over Streamable HTTP, including Claude Code, Claude Desktop, ChatGPT, Cursor, VS Code, and Windsurf. The "Connect your AI client" tab generates the exact command or configuration for your site.

= How do I connect Claude Desktop? =

Claude Desktop's custom connectors have no field for a bearer token, so enable **OAuth 2.1** under Settings → General, then add your endpoint URL as a custom connector and leave Client ID and Client Secret blank — the connector registers itself and asks you to sign in and approve. If you would rather not enable OAuth, the plugin also generates an `mcp-remote` configuration that uses a bearer token instead.

= Is it free? =

Yes. This plugin is the complete MCP server: every tool, OAuth 2.1, bearer tokens, per-connection permissions, and the audit log. There is no usage limit and no account to create.

= Is it safe to install on a production site? =

The server is disabled by default and rejects every request until you enable it. When enabled, access requires a credential bound to a WordPress user, and each tool call is checked against that user's capabilities plus the connection's own allowlist. Every write tool is off until you enable it, and you can revoke any credential instantly.

= Can I control exactly which tools the AI can use? =

Yes — that is the core of the plugin. Each bearer token has its own tool allowlist and an optional read-only ceiling that blocks every write tool regardless of what else is ticked. OAuth connections are scope-based instead: read-only or full access, still bounded by the WordPress user's capabilities.

= Can the AI modify files or run database queries? =

No. The plugin deliberately ships no filesystem write, database query, or command execution tools. Every write tool is off by default and has to be enabled per connection. `get_php_error_log_tail` reads only the path the server itself configures in `error_log`, capped at the last 100 lines, and requires an administrator.

This includes the design tools. `update_block_template` and `update_global_styles` write database rows — the same customisation records the Site Editor creates — and never touch a theme's `theme.json`, `templates/`, or any other file. If you deactivate the plugin, the theme still renders exactly as those customisations describe, because they belong to your site rather than to Sokket.

Settings are the same story. `update_site_settings` writes a fixed list of options and nothing else. The site address, the admin email, whether anyone can register, what role they get, and the permalink structure are excluded outright, and that exclusion is enforced in code after any filter has run, so a site cannot open them up by accident. `set_post_meta` works from an allowlist of meta keys rather than accepting any key you name.

= Can the AI redesign my site? Can I undo it? =

On a block theme, yes — and yes. An agent with the template and style tools enabled can edit templates and template parts, change the palette, typography and spacing, and style individual blocks.

Every one of those changes is reversible, and reversible in more than one way. `revert_block_template` discards a template customisation so the theme file takes over again, and `reset_global_styles` throws away the style changes. The Site Editor's own "Reset" and "Clear customizations" work on them too, because they are ordinary WordPress customisation records, not something the plugin invents. And since the theme's files are never modified, switching to another theme and back gives you the theme as it shipped.

These tools are off by default like every other write tool. If you would rather an agent never touched the design, simply leave them unticked.

= Does it work with block themes and the Site Editor? =

Yes — that is what the template and global styles tools are for, and they are built on the same WordPress APIs the Site Editor uses, so nothing is special-cased to a particular theme.

On a classic theme the design tools stay available but have far less to work with: `list_block_templates` returns only whatever block templates a plugin has registered, which on most sites is none, and `get_theme_json` falls back to the WordPress default palette and spacing scale. Nothing errors, and the content, media, taxonomy, comment, and SEO tools work exactly the same on either kind of theme. Classic menus, widgets, and the Customizer are not covered.

= Can the AI upload images to my media library? =

Only if you enable `upload_media` on a connection bound to a user who can already upload files, and even then the tool is deliberately narrow:

* **Images only** — JPEG, PNG, GIF, WebP, and AVIF. SVG is refused outright, because SVG is XML that can carry script; this holds even on sites that have enabled SVG uploads elsewhere.
* **The file type comes from the bytes, not the file name.** A payload named `photo.jpg` that is not really an image is rejected, and the stored extension is always rewritten to match the real image data.
* **The image arrives inside the request.** Bytes are sent base64-encoded over the connection your client already opened. The plugin does not fetch URLs, so enabling uploads still results in zero outbound requests from your site.
* **Rate limited.** Uploads are capped per user per hour (20 files / 25 MB by default, filterable) so an agent stuck in a loop cannot fill your uploads directory.
* **Logged.** The audit log records the resulting attachment id alongside the tool call.

= Does the AI client see personal data? =

It sees whatever the WordPress user it is bound to can see through the tools you enabled. Notably, `list_comments` includes commenter email addresses, and `get_site_settings` includes the site's admin email — the same data that user sees in wp-admin. Leave those tools off if you would rather not share them.

= What does the audit log record? =

The time, the user, the tool, the outcome, and the id of the post, attachment, term, or comment the call acted on. Tool arguments are never stored, so the log tells you what happened without becoming a second copy of your content.

= Can I add my own tools? =

Yes. Register them through the `sokket_register_tools` filter and they appear in the admin allowlist automatically, passing exactly the same permission gates as the built-in tools. See the developer documentation.

= Does it work with WordPress Multisite? =

Yes. Sokket runs per site — each site in a network has its own settings, credentials, endpoint, and audit log, and is enabled independently. Connect your AI client to each site separately.

= Does it work with the WordPress REST API disabled? =

No. The MCP endpoint is a REST route (`/wp-json/sokket/v1/mcp`), so the REST API must be reachable. A security plugin that blocks REST requests or strips the `Authorization` header will also block Sokket.

= What happens if I delete the plugin? =

The plugin cleans up after itself: the token, audit log, and OAuth tables are dropped, the options are deleted, and the plugin's transients are cleared. Every credential stops working immediately.

What it does not remove is your site's own content — including anything an agent created or changed through it. Posts, pages, media, terms, template customisations, and global styles all stay exactly as they are, because they are WordPress records that belong to your site, not to Sokket. Your site keeps looking and working the way it did the moment before you deleted the plugin.

== Screenshots ==

1. Dashboard — server status, endpoint URL, active connections, and recent AI tool calls at a glance.
2. Settings → General — enable the MCP server, switch on OAuth 2.1, copy the endpoint, and test the connection.
3. Settings → Access — create bearer tokens bound to a WordPress user, with a per-token tool allowlist and read-only ceiling.
4. Connections → OAuth — approved AI connections and registered clients, each revocable in one click.
5. Connections → Connect your AI client — ready-made setup commands and configs for Claude, ChatGPT, Cursor, VS Code, and Windsurf.

== Changelog ==

= 1.4.0 =
* New: block discovery tools — `list_block_types`, `validate_block_markup`, and `render_block_template`. An agent writing block markup previously had no way to check its own work: a misspelled block name or an attribute a block does not have saves without complaint and then renders as nothing. These three let it look up what exists, check markup against the block registry before saving, and render the result to see it.
* New: navigation menu tools — `list_navigation_menus`, `create_navigation_menu`, and `update_navigation_menu`. Menus read back as a nested list of items instead of raw block markup, and a menu is built by naming what each item links to. Every link is resolved against the real page, post, or term, because a navigation link carries four values that must agree and WordPress does not complain when they do not — it saves the menu, renders it, and sends visitors to a 404.
* New: `update_site_settings` — change the site title, tagline, front page, posts per page, and the date, time and timezone formats. This is what makes "use this page as the home page" possible. It writes a fixed allowlist; the site address, the admin email, the registration defaults, and the permalink structure can never be written, because a wrong value there locks you out of your own site, hands over account recovery, opens an administrator factory, or 404s every URL you have ever published.
* New: `set_post_meta` — assign a page template to a page. An allowlist of meta keys rather than an arbitrary meta writer, since post meta is where plugins keep everything from prices to access rules and no capability check tells one key from another.
* Reading a block template now reports the navigation menus its navigation blocks point at, so the menu behind a template is visible instead of being a bare id.
* New filters: `sokket_block_support_attributes`, `sokket_settings_write_allowlist`, and `sokket_allowed_post_meta`.
* The token allowlist gains two groups: "Blocks & validation" and "Navigation menus". Every new write tool is off by default; existing tokens keep exactly the tools they were granted.

= 1.3.0 =
* New: block template tools — `list_block_templates`, `get_block_template`, `update_block_template`, and `revert_block_template`. Templates a block theme ships as files were previously invisible, because WordPress only creates a database row once a template is customised; they are now listed and readable alongside customised ones. Editing a theme-provided template stores an override and leaves the theme file untouched, and `revert_block_template` discards the override so the file takes over again.
* New: global styles tools — `get_theme_json`, `update_global_styles`, and `reset_global_styles`. `get_theme_json` returns the active theme's palette, gradients, spacing scale, font sizes and families, each with the exact strings to reference it from a block attribute and from CSS, so an agent uses the theme's real preset slugs instead of guessing them. Writes go to the same user layer the Site Editor saves to; the theme's own `theme.json` file is never modified.
* Fixed: block markup written through `create_post` and `update_post` could be corrupted. Running `wp_kses_post()` over a whole post treats block delimiters as ordinary HTML comments, which entity-encoded ampersands inside block attributes — turning a `Tips & Tricks` heading attribute into `Tips &amp; Tricks` and making the editor report "Block contains unexpected or invalid content" — and stripped `svg` and `iframe`, emptying a Custom HTML block holding an inline icon. Content is now parsed first and filtered block by block, so the delimiters and attributes are left intact.
* Fixed: content is now slashed correctly on the way into `wp_insert_post()`, which expects slashed input and unslashes before writing. Every backslash in post content, titles and excerpts was previously being dropped.
* Callers who can already post unfiltered HTML — administrators and editors on a single site — are no longer filtered at all, matching what WordPress core does for the same users in the block editor and the REST API. Everyone else is filtered block by block, with inline SVG and form controls allowed inside block markup and event-handler attributes still stripped.
* New `sokket_allowed_block_html` filter for the HTML permitted inside block inner markup.
* The token allowlist gains two groups, "Templates & parts" and "Global styles". Every new tool is off by default; existing tokens keep exactly the tools they were granted.

= 1.2.0 =
* New: `delete_post` and `restore_post` tools. Posts are moved to the trash, so a call can always be undone. The front page and the posts page are refused outright, and permanent deletion additionally requires the `sokket_allow_permanent_delete` filter.
* New: `update_term` and `delete_term` tools. Deleting a term never deletes the posts using it, and the response reports how many objects lost the assignment.
* New: SEO tools, `get_seo_meta` and `update_seo_meta`, for the meta description and focus keyword. Registered only when Yoast SEO, Rank Math, or SEOPress is active, and written through that plugin's own post meta.
* `create_post` and `update_post` accept a `slug`, and both now return the resulting slug.
* Tools that remove content now carry a `delete` badge in the token allowlist, and send the MCP `destructiveHint` annotation so your AI client can ask you to confirm before it calls one. They count as writes, so read-only connections can never reach them.
* Add-ons registering tools through `sokket_register_tools` can mark them with `is_destructive` to get the same badge and annotation.

= 1.1.0 =
* New media tools: `list_media`, `upload_media` (base64 images only), and `set_featured_image`.
* New taxonomy tools: `list_taxonomies`, `list_terms`, `create_term`, and `assign_terms`.
* New comment moderation tools: `list_comments`, `moderate_comment`, and `reply_to_comment`.
* New `get_site_settings` tool reading a fixed allowlist of WordPress options.
* Uploads are restricted to JPEG, PNG, GIF, WebP, and AVIF, typed from the file contents rather than the file name, and rate limited per user per hour.
* The audit log now records the post, attachment, term, or comment id a call acted on. Tool arguments are still never stored.
* The token screen groups the tool allowlist by area.
* All new write tools are off by default; existing tokens keep exactly the tools they were granted.
* Updated the plugin banner and icon.

= 1.0.0 =
* Initial release.

== Upgrade Notice ==

= 1.4.0 =
Adds navigation menu tools, block discovery and markup validation, and a fixed-allowlist settings writer that can set a page as your home page. Every new write tool is off by default on existing tokens, and settings that could lock you out of your site still cannot be written at all.

= 1.3.0 =
Adds block template, template part, and global styles tools, so an AI agent can work on a block theme's design and not just its content. Also fixes two content bugs: block markup could be corrupted on save, and backslashes were being dropped. Every new tool is off by default on existing tokens.
