Releases: unaibamir/agent-abilities-for-mcp
Releases · unaibamir/agent-abilities-for-mcp
Release list
1.6.0
- Feature: Read-only mode, a switch on the Settings tab that stops any ability that writes from being registered as an MCP tool, whatever is ticked. It covers abilities from other plugins as well, each classified by its own annotation.
- Feature: Turning read-only mode on or off enables and disables nothing by itself. Your selections are left as they are, so switching the mode back off gives you exactly what you had chosen before.
- Feature: An "Enable all reads" button on the Abilities, Integrations and Bridge tabs, which ticks every read ability in a section and leaves the writes alone.
- Feature: The page header now states the site's posture on every tab: read-only, read plus write, or read plus write with high-risk unlocked. It is worked out from what would actually register, not from the stored setting.
- Feature: Finishing the Quick Connect wizard without choosing write access now turns read-only mode on rather than ticking a set of boxes, so it still holds months later once you have enabled other things.
- Feature: Turning read-only mode on or off is recorded in the activity log.
- Chore: The minimum PHP version is now 7.4, down from 8.0. WordPress core itself requires 7.2, and about half the sites running a plugin in this category are still on 7.4.
- Chore: The Settings tab is reorganised. OAuth leads, read-only mode and the high-risk switch are the first two rows of Safety controls, the longest descriptions fold behind a "See more", and Save settings now follows you down the page instead of sitting at the bottom.
- Chore: The tab that lists abilities registered by your other plugins is now called "Other plugins", and it has its own icon rather than sharing the one Integrations uses.
- Chore: The plugin's own listing now leads with what it actually gives you, permission controls and an audit log, rather than the generic "for AI agents" framing.
- Fix: A refund amount sent with surrounding whitespace is now trimmed before the numeric check, so it is accepted or rejected the same way on every supported PHP version.
- Fix: Several lists could come back in a different order on PHP 7.4 than on 8.x. They now sort the same way everywhere.
- Fix: An ability from another plugin that returns a result in an unexpected shape is now caught and reported instead of failing further down with a less useful error.
1.5.0
- Feature: Eight WooCommerce abilities that move money or grant authority (refunds, order status, order updates, payment gateway settings, coupon creation and updates, and tax rate creation and updates) are now locked by default behind a single audited master switch on the Settings tab.
- Feature: The activity log now records ability toggles and setting changes, not only ability calls, using a new event-type vocabulary and a detail column that names what changed.
- Feature: Every ability you enable or disable is now recorded in the activity log. Before this release, that option was written with no audit trail at all.
- Feature: Identifiers in the activity log's detail column now link to the object's edit screen.
- Feature: The activity log can now be exported as a CSV, carrying whatever filter is currently applied.
- Feature: A failed Application Password attempt against the MCP endpoint is now logged, and rate limited per source IP so a credential-stuffing run cannot flood the log.
- Fix: Creating a WooCommerce customer used to require only the capability to manage WooCommerce. It now also requires the capability to create users, since the ability creates a real WordPress account.
- Fix: Listing or reading a WooCommerce customer's details used to require only the capability to manage WooCommerce, which let a caller with just that one capability read any WordPress user's email, address, and phone, administrators included. Both abilities now also require the capability to list users, the same one WordPress itself requires to browse Users in wp-admin. A stock WooCommerce Shop Manager does not hold that capability, and is now denied both abilities where it was not before.
- Fix: A high-risk ability could still be switched on and saved as an ordinary toggle from the Integrations tab, and the activity log recorded an enable that never actually took effect.
- Fix: Payment gateway and shipping settings could return secrets under field names the redaction list did not match, such as passphrase and salt.
- Fix: Deleting a WooCommerce product variation did not check the caller's capability on that specific product the way deleting a product does.
- Fix: An identifier in the activity log could link to the wrong object when the detail text ahead of it contained an apostrophe.
- Fix: The activity log's Event and Detail columns could misalign after filtering or paging.
- Fix: Exporting a large activity log could produce a truncated file that still looked complete, and exporting while the log was being written could duplicate rows.
- Fix: Integration and ability counts on the admin screens did not refresh after a save until the page was reloaded.
- Fix: Bridge group headers counted destructive abilities as ordinary writes, and showed a plugin's raw slug instead of its name.
- Fix: Turning the high-risk switch off left a stored value behind instead of clearing the setting.
- Chore: Copy now says an Application Password is a whole-site credential bounded by the WordPress role it belongs to, and that this plugin's allowlist, high-risk floor, and audit log only govern calls made through its own MCP endpoint.
- Chore: Copy now says uninstalling does not revoke an agent's access on its own, and names what survives.
- Chore: Copy now says an OAuth grant's requested scope does not limit what the resulting token can do.
- Chore: The rate limit setting now says it ships off by default, and suggests a starting value.
- Chore: The listing description now leads with what the plugin is rather than how it works, and the tags swap seo for woocommerce.
- Chore: Regenerated the translation template.
1.4.3
- Fix: Media reads handed back the whole library to anyone who could upload a file or edit a post. An agent connected as an author now sees only what it uploaded, and the full library still goes to users who can edit other people's posts. The media count follows the same rule, so it can no longer report a total that disagrees with the list beside it.
- Fix: Deleting a WooCommerce product only checked that you manage the store, not whether that particular product was yours to delete.
- Fix: A duplicate product SKU or coupon code came back as an uncaught error rather than a message naming what it collided with.
- Fix: An ability bridged from another plugin could answer with a bare list where the protocol asks for an object, and some strict clients reject that outright. Bridged results are now always shaped as an object before they reach the wire.
- Fix: The OAuth pointer sent on a 401 compared the request path case-sensitively, so a request that differed only in casing got no pointer at all and the client had nowhere to start.
- Fix: The OAuth authorization response left out the issuer that RFC 9207 requires, which is how a client confirms which server actually answered it. Error redirects carry it now as well.
- Chore: Tightened the build checks that guard these tools, including one that quietly passed any ability whose code it could not read.
1.4.2
- Fix: Asking for a post status when creating content did nothing. "Create a post as a draft" published it live instead, and reported success. Create post, page and draft now honour the status you ask for, and refuse it when your user lacks the capability to publish.
- Fix: Scheduling was not treated as publishing, so a contributor who asked for a future status could put a post live without the capability to publish one. Scheduled and private now require the same permission as publishing.
- Fix: Editing a post's status was checked against the wrong permission, which both let some users set a status they should not have and stopped a contributor changing their own draft. It now checks the capability that actually governs publishing, using the post type's own capability names.
- Fix: Custom post types ignored every status except publish, so a request for pending or private silently became a draft.
- Fix: Updating a WooCommerce order with
line_itemsadded new items rather than changing the existing ones, which quietly raised the order total. There is now anadd_line_itemsfield that says what it does. The old field keeps working exactly as before so nothing breaks. - Fix: The product type sent when updating a WooCommerce product was discarded without a word. Sending one that does not match the product now returns an error instead of pretending it worked.
- Fix: A WooCommerce order request that mixed valid and invalid product ids reported failure after it had already written the valid items, leaving an order with items you were told had not been added. Every id is now checked before anything is written, so a bad one fails the whole request and changes nothing.
- Feature: Every input on every tool now explains itself. All 505 of them, where only three abilities were fully documented before. Agents were guessing at things like which fields replace rather than merge, that prices are plain decimal strings, that country and state want two-letter codes, and that a meta key outside your allowlist is refused rather than returned empty.
- Chore: Added a build check that fails when any tool input goes undocumented, so this cannot drift back.
1.4.1
- Fix: OAuth errors came back in WordPress's own
{code, message, data}shape instead of the{error, error_description}shape RFC 6749 requires, so no standard OAuth client could read what went wrong. Reported by an external user as issue #68, and wrong since the first release. - Fix: A malformed JSON body sent to an OAuth route was rejected by WordPress before the plugin ever saw it, so it escaped with the same wrong shape and no cache headers at all.
- Fix: Responses that carry a credential were missing
Pragma: no-cachenext toCache-Control: no-store, including the response that hands out the token. - Fix: Calling a tool that does not exist, or one you have switched off, returned HTTP 404. The MCP spec reserves that status for "this session is dead, start over", so clients were being told to reconnect after an ordinary mistake. A session that really has expired still returns 404.
- Fix: The OAuth discovery document advertised a client-registration endpoint even when dynamic client registration was off, which is the default. A fresh install was pointing connectors at a URL that does not answer.
- Fix: No tool declared
openWorldHint, and the MCP schema reads an absent value as "this tool may reach the open internet". Every ability this plugin provides now declares it false, which is what the plugin has always actually done. - Chore: Rate-limited OAuth responses now send
Retry-After.
1.4.0
- Feature: A first-run Quick Connect wizard gets a new admin connected on one screen. Turn on OAuth and copy the endpoint, or create a dedicated agent user and generate an application password, then switch on content reads and, if you want, content writes.
- Feature: A pointer on the admin menu greets a brand-new install and points to the plugin page so setup is easy to find.
- Fix: The onboarding "Connect your agent" step and the "Agent users" count no longer read any application password as a connected agent. They now track the agent users this plugin created, or an approved OAuth connection, so an unrelated application password stops showing a false "done" or padding the count.
1.3.2
- Feature: Content reads (posts, pages, search, terms, media, and products) now take an optional language argument and report which language they returned, and a single-item read can fetch a specific translation. Sites without WPML are unaffected.
- Fix: On a WPML site the content lists returned only the default language while the counters reported every language, so an agent was told more items existed than it could actually read. The counts now match the language the list returns.
- Fix: The menu-item tools reported failure on a multilingual site even when the item was created, because WPML's language filter hid it from the re-read. They now resolve the item by id and work correctly.
- Chore: Added a real-WPML contract test and a guard that fails the build if a read-only ability ever starts writing, and kept tooling directories out of the deployed package.
1.3.1
- Fix: wc-list-customers can now filter by role, so a customer using a role other than "customer" (for example a subscriber on an LMS or membership store) is no longer invisible to the list.
- Fix: wc-list-order-notes now correctly detects which notes were written by a person versus WooCommerce itself.
- Fix: A payment gateway's display order now reflects its real position in WooCommerce's own list instead of always reporting zero.
- Fix: Saving a payment gateway is now verified against the value WooCommerce actually stored, instead of assuming the write took effect.
- Fix: The refund executor no longer crashes on a gateway that has no tax method.
- Fix: Updating a WooCommerce product attribute now works the same way across WooCommerce versions instead of assuming a single schema.
- Feature: WooCommerce abilities now require WooCommerce 9.1 or newer. Below that, the WooCommerce tools simply do not register, with a clear reason shown on the Integrations screen, never a fatal error.
- Fix: rankmath-get-head now returns a clear error instead of an empty success when Rank Math's own head renderer is not available.
- Fix: AIOSEO write verification no longer reports failure when AIOSEO makes its own benign normalization to a saved value.
- Fix: A term's parent must now belong to the same hierarchical taxonomy as the term itself.
- Fix: Force-deleting a page no longer reports success when another plugin vetoed the delete.
- Fix: count-media no longer counts items sitting in the trash.
- Fix: upload-media now fails with a clear error instead of a fatal one when the server is missing the fileinfo PHP extension.
- Fix: update-site-settings now reports failure when WordPress silently reverts a value it considers invalid, instead of reporting success on a change that never took effect.
- Fix: Abilities from an inactive integration are no longer wiped out when the abilities form is saved.
- Fix: The agent-user picker now finds every user with an application password, not just the first page of users.
- Fix: A filtered-out ability row is now actually hidden instead of staying on screen.
- Fix: Corrected the reset dialog, the rate-limit help, and the privacy disclosures to match what the plugin actually does.
- Feature: The activity log now attributes each call to its OAuth client, shows a result count for list and read calls, and leaves a marker behind when the log is cleared.
- Fix: Denied OAuth bearer authentication attempts are now logged, and only when they match a real, if invalid, token.
- Fix: The OAuth consent screen and the authorization code redirect are never cached.
- Chore: The release zip no longer ships the mcp-adapter's Node package metadata, making it smaller.
- Chore: Added a real-vendor contract test suite that runs against pinned WooCommerce, Rank Math, AIOSEO, and ACF plugin code, to catch API-shape regressions like several of the fixes above before release instead of after.
1.3.0
- Fix: New installs now ship with OAuth off by default instead of on. Sites that already had OAuth on keep it on after updating, so existing connections keep working.
- Fix: The OAuth consent grant could be phished into getting an administrator to approve a malicious client.
- Feature: The OAuth consent screen now warns when the account approving a connection is an administrator.
- Feature: The settings screen now warns you before a REST API lockdown would cut off your OAuth connections.
- Fix: The MCP capability gate could quietly stop enforcing when another adapter copy loaded first. The plugin now checks that the running adapter still applies the filter, and matches it as a real call rather than a text match.
- Fix: The update-user ability did not require edit_users, so an agent could change its own account beyond its own capabilities.
- Fix: A bridged ability from another plugin with no destructive annotation is now treated as destructive rather than assumed safe.
- Feature: The Abilities Bridge directory now shows each bridged ability's effective permission, not just its name.
- Fix: WooCommerce customer listing returned zero customers on every real store, because it called a function WooCommerce does not have.
- Fix: WooCommerce shipping zones came back empty on every real store.
- Fix: WooCommerce order paging was ignored on stores using legacy (non-HPOS) order storage.
- Fix: WooCommerce product attributes were dropped when creating a product and wiped when updating one.
- Fix: Yoast's robots_noindex setting was inverted in the tool contract, so an agent wrote the opposite of what it asked for.
- Fix: Rank Math social and Twitter images set by an agent now render, because the plugin writes the attachment ID instead of a URL.
- Fix: AIOSEO social and Twitter images set by an agent now render. This corrects the image type, the Open Graph fallback, and a reset that was clearing a valid image.
- Fix: ACF field writes reported failure on numeric and boolean values even when the value saved.
- Fix: Partially updating a menu item wiped any field you did not pass instead of leaving it alone.
- Fix: The page-publish permission check did not recognize custom public statuses from other plugins, blocking valid publishes.
1.2.1
- Chore: The plugin's website link now points to agentabilitieswp.com instead of the GitHub repository.
- Chore: Refreshed the documentation so the supported-client list matches what actually works: ChatGPT, Claude (the claude.ai web app and Claude Desktop), and Manus all connect by URL over OAuth, while Claude Code, Cursor, VS Code, Windsurf, and Gemini CLI connect from your own machine.