{"id":376609,"date":"2026-09-29T11:25:19","date_gmt":"2026-09-29T11:25:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/zloj-mcp\/"},"modified":"2026-09-29T09:47:21","modified_gmt":"2026-09-29T09:47:21","slug":"zloj-mcp","status":"publish","type":"plugin","link":"https:\/\/ru.wordpress.org\/plugins\/zloj-mcp\/","author":14555966,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.3.11","stable_tag":"0.3.11","tested":"7.1.2","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Zloj MCP","header_author":"zloj.ru","header_description":"Model Context Protocol server for WordPress with token and IP access control.","assets_banners_color":"3f4147","last_updated":"2026-09-29 09:47:21","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":55,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.3.11":{"tag":"0.3.11","author":"zloj.ru","date":"2026-09-29 09:47:21","revision":3718673}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3718678,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3718678,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3718678,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3718678,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.3.11"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[2353,1556,569,242115,2299],"plugin_category":[],"plugin_contributors":[282554],"plugin_business_model":[],"class_list":["post-376609","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-api","plugin_tags-automation","plugin_tags-mcp","plugin_tags-rest","plugin_contributors-zlojru","plugin_committers-zlojru"],"banners":{"banner":"https:\/\/ps.w.org\/zloj-mcp\/assets\/banner-772x250.png?rev=3718678","banner_2x":"https:\/\/ps.w.org\/zloj-mcp\/assets\/banner-1544x500.png?rev=3718678","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/zloj-mcp\/assets\/icon-128x128.png?rev=3718678","icon_2x":"https:\/\/ps.w.org\/zloj-mcp\/assets\/icon-256x256.png?rev=3718678","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Zloj MCP exposes a JSON-RPC HTTP endpoint for MCP clients. Access is gated by a bearer token and an optional per-token IP allow list. Read, create, update, and delete access can be configured per entity (posts, media, and more).<\/p>\n\n<p>Each access token belongs to one WordPress user. Tool calls run with that user\u2019s capabilities, and content created through MCP is authored by that user. The author cannot be overridden. Users can be listed and read; the plugin does not create, update, or delete WordPress users.<\/p>\n\n<p>Settings are on <strong>Settings \u2192 Zloj MCP<\/strong> (administrators only). Several tokens can be stored; each is a salt and hash, and the owner\u2019s user ID is part of the hash. Changing that user ID in the database makes the token stop working. A token migrated from older single-token storage is not bound this way until you delete it and create a new one. The owner of an existing token cannot be changed in the settings screen.<\/p>\n\n<h4>MCP tools<\/h4>\n\n<p>Read: <code>post_type_list<\/code>, <code>post_list<\/code>, <code>post_get<\/code>, <code>user_list<\/code>, <code>user_get<\/code>, <code>term_list<\/code>, <code>media_list<\/code>, <code>comment_list<\/code>, <code>comment_get<\/code>.<\/p>\n\n<p>Write (when enabled): <code>post_create<\/code>, <code>post_update<\/code>, <code>post_delete<\/code>, <code>media_sideload<\/code>, <code>media_update<\/code>, <code>media_delete<\/code>, <code>comment_create<\/code>, <code>comment_update<\/code>, <code>comment_approve<\/code>, <code>comment_spam<\/code>, <code>comment_delete<\/code>.<\/p>\n\n<p>Post meta is read and written via the <code>meta<\/code> field on the post tools. User meta is read-only via <code>user_get<\/code> \/ <code>user_list<\/code>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install from the WordPress plugin directory.<\/li>\n<li>Activate the plugin through the Plugins screen.<\/li>\n<li>Open <strong>Settings \u2192 Zloj MCP<\/strong> as an administrator, create a token for a user, and enable access.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20is%20the%20endpoint%20url%3F\"><h3>What is the endpoint URL?<\/h3><\/dt>\n<dd><p>The settings screen shows the full URL, typically <code>https:\/\/example.com\/zloj-mcp\/<\/code> (path is configurable).<\/p><\/dd>\n<dt id=\"how%20do%20clients%20authenticate%3F\"><h3>How do clients authenticate?<\/h3><\/dt>\n<dd><p>Send <code>Authorization: Bearer &lt;token&gt;<\/code> on each request.<\/p><\/dd>\n<dt id=\"how%20does%20claude%20sign%20in%3F\"><h3>How does Claude sign in?<\/h3><\/dt>\n<dd><ol>\n<li>Use any permalink structure except Plain.<\/li>\n<li>In Settings \u2192 Zloj MCP, generate a token and copy it before saving, leave its IP list empty, turn on Enable MCP access, allow the entities you need, and save.<\/li>\n<li>In Claude, open Settings \u2192 Connectors \u2192 Add custom connector. Enter the endpoint URL shown in the plugin settings (for example <code>https:\/\/example.com\/zloj-mcp\/<\/code>). Leave the OAuth Client ID and Secret empty.<\/li>\n<li>Click Connect. Claude opens a page styled like the WordPress login screen with one token field. Paste the token and click Authorize.<\/li>\n<\/ol>\n\n<p>The token you paste is the one Claude keeps. It does not expire. Each token is a separate connection. Claude connects from Anthropic's servers, so a token with an IP list is refused, and the site must be reachable over public HTTPS.<\/p><\/dd>\n<dt id=\"example%20%28curl%29\"><h3>Example (curl)<\/h3><\/dt>\n<dd><p>curl -sS -H 'Authorization: Bearer YOUR_TOKEN' -H 'Content-Type: application\/json' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools\/list\",\"params\":{}}' https:\/\/example.com\/zloj-mcp\/<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.3.11<\/h4>\n\n<ul>\n<li>Missing post, comment, user, or attachment IDs return MCP tool errors (<code>isError<\/code>, code <code>not_found<\/code>) instead of a generic JSON-RPC execution failure.<\/li>\n<li>Existence is checked before WordPress capabilities, so a bad ID is \u201cnot found\u201d, not a permission error.<\/li>\n<\/ul>\n\n<h4>0.3.10<\/h4>\n\n<ul>\n<li>Fixed connecting from Claude when the URL is entered without the trailing slash: POST requests are no longer redirected, and the OAuth resource matches both forms.<\/li>\n<li>GET requests for an event stream now get 405, as Streamable HTTP expects.<\/li>\n<li>initialize negotiates the protocol version (2025-06-18, 2025-03-26, 2024-11-05).<\/li>\n<li>All notifications get 202. An unknown method returns a JSON-RPC error with HTTP 200 instead of 404, which clients treated as a lost session.<\/li>\n<li>Step-by-step setup for claude.ai, Claude Desktop, and Claude Code in the FAQ and README.<\/li>\n<\/ul>\n\n<h4>0.3.9<\/h4>\n\n<ul>\n<li>Claude can sign in at the MCP URL. The page uses the WordPress login layout and asks for one existing access token.<\/li>\n<li>Claude keeps that token and sends it as a bearer token. The token does not expire. Each token remains its own connection.<\/li>\n<li>Tokens stay stored as a salt and hash. The authorization code is sealed and single-use.<\/li>\n<\/ul>\n\n<h4>0.3.8<\/h4>\n\n<ul>\n<li>Comment tools: list (site-wide or by post, optional parent for replies), get, create, update, approve, spam, delete. Per-token entity access and the token owner\u2019s WordPress capabilities apply.<\/li>\n<\/ul>\n\n<h4>0.3.7<\/h4>\n\n<ul>\n<li>Action log settings sit with the route and the access switch and apply to every token.<\/li>\n<li>Entity access is stored per token. A new token starts with read checkboxes only.<\/li>\n<\/ul>\n\n<h4>0.3.6<\/h4>\n\n<ul>\n<li>Deleting a token, including one migrated from the old single-token setting, saves immediately and does not restore it.<\/li>\n<\/ul>\n\n<h4>0.3.5<\/h4>\n\n<ul>\n<li>The new-token tab opens first: user picker and a note filled with that user plus the browser date and time. Delete is only on tabs for tokens that already exist.<\/li>\n<\/ul>\n\n<h4>0.3.4<\/h4>\n\n<ul>\n<li>Fix a fatal error on the settings screen when an older single token is still stored.<\/li>\n<\/ul>\n\n<h4>0.3.3<\/h4>\n\n<ul>\n<li>Route path and the MCP access switch are in a Connection section at the top of the settings screen.<\/li>\n<li>IP allow lists are stored and checked per token. A previous site-wide list is kept on existing tokens until you save.<\/li>\n<\/ul>\n\n<h4>0.3.2<\/h4>\n\n<ul>\n<li>Removed Site, Options, Plugins, and Themes access flags and their tools: <code>site_info<\/code>, <code>option_get<\/code>, <code>plugin_list<\/code>, <code>theme_list<\/code>.<\/li>\n<\/ul>\n\n<h4>0.3.1<\/h4>\n\n<ul>\n<li>Removed user create, update, and delete (<code>user_create<\/code>, <code>user_update<\/code>, <code>user_delete<\/code> and the matching settings flags). Users stay read-only: <code>user_list<\/code> and <code>user_get<\/code>.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Multiple access tokens, one WordPress user each, managed as tabs on the settings screen.<\/li>\n<li>New token: choose the owner and a note (defaults to that user plus the browser date and time). Every tab except the new-token tab can be deleted.<\/li>\n<li>Each token stores when it was created and which administrator created it. The owner cannot be changed; their user ID is mixed into the token hash, so editing that ID invalidates the token.<\/li>\n<li>MCP calls run as the token owner. Created content uses that user as author and <code>post_author<\/code> cannot be set via MCP.<\/li>\n<li>User create, update, and delete are allowed only when the token owner has the matching capabilities. Assigning a role also requires <code>promote_users<\/code> and a role that user may grant.<\/li>\n<li>Only administrators can open or save the settings screen.<\/li>\n<li>Action log includes the token ID used for the request.<\/li>\n<\/ul>\n\n<h4>0.2.7<\/h4>\n\n<ul>\n<li>WordPress.org Plugin Check: prepared DB queries in action log list table, Tested up to 7.1.<\/li>\n<\/ul>\n\n<h4>0.2.6<\/h4>\n\n<ul>\n<li>Lower minimum PHP version to 7.4 (replace PHP 8+ syntax with 7.4-compatible code).<\/li>\n<\/ul>\n\n<h4>0.2.5<\/h4>\n\n<ul>\n<li>Fix Entity access table column alignment (Read\/Create\/Update\/Delete).<\/li>\n<\/ul>\n\n<h4>0.2.4<\/h4>\n\n<ul>\n<li>Entity access split: create, update, and delete flags per entity (replaces single write flag). Discovery <code>entities<\/code> snapshot uses the new shape; top-level <code>write<\/code> remains true when any mutate flag is on.<\/li>\n<li>New tools: <code>post_delete<\/code>, <code>user_delete<\/code>, <code>media_update<\/code>, <code>media_delete<\/code> (media delete is always permanent).<\/li>\n<li>Legacy stored <code>write_*<\/code> options enable create+update only; delete requires an explicit flag.<\/li>\n<\/ul>\n\n<h4>0.2.3<\/h4>\n\n<ul>\n<li>Reject invalid attachment statuses (including trash) on post_create and post_update.<\/li>\n<\/ul>\n\n<h4>0.2.2<\/h4>\n\n<ul>\n<li>Post\/user meta via <code>meta<\/code>, <code>include_meta<\/code>, and <code>meta_keys<\/code> on existing tools; <code>user_*<\/code> tools; entity <code>users<\/code>.<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<ul>\n<li>Tool <code>post_type_list<\/code>; per-entity read\/write settings in admin (master switch remains access enabled).<\/li>\n<li>Fix ToolException property conflict with PHP Exception on 8.4+.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>MCP tools (list\/call), adapters, write guard, option denylist, media sideload SSRF\/MIME checks.<\/li>\n<li>Action log table, pruning, admin log screen with search and pagination.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release: settings, token hash storage, IP allow list, MCP JSON-RPC base endpoint.<\/li>\n<\/ul>","raw_excerpt":"Model Context Protocol (MCP) server for WordPress with token and IP access control.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/376609","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=376609"}],"author":[{"embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/zlojru"}],"wp:attachment":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=376609"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=376609"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=376609"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=376609"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=376609"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=376609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}