WordPress Abilities API and the MCP Adapter: A Practical Guide for Agencies

WordPress 6.9 gave core, plugins and themes a standard way to tell AI agents what a site can do. The Abilities API describes each action with a schema and a permission check; the MCP Adapter publishes those actions to Claude, ChatGPT and Cursor. Here is how they fit together, how to register an ability of your own, and what agencies should standardise before agents arrive on client sites.

In this article
  1. 01What an ability is
  2. 02How abilities reach an AI agent
  3. 03Register your first ability
  4. 04Connect it to Claude
  5. 05What agencies should standardise
  6. 06Abilities or an MCP plugin?
  7. 07Where WPOS fits
Key takeaways
  • An ability is a named, self-describing action a site can perform.
  • The MCP Adapter, an official plugin from the WordPress project, turns abilities into MCP tools, resources and prompts.
  • Here is a read-only ability an agency might ship to every client site: list published posts that have not been updated for a given number of days.
  • With the MCP Adapter active, the ability is available through the default server.
  • One namespace per agency.
  • Write abilities when the action is yours: client-specific workflows, business rules, or reports no general plugin will ship.

What an ability is

An ability is a named, self-describing action a site can perform. Each one is registered with:

  • a name in the form namespace/ability-name, using lowercase letters, numbers and hyphens;
  • a label, a description and a category;
  • an input schema and an output schema, so a caller knows what to send and what comes back;
  • an execute callback, which does the work, and a permission callback, which decides who may run it;
  • optional meta, including annotations that mark an ability as read-only, destructive or idempotent.

The Abilities API is available from WordPress 6.9. It is useful on its own, as a single registry of what a site can do, but its headline use is giving AI agents a typed, permissioned way in.

How abilities reach an AI agent

The MCP Adapter, an official plugin from the WordPress project, turns abilities into MCP tools, resources and prompts. Abilities are private by default. To expose one, its developer sets meta.public to true, or meta.mcp.public to expose it to MCP only. Each ability becomes a tool unless meta.mcp.type says otherwise: a resource needs a uri, and a prompt needs arguments.

The adapter’s default server, mcp-adapter-default-server, gives clients three tools: mcp-adapter/discover-abilities, mcp-adapter/get-ability-info and mcp-adapter/execute-ability. A client discovers what the site offers, reads an ability’s schema and runs it, and the ability’s own permission callback is checked every time.

Register your first ability

Here is a read-only ability an agency might ship to every client site: list published posts that have not been updated for a given number of days. Put it in a small plugin or a must-use plugin.

<?php
/**
 * Plugin Name: Agency Abilities
 * Description: Read-only abilities agents can call on client sites.
 */

add_action( 'wp_abilities_api_categories_init', function () {
	wp_register_ability_category( 'agency-audit', array(
		'label'       => __( 'Agency audit', 'agency' ),
		'description' => __( 'Read-only checks an agency runs across client sites.', 'agency' ),
	) );
} );

add_action( 'wp_abilities_api_init', function () {
	wp_register_ability( 'agency/list-stale-posts', array(
		'label'               => __( 'List stale posts', 'agency' ),
		'description'         => __( 'Lists published posts not updated in the given number of days.', 'agency' ),
		'category'            => 'agency-audit',
		'input_schema'        => array(
			'type'       => 'object',
			'properties' => array(
				'days' => array( 'type' => 'integer', 'minimum' => 30, 'default' => 365 ),
			),
		),
		'output_schema'       => array(
			'type'  => 'array',
			'items' => array(
				'type'       => 'object',
				'properties' => array(
					'id'       => array( 'type' => 'integer' ),
					'title'    => array( 'type' => 'string' ),
					'modified' => array( 'type' => 'string' ),
				),
			),
		),
		'execute_callback'    => function ( $input ) {
			$days  = absint( $input['days'] ?? 365 );
			$posts = get_posts( array(
				'post_status'    => 'publish',
				'posts_per_page' => 50,
				'date_query'     => array(
					array( 'column' => 'post_modified_gmt', 'before' => $days . ' days ago' ),
				),
			) );
			$items = array();
			foreach ( $posts as $post ) {
				$items[] = array(
					'id'       => $post->ID,
					'title'    => get_the_title( $post ),
					'modified' => $post->post_modified_gmt,
				);
			}
			return $items;
		},
		'permission_callback' => function () {
			return current_user_can( 'edit_posts' );
		},
		'meta'                => array(
			'public'      => true,
			'annotations' => array(
				'readonly'    => true,
				'destructive' => false,
				'idempotent'  => true,
			),
		),
	) );
} );

