{
  "version": "3.10.2",
  "download_url": "https://updates.mcpwp.net/mcpwp-latest.zip",
  "requires": "5.0",
  "requires_php": "7.4",
  "tested": "7.0",
  "name": "MCPWP",
  "homepage": "https://mcpwp.net/",
  "author": "Mumega",
  "author_homepage": "https://mumega.com/",
  "changelog": "<strong>3.10.2</strong> — fix: adversarial review findings — two defects already live in 3.10.1 (<a href=\"https://github.com/Mumega-com/mcpwp/issues/736\">#736</a>)<h4>3.10.1</h4> — fix: clear the open bug backlog — <a href=\"https://github.com/Mumega-com/mcpwp/issues/717\">#717</a>, <a href=\"https://github.com/Mumega-com/mcpwp/issues/720\">#720</a>, <a href=\"https://github.com/Mumega-com/mcpwp/issues/678\">#678</a>, and the honesty half of <a href=\"https://github.com/Mumega-com/mcpwp/issues/729\">#729</a> (<a href=\"https://github.com/Mumega-com/mcpwp/issues/734\">#734</a>)<h4>3.10.0</h4> — feat: <strong>seo:</strong> market data via DataForSEO — visibility, opportunities, and an agent loop (<a href=\"https://github.com/Mumega-com/mcpwp/issues/730\">#730</a>)<h4>3.9.3</h4> — fix: <strong>security:</strong> granular tool-category gate on all auth paths, fail-closed OAuth scopes (<a href=\"https://github.com/Mumega-com/mcpwp/issues/700\">#700</a>)<p><strong>Heads up:</strong> AI image and alt-text generation is now governed by the <strong>AI</strong> tool toggle rather than <strong>Admin</strong>. If you disabled Admin specifically to block <code>/integrations/*</code> generation, it becomes reachable again on upgrade — AI is on by default. Disable the AI toggle to restore that block. This aligns the REST routes with the tool taxonomy the MCP layer has always used. Tool-category toggles now hold on the REST entry point as well as the MCP one. A toggle you previously set expecting MCP-only enforcement — WooCommerce, LearnPress, Multisite, Staging, Forms, Elementor Theme — will now also block the matching REST routes.</p><h4>3.9.2</h4> — fix: **release:** publish and watch the Freemius channel like the self-hosted one ([#726](https://github.com/Mumega-com/mcpwp/issues/726))<h4>3.9.1</h4> — fix: **update:** guard Mcpwp_Updater use on builds that prune it ([#724](https://github.com/Mumega-com/mcpwp/issues/724))<h4>3.9.0</h4> — feat: **mupot:** read-first WordPress connector — status + task board in Control Room ([#715](https://github.com/Mumega-com/mcpwp/issues/715)) ([8a06c11](https://github.com/Mumega-com/mcpwp/commit/8a06c11593f62c7de1b873d4d79ed09f014ed71c)), closes [#689](https://github.com/Mumega-com/mcpwp/issues/689)<h4>3.8.0</h4> — feat: **updater:** make update-channel failures loud at every layer ([#719](https://github.com/Mumega-com/mcpwp/issues/719)); fix: tool schema item types ([#707](https://github.com/Mumega-com/mcpwp/issues/707)) and staging environment detection ([#710](https://github.com/Mumega-com/mcpwp/issues/710)) ([#713](https://github.com/Mumega-com/mcpwp/issues/713)); fix: **updater:** resolve updates from the plugin manifest, not the WP.org transient ([#718](https://github.com/Mumega-com/mcpwp/issues/718))<h4>3.7.2</h4> — fix: **security:** fold route case before every authorization decision ([#711](https://github.com/Mumega-com/mcpwp/issues/711))<h4>3.7.1</h4> — feat: **admin:** redesign admin UI to Claude Design Control Room mockup (3.6.5); feat: allow extensions to raise custom MCP tool scope ([#654](https://github.com/Mumega-com/mcpwp/issues/654)); feat: **broker-plugin:** cached introspection validator (fail-closed, audience-checked, kill-switch); feat: **broker-plugin:** claude.ai/ChatGPT OAuth sign-in via mumcp.com broker (v3.7.0); feat: **broker-plugin:** enrollment callback + confirm endpoints (site-control proof); feat: **broker-plugin:** enrollment lifecycle — connect/state/confirm/store/disconnect + Connections UI; feat: **broker-plugin:** point .well-known/oauth-protected-resource at mumcp.com when enrolled; feat: **broker-plugin:** validate broker Bearer tokens in verify_api_key() (read|write, never admin) + 401 discovery header; feat: **cloudflare:** cloudflare integration — bot-fix, cache purge, speed/CWV signals ([#632](https://github.com/Mumega-com/mcpwp/issues/632)); feat: **elementor:** idempotent, named Kit CSS blocks ([#645](https://github.com/Mumega-com/mcpwp/issues/645)); feat: **elementor:** validate Atomic Elements props against real schema + document the feature; feat: **integrations:** self-service Cloudflare Bot Fight Mode fix in wp-admin; feat: **seo:** classify deprecated schema.org rich-result types ([#615](https://github.com/Mumega-com/mcpwp/issues/615)); feat: **seo:** experimental opt-in GEO/AI-citability score ([#617](https://github.com/Mumega-com/mcpwp/issues/617)); feat: **seo:** schema-placement check + explicit E-E-A-T rubric ([#616](https://github.com/Mumega-com/mcpwp/issues/616)); feat: support trusted custom tool callbacks ([#657](https://github.com/Mumega-com/mcpwp/issues/657)); fix: **broker-plugin:** host-lock enroll-store issuer/introspection_endpoint to mumcp.com (prevent credential-exfil poisoning); fix: **broker-plugin:** introspect only as fallback after local key + rate-limit anonymous bearer attempts (no key egress, no DoS); fix: **broker-plugin:** public state-gated enroll-callback + pin audience to home_url + pin introspection URL + no public log-amplification; fix: **ci:** scope proxy-worker audit to runtime deps + bump hono ([#692](https://github.com/Mumega-com/mcpwp/issues/692)); fix: **elementor:** accept create-side param names on archetype/part list tools ([#640](https://github.com/Mumega-com/mcpwp/issues/640)); fix: **elementor:** correct destructive annotations and elementor_data round-trip typing ([#642](https://github.com/Mumega-com/mcpwp/issues/642)); fix: **elementor:** stop silent data loss on section/container/atomic layout mismatches; fix: **freemius:** soft-gate first activation instead of hard license wall ([#646](https://github.com/Mumega-com/mcpwp/issues/646)); fix: **license:** close reconnect-link render-time gap + notify on blocked updates; fix: **license:** detect wrong-package downgrade + warn loudly ([#656](https://github.com/Mumega-com/mcpwp/issues/656)); fix: **license:** reconnect flow no longer forces skip-mode (found the actual bug); fix: **license:** reconnect Freemius when a site is stuck anonymous/pending ([#633](https://github.com/Mumega-com/mcpwp/issues/633)); fix: **license:** update vendored Freemius SDK 2.13.0 -&gt; 2.13.4; fix: **license:** use Freemius's install-linked checkout URL, not marketing site; fix: **mcp:** draft rendered-copy 404/502 + expose unlicensed-reason code; fix: menu taxonomy contract, AIOSEO persistence, draft rendered-copy (3.6.2) ([#682](https://github.com/Mumega-com/mcpwp/issues/682)); fix: **oauth:** discovery docs broken on subdirectory installs + widen CF fix; fix: **oauth:** serve consent screen off the REST API so browser sign-in works ([#695](https://github.com/Mumega-com/mcpwp/issues/695)); fix: **pages:** support excerpt on wp_create_page/wp_update_page ([#697](https://github.com/Mumega-com/mcpwp/issues/697)); fix: **release:** release_freemius.sh never defined MCPWP_FREEMIUS_BUILD; fix: **rendered-html:** render draft/private Elementor content in-process, not via loopback ([#644](https://github.com/Mumega-com/mcpwp/issues/644)); fix: **security:** block secret option stores from /option and admin-gate /plugin-settings; fix: **security:** block secret option stores from /option and admin-gate /plugin-settings; fix: **security:** close draft/private content disclosure to read-scoped API keys ([#683](https://github.com/Mumega-com/mcpwp/issues/683)); fix: **security:** harden feedback-relay rate limiting and Figma OAuth callback ([#649](https://github.com/Mumega-com/mcpwp/issues/649)); fix: **security:** harden REST/MCP scope matrix and self-approval gate; fix: **security:** harden REST/MCP scope matrix and self-approval gate; fix: **security:** require admin scope to bypass content-approval gate; fix: **security:** require admin scope to bypass content-approval gate; fix: **security:** restrict Elementor globals writes to an allowlist and admin-gate kit CSS ([#603](https://github.com/Mumega-com/mcpwp/issues/603)); fix: **security:** restrict non-public content reads to write-scoped keys ([#601](https://github.com/Mumega-com/mcpwp/issues/601)); fix: **seo:** 3.6.4 — readiness false-positives, screenshot save_to_media, setup-page connect clarity ([#685](https://github.com/Mumega-com/mcpwp/issues/685)); fix: **seo:** stop /seo/audit fatal and per-post self-fetch storm; fix: **seo:** stop /seo/audit fatal and per-post self-fetch storm<h4>3.7.0</h4> — new: **connect:** claude.ai/ChatGPT can now sign into your site over OAuth via the mumcp.com broker (WP Admin → MCPWP → Setup → Connect to mumcp.com) — no per-site OAuth server; tokens validated by cached introspection; new Connections UI with Disconnect kill-switch. security: broker tokens capped at read/write (**admin never grantable over OAuth**), fail-closed + audience-bound; per-site credential stored encrypted. Claude Desktop/Cursor unchanged (X-API-Key).<br><h4>3.6.5</h4> — new: **admin:** redesigned admin UI — warm cream/antique-gold palette, Newsreader/Instrument Sans/IBM Plex Mono typography, refreshed cards, stat tiles, badges, and buttons across all admin pages; new: **control-room:** pending approvals show a before/after diff disclosure<h4>3.6.4</h4> — fix: **seo:** robots.txt readiness no longer false-flags sub-path disallows (/wp-admin/, Woo cart) as a sitewide block ([#680](https://github.com/Mumega-com/mcpwp/issues/680)); fix: **seo:** template-page readiness sources from rendered output instead of false missing_h1/thin_content ([#681](https://github.com/Mumega-com/mcpwp/issues/681)); fix: **media:** wp_screenshot_url honors explicit save_to_media=false ([#677](https://github.com/Mumega-com/mcpwp/issues/677)); new: **setup:** clearer Claude Desktop connect methods (API key vs OAuth coming-soon) + secret-in-URL warning<h4>3.6.3</h4> — fix: **security:** close a content-disclosure gap where a read-scoped API key could read or enumerate non-public (draft/pending/private) content — titles, URLs, bodies, excerpts, and SEO/approval metadata — across the Elementor, blocks, pages, posts, SEO, content-graph, approvals, and signals read surfaces; non-public content now requires write scope, enforced at a shared model chokepoint ([#683](https://github.com/Mumega-com/mcpwp/issues/683))<h4>3.6.2</h4> — fix: **menus:** wp_add_menu_item/wp_create_menu now honor the documented taxonomy and post_type item types instead of silently storing a blank custom link ([#676](https://github.com/Mumega-com/mcpwp/issues/676)); fix: **seo:** wp_set_seo (AIOSEO) now persists the meta description and robots flags reliably instead of a false success ([#672](https://github.com/Mumega-com/mcpwp/issues/672)); fix: **content:** wp_get_rendered_copy renders unpublished drafts in-process instead of failing with a loopback fetch_error ([#675](https://github.com/Mumega-com/mcpwp/issues/675))<h4>3.6.1</h4> — fix: **oauth:** discovery documents now work on subdirectory-installed sites, not just domain-root installs; new: Cloudflare Fix MCP Access now also covers OAuth discovery paths.<h4>3.6.0</h4> — feat: allow extensions to raise custom MCP tool scope ([#654](https://github.com/Mumega-com/mcpwp/issues/654)); feat: **cloudflare:** cloudflare integration — bot-fix, cache purge, speed/CWV signals ([#632](https://github.com/Mumega-com/mcpwp/issues/632)); feat: **integrations:** self-service Cloudflare Bot Fight Mode fix in wp-admin; feat: support trusted custom tool callbacks ([#657](https://github.com/Mumega-com/mcpwp/issues/657)); fix: **freemius:** soft-gate first activation instead of hard license wall ([#646](https://github.com/Mumega-com/mcpwp/issues/646)); fix: **license:** close reconnect-link render-time gap + notify on blocked updates; fix: **license:** detect wrong-package downgrade + warn loudly ([#656](https://github.com/Mumega-com/mcpwp/issues/656)); fix: **license:** reconnect flow no longer forces skip-mode (found the actual bug); fix: **license:** update vendored Freemius SDK 2.13.0 -&gt; 2.13.4; fix: **license:** use Freemius's install-linked checkout URL, not marketing site; fix: **mcp:** draft rendered-copy 404/502 + expose unlicensed-reason code; fix: **release:** release_freemius.sh never defined MCPWP_FREEMIUS_BUILD; fix: **security:** harden feedback-relay rate limiting and Figma OAuth callback ([#649](https://github.com/Mumega-com/mcpwp/issues/649))<h4>3.5.8</h4> — fix: **build:** release_freemius.sh never defined MCPWP_FREEMIUS_BUILD, so every Freemius zip since 3.5.1 had the SDK on disk but never actually loaded it — root cause of every unlicensed/no_freemius_sdk report this cycle.<h4>3.5.7</h4> — new: **integrations:** self-service \\\"Fix MCP Access (Bot Fight Mode)\\\" button on the Cloudflare integration card — no manual per-site Cloudflare dashboard work needed anymore.<h4>3.5.6</h4> — fix: **license:** closed a gap in the reconnect fix (the displayed link itself still got require_license=false baked in); new: admin notice when Freemius can't push an update to an anonymous/unlicensed site (read-only, no install action).<h4>3.5.5</h4> — fix: **license:** reconnect (\\\"Manage pricing and license\\\" after Skip) now actually lets you enter a license — the soft-gate default was leaking onto Freemius's own reconnect redirect too.<h4>3.5.4</h4> — fix: **license:** detect residual Freemius account data for this product with no SDK currently loaded (reason: freemius_removed_had_license) plus an admin notice pointing at the fix (#656).<h4>3.5.3</h4> — fix: **rendered-copy:** wp_get_rendered_copy now renders private/draft/pending Elementor content in-process instead of fetching the public/preview URL (#655); fix: **license:** expose a safe unlicensed-reason code without exposing the key (#656).<h4>3.5.2</h4> — fix: **license:** update vendored Freemius SDK 2.13.0 → 2.13.4 — includes an upstream checkout-context fix where raw request params could override computed checkout params.<h4>3.5.1</h4> — fix: **license:** Upgrade/pricing links now use Freemius's own install-linked checkout URL instead of a plain marketing-site link — a purchase made on the marketing site had no install context, so it never synced back to the plugin.<h4>3.5.0</h4> — feat: **elementor:** idempotent, named Kit CSS blocks ([#645](https://github.com/Mumega-com/mcpwp/issues/645)); feat: **elementor:** validate Atomic Elements props against real schema + document the feature; feat: **seo:** classify deprecated schema.org rich-result types ([#615](https://github.com/Mumega-com/mcpwp/issues/615)); feat: **seo:** experimental opt-in GEO/AI-citability score ([#617](https://github.com/Mumega-com/mcpwp/issues/617)); feat: **seo:** schema-placement check + explicit E-E-A-T rubric ([#616](https://github.com/Mumega-com/mcpwp/issues/616)); fix: **elementor:** accept create-side param names on archetype/part list tools ([#640](https://github.com/Mumega-com/mcpwp/issues/640)); fix: **elementor:** correct destructive annotations and elementor_data round-trip typing ([#642](https://github.com/Mumega-com/mcpwp/issues/642)); fix: **elementor:** stop silent data loss on section/container/atomic layout mismatches; fix: **license:** reconnect Freemius when a site is stuck anonymous/pending ([#633](https://github.com/Mumega-com/mcpwp/issues/633)); fix: **rendered-html:** render draft/private Elementor content in-process, not via loopback ([#644](https://github.com/Mumega-com/mcpwp/issues/644)); fix: **security:** block secret option stores from /option and admin-gate /plugin-settings; fix: **security:** block secret option stores from /option and admin-gate /plugin-settings; fix: **security:** harden REST/MCP scope matrix and self-approval gate; fix: **security:** harden REST/MCP scope matrix and self-approval gate; fix: **security:** require admin scope to bypass content-approval gate; fix: **security:** require admin scope to bypass content-approval gate; fix: **security:** restrict non-public content reads to write-scoped keys ([#601](https://github.com/Mumega-com/mcpwp/issues/601)); fix: **seo:** stop /seo/audit fatal and per-post self-fetch storm; fix: **seo:** stop /seo/audit fatal and per-post self-fetch storm<h4>3.4.17</h4> — new(seo): /seo/content-quality gains an optional geo_citability_experimental score (include_geo_experimental=true, off by default) — self-contained answer blocks, question-phrased headings, structured-data presence, explicitly labeled vendor-observed correlation not Google-confirmed, never mixed into the main score. Deliberately doesn't score total word count. Not building an llms.txt generator.<h4>3.4.16</h4> — new(seo): /seo/structured-data flags schema_placement_mismatch when FAQPage/HowTo/QAPage schema describes content not found on the page (Google's March 2026 eligibility rule); /seo/content-quality returns an explicit eeat field with Google's 4-factor E-E-A-T rubric (Experience/Expertise/Authoritativeness/Trustworthiness), each with its own sub-score and evidence, not one aggregate number.<h4>3.4.15</h4> — new(seo): /seo/structured-data classifies each schema @type as active or deprecated_no_rich_result (HowTo, FAQPage, ClaimReview, EstimatedSalary, LearningVideo, SpecialAnnouncement, VehicleListing — confirmed via Google Search Central), without recommending deletion. Book/Course deliberately excluded to avoid false positives.<h4>3.4.14</h4> — new(elementor): dry_run/wp_set_elementor validates Atomic Elements props against their real schema instead of skipping validation, flagging unknown props and the missing {\\\"$$type\\\",\\\"value\\\"} wrapper before writing; wp_add_section/replace_section/edit_section/edit_widget already work with Atomic Elements as-is. new(docs): wp_get_guide(topic=\\\"elementor\\\") documents Atomic Elements — layout modes, structure, prop format, worked example (#618/#622/#623).<h4>3.4.13</h4> — new(elementor): wp_get_widget_schema returns a real deep schema for Atomic Elements (props/types/enums/defaults) built from Elementor's own get_props_schema(), instead of an empty tabs list; covers both atomic leaf widgets and container elements (two different Elementor managers, both now resolve).<h4>3.4.12</h4> — fix(elementor): wp_get_elementor_summary/preview stats were blind to Atomic content elements (no widgetType wrapper), now counted + unwrapped correctly; wp_edit_widget can now edit Atomic elements; found + fixed a real silent-data-loss bug where Elementor's own HTML-cache-rebuild save was stripping nested Atomic elements past a top-level-only integrity check — now a full recursive check that restores verified data (#618/#620).<h4>3.4.11</h4> — fix(elementor): wp_site_info detects Elementor Atomic Elements (Editor V4) — elementor_layout_mode reports \\\"atomic\\\" + new elementor_atomic_active flag; wp_set_elementor rejects atomic payloads up front on non-atomic sites instead of a false success + silent data loss (#618/#619); added missing \\\"e-grid\\\" atomic type.<h4>3.4.10</h4> — fix(elementor): wp_set_elementor rejects \\\"container\\\" elements up front with a clear error when the site's Elementor Container experiment is inactive, instead of a false success followed by an empty page; also restores verified data if Elementor's internal HTML-cache rebuild ever corrupts it. Root cause of #612.<h4>3.4.9</h4> — diagnostic(elementor): every write/delete of _elementor_data now logs post ID, element count, and a full backtrace via error_log() — tracking down #612.<h4>3.4.8</h4> — fix(admin ui): sidebar menu icon was invisible (background square nearly matched WP admin's dark theme); Permissions checkboxes on Create API Key form could overflow off-screen, now wraps. hardening(elementor): wp_set_elementor post-write verification now reads the raw DB row directly, bypassing any persistent object cache, and surfaces the real MySQL error on silent write failures (#612).<h4>3.4.7</h4> — fix(auth): Create API Key form was missing scope checkboxes — every scoped key (including Admin role) silently saved read-only, blocking all write tools. Form now defaults to read+write (+admin for Admin role).<h4>3.4.6</h4> — fix(security): restrict non-public content reads to write-scoped keys (#601).<h4>3.4.5</h4> — fix(security): require admin scope to bypass content-approval gate.<h4>3.4.4</h4> — fix: **seo:** stop /seo/audit fatal and per-post self-fetch storm; fix: **seo:** stop /seo/audit fatal and per-post self-fetch storm<h4>3.4.1</h4> — security: require admin scope for plugin self-update and update-control options; restrict update package URLs to HTTPS + trusted hosts (fixes write-scope→RCE chain)<h4>3.4.0</h4> — feat: GET /openapi.json — OpenAPI 3.0 schema from free-tools registry; ChatGPT GPT Actions support<h4>3.3.9</h4> — fix(ux): staging tools now visible in tools/list on all plans (non-Pro calls return upgrade prompt); MCP server instructions note Pro-gated features when unlicensed<h4>3.3.8</h4> — feat(staging): Pro staging — WP Engine/Kinsta/Pressable adapters + Generic WP-CLI fallback; REST /staging GET/POST/status; 4 MCP tools (wp_get_staging_info, wp_push_to_staging, wp_push_to_live, wp_get_staging_status); push-to-live gated by approval workflow; three new integration providers; SSRF mitigated<h4>3.3.7</h4> — feat(T50): MCP resources/list returns 6 real site resources (site-info, context, pages, posts, design-refs, elementor-status); resources/read proxies to mcpwp/v1 REST with API key forwarding; feat(T51): MCP prompts/list returns 5 named templates (audit-seo, build-page, refresh-content, onboard, design-match); prompts/get fills arguments and returns messages[]; both declared in initialize capabilities<h4>3.3.6</h4> — fix(#575): wp_upload_media_b64 now exposes mime_type in MCP schema; fix(#576): wp_update_menu_item errors include actionable ID-lookup hints; feat(#577): wp_list_media search param + image-reuse guidance; fix(#578): design-reference retry guidance in tool description and missing_image error<h4>3.3.5</h4> — feat: before/after change summary on wp_update_page/wp_update_post (changes[], unchanged[]); structural_changes on wp_set_elementor (sections/widgets before+after); fix(security): sslverify=false in CSS-prime loopback<h4>3.3.4</h4> — Fix(security): SSRF redirect bypass in wp_get_rendered_copy fetcher — redirection=0 was missing; redirect chains could bypass same-host allowlist<h4>3.3.3</h4> — Mutation tool schema docs: wp_create/update_page now documents parent/template/menu_order; wp_create/update_post documents categories and tags; fix(security): SSRF redirect bypass closed — fetchers pass redirection=0 to prevent redirect chains bypassing same-host allowlist<h4>3.3.2</h4> — New: wp_get_rendered_copy tool returns structured visible text from live rendered page (headings, paragraphs, button labels, list items, link text, image alts) — ground truth for copy audits (#569); Fix(security): sslverify=false in wp_get_rendered_html fixed<h4>3.3.1</h4> — New: wp_flush_cache tool flushes WP page cache (W3TC, WP Super Cache, LiteSpeed, WP Rocket, Breeze, Cloudflare) after bulk edits (#568); Elementor write tools surface validation_warnings in response (#571); Fix(security): batch sub-request rate-limit bypass via static flag, not HTTP header (#573); /onboard adds suggested_first_tools + quick_start (#574)<h4>3.3.0</h4> — <h4>3.3.0</h4> — Render-truth validation: every validator now has validation_basis + note; validate_structured_data fetches live JSON-LD from rendered page; validate_internal_links covers Elementor widget links; validate_blocks notes dynamic-render caveat; audit_seo_site shows per-URL basis (#569)<h4>3.2.9</h4> — New: validate_seo_readiness fetches live rendered &lt;head&gt; for published pages; issues reconciled against ground truth; rendered_head + validation_basis in response (#569)<h4>3.2.8</h4> — Fix: SEO readiness detects AIOSEO excerpt fallback (no false 'missing meta description'); apply_internal_link now checks Elementor data for existing links before inserting (#569)<h4>3.2.7</h4> — New: wp_bulk_upload_media tool for migrations (up to 20 URLs, one rate-limit count) (#566)<h4>3.2.6</h4> — REST Pro gate enforced (#564), dead hostname routing removed (#547), rate status identifier fix (#533)<h4>3.2.5</h4><ul><li>Elementor ID dedup (#565), MCP rate-limit fix (#566), CSS verification improvements (#567)</li></ul><h4>3.2.4</h4><ul><li>Security: Encryption key is now stored in a dedicated WordPress option (mcpwp_encryption_key) instead of being derived from AUTH_SALT. AUTH_SALT rotation no longer silently corrupts stored provider credentials. A one-time non-destructive migration re-encrypts existing blobs on first load; blobs that cannot be decrypted are preserved as-is with an admin notice listing affected providers.</li><li>Security: Admin AJAX pro-gate bypass is now restricted to verified admin users with activate_plugins capability, confirmed nonce, and an explicit action allowlist — replacing the open apply_filters hook.</li></ul><h4>3.2.3</h4><ul><li>Improved: screenshots return media-library URLs by default (inline=true for base64).</li><li>Improved: wp_get_elementor drops the duplicate raw-JSON payload (include_raw=true to restore).</li></ul><h4>3.2.2</h4><ul><li>New: Pro tools on Free installs return a clear upgrade-path error (pro_required) instead of \\\"unknown tool\\\".</li><li>Improved: /introspect compact by default (~80% smaller; ?full=true for legacy full schemas).</li><li>Fixed: /option refuses plain-string overwrites of array options (decodes JSON; force_type_change to override).</li><li>Fixed: numeric JSON types for analytics counts and Elementor page_id.</li></ul><h4>3.2.1</h4><ul><li>Maintenance: Internal rebrand cleanup (spai→mcpwp) — cron label, code comments, and admin JS object renamed. Webhook deliveries now also emit X-MCPWP-Signature/X-MCPWP-Event/X-MCPWP-Webhook-ID headers alongside existing X-SPAI-* headers (both sets sent; X-SPAI-* retained for backward-compat). MCP tools/list response now also includes x_mcpwp envelope key alongside x_spai. Bridge migration of legacy sites unchanged.</li></ul><h4>3.2.0</h4><ul><li>New: Minimal OAuth 2.1 authorization server — MCP clients (Claude Desktop, ChatGPT) can now authenticate via browser sign-in. Adds RFC 9728 protected-resource metadata, RFC 8414 authorization-server metadata, PKCE S256 authorize endpoint, and token exchange (authorization_code + refresh_token). X-API-Key authentication is unchanged. Requires oauth_enabled setting + allow-listed redirect URIs to activate.</li><li>Fix: wp_recall PHP 8.x compatibility (#534).</li></ul><h4>3.1.0</h4><ul><li>New: Seamless migration bridge — sites upgrading from the earlier site-pilot-ai build carry over all content, API keys, OAuth access tokens, settings, and licensing entitlement automatically. Existing keys keep authenticating during and after the change; migration is idempotent and non-destructive (originals left intact for rollback).</li><li>New: Dual-prefix authentication — legacy keys and OAuth tokens continue to work alongside new mcpwp_ credentials, with original scopes preserved.</li><li>Compliance: WordPress.org Plugin Check clean (0 errors); the WordPress.org build makes no third-party network calls; GPL-2.0.</li><li>Docs: per-site cutover runbook and verified MCP client connect matrix added.</li></ul><h4>3.0.1</h4><ul><li>Fix: signals fatal on every compute — compute_seo_issues() called private get_issues() and filtered on severity 'critical' (store never writes it); now uses public list_issues(status=open, severity=error).</li><li>Fix: GET /signals lazily computes on first read — closes permanently-empty feed on low-traffic hosts where WP-Cron never fires. Response includes last_computed, partial, skipped_types.</li><li>Fix: compute_pending_updates() no longer hits wordpress.org on web requests — reads cached transient; network refresh is cron-only.</li><li>Improvement: compute() time-budgeted — over-budget signal types skip and preserve stored values; reported via mcpwp_signals_meta.</li><li>Licensing: Freemius single source of truth — removed legacy local trial and Lemon Squeezy store that could independently grant Pro. New get_license_info() accessor guarantees plan/is_pro consistency.</li><li>Hardening (G5): gateway tool-registration contract enforced; unknown tools rejected at tools/call.</li><li>Refactor (G1–G4): split REST Site, tool mega-files, Admin, and Elementor Basic into focused per-surface controllers and trait groups (no behavior change).</li></ul><h4>3.0.0</h4><ul><li>Rebrand: the plugin is now MCPWP throughout — folder, main file, classes, function\\\\/option prefixes, constants, text domain, and REST namespace (mcpwp\\\\/v1). A clean reinstall is recommended; settings and API keys are re-created fresh.</li></ul><h4>2.8.56</h4><ul><li>Fix: front-end fatal error (\\\"Class Spai_Elementor_Chat_Widget not found\\\") when Elementor initialized widgets before the chat-widget class was defined under certain plugin load orders. Widget registration is now guarded and skips safely instead of crashing the site.</li><li>Fix: capability detection now refreshes immediately when a plugin is activated or deactivated. The capabilities response (woocommerce, learnpress, etc.) was cached up to an hour, so a newly-enabled integration could report as unavailable — making connected AI agents blind to tools that were actually ready. The cache is now cleared on plugin activate/deactivate.</li></ul><h4>2.8.55</h4><ul><li>Improvement: Admin JavaScript consolidated into a single enqueued, cacheable asset — inline scripts removed from Setup, Tools, Chat, and Integrations pages; data passed via wp_localize_script.</li><li>Fix: PostHog analytics now initializes exactly once (was double-initialized on Tools and Integrations pages).</li><li>Fix: admin script now loads on every MCPWP page (Control Room and Chat previously missing it).</li><li>Security: chat history JSON data element is now tag-escaped, preventing a stored message containing markup from breaking out of the script element.</li><li>Design system: added surface/border/text and status color tokens plus a radius scale; consolidated two badge styles into one; replaced hardcoded values with tokens and status classes.</li></ul><h4>2.8.54</h4><ul><li>Improvement: Control Room — empty-state guidance, in-page section navigation, change summaries on pending approvals, and a confirm before applying changes.</li><li>Improvement: Library — design-reference form split into Required/Optional groups, consistent cards, clearer empty states.</li><li>Improvement: Integrations — upgrade link always shown on Pro cards with per-provider unlock descriptions; version pill; translatable status messages.</li><li>Accessibility: input label associations, a 1024px responsive breakpoint, fluid chat height.</li></ul><h4>2.8.53</h4><ul><li>New: Setup onboarding checklist — 3-step guide (generate key → connect → first tool call) so new users always know the next step.</li><li>Improvement: Chat shows a \\\"connect OpenAI or Gemini\\\" notice when no AI provider is configured, instead of silently degrading.</li><li>Accessibility: tool toggles now show a visible keyboard focus ring (WCAG 2.1 AA).</li><li>Polish: clearer \\\"Update channel\\\" labeling; removed a stale admin template; design-system cleanups.</li></ul><h4>2.8.52</h4><ul><li>New: wp_keyword_research — keyless keyword research via Google Suggest. Expands a seed phrase into related keywords and grouped questions (long-tail terms, content ideas, SEO topic discovery). No API key required.</li></ul><h4>2.8.51</h4><ul><li>Fix: wp_bulk_find_replace no longer returns \\\"not found\\\" for searches containing HTML tags or URL slashes — the pre-check ran on raw JSON (where &lt; is stored as \\\\u003c and / as \\\\/); it now matches on the decoded element tree.</li><li>Fix: wp_bulk_find_replace no longer corrupts page structure when a search term overlaps Elementor vocabulary — structural keys (elType, widgetType, id, isInner, structure) are excluded from replacement.</li><li>Hardening: find-replace search term now requires a minimum length of 1.</li><li>Tests: added Elementor find/replace regression suite.</li></ul><h4>2.8.50</h4><ul><li>New: spai_register_tools filter — third-party plugins register MCP tools with a simple array, no PHP class required. Full dispatch, category, scope, and destructive/open_world hints supported.</li><li>Improvement: 56 tool descriptions rewritten for BM25 search accuracy — more specific verbs, synonyms, and use-case context.</li><li>Docs: openapi-chatgpt.yaml updated to v2.8.50 — adds /onboard, menus, approvals, full Elementor edit suite, /batch, and 24 other missing endpoints. 49 operations total.</li></ul><h4>2.8.49</h4><ul><li>New: Blueprint Library — wp_list_site_blueprints/wp_deploy_site_blueprint/wp_extract_site_blueprint. Deploy 5 starter site structures (law firm, restaurant, SaaS, real estate, portfolio) or save custom blueprints from your existing site.</li><li>New: Chat Excellence — multi-model routing (OpenAI GPT-4o mini, Gemini 2.5 Flash, Workers AI), SSE streaming, persistent history per user, Clear button, model indicator.</li><li>New: Destructive tool confirmation in chat — delete/rollback tools require explicit OK before executing.</li><li>New: Chat model picker in Settings.</li></ul><h4>2.8.48</h4><ul><li>New: Dynamic site memory — wp_remember/wp_recall/wp_forget/wp_list_memories. AI decisions and brand rules persist across sessions in structured namespaces.</li><li>New: Proactive site signals — wp_get_signals surfaces stale content, broken Elementor data, missing featured images, draft accumulation, plugin updates, and SEO issues without being asked.</li><li>New: Site Signals panel in Control Room with severity indicators and direct edit links.</li></ul><h4>2.8.47</h4><ul><li>New: White-label mode — agency name, logo, primary color, and chat greeting configurable in WP Admin > Settings.</li><li>New: [mcpwp_chat] shortcode renders branded floating chat widget on any page or post.</li><li>New: Elementor chat widget wrapping the shortcode (available in Elementor widget panel).</li><li>New: Agency custom hostname routing in proxy worker (CNAME ai.agency.com → proxy.mcpwp.net via KV).</li></ul><h4>2.8.46</h4><ul><li>New: AI action audit log — every write-tool call logged to DB with before/after state snapshots (EU AI Act compliance).</li><li>New: One-click rollback for post/page updates and Elementor writes in Control Room.</li><li>New: CSV export of action log for compliance reporting.</li><li>New: Configurable log retention (default 90 days, daily auto-prune).</li></ul><h4>2.8.45</h4><ul><li>New: Server-side MCP tool analytics — anonymous tool call data (tool name, success/failure, duration) sent to PostHog when enabled. Opt-in for free tier, opt-out for paid. No site content or PII collected.</li><li>New: Site support UUID in Settings page.</li><li>New: PostHog token and host configurable via WP Admin > Integrations.</li><li>Docs: Privacy section added to readme.txt per WP.org guidelines.</li></ul><h4>2.8.44</h4><ul><li>New: PostHog analytics integration — configure token via WP Admin > Integrations. Tracks 10 key admin actions (API key copy, connection test, upgrade click, key create/revoke, integration save/remove, tool toggle, client tab switch).</li><li>Fix: PostHog token no longer hardcoded — removed default public token, must be configured per-site.</li></ul><h4>2.8.43</h4><ul><li>Fix: wp_set_template_conditions accepts positional array form [\\\"include\\\",\\\"singular\\\",\\\"product\\\"] — was flattening to include>general.</li><li>Fix: wp_get_elementor_globals returns both system_typography/custom_typography and system_colors/custom_colors.</li><li>Fix: wp_upload_media_from_url now exposes filename, title, alt params in tools/list.</li><li>Fix: Elementor v4 atomic elements skip settings key validation (they use props/styles).</li><li>Fix: Form widget schema includes button color keys — removes false-positive validator warnings.</li></ul><h4>2.8.42</h4><ul><li>Fix: Theme handler corrupted entries removed — only Astra, GeneratePress, Kadence remain with accurate settings_type.</li><li>Fix: Integrations admin page JS handlers now implemented (save/remove/test connection).</li><li>Fix: version.json download_url corrected (was 404).</li><li>Polish: Admin UI inline styles extracted to CSS classes.</li></ul><h4>2.8.41</h4><ul><li>Fix: Scoped API key scope enforcement — submitted scopes now respected with role-based ceiling; non-admin roles capped at read+write.</li><li>Fix: SEO MCP tool contract — normalized title/description/canonical_url fields, bulk items alias, Google Indexing tools fixed.</li><li>New: wp_create/get/update_elementor_custom_code — Elementor Pro custom code snippets with location, conditions, and dry_run.</li></ul><h4>2.8.40</h4><ul><li>Fix: wp_validate_seo_readiness transport deserialize error on large sites — graph query reduced from 500 to 100 posts.</li><li>Fix: MCP tools/call handles json_encode failure gracefully.</li><li>Polish: MCPWP admin shell with CSS design tokens, dark product headers, shared card/badge/toggle components; admin assets load by page slug (#342, #344).</li><li>Assets: Refreshed WordPress.org banner, icon, and screenshots to MCPWP branding (#341).</li></ul><h4>2.8.38</h4><ul><li>New: wp_update_media — update alt text, title, caption, or description on existing attachments without re-uploading.</li></ul><h4>2.8.37</h4><ul><li>Fix: PHP fatal in wp_seo_audit_site and wp_validate_seo_readiness — extract_internal_links_from_content() moved to base class.</li><li>Fix: Disabled tool categories now enforced at execution time, not just discovery.</li><li>Fix: Elementor custom-code tools hidden from tools/list when Elementor Pro is not installed.</li></ul><h4>2.8.36</h4><ul><li>Fix: wp_bulk_find_replace operates on decoded element tree to prevent JSON corruption.</li><li>New: wp_get_kit_css and wp_set_kit_css for Elementor kit global CSS.</li></ul>"
}
