Title: MCP Abilities Guard – Allow, reject, or hold for approval — or undo — any MCP action
Author: KevinPlugins
Published: <strong>September 1, 2026</strong>
Last modified: September 1, 2026

---

Search plugins

![](https://ps.w.org/kevinplugins-mcp-abilities-guard/assets/banner-772x250.png?
rev=3675125)

![](https://ps.w.org/kevinplugins-mcp-abilities-guard/assets/icon-256x256.png?rev
=3675125)

# MCP Abilities Guard – Allow, reject, or hold for approval — or undo — any MCP action

 By [KevinPlugins](https://profiles.wordpress.org/kevinplugins/)

[Download](https://downloads.wordpress.org/plugin/kevinplugins-mcp-abilities-guard.1.0.0.zip)

 * [Details](https://wordpress.org/plugins/kevinplugins-mcp-abilities-guard/#description)
 * [Reviews](https://wordpress.org/plugins/kevinplugins-mcp-abilities-guard/#reviews)
 *  [Installation](https://wordpress.org/plugins/kevinplugins-mcp-abilities-guard/#installation)
 * [Development](https://wordpress.org/plugins/kevinplugins-mcp-abilities-guard/#developers)

 [Support](https://wordpress.org/support/plugin/kevinplugins-mcp-abilities-guard/)

## Description

MCP plugins let an AI agent act on your site. Whichever one you use, the result 
is the same: a model connected in Claude, Cursor or Codex can create posts, edit
content, change settings and delete things, and by default nothing stands between
the model deciding and WordPress doing.

MCP Abilities Guard lets you govern every ability an AI agent can call. For each
one you can set:

 * **Always allow** — it runs, and what it did is recorded
 * **Require approval** — it is held. Nothing changes until a human says yes
 * **Always reject** — it never runs, and the agent is told to stop trying

By default, everything runs and is recorded — the gate is opt-in. You decide what
to hold: set a rule on a particular ability to require approval or block it, or 
flip a single switch to hold every delete across the site. Nothing is held until
you ask for it, so the plugin never quietly breaks an agent workflow you did not
choose to stop.

The **Hold removals** switch is the one most sites will want: one click, and every
delete — posts, users, options, whole tables — waits for approval, including deletes
hidden inside an ability whose code cannot be read (once it is seen deleting, it
is caught from then on). A removal is the write worth this treatment, because once
it runs the site no longer has what was there to put back.

You do not need the ability’s author to have built any of this. The guard attaches
as abilities are registered, so it covers plugins that have never heard of it.

#### It works with whichever MCP plugin you use

There are many MCP server plugins now, each with its own endpoint, its own authentication
and its own way of exposing tools. This plugin is not tied to any of them.

Abilities are guarded at the moment WordPress registers them, so a rule applies 
no matter which server later exposes that ability. And because MCP is a standard
protocol, tool calls are recognised by their shape rather than by any plugin’s URL—
so a call is inspected the same way whether it arrives through one MCP plugin, another,
or one released next year.

That matters more than it sounds. Several MCP plugins register abilities _and_ run
their own server that calls the underlying code directly. Guard only the ability,
and a rule you set looks armed while the agent’s actual route sails past it. This
plugin watches both, so the rule holds whichever way the call comes in.

#### How it decides what an ability does

Most tools guess from an ability’s name, or trust whatever its author declared. 
Both are wrong often enough to matter — an ability called `get_report` can still
send email. This plugin prefers evidence, strongest first:

 1. **Watching it run.** While an ability executes, the plugin records what it touches:
    posts, pages, options, users, terms, comments, and writes to any plugin’s own tables.
    Seen reading and never writing, it earns read-only status.
 2. **Reading its code.** Before an ability has ever run, its callback is inspected
    for database writes, outbound requests and file changes. This catches a write on
    the first call rather than the second.
 3. **Its declared annotation.** A read-only claim is taken only as a hint. A claim
    of being _destructive_, though, is believed and the ability is held — that admission
    costs its author access, which is why it is worth trusting.
 4. **Its name.** The weakest signal, used last, and never enough on its own to auto-
    allow.

Every row in the admin list shows which of these produced its classification, so
you always know whether you are reading a verified result or an assumption. When
nothing can be determined the plugin says **unknown** rather than guessing. An unknown
ordinary call still runs; an unknown removal or outbound effect is held, since those
are the ones worth stopping when in doubt.

#### What is held, and when

Out of the box, nothing is held — every call runs and is recorded, and you choose
what to gate. There are two ways to choose.

The first is per ability: on the Abilities screen, set any ability to _require approval_
or _always reject_. Use this for the specific tools you want a person to see — a“
mail every subscriber” action, a bulk importer, anything you would rather confirm.

The second is the **Hold removals** switch in Settings: one toggle that holds every
delete at once, including deletes caught only by watching an ability run. A removal
is the one write worth a blanket rule, because its “before” is gone the instant 
it runs and there is nothing to undo afterwards. It is off by default — the gate
is opt-in — and most sites will want it on.

#### What a held request looks like

Nothing has changed yet. The call is queued, and the agent receives a clear message:
approval is pending, do not retry, and do not attempt the same change another way.
It can check the outcome later through an ability provided for that purpose, so 
it waits rather than looking for a way around.

You review it in wp-admin, with the arguments the agent proposed. Values that look
sensitive are redacted. Approve and it runs; reject and it never does.

#### Seeing the change before you allow it

A held request is not a name and a shrug. Where the target can be resolved, the 
review screen shows the object’s current values against what the agent proposes —
a real before and after, read from your database at the moment you are looking at
it.

Where that is not possible the screen says so rather than dressing up a guess. A
reviewer who believes they are reading a verified diff when they are reading the
arguments is worse off than one who knows which they have.

#### Undoing what already happened

This plugin records that a call happened, who made it, how it was decided and what
it touched. Putting a change back is a different problem: it needs every affected
object’s previous state kept, which is storage a site that only wants the gate has
no reason to pay for. That, with the full before-and-after history, is [MCP Abilities Guard Pro](https://www.kevinplugins.com/mcp-abilities-guard/).

Nothing here degrades without it. The gate, the approvals, the previews and the 
record of decisions are complete on their own.

#### MCP Abilities Guard Pro

The free plugin decides what may happen and keeps an honest record that it did. 
The Pro add-on adds what it takes to see and unwind what already happened:

 * **Full change history.** A before-and-after image of every write an agent made—
   posts, options, users, terms, comments, metadata, and writes to any plugin’s 
   own tables — described in plain language and kept for as long as you choose.
 * **One-click undo.** Revert any recorded change straight from the log, restoring
   the object to exactly what it was. This includes raw SQL writes to core tables
   that fire no WordPress hook, which nothing else can put back.
 * **Multiple approvers, with a quorum.** Require several people to sign off on 
   a held request — named users or roles — and choose whether any one of them is
   enough or all of them must approve. The free plugin applies a request on a single
   administrator’s approval.

Pro attaches to the free plugin through its own hooks: install it and the audit 
log gains a history and an undo button, and the approver picker gains a quorum. 
Remove it and the gate keeps working exactly as before. Learn more at [MCP Abilities Guard Pro](https://www.kevinplugins.com/mcp-abilities-guard/).

#### What this plugin does

 * Sets every registered ability to always allow, require approval, or always reject
 * Covers abilities from any plugin, without their authors doing anything
 * Classifies read versus write by observation and code inspection, not naming
 * One switch to hold every removal (delete) for approval — including ones caught
   only by watching an ability run
 * Queues held calls for human review, with the proposed arguments shown and sensitive
   values redacted
 * Keeps every held request with who asked, who answered and when — the history 
   an approver looks back at
 * Supports different rules per caller, so one agent can be trusted where another
   is not
 * Applies a held request on a single approval from any administrator (choosing 
   specific approvers, and requiring several — any or all — is available in the 
   Pro add-on)
 * Expires unanswered requests after a period you choose
 * Learning mode: watch and classify without holding anything, so you can see the
   list before you set rules
 * Reports coverage: which MCP tool calls it saw, and which did not map to a registered
   ability

#### What this plugin does not do

 * It does not run an MCP server, transport or authentication. Those are your MCP
   plugin’s job.
 * It does not register abilities of its own, other than one small ability that 
   lets an agent look up whether its pending request was approved.
 * It does not replace an ability’s own permission checks. Those still run. This
   is a layer on top, not a substitute.
 * It does not govern MCP tools that were never registered as abilities. Some plugins
   serve tools directly without registering them; those are outside its reach, and
   the Coverage screen names them rather than leaving you to assume you are covered.
 * It does not phone home, collect telemetry, or make any external network request.

#### Requirements

 * WordPress 6.9 or later — the Abilities API arrived in core in 6.9
 * PHP 7.4 or later
 * At least one plugin that registers abilities, and usually an MCP server plugin
   to expose them

#### Source code

Development happens in the open at [github.com/KevinPlugins/mcp-abilities-guard](https://github.com/KevinPlugins/mcp-abilities-guard).

The admin screen is a Vue application. What runs in `assets/` is the compiled bundle;
the readable source it was built from ships alongside it, in the `app/` directory
of the plugin, together with the build configuration (`app/package.json`, `app/vite.
config.js`). Run `npm install && npm run build` inside `app/` to rebuild the bundle
and compare it against what ships.

#### Privacy

Nothing leaves your site. There is no external service, no telemetry and no account.
Requests, approvals and behaviour profiles are stored in your own database.

Arguments passed to abilities are stored with each queued request so a reviewer 
can see what was proposed. Values that look sensitive are redacted before display.
Requests can be purged on a schedule you set, because those arguments may contain
personal data.

#### About MCP

Model Context Protocol is an open specification originally developed by Anthropic.
This plugin is a third-party project and is not affiliated with, endorsed by or 
sponsored by Anthropic, nor by any of the MCP server plugins it works alongside.

## Screenshots

[⌊The abilities list. Every registered ability, from any MCP plugin, labelled by
what it actually does — read, write or remove — with a per-ability rule: always 
allow, require approval (naming who signs off), or block.⌉⌊The abilities list. Every
registered ability, from any MCP plugin, labelled by what it actually does — read,
write or remove — with a per-ability rule: always allow, require approval (naming
who signs off), or block.⌉[

The abilities list. Every registered ability, from any MCP plugin, labelled by what
it actually does — read, write or remove — with a per-ability rule: always allow,
require approval (naming who signs off), or block.

[⌊The approval queue, seen by someone who is not an approver for this request. A
removal is held with its proposed arguments shown; the Approve button is disabled
and explains why.⌉⌊The approval queue, seen by someone who is not an approver for
this request. A removal is held with its proposed arguments shown; the Approve button
is disabled and explains why.⌉[

The approval queue, seen by someone who is not an approver for this request. A removal
is held with its proposed arguments shown; the Approve button is disabled and explains
why.

[⌊The same held request, seen by an approver — one click applies it or rejects it.
Nothing has touched the site while it waits.⌉⌊The same held request, seen by an 
approver — one click applies it or rejects it. Nothing has touched the site while
it waits.⌉[

The same held request, seen by an approver — one click applies it or rejects it.
Nothing has touched the site while it waits.

[⌊The audit log: every governed call — allowed, queued, blocked or reverted — with
the caller, the outcome, and exactly what changed. (Change history and one-click
undo are part of the Pro add-on.)⌉⌊The audit log: every governed call — allowed,
queued, blocked or reverted — with the caller, the outcome, and exactly what changed.(
Change history and one-click undo are part of the Pro add-on.)⌉[

The audit log: every governed call — allowed, queued, blocked or reverted — with
the caller, the outcome, and exactly what changed. (Change history and one-click
undo are part of the Pro add-on.)

[⌊Undo in action: an applied change reverted from the log, the original row marked"
reverted", and the undo itself recorded. (Pro add-on.)⌉⌊Undo in action: an applied
change reverted from the log, the original row marked "reverted", and the undo itself
recorded. (Pro add-on.)⌉[

Undo in action: an applied change reverted from the log, the original row marked“
reverted”, and the undo itself recorded. (Pro add-on.)

[⌊Settings. Everything runs and is recorded by default; the gate is opt-in. A single"
hold removals" switch holds every delete, plus learning mode, holding unidentifiable
callers, and request expiry.⌉⌊Settings. Everything runs and is recorded by default;
the gate is opt-in. A single "hold removals" switch holds every delete, plus learning
mode, holding unidentifiable callers, and request expiry.⌉[

Settings. Everything runs and is recorded by default; the gate is opt-in. A single“
hold removals” switch holds every delete, plus learning mode, holding unidentifiable
callers, and request expiry.

## Installation

 1. Install MCP Abilities Guard from the plugin directory, or upload the plugin zip.
 2. Activate it.
 3. Open **MCP Abilities Guard** from the WordPress admin menu (it is a top-level item).

On a site that already has abilities registered, leave **Learning mode** on to begin
with. The plugin watches and classifies without holding anything, so you can see
what your abilities actually do before deciding anything. When the list looks right,
turn learning mode off and set rules on the abilities you care about.

A reasonable starting point is to turn on **Hold removals** so every delete waits
for you, then add an _always reject_ rule on anything you never want an agent touching
and a _require approval_ rule on the few other actions worth a glance (a bulk-email
tool, say). Everything else runs and is recorded.

## FAQ

### Does it work with my MCP plugin?

It should. The guard attaches to abilities as WordPress registers them, so it does
not care which plugin later exposes them. Tool calls are recognised by the MCP protocol’s
own message shape rather than by any particular plugin’s endpoint, so no per-plugin
support is needed.

### Do I need to write any code?

No. Everything is set from the admin screen.

### What is the difference between “require approval” and “always reject”?

Require approval holds the call and waits for a person. Always reject refuses it
outright, tells the agent not to retry and not to attempt the same change another
way, and records the attempt. Use reject for things no agent should ever do, so 
you are not answering the same prompt repeatedly.

### What happens to the AI agent while a request is held?

It is told the request is queued, that nothing has changed, and that it should not
retry. It can look up the outcome later through an ability the plugin registers 
for exactly that purpose. Agents told only “denied” tend to look for another route,
which is why the wording matters.

### Will it slow my site down?

It does nothing on front-end page loads. The work happens only while an ability 
is executing, which is an admin or API request.

### What if an ability has never run?

Its code is inspected before it runs, which is usually enough to tell a read from
a write from a removal. If that is inconclusive it runs like an ordinary write. 
With **Hold removals** on, a call detected — or later observed — to delete is held
even if it was never seen before. Nothing is ever labelled read-only on a guess.

### Can it undo what an agent did?

Not on its own. This plugin’s job is to stop the change before it happens, and to
keep an honest record that it did. Reverting one afterwards means storing every 
affected object’s previous state, which is a real cost and belongs with the feature
that needs it — MCP Abilities Guard Pro.

Email, outbound requests and file writes cannot be undone by anything, at any price.
They are not held by default — holding every incidental email would be unusable —
but every one is recorded, and you can put a require-approval rule on a specific
outbound tool if it is worth stopping.

### Can different agents have different rules?

Yes. A caller proven by authentication can be given its own rules. A caller that
merely says who it is can be told apart in the request queue and can have rules 
made stricter, but never looser — otherwise any client could claim to be your trusted
one.

### Can I require more than one person to approve?

In the free plugin a held request is applied by the first administrator who approves
it. Requiring several approvers — naming specific users or roles, and choosing whether
any one of them or all of them must sign off — is part of the Pro add-on.

### An MCP tool is not in my list. Why?

It was probably never registered as an ability. Check the Coverage screen: tool 
calls that did not map to a registered ability are listed there. Its author would
need to register those tools with the Abilities API for them to become governable.

### Does it replace the permission checks abilities already have?

No. Those still run. This is an extra layer, not a substitute — an ability that 
refuses a user without the right capability still refuses them.

### Does it send data anywhere?

No. No external service, no telemetry, no account.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“MCP Abilities Guard – Allow, reject, or hold for approval — or undo — any MCP action”
is open source software. The following people have contributed to this plugin.

Contributors

 *   [ KevinPlugins ](https://profiles.wordpress.org/kevinplugins/)

[Translate “MCP Abilities Guard – Allow, reject, or hold for approval — or undo — any MCP action” into your language.](https://translate.wordpress.org/projects/wp-plugins/kevinplugins-mcp-abilities-guard)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/kevinplugins-mcp-abilities-guard/),
check out the [SVN repository](https://plugins.svn.wordpress.org/kevinplugins-mcp-abilities-guard/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/kevinplugins-mcp-abilities-guard/)
by [RSS](https://plugins.trac.wordpress.org/log/kevinplugins-mcp-abilities-guard/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.0.0

 * Initial release.
 * Per-ability rules: always allow, require approval, always reject.
 * Covers abilities registered by any plugin, with no cooperation needed from their
   authors.
 * Recognises MCP tool calls by protocol shape, so a rule holds whichever server
   exposes the ability.
 * Read/write classification by observation and by inspecting the ability’s code,
   with the basis shown for each.
 * Opt-in gate: everything runs and is recorded by default. A “hold removals” switch
   holds every delete; per-ability rules hold or block anything else.
 * Approval queue with per-caller rules, single-approval sign-off, and optional 
   expiry (multiple approvers with any/all quorum in Pro).
 * Request history: what was asked, who answered it, and when.
 * Learning mode for classifying without holding anything.
 * Coverage reporting for MCP tool calls that map to no registered ability.

## Meta

 *  Version **1.0.0**
 *  Last updated **4 days ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.9 or higher **
 *  Tested up to **7.1**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [abilities](https://wordpress.org/plugins/tags/abilities/)[AI](https://wordpress.org/plugins/tags/ai/)
   [approval](https://wordpress.org/plugins/tags/approval/)[mcp](https://wordpress.org/plugins/tags/mcp/)
   [model context protocol](https://wordpress.org/plugins/tags/model-context-protocol/)
 *  [Advanced View](https://wordpress.org/plugins/kevinplugins-mcp-abilities-guard/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/kevinplugins-mcp-abilities-guard/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/kevinplugins-mcp-abilities-guard/reviews/)

## Contributors

 *   [ KevinPlugins ](https://profiles.wordpress.org/kevinplugins/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/kevinplugins-mcp-abilities-guard/)