The WordPress Abilities API: What It Lets Software Do To A Client Site.

Core shipped a registry that lets a site declare what it can do. We read one live and found 38 abilities, three of them equivalent to SSH.

Aditya Sharma·6 min read

Short answer: the wordpress abilities api is a registry, introduced in WordPress 6.9, where plugins and core declare what they can do in a machine-readable schema. It is not a chatbot and it is not an AI feature. It is the list an agent reads to find out what a particular site permits, and that list is decided entirely by what is installed.

I read one on a live production site this week. Here is what is actually in there.

What it is, in core’s own words

The WordPress AI team describes the Abilities API as “a core WordPress API (introduced in 6.9) that creates a central registry of capabilities, making WordPress functions discoverable and accessible to AI agents, automation tools, and developers”.

An ability itself is defined as “a registered, self-documenting unit of WordPress functionality that can be discovered and invoked through multiple contexts (REST API, Command Palette, MCP). Includes authorization and input/output specifications”.

The phrase doing the work there is self-documenting. The site tells you what it can do, what each operation accepts, and what it returns, without anybody writing an integration guide.

A real WordPress Abilities API registry, read live

Table of the abilities registered on a production WordPress site. The rank-math namespace registers 24, agent-connector-for-wp registers 11, and core registers 3, for 38 in total
38 abilities on one ordinary site. Note where they come from. Core contributes three.

Everything else was registered by a plugin somebody chose to install.*

That distribution is the thing to internalise. What an agent can do to a WordPress site is not a property of WordPress. It is a property of that site’s plugin list.

Here is a single ability as the site publishes it:

The core/get-site-info ability in full, showing its name, label, description, an input schema with an enum of permitted fields and additionalProperties set to false, and an output schema
Note additionalProperties: false and the enum listing exactly which fields may be

requested. This is the difference between an agent guessing at an API and an agent reading a contract. Anything outside the schema is rejected before it reaches any code.*

The line core drew, and the line your plugins did not

Core is being deliberately careful here, and it is worth knowing why.

The AI team is implementing read-only abilities first, with management operations planned afterwards, on the reasoning that write operations “require more careful design and governance than retrieval capabilities.”

That caution does not extend to plugins, because it cannot. Any plugin may register any ability it likes.

Table of abilities on the live site split by effect. The three core abilities only read. The connector plugin's file-read is a read. Its file-write, php-eval and shell-exec are writes, described as writing any file, executing arbitrary PHP in the WordPress runtime, and running arbitrary shell commands
Core’s three abilities only read. The three at the bottom, registered by a connector

plugin, are as powerful as SSH. That is not a criticism of the connector, which documents exactly what it does. It is the reason installing one is an agency decision rather than a technical detail.*

An agent connected to that site is not limited by the Abilities API. It is limited by whichever plugin registered the most dangerous ability, and by the capabilities of the user whose credential it holds.

What this changes for an agency

The genuinely useful shift is that you can now inspect this rather than trust a vendor’s description of it.

Before the Abilities API, “our tool integrates with WordPress” was a claim you either believed or did not. Now the site itself will tell you, in a schema, exactly what has been exposed on it.

Five questions to answer before connecting an agent to a client site, covering what the site can do, which abilities only read, which are effectively root access, whose credential is in use, and how to revoke it quickly
Question three is the one worth being unpopular about. A connector exposing arbitrary

PHP evaluation is not a limited integration, whatever the marketing says. It is full server access with a friendlier name.*

One practical habit: never hardcode an ability list. Ask the site every time. Plugins get added, updated and removed, and a list you cached in March describes a site that no longer exists.

There is a second habit worth building, and it comes from the same place as every other check on this blog: verify the revocation path before you rely on it. An application password is revoked from the user’s own profile screen, and the connection dies immediately. Test that once, on a site you control, so you know what it looks like. A safety mechanism nobody has ever exercised is a backup nobody has ever restored: a hope with a filename.

It is also worth being clear about what the registry does not tell you. It lists what a site can do. It says nothing about whether the code behind each ability is well written, or whether the plugin that registered it is still maintained. An ability exposed by a plugin that quietly left the directory is still discoverable, still invokable, and no longer receiving fixes.

Reading a registry yourself

The endpoint is public in the sense that it exists at a known path, though it requires authentication to read:

curl -s -u "USER:APPLICATION_PASSWORD" \
  https://example.com/wp-json/wp-abilities/v1/abilities \
  | python3 -c 'import json,sys
d=json.load(sys.stdin)
items = d if isinstance(d,list) else d.get("abilities",[])
print(len(items),"abilities")
for a in items: print(" ", a["name"])'

Two things to look for in the output. Group the names by their namespace prefix, because that tells you which plugin contributed what. Then read the description of anything whose name contains write, exec, eval, delete or update, because those are the ones that can change the site.

If the list surprises you, that is the point of reading it.

Where I think this goes

The interesting part is not that agents can now change WordPress sites. Software has been able to do that for twenty years through the REST API and WP-CLI.

The interesting part is that the site can now declare what it permits, in a form software can read, and that declaration can be audited by the person responsible for the site.

That is the piece agencies have never had. Not a promise that a tool behaves, but a list you can read before you connect it, and revoke afterwards without asking anybody.

Protuno connects to sites this way, and the same reasoning is why every agent carries a permission you set and why nothing writes without a proven restore point. Straight with you as on every post here: the Super Agents are built and named but not live yet. The free audit needs no connection at all and runs from a domain.

If you want to see this for yourself, the fastest route is a site you already control. Install a connector, request the abilities list, and read it. It is more informative than any integration page, and it is the same list an agent would read.

It also pairs well with knowing what PHP branch that site is on, because an agent is only ever as safe as the runtime underneath it.

Comments