{"id":315167,"date":"2026-05-20T14:54:22","date_gmt":"2026-05-20T14:54:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/inhale-mcp-abilities\/"},"modified":"2026-05-21T11:22:00","modified_gmt":"2026-05-21T11:22:00","slug":"inhale-mcp-abilities","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/inhale-mcp-abilities\/","author":14921907,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.4.2","stable_tag":"0.4.2","tested":"7.0","requires":"6.8","requires_php":"7.4","requires_plugins":null,"header_name":"Inhale: MCP Abilities by Respira","header_author":"Respira","header_description":"A small settings page that lets WordPress site administrators choose which registered abilities are exposed to the default MCP server. Built by Respira.","assets_banners_color":"070a0d","last_updated":"2026-05-21 11:22:00","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/respira.press\/inhale","header_author_uri":"https:\/\/respira.press","rating":0,"author_block_rating":0,"active_installs":0,"downloads":110,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.4.0":{"tag":"0.4.0","author":"urbankidro","date":"2026-05-20 14:53:54"},"0.4.1":{"tag":"0.4.1","author":"urbankidro","date":"2026-05-21 10:40:11"},"0.4.2":{"tag":"0.4.2","author":"urbankidro","date":"2026-05-21 11:22:00"}},"upgrade_notice":{"0.4.2":"<p>Adds UTM tags to outbound respira.press links so the plugin shows up as an attribution source in Respira&#039;s acquisition dashboard. Same destination pages, no telemetry from the plugin itself. Safe to upgrade.<\/p>","0.4.1":"<p>Fixes the WP-CLI snippet in the Connection section. Pre-0.4.1 the snippet pointed at <code>wp mcp stdio<\/code>, which is not a registered subcommand and resulted in a &quot;command not found&quot; error. Now uses <code>wp mcp-adapter serve<\/code> with <code>--user=admin<\/code>. Adds a note that STDIO transport is local-only; remote sites should use HTTP. No behavioral change to abilities or the settings page itself. Safe to upgrade.<\/p>","0.4.0":"<p>Plugin Directory review fixes: prefix every identifier with <code>respira_inhale_*<\/code>, prefix the option key, use <code>rest_url()<\/code> for the Connection endpoint. A one-shot migration preserves prior selections. Safe to upgrade.<\/p>","0.3.2":"<p>Plugin Check (PCP) pass: i18n + sanitization annotations, simplified asset loader, hardened export exclusions. No behavioral change. Safe to upgrade.<\/p>","0.3.1":"<p>Adds the four wp.org Plugin Directory screenshots; no runtime changes.<\/p>","0.3.0":"<p>WordPress.org Plugin Directory submission release. Full codebase pass against the plugin review guidelines, page header restructure, dark\/light theme parity, light-mode contrast fix, foreign-notice suppression on the Inhale page, and hardened uninstall (single-site and multisite). Safe to upgrade.<\/p>","0.2.0":"<p>Option key renamed to the canonical <code>mcp_adapter_public_abilities<\/code> shared with WordPress\/mcp-adapter PR #184. A one-shot migration runs on plugin upgrade so v0.1.x selections are preserved automatically. Safe to upgrade.<\/p>","0.1.1":"<p>Security hardening pass on the settings page render path. No new features. Safe to upgrade.<\/p>","0.1.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3539555,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3539555,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3539555,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3539555,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3539555,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.4.0","0.4.1","0.4.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3539555,"resolution":"1","location":"assets","locale":"","width":1600,"height":1000},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3539555,"resolution":"2","location":"assets","locale":"","width":1600,"height":1000},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3539555,"resolution":"3","location":"assets","locale":"","width":1600,"height":1000},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3539555,"resolution":"4","location":"assets","locale":"","width":1600,"height":1000}},"screenshots":{"1":"The Inhale: MCP Abilities settings page in light mode: page header with the \"by respira.press\" subtitle, sources card listing every plugin that registers abilities, filter tabs (All, Inhaled, Read-only, Destructive, Unannotated), search, and the wp-admin native abilities list table with iOS-style toggle switches in the Status column.","2":"The abilities list table close-up: row checkboxes for bulk selection, toggles per row (green when inhaled, grey when not), Source column showing the registering plugin, descriptions sourced from each ability's declared meta, and annotation badges (Read-only, Destructive, Idempotent).","3":"The Connection section showing the default MCP server endpoint with copy-to-clipboard, expandable client configuration guides for WP-CLI STDIO and HTTP transports with application passwords, and the About section with the Anthropic trademark disclaimer.","4":"Dark mode view: the entire wp-admin content column paints dark together with the Inhale page, the wordmark and subtitle render with brand-spec emerald (#86efac) typography, and the abilities table inherits the dark surface tokens."}},"plugin_section":[],"plugin_tags":[251511,2353,263707,242115,253991],"plugin_category":[],"plugin_contributors":[263708],"plugin_business_model":[],"class_list":["post-315167","plugin","type-plugin","status-publish","hentry","plugin_tags-abilities","plugin_tags-ai","plugin_tags-ai-infrastructure","plugin_tags-mcp","plugin_tags-model-context-protocol","plugin_contributors-urbankidro","plugin_committers-urbankidro"],"banners":{"banner":"https:\/\/ps.w.org\/inhale-mcp-abilities\/assets\/banner-772x250.png?rev=3539555","banner_2x":"https:\/\/ps.w.org\/inhale-mcp-abilities\/assets\/banner-1544x500.png?rev=3539555","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/inhale-mcp-abilities\/assets\/icon.svg?rev=3539555","icon":"https:\/\/ps.w.org\/inhale-mcp-abilities\/assets\/icon.svg?rev=3539555","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/inhale-mcp-abilities\/assets\/screenshot-1.png?rev=3539555","caption":"The Inhale: MCP Abilities settings page in light mode: page header with the \"by respira.press\" subtitle, sources card listing every plugin that registers abilities, filter tabs (All, Inhaled, Read-only, Destructive, Unannotated), search, and the wp-admin native abilities list table with iOS-style toggle switches in the Status column."},{"src":"https:\/\/ps.w.org\/inhale-mcp-abilities\/assets\/screenshot-2.png?rev=3539555","caption":"The abilities list table close-up: row checkboxes for bulk selection, toggles per row (green when inhaled, grey when not), Source column showing the registering plugin, descriptions sourced from each ability's declared meta, and annotation badges (Read-only, Destructive, Idempotent)."},{"src":"https:\/\/ps.w.org\/inhale-mcp-abilities\/assets\/screenshot-3.png?rev=3539555","caption":"The Connection section showing the default MCP server endpoint with copy-to-clipboard, expandable client configuration guides for WP-CLI STDIO and HTTP transports with application passwords, and the About section with the Anthropic trademark disclaimer."},{"src":"https:\/\/ps.w.org\/inhale-mcp-abilities\/assets\/screenshot-4.png?rev=3539555","caption":"Dark mode view: the entire wp-admin content column paints dark together with the Inhale page, the wordmark and subtitle render with brand-spec emerald (#86efac) typography, and the abilities table inherits the dark surface tokens."}],"raw_content":"<!--section=description-->\n<p>Inhale: MCP Abilities is a small, focused utility that solves one problem: the default WordPress MCP server (provided by the official MCP Adapter plugin) does not expose any registered abilities by default. Site administrators have to write PHP filters to opt each ability into the public MCP surface.<\/p>\n\n<p>This is the workaround pattern documented in WordPress contributor blog posts and developer guides since the MCP Adapter shipped. Inhale: MCP Abilities replaces the PHP-filter workaround with a simple settings page.<\/p>\n\n<p>Once installed and activated, you'll find a new page at Settings &gt; Inhale: MCP Abilities where you can check off the abilities you want exposed to your default MCP server.<\/p>\n\n<h4>What the Inhale: MCP Abilities plugin does<\/h4>\n\n<ul>\n<li>Lists every registered WordPress ability across all active plugins and themes<\/li>\n<li>Lets you select which abilities are exposed to the default MCP server with simple checkboxes<\/li>\n<li>Shows annotation metadata (read-only, destructive, idempotent) on each ability so you can make informed decisions<\/li>\n<li>Requires explicit confirmation when you inhale an ability marked as destructive<\/li>\n<li>Provides connection info for popular MCP clients (Claude Desktop, Cursor, Claude Code)<\/li>\n<li>Respects each ability's own permission_callback. The Inhale: MCP Abilities plugin controls visibility, not authorization.<\/li>\n<\/ul>\n\n<h4>What the Inhale: MCP Abilities plugin doesn't do<\/h4>\n\n<ul>\n<li>Inhale: MCP Abilities does not run any MCP servers, transports, or authentication. Those are handled by the official MCP Adapter plugin, which the Inhale: MCP Abilities plugin extends.<\/li>\n<li>Inhale: MCP Abilities does not register any abilities of its own. It only toggles visibility of abilities other plugins have registered.<\/li>\n<li>Inhale: MCP Abilities does not phone home, collect telemetry, or make external network requests.<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.8 or later (Abilities API in core since 6.9; 6.8 requires the Abilities API plugin)<\/li>\n<li>PHP 7.4 or later<\/li>\n<li>The official WordPress MCP Adapter plugin installed and active<\/li>\n<\/ul>\n\n<h4>About MCP<\/h4>\n\n<p>Model Context Protocol (MCP) is an open specification originally developed by Anthropic. Inhale: MCP Abilities is a third-party plugin and is not affiliated with, endorsed by, or sponsored by Anthropic. Respira is an independent company.<\/p>\n\n<h4>About Respira<\/h4>\n\n<p>The Inhale: MCP Abilities plugin is built and maintained by Respira, which ships AI infrastructure for WordPress. The main product is Respira for WordPress, a safety layer that registers 130+ abilities across 12 page builders (Elementor, Bricks, Divi, Beaver Builder, Oxygen, Breakdance and 6 more) with snapshot-before-write protection, render validation and one-click rollback. Inhale: MCP Abilities is a free utility offered to the WordPress community. Learn more at https:\/\/respira.press\/inhale?utm_source=inhale&amp;utm_medium=wp-org&amp;utm_campaign=readme-description.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the official WordPress MCP Adapter plugin (https:\/\/github.com\/WordPress\/mcp-adapter)<\/li>\n<li>Install Inhale: MCP Abilities from the WordPress plugin directory or by uploading the plugin zip<\/li>\n<li>Activate the Inhale: MCP Abilities plugin<\/li>\n<li>Navigate to Settings &gt; Inhale: MCP Abilities<\/li>\n<li>Check the abilities you want exposed to your default MCP server<\/li>\n<li>Save changes<\/li>\n<li>Connect your MCP client (Claude Desktop, Cursor, Claude Code, or any MCP-compatible AI assistant) to the endpoint shown on the Inhale: MCP Abilities settings page<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20to%20write%20any%20code%20to%20use%20the%20inhale%3A%20mcp%20abilities%20plugin%3F\"><h3>Do I need to write any code to use the Inhale: MCP Abilities plugin?<\/h3><\/dt>\n<dd><p>No. Inhale: MCP Abilities is a settings-only utility. The whole point is to replace the PHP-filter workaround with a UI.<\/p><\/dd>\n<dt id=\"does%20inhale%3A%20mcp%20abilities%20work%20with%20the%20wordpress%20ai%20plugin%3F\"><h3>Does Inhale: MCP Abilities work with the WordPress AI plugin?<\/h3><\/dt>\n<dd><p>Inhale: MCP Abilities works alongside the WordPress AI plugin without conflicts. The WordPress AI plugin handles AI-powered editor features inside wp-admin. The Inhale: MCP Abilities plugin handles which abilities are exposed to external MCP clients via the MCP Adapter.<\/p><\/dd>\n<dt id=\"is%20the%20inhale%3A%20mcp%20abilities%20plugin%20safe%20to%20use%20on%20production%20sites%3F\"><h3>Is the Inhale: MCP Abilities plugin safe to use on production sites?<\/h3><\/dt>\n<dd><p>The Inhale: MCP Abilities plugin is conservative by default: no abilities are exposed until you explicitly check them, and destructive abilities require additional confirmation. Inhale: MCP Abilities doesn't change how WordPress abilities work; it only controls their visibility to the default MCP server. Each ability still runs its own permission checks before execution.<\/p><\/dd>\n<dt id=\"what%27s%20the%20relationship%20between%20inhale%3A%20mcp%20abilities%20and%20respira%3F\"><h3>What's the relationship between Inhale: MCP Abilities and Respira?<\/h3><\/dt>\n<dd><p>Inhale: MCP Abilities is a free utility built and maintained by Respira. Respira's main product is Respira for WordPress, a safety layer for AI-driven edits across 12 page builders. The two products are separate. You can use the Inhale: MCP Abilities plugin without ever using Respira for WordPress.<\/p><\/dd>\n<dt id=\"will%20write%20operations%20work%20through%20mcp%3F\"><h3>Will write operations work through MCP?<\/h3><\/dt>\n<dd><p>Yes, if you inhale abilities that perform writes. Whether a particular ability performs writes is determined by the plugin that registered the ability, not by Inhale: MCP Abilities. The Inhale: MCP Abilities plugin surfaces annotation metadata (destructive, idempotent) where the registering plugin has provided it, so you can make informed decisions.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.4.2<\/h4>\n\n<ul>\n<li>Every outbound link from the settings page and the readme to respira.press now carries <code>utm_source=inhale<\/code> plus a <code>utm_medium<\/code> and <code>utm_campaign<\/code> that name the specific click location (settings-header, settings-docs, settings-footer, readme-description). This lets Respira measure how many sign-ups and how much revenue on respira.press are attributable to the Inhale plugin as a referral channel, without any change to the destination pages or any extra plugin code. The plugin itself does not call out, fetch, or send anything to respira.press at runtime; the UTM tags only matter when a human clicks a link.<\/li>\n<\/ul>\n\n<h4>0.4.1<\/h4>\n\n<ul>\n<li>WP-CLI snippet in the Connection section now uses the canonical <code>wp mcp-adapter serve<\/code> subcommand (was <code>wp mcp stdio<\/code>, which is not a registered subcommand and resulted in a \"command not found\" error when pasted into Claude Desktop). The snippet also includes <code>--user=admin<\/code> so the serve process runs with admin capabilities and can read the registered abilities.<\/li>\n<li>New note above the WP-CLI snippet explains that STDIO transport requires WordPress and the MCP client to run on the same machine. Most real-world installs sit on a remote host, in which case the HTTP transport snippet below is the correct path.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Plugin Directory review feedback. Three fixes addressing the initial review.<\/li>\n<li>Generic prefixes replaced. Every constant, class, function, filter, nonce and CSS ID prefixed with <code>RESPIRA_INHALE_*<\/code> \/ <code>Respira_Inhale_*<\/code> \/ <code>respira_inhale_*<\/code> (was <code>INHALE_*<\/code> \/ <code>Inhale_*<\/code> \/ <code>inhale_*<\/code>). Class files renamed to <code>class-respira-inhale-*.php<\/code>. The new prefix is unique to this plugin and does not collide with the wider <code>respira_*<\/code> namespace used by the main Respira for WordPress plugin.<\/li>\n<li>Option key properly prefixed. Primary storage is now <code>respira_inhale_public_abilities<\/code>. The plugin also mirrors writes to <code>mcp_adapter_public_abilities<\/code> (the canonical key proposed in WordPress\/mcp-adapter#184) and reads it as a fallback, so the two surfaces share state if and when the upstream adapter ships its own settings UI. A one-shot migration on plugin upgrade copies any prior selections (v0.1.x legacy key or v0.2.x-v0.3.x canonical-only key) onto the new prefixed key and removes the old options.<\/li>\n<li>REST endpoint built with <code>rest_url()<\/code>. The Connection section endpoint URL is now generated via <code>rest_url('mcp\/mcp-adapter-default-server')<\/code> instead of concatenating <code>home_url()<\/code> with a hardcoded <code>\/wp-json<\/code> path, so it resolves correctly on installs with non-standard REST base configuration, sub-directory permalinks, and multisite blogs.<\/li>\n<li>Display name updated to \"Inhale: MCP Abilities by Respira\" to make the author attribution clearer in wp-admin plugin lists. Slug <code>inhale-mcp-abilities<\/code> is unchanged.<\/li>\n<li><code>Contributors<\/code> field in readme.txt now lists the wp.org-owner username (<code>urbankidro<\/code>) instead of the brand string. The <code>Author<\/code> plugin header still reads \"Respira\" so the visible attribution on the wp.org directory page is unchanged.<\/li>\n<li>Uninstall handler updated to remove the new primary key, the v0.4.0 migration flag, the canonical compat key, and every legacy key from v0.1.x and v0.2.x. Single-site and multisite sweep.<\/li>\n<\/ul>\n\n<h4>0.3.2<\/h4>\n\n<ul>\n<li>Plugin Check (PCP) pass. Short description rewritten in standard English. Translators comment moved to sit directly above the <code>__()<\/code> call so PCP's i18n linter sees it. Inline <code>phpcs:ignore<\/code> annotations added on the read-only <code>$_GET['notice']<\/code> display path (post-redirect-get banner; no state change, value whitelisted) and on the <code>$_POST['abilities']<\/code> array read (sanitized per element below). Inhale_I18n drops the now-discouraged <code>load_plugin_textdomain()<\/code> call since wp.org auto-loads translations for plugins hosted in the Plugin Directory. Multisite-cleanup variables in <code>uninstall.php<\/code> prefixed (<code>$inhale_sites<\/code>, <code>$inhale_site_id<\/code>) to satisfy the PrefixAllGlobals rule.<\/li>\n<li>Asset loader simplified. The <code>admin.min.css<\/code> \/ <code>admin.min.js<\/code> duplicates have been removed; the single <code>admin.css<\/code> \/ <code>admin.js<\/code> files are the only enqueued assets. The Plugin Directory prefers human-readable code; the admin page is small and loaded on one settings screen only, so a separate minified bundle wasn't pulling any real payload weight.<\/li>\n<li>GitHub archive exclusions hardened. README.md, .distignore and a few other dev-only files now carry the <code>export-ignore<\/code> attribute, so the submission zip stays focused on runtime files.<\/li>\n<\/ul>\n\n<h4>0.3.1<\/h4>\n\n<ul>\n<li>Add the four wp.org Plugin Directory screenshots, captured at 1600x1000 from a live v0.3.0 install (Studio, WordPress 7.0-RC4, 155 registered abilities across Respira, Respira WooCommerce and WordPress core): the settings page hero, the abilities list close-up showing toggle switches and annotation badges, the Connection section with endpoint + transport guides, and the dark-mode view. Screenshot descriptions in readme.txt refreshed to match.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Plugin Directory submission release. Full pass on the codebase to meet WordPress.org plugin review guidelines: every PHP file has an ABSPATH guard, every output is escaped through <code>esc_attr<\/code> \/ <code>esc_html<\/code> \/ <code>esc_url<\/code>, every input is sanitized and capability-checked, every state-changing request is nonce-verified, and translatable strings carry a text domain matching the plugin slug.<\/li>\n<li>Settings page chrome: page header restructure with \"by respira.press\" as a Baskervville italic subtitle and a small version pill in the right-side toolbar. Both adapt per theme via <code>--accent-text<\/code> and <code>--accent-border<\/code> tokens so contrast is AA on light and dark surfaces.<\/li>\n<li>Theme toggle: layout shift between dark and light is gone. Background, padding and margin moved to the base <code>.inhale-wrap<\/code> selector and the dark variant only redefines color tokens. A body class (<code>inhale-theme-dark<\/code>) mirrors the data-theme attribute so the WP admin content column, sidebar and footer all paint dark together with no \"white band\" anywhere on the page.<\/li>\n<li>Notifications scoping: every admin notice queued by other plugins or the active theme is suppressed on the Inhale settings page (license nags, plugin-install banners, trial reminders, etc.). Inhale's own success \/ warning notices render inline and survive the cleanup.<\/li>\n<li>Uninstall hardening: <code>uninstall.php<\/code> now removes every option this plugin has ever written: the canonical <code>mcp_adapter_public_abilities<\/code> key (v0.2.0+), the legacy <code>inhale_mcp_abilities_public_abilities<\/code> key (v0.1.x), and the <code>inhale_option_migrated_v020<\/code> migration flag. Multisite installations sweep every blog in <code>get_sites()<\/code> so no orphaned wp_options rows remain.<\/li>\n<li>Tested with WordPress 7.0-RC4 and PHP 8.4 on Studio. Confirmed no remote calls, no tracking, no obfuscated code, no external dependencies. License is GPL-2.0-or-later with the full GPL text included in <code>LICENSE<\/code>.<\/li>\n<\/ul>\n\n<h4>0.2.3<\/h4>\n\n<ul>\n<li>Eliminate the dark\/light theme layout shift. Background, padding and margin now apply to the base <code>.inhale-wrap<\/code> instead of only the dark variant, so toggling theme no longer pushes the title up or down.<\/li>\n<li>Paint <code>#wpbody-content<\/code> dark too when the dark theme is active, via a body class (<code>inhale-theme-dark<\/code>) the JS adds in lockstep with the <code>data-theme<\/code> attribute. Closes the \"white bar at the top\" gap between the WP admin bar and the Inhale page in dark mode.<\/li>\n<li>Restructure the page header: \"by respira.press\" is now a subtitle directly under the H1 in 14px Baskervville italic emerald, aligned with the title block next to the dot-grid logo.<\/li>\n<li>Move the version pill from the H1 to the right-side toolbar, sized down to 9.5px monospace lowercase. Sits between the Documentation link and the theme toggle.<\/li>\n<\/ul>\n\n<h4>0.2.2<\/h4>\n\n<ul>\n<li>Suppress every admin notice queued by other plugins or the active theme on the Inhale settings page. Inhale's own notices (rendered inline via render_notice()) survive, every other one (license warnings, plugin-install nags, update banners, etc.) is dropped on this screen only. Implemented via <code>remove_all_actions( 'admin_notices' \/ 'all_admin_notices' \/ 'user_admin_notices' \/ 'network_admin_notices' )<\/code> on the <code>current_screen<\/code> hook, scoped to <code>settings_page_inhale-mcp-abilities<\/code>.<\/li>\n<li>Add \"by respira.press\" attribution after the page title, rendered in Baskervville italic emerald (#86efac) per the canonical respira.press\/brand spec, with system serif fallbacks so no external font fetch is required.<\/li>\n<li>Add a small pill next to the attribution showing the current plugin version (<code>v0.2.2<\/code>). Pill uses the emerald accent palette and the mono font, sized 11px, focus-visible underline on the linked attribution.<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<ul>\n<li>Replace the Status column text pill (\"Inhaled\" \/ em-dash) with an iOS-style toggle switch. Green when the ability is inhaled, off when not. Clicking the toggle commits the change immediately, same single-row flow as the existing row-hover quick action. Managed rows (mcp-adapter namespace) render a disabled toggle. Destructive abilities still trigger the confirmation dialog before flipping on.<\/li>\n<li>No behavioral change on saved data; the option key remains <code>mcp_adapter_public_abilities<\/code> from v0.2.0.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Rename the option key from <code>inhale_mcp_abilities_public_abilities<\/code> to the canonical <code>mcp_adapter_public_abilities<\/code> so Inhale shares storage with the settings UI proposed upstream in WordPress\/mcp-adapter PR #184. A one-shot migration on plugin upgrade preserves all v0.1.x selections, deletes the legacy key, and sets a <code>inhale_option_migrated_v020<\/code> flag so it runs once.<\/li>\n<li>No UI or behavior changes. Sites with no prior selections are unaffected.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Hardening pass: the permission-denied path in the settings page render now passes HTTP response code 403 and a back link to <code>wp_die()<\/code>, so access logs and automated clients see an authorization failure instead of a generic error.<\/li>\n<li>Normalize row-class escaping in the abilities table: always render the <code>&lt;tr&gt;<\/code> class attribute through <code>esc_attr()<\/code> instead of conditionally injecting the attribute fragment. No behavioral change, conforms more strictly to the WordPress Plugin Check <code>WordPress.Security.EscapeOutput<\/code> rule.<\/li>\n<li>Mirrors the equivalent review feedback addressed upstream on WordPress\/mcp-adapter PR #184.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Settings page at Settings &gt; Inhale: MCP Abilities, registered with <code>manage_options<\/code> capability.<\/li>\n<li>Discovers every ability registered via the WordPress Abilities API (<code>wp_get_abilities()<\/code>) and lists them in a wp-admin native list table.<\/li>\n<li>Standard wp-admin selection + bulk-action UX: row checkboxes are selection, the Bulk Actions dropdown plus Apply commits Inhale or Exhale immediately.<\/li>\n<li>Row-hover quick actions for single-ability inhale or exhale.<\/li>\n<li>Annotation badges on each ability (read-only, destructive, idempotent) sourced from the ability's declared meta; falls back to heuristic inference from the ability name when the registering plugin didn't tag it, with a dashed border and asterisk to mark inferred annotations.<\/li>\n<li>Filter views (All, Inhaled, Read-only, Destructive, Unannotated) and a search box that matches across name, source and description.<\/li>\n<li>Multi-select source filter on the Source column to narrow by the registering plugin or theme.<\/li>\n<li>Sortable columns (Ability, Source, Description, Status).<\/li>\n<li>Client-side pagination: 20 \/ 50 \/ 100 \/ All items per page, with wp-admin-native page navigation chrome.<\/li>\n<li>Sources summary card above the table listing every plugin or theme that registers abilities, with the count per source and a deep-link to that plugin's wp-admin home.<\/li>\n<li>Destructive ability confirmation: one consolidated dialog when a bulk Inhale would expose destructive abilities; one dialog per single-row Inhale link.<\/li>\n<li>Annotation legend section under the table explaining what each annotation means, including how inferred annotations differ from declared ones.<\/li>\n<li>Connection section showing the default MCP server endpoint with copy-to-clipboard, and expandable connection guides for WP-CLI STDIO transport and HTTP transport with application passwords.<\/li>\n<li>About section with the MCP \/ Anthropic trademark disclaimer (this plugin is third-party, not affiliated with Anthropic).<\/li>\n<li>Light and dark mode support, persisted per browser in localStorage and respecting the wp-admin color scheme on first load.<\/li>\n<li>WCAG AA contrast in both modes; full keyboard accessibility.<\/li>\n<li>Filter (<code>wp_register_ability_args<\/code> at priority 10) is the only writer to ability meta; existing meta on opted-in abilities is preserved.<\/li>\n<li>Adapter-managed abilities (<code>mcp-adapter\/*<\/code> namespace) are surfaced as read-only \"Managed\" rows and skipped by the filter.<\/li>\n<\/ul>","raw_excerpt":"A small settings page that lets WordPress site administrators choose which registered abilities are exposed to the default MCP server.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/315167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=315167"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/urbankidro"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=315167"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=315167"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=315167"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=315167"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=315167"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=315167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}