Three details matter. The permission callback checks a real capability rather than returning true. The annotations tell clients the ability only reads. And meta.public is set deliberately, because nothing is exposed until you say so. The Abilities API handbook lists every argument.

Connect it to Claude

With the MCP Adapter active, the ability is available through the default server. For a local site, the adapter’s guide uses WP-CLI over STDIO. In Claude Desktop’s claude_desktop_config.json:

{
  "mcpServers": {
    "wordpress": {
      "command": "wp",
      "args": [
        "--path=/path/to/your/wordpress/site",
        "mcp-adapter",
        "serve",
        "--server=mcp-adapter-default-server",
        "--user=admin"
      ]
    }
  }
}

For a hosted site, use an application password and Automattic’s @automattic/mcp-wordpress-remote proxy; the exact configuration is in How to connect Claude to WordPress. Then ask Claude to discover the site’s abilities and run agency/list-stale-posts with days set to 365.

What agencies should standardise

  • One namespace per agency. Ship your abilities under a single prefix, such as agency/, in one plugin you version and deploy across the fleet.
  • Read-only first. Start with abilities that report, such as stale content, plugin versions or broken links, before any that change things.
  • Honest annotations. Mark destructive abilities as destructive, so clients and reviewers treat them accordingly.
  • Real permission checks. Never use __return_true for anything that writes; check the capability the action needs.
  • A dedicated agent user. Connect MCP clients as a user with only the capabilities your abilities need.
  • Logging. Record who ran which ability and when, so a client question has an answer.

Abilities or an MCP plugin?

Write abilities when the action is yours: client-specific workflows, business rules, or reports no general plugin will ship. Use an MCP plugin when you want breadth today: hundreds of general tools for content, settings and stores. The two are not exclusive, and the official route is where WordPress itself is heading, as covered in what WordPress 7.0 means for agencies. Our comparison of WordPress MCP plugins covers the plugin side.

Where WPOS fits

Abilities make a site agent-ready. Running a client fleet takes more. WPOS is an agent and workspace for agencies: it works inside wp-admin on each client site, builds natively in the site’s builder, follows your team’s skills and checks its own render before it reports done. It also speaks MCP, so your own Claude Code, Cursor or Codex can drive the same tools across your client sites without spending WPOS credits. Try it free for 30 days on a site you already manage.

Frequently Asked Questions

A core API, available from WordPress 6.9, for registering named actions a site can perform, each with input and output schemas, a permission callback and an execute callback. It gives AI agents and other clients a typed, permissioned way to use a site's features.

No. Abilities are private by default. A developer exposes one by setting meta.public, or meta.mcp.public for MCP only, and the MCP Adapter then publishes it to MCP clients.

A tool is an action the agent can run, a resource is data it can read, and a prompt is a reusable workflow template. Abilities become tools unless meta.mcp.type sets resource, which needs a uri, or prompt, which needs arguments.

Not to use them in PHP. To make them available to MCP clients such as Claude, you need the MCP Adapter or another MCP server that reads registered abilities.

WordPress 6.9 or later for the Abilities API. The MCP Adapter plugin also needs PHP 7.4 or later.

Agent-ready sites, run as a fleet.

WPOS puts an agent inside wp-admin on every client site. Free for 30 days: 5,000 credits, a live site plus a sandbox, no card.

Start free