{"id":326172,"date":"2026-06-29T08:49:54","date_gmt":"2026-06-29T08:49:54","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/agentready-ai-readiness-kit\/"},"modified":"2026-06-29T09:00:35","modified_gmt":"2026-06-29T09:00:35","slug":"mokhai-agent-readiness-kit","status":"publish","type":"plugin","link":"https:\/\/ast.wordpress.org\/plugins\/mokhai-agent-readiness-kit\/","author":18564449,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.4.0","stable_tag":"0.4.0","tested":"7.0","requires":"6.9","requires_php":"7.4","requires_plugins":null,"header_name":"Mokhai - Agent Readiness Kit","header_author":"Mohamed Khaled","header_description":"Help AI agents read your WordPress site correctly: llms.txt, clean Markdown views, structured data, and a readiness score \u2014 from one Context Profile.","assets_banners_color":"655ec7","last_updated":"2026-06-29 09:00:35","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/Ref34t\/mokhai-agent-readiness-kit","header_author_uri":"https:\/\/profiles.wordpress.org\/mokhaled","rating":0,"author_block_rating":0,"active_installs":0,"downloads":58,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","faq","changelog"],"tags":{"0.4.0":{"tag":"0.4.0","author":"mokhaled","date":"2026-06-29 09:00:35"}},"upgrade_notice":{"0.4.0":"<p>Public launch on WordPress.org. Refreshed listing assets and readme; no functional change and no migration \u2014 safe in-place upgrade.<\/p>","0.2.0":"<p>Adds AI Assistant Preview, WordPress Abilities API + MCP, and a multi-channel discovery sub-score, plus fixes for JSON-LD output, stale cron recovery, and Markdown cleanup. Safe in-place upgrade \u2014 the Context Score cache auto-invalidates.<\/p>","0.1.0":"<p>First public release. Install on WordPress 6.9+ with PHP 7.4+.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3589684,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3589684,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3589684,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3589684,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.4.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3589684,"resolution":"1","location":"assets","locale":"","width":1280,"height":720},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3589684,"resolution":"2","location":"assets","locale":"","width":1280,"height":720},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3589684,"resolution":"3","location":"assets","locale":"","width":1280,"height":720},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3589684,"resolution":"4","location":"assets","locale":"","width":1280,"height":720}},"screenshots":{"1":"Context Profile \u2014 the single source of truth for which CPTs and statuses are exposed to agents","2":"AI Assistant Preview \u2014 see exactly what an agent reads: raw HTML, the clean Markdown View, and the <code>\/llms.txt<\/code> line, side by side","3":"LLMs Index \u2014 <code>\/llms.txt<\/code> admin UI with editorial entries and LLM-powered descriptions","4":"Context Score \u2014 0\u2013100 readiness audit with seven sub-scores and actionable fixes"}},"plugin_section":[],"plugin_tags":[15643,2353,244604,4608,1117],"plugin_category":[55],"plugin_contributors":[246178],"plugin_business_model":[],"class_list":["post-326172","plugin","type-plugin","status-publish","hentry","plugin_tags-agents","plugin_tags-ai","plugin_tags-llms-txt","plugin_tags-markdown","plugin_tags-schema","plugin_category-seo-and-marketing","plugin_contributors-mokhaled","plugin_committers-mokhaled"],"banners":{"banner":"https:\/\/ps.w.org\/mokhai-agent-readiness-kit\/assets\/banner-772x250.png?rev=3589684","banner_2x":"https:\/\/ps.w.org\/mokhai-agent-readiness-kit\/assets\/banner-1544x500.png?rev=3589684","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/mokhai-agent-readiness-kit\/assets\/icon-128x128.png?rev=3589684","icon_2x":"https:\/\/ps.w.org\/mokhai-agent-readiness-kit\/assets\/icon-256x256.png?rev=3589684","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/mokhai-agent-readiness-kit\/assets\/screenshot-1.png?rev=3589684","caption":"Context Profile \u2014 the single source of truth for which CPTs and statuses are exposed to agents"},{"src":"https:\/\/ps.w.org\/mokhai-agent-readiness-kit\/assets\/screenshot-2.png?rev=3589684","caption":"AI Assistant Preview \u2014 see exactly what an agent reads: raw HTML, the clean Markdown View, and the <code>\/llms.txt<\/code> line, side by side"},{"src":"https:\/\/ps.w.org\/mokhai-agent-readiness-kit\/assets\/screenshot-3.png?rev=3589684","caption":"LLMs Index \u2014 <code>\/llms.txt<\/code> admin UI with editorial entries and LLM-powered descriptions"},{"src":"https:\/\/ps.w.org\/mokhai-agent-readiness-kit\/assets\/screenshot-4.png?rev=3589684","caption":"Context Score \u2014 0\u2013100 readiness audit with seven sub-scores and actionable fixes"}],"raw_content":"<!--section=description-->\n<p>Mokhai is an open-source WordPress plugin that turns your site into a first-class citizen of the AI-agent web \u2014 readable today, actionable next. A single <strong>Context Profile<\/strong> (configured once under Tools \u2192 Context) is the source of truth for every agent-facing surface \u2014 what's exposed, how it's served, and how it's scored.<\/p>\n\n<p>Mokhai ships seven coherent modules, all driven by one Context Profile:<\/p>\n\n<ul>\n<li><strong>Markdown Views<\/strong> \u2014 deterministic HTML \u2192 Markdown rendering for any public URL, with three URL forms (<code>.md<\/code> path, <code>?format=md<\/code> query, <code>Accept: text\/markdown<\/code> content negotiation) and uniform 404 on denial. Per-post cache with content-hash invalidation, Gutenberg sidebar preview, WP-CLI command, REST endpoint for admin tooling.<\/li>\n<li><strong>LLMs Index<\/strong> \u2014 <code>\/llms.txt<\/code> generator that publishes a discovery surface for AI agents, with conflict detection against <code>robots.txt<\/code>, an editorial entries admin UI for site owners to add curated entries, and an optional LLM-powered pass that drafts entry descriptions from post content.<\/li>\n<li><strong>Context Score<\/strong> \u2014 0\u2013100 readiness audit across seven weighted sub-scores (discoverability, description coverage, schema coverage, exposure safety, integration health, Markdown conversion quality, multi-channel discovery), surfaced in an admin page, Site Health, and <code>wp ai-readiness-kit context-score recompute<\/code>. Includes an optional LLM-generated narrative (with a rule-based fallback) explaining the score and the highest-leverage fixes.<\/li>\n<li><strong>Schema Coordination<\/strong> \u2014 detects whether your SEO plugin already emits JSON-LD; if not, optionally emits a native WebSite + Organization + per-content schema set so the schema sub-score is achievable without a third-party SEO plugin. Defers gracefully when an SEO plugin is already covering the surface.<\/li>\n<li><strong>AI Assistant Preview<\/strong> \u2014 an admin pane that shows any post exactly as an AI assistant consumes it: raw HTML, the Markdown View, and the live <code>\/llms.txt<\/code> line side by side, plus an on-demand \"sample AI summary\" so you can sanity-check what an agent would say about the page.<\/li>\n<li><strong>Agent Abilities + MCP<\/strong> \u2014 exposes core plugin operations (audit run, profile read, exposure toggle, <code>\/llms.txt<\/code> regenerate, Markdown preview) through the WordPress Abilities API, and surfaces them to MCP clients via the WordPress MCP adapter. Every ability is <code>manage_options<\/code>-gated.<\/li>\n<li><strong>Multi-channel discovery<\/strong> \u2014 a seventh Context Score sub-score crediting additional agent-discovery surfaces (<code>ai.txt<\/code>, <code>\/.well-known\/<\/code> declarations, OpenAPI) beyond <code>\/llms.txt<\/code>, so a site running several discovery channels scores higher than one running only one.<\/li>\n<\/ul>\n\n<p>The plugin is fully free, GPL-2.0+, with no paid tier and no hosted backend. Every module is independently toggleable from the Context Profile. No content leaves your server. The plugin makes no external HTTP calls; AI providers configured via the WP AI Client (an optional dependency) are only consulted by modules that explicitly opt in, and every deterministic surface (Markdown Views, \/llms.txt, the rule-based score, the gap-fill schema) runs fully locally without an AI provider.<\/p>\n\n<h3>Markdown Views<\/h3>\n\n<p>Markdown Views exposes any public URL as a clean Markdown variant. The intended consumer is an AI agent that's discovered a URL (typically via \/llms.txt) and wants the raw content without HTML chrome, header\/footer\/sidebar markup, or JavaScript-rendered widgets.<\/p>\n\n<h4>Three URL forms<\/h4>\n\n<p>All three return the same body. Pick whichever matches your client.<\/p>\n\n<ul>\n<li><code>https:\/\/example.com\/about-us.md<\/code> \u2014 path-form (requires pretty permalinks; aligned with the llms.txt ecosystem convention)<\/li>\n<li><code>https:\/\/example.com\/about-us\/?format=md<\/code> \u2014 query-form (works regardless of permalink structure)<\/li>\n<li><code>Accept: text\/markdown<\/code> header on the canonical URL \u2014 content-negotiation form<\/li>\n<\/ul>\n\n<p>The 200 response always carries <code>Content-Type: text\/markdown; charset=utf-8<\/code>, <code>X-Robots-Tag: noindex<\/code> (so search engines don't index the raw view as a duplicate of the HTML), and <code>Cache-Control: no-store, must-revalidate<\/code>.<\/p>\n\n<h4>Exposure rules<\/h4>\n\n<p>A URL returns 404 with no body \u2014 never a partial content leak \u2014 when any of the following is true:<\/p>\n\n<ul>\n<li>The post's CPT is not in the Context Profile's \"Exposed CPTs\" list<\/li>\n<li>The post's status is not in the \"Exposed statuses\" list (defaults to <code>publish<\/code> only)<\/li>\n<li>The post is password-protected<\/li>\n<li>A subscriber to the <code>agentready_post_is_noindexed<\/code> filter returns true (the extension point for SEO-plugin noindex coordination \u2014 wire it from your theme \/ a companion plugin in v0.1; native Yoast \/ Rank Math \/ AIOSEO subscribers ship in a follow-up release)<\/li>\n<li>The Markdown Views module is toggled off in the Context Profile<\/li>\n<\/ul>\n\n<p>All denial paths produce the same 404 shape \u2014 admin debugging via the REST endpoint or the <code>wp ai-readiness-kit md preview<\/code> command surfaces the specific reason.<\/p>\n\n<h4>Inspection surfaces<\/h4>\n\n<ul>\n<li><strong>Gutenberg sidebar panel<\/strong> \u2014 opens automatically in the document settings sidebar when editing a post. Shows the current MD rendering, the visibility verdict, and the cache state (cached vs miss, walker version, generated_at).<\/li>\n<li><strong>WP-CLI<\/strong> \u2014 <code>wp ai-readiness-kit md preview &lt;post-id-or-url&gt;<\/code>. Supports <code>--format=wrapped<\/code> for YAML-front-matter output suitable for piping into LLM tooling, <code>--show-meta<\/code> for cache diagnostics on stderr, and <code>--bypass-exposure<\/code> (requires manage_options) for inspecting hidden posts without serving them.<\/li>\n<li><strong>REST endpoint<\/strong> \u2014 <code>GET \/wp-json\/ai-readiness-kit\/v1\/markdown-views\/preview?post=&lt;id&gt;<\/code>. Authentication via WP cookie \/ nonce; permission gated on <code>edit_post<\/code> for the target post. Used by the Gutenberg sidebar; available to third-party admin tooling.<\/li>\n<\/ul>\n\n<h3>LLMs Index (\/llms.txt)<\/h3>\n\n<p>Mokhai publishes a <code>\/llms.txt<\/code> discovery surface for AI agents \u2014 the de-facto convention for declaring which URLs on a site are worth fetching as agent context. The generator is driven by the Context Profile: only CPTs and statuses you've exposed appear in the index. Conflict detection surfaces when <code>robots.txt<\/code> already covers the same paths; an admin notice points to the conflict so coverage isn't silently inconsistent.<\/p>\n\n<h4>Editorial entries<\/h4>\n\n<p>Most sites have URLs that aren't WordPress posts but are valuable agent context \u2014 pricing pages, brand guidelines, support knowledge bases hosted elsewhere. The editorial entries admin UI lets site owners add curated entries with custom titles and descriptions; they appear in <code>\/llms.txt<\/code> alongside the auto-generated post entries.<\/p>\n\n<h4>LLM-powered descriptions<\/h4>\n\n<p>Optionally, an LLM pass drafts the per-entry descriptions from the post content (uses the WP AI Client provider configured at the site level). The deterministic floor \u2014 title-only, no description \u2014 runs without an AI provider.<\/p>\n\n<p>Posts whose body is below a minimum length are skipped by the LLM pass rather than padded with filler (e.g. a bare \"Title is available at URL.\"). Such entries show a \"skipped\" status in the Descriptions tab and fall back to the title-only floor in <code>\/llms.txt<\/code>. Adjust the threshold with the <code>agentready_description_min_content_chars<\/code> filter.<\/p>\n\n<h4>WP-CLI<\/h4>\n\n<ul>\n<li><code>wp ai-readiness-kit llms-txt status<\/code> \u2014 current generation state, conflict report, entry count<\/li>\n<li><code>wp ai-readiness-kit llms-txt regen<\/code> \u2014 force regeneration<\/li>\n<li><code>wp ai-readiness-kit llms-txt preview<\/code> \u2014 output the current <code>\/llms.txt<\/code> content to stdout<\/li>\n<\/ul>\n\n<h3>Context Score<\/h3>\n\n<p>Context Score is the 0\u2013100 readiness audit answering \"how prepared is this site for AI agent traffic?\". It combines seven weighted sub-scores:<\/p>\n\n<ol>\n<li><strong>Discoverability (weight 10)<\/strong> \u2014 <code>\/llms.txt<\/code> cache populated, at least one CPT exposed, entries published, no rewrite conflicts overriding the route<\/li>\n<li><strong>Description coverage (weight 15)<\/strong> \u2014 share of exposed entries that have a curated description (post excerpt or LLM-generated cache from the descriptions module)<\/li>\n<li><strong>Schema coverage (weight 10)<\/strong> \u2014 JSON-LD is being emitted, either by a detected SEO plugin (Yoast \/ Rank Math \/ AIOSEO \/ The SEO Framework) or by Mokhai's native gap-fill emitter when the Context Profile toggle is on<\/li>\n<li><strong>Exposure safety (weight 15)<\/strong> \u2014 exposed statuses are limited to <code>publish<\/code> (no risky non-publish exposures) and at least one CPT is configured explicitly rather than implicitly<\/li>\n<li><strong>Integration health (weight 15)<\/strong> \u2014 LLM features \u2194 AI Client posture are consistent (no silent-degrade trap) and no <code>\/llms.txt<\/code> conflicts are unresolved<\/li>\n<li><strong>Markdown conversion quality (weight 25)<\/strong> \u2014 mean quality score across the Markdown Views cache and the percentage of cached posts above the cleanup threshold<\/li>\n<li><strong>Multi-channel discovery (weight 10)<\/strong> \u2014 how many of the four plugin-served agent-discovery surfaces are present (<code>\/llms.txt<\/code>, <code>ai.txt<\/code>, <code>\/.well-known\/ai-layer<\/code>, <code>\/.well-known\/llms-policy.json<\/code>); all four = 100, so a plugin-only site can reach full marks. OpenAPI is detected and credited as a bonus channel for sites exposing an API but does not change the score. Sibling-provider plugins (e.g. AI Layer) are detected and credited via the filterable <code>ai_readiness_kit_multi_channel_providers<\/code> registry.<\/li>\n<\/ol>\n\n<p>The score is surfaced in three places:<\/p>\n\n<ul>\n<li><strong>Tools \u2192 Context \u2192 Context Score<\/strong> \u2014 the full breakdown with per-sub-score detail<\/li>\n<li><strong>Site Health<\/strong> \u2014 the headline score and the highest-leverage area to improve<\/li>\n<li><strong>WP-CLI<\/strong> \u2014 <code>wp ai-readiness-kit context-score recompute<\/code> for scripted audits<\/li>\n<\/ul>\n\n<p>An LLM-generated narrative (uses the WP AI Client provider) explains the score in plain English and names the highest-leverage fixes. A rule-based narrative ships as a fallback for sites without an AI provider configured.<\/p>\n\n<h3>Schema Coordination<\/h3>\n\n<p>When you have an SEO plugin (Yoast, Rank Math, AIOSEO, The SEO Framework) active and emitting JSON-LD, Mokhai defers schema emission to them entirely \u2014 no competing markup, no duplicate type declarations. When no SEO plugin is emitting schema, Mokhai can optionally emit a native WebSite + Organization + per-content schema set so the schema sub-score in Context Score is achievable without a third-party SEO plugin. The toggle lives in the Context Profile; default is off (gap-fill behaviour kicks in only when explicitly enabled).<\/p>\n\n<h3>AI Assistant Preview<\/h3>\n\n<p>The AI Assistant Preview pane (Tools \u2192 Context) answers a question every site owner eventually asks: \"what does an AI assistant actually see when it reads this page?\" Pick any exposed URL and the pane renders three views side by side \u2014 the raw HTML, the Markdown View an agent fetches (proxied through the same converter as the live <code>.md<\/code> surface, so the no-hallucination guard applies), and the exact <code>\/llms.txt<\/code> line for that entry. A \"Sample AI Summary\" box generates an on-demand, synchronous summary using the configured WP AI Client provider (no cron, no background queue \u2014 it runs and caches in place), so you can sanity-check the agent's-eye view of a page before publishing. The summary degrades gracefully (a structured hint, never a raw error) when no AI provider is configured.<\/p>\n\n<h3>Agent Abilities (MCP)<\/h3>\n\n<p>Mokhai registers an <code>ai-readiness-kit<\/code> ability category and five core WordPress Abilities (WP 6.9+): audit-run, profile-read, profile-set-exposure, llms-txt-regenerate, and md-view-preview. Each is a thin wrapper over an existing service, gated on <code>manage_options<\/code>, and exposed via the core <code>wp-abilities\/v1<\/code> REST surface. When the WordPress MCP adapter is installed, these abilities are also reachable by MCP clients (the abilities are flagged <code>meta.mcp.public<\/code>), making the plugin's operations callable by agent runtimes \u2014 a step from agent-<em>readable<\/em> toward agent-<em>usable<\/em>. The MCP flag is inert when no adapter is present, so the abilities work standalone.<\/p>\n\n<h3>Privacy and Storage<\/h3>\n\n<p>Mokhai stores rendered Markdown in a custom table named <code>{$wpdb-&gt;prefix}agentready_md_cache<\/code>, with one row per published post that has been requested at least once as Markdown \u2014 holding the Markdown body, an integrity hash of the source content, and the timestamp at which it was generated. The cache is invalidated automatically when a post is saved, trashed, or deleted.<\/p>\n\n<p>Context Score audit results are cached in the <code>agentready_context_score_cache<\/code> <code>wp_options<\/code> entry (the most-recent breakdown only \u2014 overwritten on each recompute).<\/p>\n\n<p>No content leaves your server. The plugin makes no external HTTP calls and ships no third-party analytics. AI providers configured via the WP AI Client (an optional dependency) are only consulted by modules that explicitly opt in; the deterministic surfaces (Markdown Views, \/llms.txt, rule-based score narrative, gap-fill schema) all run fully locally without an AI provider.<\/p>\n\n<p>Both cache tables are dropped on plugin uninstall (not on deactivation \u2014 deactivate is reversible, uninstall is the explicit \"I'm done\" gesture).<\/p>\n\n<h3>Configuration<\/h3>\n\n<p>Under <strong>Tools \u2192 Context<\/strong>, set:<\/p>\n\n<ul>\n<li><strong>Exposed CPTs<\/strong> \u2014 the list of post types to expose to agents. Default: empty (safe-by-default \u2014 a fresh install exposes nothing).<\/li>\n<li><strong>Exposed statuses<\/strong> \u2014 the list of post statuses to expose. Default: <code>publish<\/code> only.<\/li>\n<\/ul>\n\n<p>The same screen exposes the LLM cleanup toggle (Markdown Views auto-cleanup pass), the LLM descriptions toggle (auto-drafted <code>\/llms.txt<\/code> entry descriptions), and the native Schema emission toggle (default off \u2014 opt in to satisfy Context Score's schema sub-score without a third-party SEO plugin). Each toggle gracefully degrades when the WP AI Client is unconfigured.<\/p>\n\n<p>To turn Markdown Views off without uninstalling:<\/p>\n\n<pre><code>wp eval \"$p = get_option('agentready_context_profile'); $p['markdown_views_enabled'] = false; update_option('agentready_context_profile', $p);\"\n<\/code><\/pre>\n\n<p>The module respects the toggle without latency \u2014 flipping back to true is instant; the cache table is preserved across toggle cycles.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20mokhai%20require%20an%20ai%20api%20key%3F\"><h3>Does Mokhai require an AI API key?<\/h3><\/dt>\n<dd><p>No. Every deterministic surface (Markdown Views, \/llms.txt floor, rule-based Context Score narrative, gap-fill JSON-LD emission) runs fully locally with no external calls. Modules that benefit from an LLM (the Markdown cleanup pass, \/llms.txt entry-description drafting, the LLM-narrated Context Score) require the optional WP AI Client to be configured, but each is independently toggleable and not load-bearing for the core agent-readiness contract.<\/p><\/dd>\n<dt id=\"how%20does%20mokhai%20interact%20with%20my%20seo%20plugin%3F\"><h3>How does Mokhai interact with my SEO plugin?<\/h3><\/dt>\n<dd><p>For JSON-LD: when an SEO plugin (Yoast, Rank Math, AIOSEO, The SEO Framework) is active, Mokhai emits nothing competing \u2014 schema is theirs. When no SEO plugin is emitting JSON-LD, you can optionally enable Mokhai's native gap-fill emission from the Context Profile. For noindex: Mokhai ships an <code>agentready_post_is_noindexed<\/code> filter the Markdown Views handler honours; v0.1 leaves the SEO-plugin subscriber unwired (a theme or companion plugin can subscribe it today; native Yoast \/ Rank Math \/ AIOSEO subscribers ship in a follow-up release).<\/p><\/dd>\n<dt id=\"how%20is%20this%20different%20from%20existing%20%2Fllms.txt%20plugins%3F\"><h3>How is this different from existing \/llms.txt plugins?<\/h3><\/dt>\n<dd><p>\/llms.txt is one surface among several. Mokhai ships the integrated reading layer (Markdown views), the discovery layer (\/llms.txt with editorial entries and LLM-powered descriptions), the audit layer (Context Score across seven sub-scores), and the schema coordination layer as a single coherent unit driven by one Context Profile. Most existing plugins target one of these surfaces in isolation; Mokhai treats them as a coordinated stack.<\/p><\/dd>\n<dt id=\"what%27s%20on%20the%20roadmap%20after%20v0.2%3F\"><h3>What's on the roadmap after v0.2?<\/h3><\/dt>\n<dd><p>v0.2 shipped the AI Assistant Preview pane, the WordPress Abilities API + MCP integration, and the multi-channel discovery sub-score. Looking ahead: a fuller agent-<em>actionable<\/em> layer (callable tools via WebMCP \/ <code>navigator.modelContext<\/code>), agent-activity analytics (per-bot counters), and a richer <code>\/.well-known\/llms-policy.json<\/code> policy-declaration surface.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.4.0 \u2014 2026-06-29<\/h4>\n\n<p><strong>Public-launch release.<\/strong> The plugin is now live on the WordPress.org Plugin Directory as \"Mokhai - Agent Readiness Kit\" (slug <code>mokhai-agent-readiness-kit<\/code>). This release is launch housekeeping \u2014 no functional change, no migration:<\/p>\n\n<ul>\n<li>Refreshed Plugin Directory assets \u2014 new banner, icon, and screenshots.<\/li>\n<li>Polished readme copy for the public listing.<\/li>\n<li>Repository links consolidated under the <code>mokhai-agent-readiness-kit<\/code> name (Plugin URI, package metadata). REST routes, WP-CLI commands, abilities, option keys, and all stored data are unchanged \u2014 existing installs upgrade in place with no action required.<\/li>\n<\/ul>\n\n<h4>0.3.2 \u2014 2026-06-21<\/h4>\n\n<p><strong>Rename to \"Mokhai - Agent Readiness Kit\"<\/strong> (text domain <code>mokhai-agent-readiness-kit<\/code>). wp.org plugin review rejected \"Agentable\" as colliding with existing third-party projects and required a name and slug that are clearly ours, with a distinctive leading term. \"Mokhai\" satisfies that. REST, WP-CLI, abilities, option keys, and all stored data are unchanged \u2014 existing installs upgrade with no migration. (#259, AgDR-0062)<\/p>\n\n<p>Also ships the following changes that landed on <code>main<\/code> since 0.3.1:<\/p>\n\n<ul>\n<li><code>\/llms.txt<\/code> now warns in the admin when a static <code>robots.txt<\/code> blocks the <code>\/llms.txt<\/code> reference, so the conflict isn't silent. (#245, #250)<\/li>\n<li><code>\/llms.txt<\/code> emits the site header on an otherwise-empty index instead of returning a blank body. (#244, #249)<\/li>\n<li>WooCommerce transactional pages (cart, checkout, account) are now excluded from the <code>\/llms.txt<\/code> index. (#243, #248)<\/li>\n<li>Markdown Views falls back to the raw <code>post_title<\/code> when a filtered title comes back empty, so titled posts no longer render untitled. (#242, #247)<\/li>\n<li>Markdown URL mapper now guards the root \/ front-page URL, fixing mapping on the home route. (#241, #246)<\/li>\n<\/ul>\n\n<h4>0.3.1 \u2014 2026-06-14<\/h4>\n\n<p>Rename to <strong>Agentable<\/strong> (text domain <code>agentable<\/code>). The previous \"AgentReady\" brand collided with an existing third party (agentready.org), so the plugin is renamed to a distinct, ownable name that also fits the roadmap \u2014 sites readable today, actionable next. REST, WP-CLI, abilities, and stored data keys are unchanged, so existing installs upgrade with no migration. Also makes root-served-file detection (<code>llms.txt<\/code>, <code>ai.txt<\/code>, <code>.well-known\/*<\/code>) subdirectory-install aware via <code>get_home_path()<\/code> instead of assuming the install root is the web root. (#230, AgDR-0060)<\/p>\n\n<h4>0.3.0 \u2014 2026-06-12<\/h4>\n\n<p>Polish release. Refinements surfaced through a full live UX walkthrough of the v0.2.0 admin surfaces \u2014 score-narrative correctness, clearer labels, and a more discoverable plugin. Also renamed to \"AgentReady \u2013 AI Readiness Kit\"; REST, WP-CLI, and stored data keys are unchanged. (#224, AgDR-0059)<\/p>\n\n<p><strong>Improved<\/strong><\/p>\n\n<ul>\n<li><strong>Multi-channel discovery is reachable at 100 for plugin-only sites<\/strong> \u2014 the four plugin-served discovery channels (<code>\/llms.txt<\/code>, <code>ai.txt<\/code>, <code>\/.well-known\/ai-layer<\/code>, <code>\/.well-known\/llms-policy.json<\/code>) now score 100 on their own; OpenAPI is credited as a bonus channel for API-exposing sites rather than capping the score at 80. (#212, AgDR-0058)<\/li>\n<li><strong>\"Content readability\" renamed to \"Description coverage\"<\/strong> across the Context Score page, Site Health, and readme, to match what the sub-score actually measures (curated <code>\/llms.txt<\/code> description coverage). Internal key unchanged. (#211)<\/li>\n<li><strong>Plugin is now findable in wp-admin<\/strong> \u2014 the Tools entries read \"AI Readiness \u2014 Context\" \/ \"AI Readiness \u2014 Score\", and the Plugins list carries a \"Settings\" link to the Context Profile. (#207)<\/li>\n<li><strong>Quality floor for auto-descriptions<\/strong> \u2014 near-empty posts are skipped (distinct \"skipped\" status) instead of padded with filler like \"Title is available at URL.\"; threshold filterable via <code>agentready_description_min_content_chars<\/code>. (#214)<\/li>\n<\/ul>\n\n<p><strong>Fixes<\/strong><\/p>\n\n<ul>\n<li>Schema-coverage narrative no longer reads \"No structured data was detected\" beside a 100\/100 score when native JSON-LD emission is on; the stale \"future release\" fix advice is replaced with the reachable Context Profile action. (#208)<\/li>\n<li>Content-readability fix advice now points to the Descriptions tab \"Regenerate stale descriptions\" GUI path and stops telling users to enable a setting that is already on. (#209)<\/li>\n<li>The multi-channel discovery sub-score renders a human label instead of the raw <code>multi_channel_discovery<\/code> key. (#210)<\/li>\n<li>AI Assistant Preview shows an explicit \"no content\" message for empty posts instead of blank dark panes. (#213)<\/li>\n<li>Relative-time copy uses proper <code>_n()<\/code> plural forms (\"1 minute ago\" \/ \"5 minutes ago\"); excluded posts in the Descriptions table are labelled \"excluded\" and the intro copy matches. (#215)<\/li>\n<\/ul>\n\n<h4>0.2.0 \u2014 2026-06-03<\/h4>\n\n<p>Feature release. Three new agent-facing modules plus a batch of correctness fixes surfaced through live testing.<\/p>\n\n<p><strong>New<\/strong><\/p>\n\n<ul>\n<li><strong>AI Assistant Preview pane<\/strong> \u2014 view any post as an AI assistant consumes it (raw HTML \/ Markdown View \/ live <code>\/llms.txt<\/code> line, side by side) with an on-demand synchronous \"sample AI summary\". No cron; degrades gracefully without an AI provider. (#45)<\/li>\n<li><strong>WordPress Abilities API + MCP<\/strong> \u2014 five <code>manage_options<\/code>-gated abilities (audit-run, profile-read, profile-set-exposure, llms-txt-regenerate, md-view-preview) exposed via core <code>wp-abilities\/v1<\/code>, and reachable by MCP clients through the WordPress MCP adapter when installed. (#21, #131)<\/li>\n<li><strong>Multi-channel discovery sub-score<\/strong> \u2014 Context Score gains a seventh sub-score crediting agent-discovery surfaces beyond <code>\/llms.txt<\/code> (<code>ai.txt<\/code>, <code>\/.well-known\/<\/code> declarations, OpenAPI), with a filterable sibling-provider registry. Discoverability re-weighted 20 \u2192 10 to fund it; total stays 100. (#22)<\/li>\n<\/ul>\n\n<p><strong>Improved<\/strong><\/p>\n\n<ul>\n<li>Tools \u2192 Context rebuilt as a single Card + TabPanel single-page admin, aligned with the WP AI Client \/ OpenAI Connector design system, with REST write controllers for the Context Profile and editorial entries. (#142)<\/li>\n<li>Context Score reason strings are now fully translatable via reason codes, and the sub-score copy across the admin UI and the LLM narrative prompt derives from a single source of truth (<code>Engine::WEIGHTS<\/code>). (#137, #139, #140)<\/li>\n<\/ul>\n\n<p><strong>Fixes<\/strong><\/p>\n\n<ul>\n<li>JSON-LD is now emitted without <code>esc_html()<\/code> (angle brackets escaped via <code>JSON_HEX_TAG<\/code>), so the structured-data payload validates in every standards-compliant validator. (#118)<\/li>\n<li>Stale past-timestamp cron events are cleared before re-scheduling across all four schedulers (<code>\/llms.txt<\/code> recompute, Context Score recompute, Markdown cleanup, description generation) \u2014 fixes \"stuck pending forever\" on sites where wp-cron sat stale. (#115, #120, #121)<\/li>\n<li>The Markdown cleanup allowlist now preserves word boundaries at block edges, so headings and paragraphs adjacent to block tags are no longer dropped by the no-hallucination guard. (#135)<\/li>\n<li>Orphaned shortcodes are stripped from both the deterministic Markdown walker and <code>\/llms.txt<\/code> entry descriptions via a shared helper. (#145, #147)<\/li>\n<li><code>\/llms.txt<\/code> now recomposes when a post's description changes, and carries a generator-version staleness signal so out-of-date descriptions are detectable. (#149, #151)<\/li>\n<li><code>package.json<\/code> version now tracks the plugin version (was drifting at 0.1.0). (#113)<\/li>\n<\/ul>\n\n<h4>0.1.1 \u2014 2026-05-24<\/h4>\n\n<p>Bug-fix release. Four issues surfaced during post-merge smoke testing of v0.1.0 (PR #102 rebrand bundle) and the external LLM review of the live <code>\/llms.txt<\/code> output.<\/p>\n\n<p><strong>Fixes<\/strong><\/p>\n\n<ul>\n<li><code>\/llms.txt<\/code> regen now fires reliably after Context Profile saves on sites where wp-cron sits stale (e.g. wp-env without traffic, any site where cron failed for a window). <code>Service::schedule_regen()<\/code> now clears stale past-timestamp events before scheduling a fresh one. (#103)<\/li>\n<li><code>Schema_Emitter<\/code> now emits per-content JSON-LD for custom CPTs. Built-in <code>post<\/code> maps to <code>Article<\/code>; <code>page<\/code> and every other CPT (including custom ones like <code>lesson<\/code>, <code>product<\/code>, <code>recipe<\/code>) map to <code>WebPage<\/code> by default. Adds an <code>agentready_schema_type_for_cpt<\/code> filter for plugin\/theme authors to specialize. Honors <code>'Article'<\/code> \/ <code>'WebPage'<\/code> \/ <code>null<\/code> (suppress) in v0.1.1; full custom-<code>@type<\/code> support lands in v0.1.2. AgDR-0040 captures the rationale. (#104)<\/li>\n<li><code>\/llms.txt<\/code> entry links now point at the <code>.md<\/code> form when Markdown Views is enabled \u2014 AI agents fetch a 4\u20138 KB Markdown body instead of the 50\u2013100 KB HTML page. Pretty permalinks use the <code>&lt;slug&gt;.md<\/code> shape; plain permalinks fall through to <code>?format=md<\/code>. Idempotent: URLs already in either form are returned unchanged. When <code>markdown_views_enabled<\/code> is false, the canonical permalink is preserved. (#105)<\/li>\n<li>HTML entities (<code>&amp;#8217;<\/code>, <code>&amp;amp;<\/code>, <code>&amp;quot;<\/code>, <code>&amp;mdash;<\/code>, etc.) no longer leak into the plain-text <code>\/llms.txt<\/code> body. WordPress's <code>wptexturize<\/code> filter HTML-encodes typographic characters; the composer now decodes them at the bottom of the escape pipeline so every text surface (site name, tagline, section label, entry title, description) is clean. (#106)<\/li>\n<\/ul>\n\n<h4>0.1.0 \u2014 2026-05-20<\/h4>\n\n<p>First public release. Four coherent modules driven by one Context Profile.<\/p>\n\n<p><strong>Markdown Views<\/strong><\/p>\n\n<ul>\n<li>Deterministic HTML \u2192 Markdown rendering with three URL forms (path <code>.md<\/code>, query <code>?format=md<\/code>, <code>Accept: text\/markdown<\/code>)<\/li>\n<li>Custom cache table with content-hash invalidation and walker-version lazy revalidation<\/li>\n<li>Gutenberg sidebar panel for in-editor preview<\/li>\n<li><code>wp ai-readiness-kit md preview<\/code> WP-CLI command with <code>--format=wrapped<\/code>, <code>--show-meta<\/code>, <code>--bypass-exposure<\/code><\/li>\n<li>REST endpoint for admin tooling at <code>\/wp-json\/ai-readiness-kit\/v1\/markdown-views\/preview<\/code><\/li>\n<li>LLM cleanup pass with safety guard (rate-limited, opt-in via Context Profile)<\/li>\n<li>Admin UI for cleanup approval workflow<\/li>\n<\/ul>\n\n<p><strong>LLMs Index (\/llms.txt)<\/strong><\/p>\n\n<ul>\n<li><code>\/llms.txt<\/code> generator with Context Profile-driven inclusion rules<\/li>\n<li>Conflict detection against <code>robots.txt<\/code> with admin notice<\/li>\n<li>Editorial entries admin UI for curated non-WordPress URLs<\/li>\n<li>LLM-powered per-entry descriptions (Phase A engine + Phase B admin UI)<\/li>\n<li>WP-CLI: <code>wp ai-readiness-kit llms-txt {status,regen,preview}<\/code><\/li>\n<\/ul>\n\n<p><strong>Context Score<\/strong><\/p>\n\n<ul>\n<li>Six weighted sub-scores (discoverability 20, content readability 15, schema coverage 10, exposure safety 15, integration health 15, Markdown conversion quality 25) \u2192 0\u2013100 composite<\/li>\n<li>Admin page at Tools \u2192 Context Score with full sub-score breakdown<\/li>\n<li>Site Health integration with headline score and highest-leverage fix surfacing<\/li>\n<li>REST endpoint for programmatic access<\/li>\n<li>LLM-narrated explanation with rule-based fallback<\/li>\n<li>WP-CLI: <code>wp ai-readiness-kit context-score recompute<\/code><\/li>\n<\/ul>\n\n<p><strong>Schema Coordination<\/strong><\/p>\n\n<ul>\n<li>SEO plugin detection (Yoast, Rank Math, AIOSEO, The SEO Framework)<\/li>\n<li>Native gap-fill JSON-LD emitter (WebSite + Organization + per-content) gated behind a Context Profile toggle, credited in Context Score's schema sub-score<\/li>\n<\/ul>\n\n<p><strong>Infrastructure<\/strong><\/p>\n\n<ul>\n<li>Layered CI: PHPCS (WordPress + WordPressVIPMinimum) + Plugin Check + PHPUnit + PHPStan level 5<\/li>\n<li><code>requires_wp<\/code> \/ <code>requires_php<\/code> runtime gate with admin-notice degradation<\/li>\n<li>Translation policy documented (AgDR-0009): managed via wp.org under slug <code>agentable<\/code><\/li>\n<li>Competitive landscape captured (AgDR-0006)<\/li>\n<\/ul>","raw_excerpt":"Help AI agents read your WordPress site correctly: llms.txt, clean Markdown views, structured data, and a readiness score \u2014 from one Context Profile.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/326172","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=326172"}],"author":[{"embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mokhaled"}],"wp:attachment":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=326172"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=326172"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=326172"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=326172"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=326172"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=326172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}