Skip to main content
The WordPress Abilities API is a WordPress Core feature (available in WordPress 6.9+) that provides a standardized registry for capabilities across the WordPress ecosystem. Any plugin can register discrete actions (“abilities”) with defined input/output schemas, making functionality discoverable by external systems. MainWP Dashboard registers 62 abilities into this framework across five categories. This integration enables AI agents, automation platforms, and external tools to discover what MainWP can do and execute those capabilities through a consistent interface.

What You’ll Learn

  • How the Abilities API enables discovery of MainWP capabilities
  • Available ability categories and endpoints
  • How to execute abilities and handle responses
  • Error handling for AI agent integrations

How It Works

The Abilities API adds a discovery layer to WordPress. AI agents and automation tools query /wp-abilities/v1/abilities to see all available actions, their input schemas, output schemas, and behavioral annotations. This enables dynamic discovery of what operations are possible and automated parameter validation.

MainWP MCP Server

Connect Claude, VS Code Copilot, and Cursor to your MainWP Dashboard through the Model Context Protocol. The MCP Server exposes MainWP abilities as tools that AI assistants can call directly.

Prerequisites

  • WordPress 6.9 or later
  • MainWP Dashboard 6.0 or later
  • WordPress user with manage_options capability
  • API key with appropriate permissions

Base URL

All Abilities API endpoints use the WordPress Abilities namespace:
https://your-dashboard.com/wp-json/wp-abilities/v1/

Authentication

The Abilities API accepts any WordPress REST API authentication method.

Bearer Token

Use the same API keys generated for the MainWP REST API:
curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://your-dashboard.com/wp-json/wp-abilities/v1/abilities"

Application Passwords

Create an Application Password in WordPress under Users > Profile:
curl -u "USERNAME:APPLICATION_PASSWORD" \
  "https://your-dashboard.com/wp-json/wp-abilities/v1/abilities"

Discovery Endpoints

These endpoints let you explore what abilities are available.

List All Abilities

GET /wp-json/wp-abilities/v1/abilities
Returns registered abilities with pagination.
ParameterTypeDefaultDescription
pageinteger1Page number
per_pageinteger50Items per page (max 100)
categorystringFilter by category slug
curl -u "admin:xxxx" \
  "https://your-dashboard.com/wp-json/wp-abilities/v1/abilities?category=mainwp-sites"

Get Single Ability

GET /wp-json/wp-abilities/v1/abilities/{name}
Returns full details for a specific ability including input/output schemas.
curl -u "admin:xxxx" \
  "https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/list-sites-v1"

List Categories

GET /wp-json/wp-abilities/v1/categories
MainWP registers these categories:
CategoryAbilitiesDescription
mainwp-sites30Site management and monitoring
mainwp-updates13Update detection and execution
mainwp-clients11Client management
mainwp-tags7Tag/group management
mainwp-batch1Batch operation monitoring

Executing Abilities

Endpoint

GET|POST /wp-json/wp-abilities/v1/abilities/{name}/run

HTTP Methods

Each ability specifies whether it reads or modifies data:
  • GET — Read-only abilities (marked readonly: true)
  • POST — Abilities that create, update, or delete data

Input Handling

GET requests: Omit the input parameter to use schema defaults. URL-encoded JSON in query strings does not work reliably.
curl -u "admin:xxxx" \
  "https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/list-sites-v1/run"
POST requests: Pass input in the JSON body:
curl -X POST -u "admin:xxxx" \
  -H "Content-Type: application/json" \
  -d '{"input":{"site_id_or_domain":1}}' \
  "https://your-dashboard.com/wp-json/wp-abilities/v1/abilities/mainwp/get-site-v1/run"

Response Format

Success

Abilities return their defined output schema directly:
{
  "items": [
    {
      "id": 1,
      "url": "https://example.com",
      "name": "My Site",
      "status": "connected"
    }
  ],
  "page": 1,
  "per_page": 20,
  "total": 150
}

Errors

Error responses follow WordPress REST API conventions:
{
  "code": "ability_invalid_input",
  "message": "Invalid parameter: site_id_or_domain is required",
  "data": {
    "status": 400
  }
}

Ability Annotations

Each ability includes metadata describing its behavior:
AnnotationTypeDescription
readonlybooleanTrue if ability only reads data
destructivebooleanTrue if ability deletes data
idempotentbooleanTrue if repeated calls have no additional effect
instructionsstringCustom usage guidance
These annotations help AI agents make informed decisions about which abilities to call and in what order.

Error Reference

Abilities API Errors

CodeHTTPDescription
ability_invalid_input400Input fails JSON Schema validation
ability_missing_input_schema400Required input not provided
ability_invalid_permissions403Permission callback returned false
ability_invalid_output500Output fails validation
rest_ability_not_found404Ability not registered
rest_ability_invalid_method405Wrong HTTP method for ability type

MainWP-Specific Errors

CodeHTTPDescription
mainwp_site_not_found404Site ID or domain not found
mainwp_client_not_found404Client ID or email not found
mainwp_tag_not_found404Tag ID not found
mainwp_job_not_found404Batch job expired or not found
mainwp_confirmation_required400Destructive operation missing confirm: true
mainwp_site_offline503Site unreachable
mainwp_module_not_available501Required module not active

Feature-Gated Abilities

Some abilities require optional MainWP modules:
ModuleRequired For
Cost Trackerget-site-costs-v1, get-client-costs-v1
Logsget-site-changes-v1
If the required module is inactive, these abilities return a mainwp_module_not_available error.