Dal’Abilities API agli AI agent: come usare il WordPress MCP Adapter (con esempi reali)
Con WordPress 6.9 è arrivata l’Abilities API, un modo coerente e “machine-friendly” per dichiarare cosa sa fare un sito (core o plugin) tramite funzioni standardizzate, scopribili, tipizzate ed eseguibili. Il passo successivo, per chi sta lavorando su automazioni e agent, è naturale: esporre quelle Abilities a strumenti di AI in modo sicuro e controllabile.
Qui entra in gioco il WordPress MCP Adapter, un pacchetto ufficiale dell’iniziativa AI Building Blocks for WordPress che implementa il Model Context Protocol (MCP) nel perimetro di un sito WordPress. Tradotto in pratica: un client compatibile MCP (Claude Desktop, Claude Code, Cursor, VS Code) può scoprire e chiamare le Abilities del tuo sito come se fossero MCP tools, e in alcuni casi leggere dati come MCP resources.
In questa guida trovi: installazione del MCP Adapter, come rendere disponibili le Abilities al server di default, come collegare i principali client AI con trasporti STDIO/HTTP, come usare i tool, come creare server MCP custom per un plugin, un esempio completo con “List All URLs”, e una checklist di sicurezza.
Ripasso veloce: perché Abilities è la base giusta
L’Abilities API dà a WordPress una API funzionale “di prima classe” e cross-context: la stessa Ability è scopribile ed eseguibile da PHP, JavaScript e REST API, con input/output definiti e permessi espliciti.
Una Ability la registri una volta con:
- Un nome univoco nel formato
namespace/ability-name - Uno schema tipizzato per input e output (input schema e output schema)
- Una
permission_callbackper applicare capability e vincoli - Una
execute_callbackche esegue davvero l’azione (fetch dati, update post, diagnostica, ecc.)
WordPress 6.9 include già 3 Abilities di core, utili anche solo per fare prove con MCP:
core/get-site-info: ritorna le informazioni del sito configurate in WordPress (tutti i campi o un sottoinsieme).core/get-user-info: ritorna dettagli base del profilo dell’utente autenticato corrente, utile per personalizzazione/audit/comportamenti “access-aware”.core/get-environment-info: ritorna dettagli del contesto runtime (ambiente, runtime PHP, info DB server, versione WordPress) per diagnostica e compatibilità.
Cos’è il WordPress MCP Adapter
Il WordPress MCP Adapter fa da “ponte” tra Abilities e MCP: adatta le Abilities (registrate tramite Abilities API) nelle primitive supportate dal Model Context Protocol così che un agent possa:
- Scoprire ed eseguire funzionalità del sito come MCP tools
- Leggere dati WordPress come MCP resources quando ha senso esporli in modo passivo
In altre parole: se il tuo plugin registra già Abilities, sei molto vicino a renderle utilizzabili da un agent AI, senza inventarti una nuova API proprietaria.
Primer MCP: tools, resources, prompts
MCP organizza l’interazione in tre primitive:
- Tools: funzioni eseguibili chiamate dall’AI per compiere azioni.
- Resources: fonti dati passive (file, righe DB, ecc.) che l’AI legge come contesto.
- Prompts: template preconfigurati per guidare workflow specifici.
Con il MCP Adapter, la scelta più comune è esporre le Abilities come tools, perché spesso incarnano logica eseguibile (lettura dati, update contenuti, diagnostica). Però l’adapter è flessibile: una Ability puramente read-only che fornisce dati “statici” (ad esempio un log di debug o una configurazione del sito) può essere configurata come resource, così l’AI la usa come contesto senza “invocarla” come azione.
Installare il MCP Adapter (via plugin)
Il percorso più rapido per iniziare è installarlo come plugin scaricandolo dalla pagina delle release su GitHub: https://github.com/WordPress/mcp-adapter/releases.
Una volta installato e attivato, il plugin registra:
- Un server MCP di default chiamato
mcp-adapter-default-server - Tre Abilities custom dell’adapter:
mcp-adapter/discover-abilities,mcp-adapter/get-ability-info,mcp-adapter/execute-ability - Le stesse esposte automaticamente come MCP tools:
mcp-adapter-discover-abilities,mcp-adapter-get-ability-info,mcp-adapter-execute-ability
Questi tre tool permettono un accesso “a strati” alle Abilities: prima l’agent scopre cosa è disponibile, poi legge i dettagli di una Ability, infine la esegue.
Rendere disponibili le Abilities al server di default
Per impostazione predefinita, una Ability è disponibile via server di default del MCP Adapter solo se la marchi esplicitamente come pubblica per l’accesso MCP. Il flag da aggiungere durante la registrazione con wp_register_ability() è meta.mcp.public.
'meta' => array(
'mcp' => array(
'public' => true, // Required for MCP default server access
),
)Per le Abilities di core (che ovviamente non registri tu), puoi intervenire con il filtro wp_register_ability_args e “arricchire” gli argomenti di registrazione aggiungendo quel flag.
<?php
/**
* Plugin Name: Enable core abilities
* Version: 1.0.0
*
* @package enable-core-abilities
*/
add_filter( 'wp_register_ability_args', 'myplugin_enable_core_abilities_mcp_access', 10, 2 );
/**
* Enable MCP access for core abilities.
*
* @param array $args Ability registration arguments.
* @param string $ability_name Ability ID.
* @return array Modified ability registration arguments.
*/
function myplugin_enable_core_abilities_mcp_access( array $args, string $ability_name ) {
// Enable MCP access for the three current core abilities.
$core_abilities = array(
'core/get-site-info',
'core/get-user-info',
'core/get-environment-info',
);
if ( in_array( $ability_name, $core_abilities, true ) ) {
$args['meta']['mcp']['public'] = true;
}
return $args;
}
A questo punto puoi collegare un client AI al tuo WordPress “MCP-enabled” e chiamare quelle Abilities passando dal server di default e dai tool dell’adapter.
Collegare applicazioni AI: STDIO vs HTTP
Metodi di trasporto
Per parlare con un sito WordPress esposto come server MCP esistono due meccanismi di trasporto (transport layer): STDIO e HTTP. La scelta dipende quasi sempre da dove gira il sito.
- STDIO: ideale in locale, soprattutto in ambienti di sviluppo. Nel caso del MCP Adapter, passa da WP-CLI (quindi WP-CLI deve essere installato localmente).
- HTTP: tipico per installazioni raggiungibili pubblicamente, o quando non vuoi/puoi usare STDIO. In questo caso puoi usare un proxy remoto basato su Node.js:
@automattic/mcp-wordpress-remote.
Configurazione minima per STDIO (WP-CLI)
Per un ambiente WordPress locale, la configurazione minima in stile MCP è questa:
{
"wordpress-mcp-server": {
"command": "wp",
"args": [
"--path=/path/to/your/wordpress/installation",
"mcp-adapter",
"serve",
"--server=mcp-adapter-default-server",
"--user={admin_user}"
]
}
}Dettagli importanti:
wordpress-mcp-serverè un nome a tua scelta (identificatore del server nella configurazione del client).commandèwp(il binario di WP-CLI).- In
args:--pathpunta alla directory di installazione WordPress;mcp-adapter serveavvia il server;--serversceglie quale server MCP usare (qui il default);--userdefinisce l’utente WordPress con cui autenticare le chiamate (es. admin).
Configurazione minima per HTTP (proxy Node.js)
Per un’installazione pubblica (o semplicemente per evitare STDIO), puoi impostare HTTP usando il proxy @automattic/mcp-wordpress-remote (serve Node.js). L’autenticazione può avvenire con application passwords WordPress, oppure con una implementazione OAuth custom.
{
"wordpress-mcp-server": {
"command": "npx",
"args": ["-y", "@automattic/mcp-wordpress-remote@latest"],
"env": {
"WP_API_URL": "https://yoursite.example/wp-json/mcp/mcp-adapter-default-server",
"WP_API_USERNAME": "{admin_user}",
"WP_API_PASSWORD": "{application-password}"
}
}
}Note pratiche:
commandènpx(esegue pacchetti Node).- In
args,-yaccetta automaticamente l’installazione e@automattic/mcp-wordpress-remote@latestusa l’ultima versione del proxy. - In
env,WP_API_URLpunta all’endpoint MCP del sito, mentre username e application password definiscono l’identità WordPress con cui il client agirà.
Se stai usando HTTP proxy verso un WordPress locale, il progetto mcp-wordpress-remote include anche una pagina di troubleshooting: https://github.com/Automattic/mcp-wordpress-remote/blob/trunk/Docs/troubleshooting.md. I problemi più frequenti in questi casi sono legati a più versioni di Node installate o a certificati SSL locali.
Dove si configura l’MCP server nei client più usati
Qui sotto trovi i punti esatti dell’interfaccia dove inserire la configurazione MCP in Claude Desktop, Cursor, Claude Code e VS Code. Il formato della configurazione è sostanzialmente lo stesso: cambiano soprattutto nome del file e (nel caso di VS Code) la chiave root (servers invece di mcpServers).
Claude Desktop
In Claude Desktop vai nella sezione Developer (Claude → Settings → Developer). Sotto “Local MCP servers” clicca Edit config: si aprirà il file claude_desktop_config.json.

I server MCP si definiscono dentro l’oggetto mcpServers:
{
"mcpServers": {
}
}Ecco un esempio completo con trasporto STDIO:
{
"mcpServers": {
"wordpress-mcp-server": {
"command": "wp",
"args": [
"--path=/Users/jonathanbossenger/Studio/wordpress-mcp",
"mcp-adapter",
"serve",
"--server=mcp-adapter-default-server",
"--user=admin"
]
}
}
}E lo stesso con trasporto HTTP:
{
"mcpServers": {
"wordpress-mcp-server": {
"command": "npx",
"args": ["-y", "@automattic/mcp-wordpress-remote@latest"],
"env": {
"WP_API_URL": "http://localhost:8885/wp-json/mcp/mcp-adapter-default-server",
"WP_API_USERNAME": "admin",
"WP_API_PASSWORD": "2SEB qW5j D7CW fpsh pbmN RGva"
}
}
}
}Dopo aver salvato il file, riavvia Claude Desktop: legge la configurazione dei server MCP solo all’avvio. Quando tutto è ok, nella tab Developer vedrai il server con stato running e potrai usarlo nelle conversazioni.

Cursor
In Cursor vai in Settings (Cursor → Settings → Cursor Settings) e apri la sezione Tools and MCP.
Clicca Add Custom MCP: Cursor aprirà il file mcp.json. Il formato della configurazione è lo stesso di Claude Desktop. Dopo il salvataggio, torna in Tools and MCP: vedrai il server in lista e potrai abilitarlo per le sessioni di coding.
Claude Code
Con Claude Code puoi aggiungere i server MCP in due modi:
- Inserendo un oggetto
mcpServerscon le configurazioni dentro il file.claude.jsonnella tua home directory (config globale). - Creando un file
.mcp.jsonnella directory del progetto (config per-progetto, utile se vuoi server diversi a seconda del repository).
In entrambi i casi, puoi usare lo stesso formato visto per Cursor/Claude Desktop.
VS Code
In VS Code la configurazione dei server MCP avviene tramite un file JSON tipicamente chiamato mcp.json, da mettere in .vscode dentro il workspace. Il dettaglio che cambia è che i server stanno dentro l’oggetto servers (non mcpServers).
{
"servers": {
// MCP server definitions go here
}
}Una volta presente il file, VS Code mostra una toolbar di controllo MCP per avviare/fermare/riavviare il server. Quando parte correttamente, ti mostra anche quanti tool sono disponibili (nel caso base dell’adapter: tre).
Usare i MCP tools: esempio end-to-end
Una volta connesso il server MCP nel client che preferisci, puoi iniziare a usare i tool esposti dal MCP Adapter. Un esempio semplice in Claude Desktop: chiedi qualcosa come “Recupera le informazioni del sito dal mio WordPress”.
Il flusso tipico è:
- Il client identifica che esiste un MCP server collegato.
- Chiama
mcp-adapter-discover-abilitiesper capire quali Abilities sono disponibili. - Seleziona l’Ability corretta (es.
core/get-site-info). - Chiama
mcp-adapter-execute-abilitypassando il nome dell’Ability. - Riceve i dati e li presenta come risposta (site info).
Quando ha senso creare un MCP server custom per un plugin
Il server di default dell’adapter copre molti casi, ma un server MCP custom nel tuo plugin ti dà più controllo su come e cosa esporre. Per farlo, l’approccio consigliato è installare il pacchetto via Composer e registrare il server nel lifecycle del plugin.
1) Installare via Composer
Dalla directory del plugin:
composer require wordpress/mcp-adapter2) Caricare l’autoloader di Composer
if ( file_exists( __DIR__ . '/vendor/autoload.php' ) ) {
require_once __DIR__ . '/vendor/autoload.php';
}Se è realistico che più plugin nello stesso sito dipendano da MCP Adapter o Abilities API, la documentazione ufficiale raccomanda di usare Jetpack Autoloader per evitare conflitti di versione: https://github.com/WordPress/mcp-adapter/blob/trunk/docs/getting-started/installation.md#using-jetpack-autoloader-highly-recommended.
3) Inizializzare l’MCP Adapter
if ( ! class_exists( WPMCPCoreMcpAdapter::class ) ) {
// check if the MCP Adapter class is available, if not show some sort of error or admin notice
return;
}
// Initialize MCP Adapter and its default server.
WPMCPCoreMcpAdapter::instance();
4) Registrare un server custom con mcp_adapter_init
Agganciati all’action mcp_adapter_init. La callback riceve l’istanza dell’adapter; poi chiami create_server() con configurazione, trasporti, handler e lista di Abilities esposte.
add_action( 'mcp_adapter_init', 'myplugin_create_custom_mcp_server' );
function myplugin_create_custom_mcp_server( $adapter ) {
$adapter = WPMCPCoreMcpAdapter::instance();
$adapter->create_server(
'custom-mcp-server', // Unique server identifier.
'custom-mcp-server', // REST API namespace.
'mcp', // REST API route.
'Custom MCP Server', // Server name.
'Custom MCP Server', // Server description.
'v1.0.0', // Server version.
array( // Transport methods.
WPMCPTransportHttpTransport::class, // Recommended: MCP 2025-06-18 compliant.
),
WPMCPInfrastructureErrorHandlingErrorLogMcpErrorHandler::class, // Error handler.
WPMCPInfrastructureObservabilityNullMcpObservabilityHandler::class, // Observability handler.
array( 'namespace/ability-name' ), // Abilities to expose as tools
array(), // Resources (optional).
array(), // Prompts (optional).
);
}
Parametri da non confondere:
- 1° parametro: identificatore univoco del server (serve anche quando lo avvii via WP-CLI).
- 2° e 3° parametro: namespace e route REST API del server MCP.
- 4° e 5° parametro: nome e descrizione mostrati nei client AI quando elencano i server disponibili.
- 6° parametro: versione del server.
- 10° parametro: array dei nomi delle Abilities che vuoi esporre come MCP tools (anche più di una).
- Gli altri parametri controllano trasporti, error handling e observability. In esempio: HTTP transport, error log e handler di osservabilità “null”, ma puoi implementare handler custom per integrare transport/logging/monitoring proprietari.
Esempio completo: aggiungere un server MCP custom a “List All URLs”
Per vedere un caso concreto, prendiamo il plugin List All URLs: https://github.com/wptrainingteam/list-all-urls. L’obiettivo è esporre la sua Ability list-all-urls/urls come MCP tool tramite un server custom del plugin.
Prima di iniziare
Se hai attivo il plugin “MCP Adapter” installato come plugin WordPress, disattivalo prima di procedere con l’esempio: qui usiamo l’adapter come dipendenza del plugin via Composer.
1) Clonare il repository nella directory plugins
cd wp-content/plugins
git clone git@github.com:wptrainingteam/list-all-urls.git2) Passare al branch con Abilities API
cd list-all-urls
git checkout abilities3) Installare le dipendenze
Il plugin usa già Composer, quindi:
composer install4) Aggiungere la dipendenza wordpress/mcp-adapter
composer require wordpress/mcp-adapter5) Modificare list-all-urls.php: init adapter + create_server()
Apri list-all-urls.php e aggiungi in fondo questo codice per inizializzare l’adapter e registrare un server MCP custom che espone solo list-all-urls/urls come tool.
if ( ! class_exists( WPMCPCoreMcpAdapter::class ) ) {
return;
}
// Initialize MCP Adapter and its default server.
WPMCPCoreMcpAdapter::instance();
add_action( 'mcp_adapter_init', 'list_all_urls_create_custom_mcp_server' );
/**
* Create a custom MCP server for the List All URLs plugin.
*
* @param object $adapter WPMCPCoreMcpAdapter The MCP Adapter instance.
* @return void
*/
function list_all_urls_create_custom_mcp_server( $adapter ) {
$adapter = WPMCPCoreMcpAdapter::instance();
$adapter->create_server(
'list-all-urls-mcp-server',
'list-all-urls-mcp-server',
'mcp',
'List All URLS MCP Server',
'Custom MCP Server for the List All URLs plugin. Currently exposes only the list-all-urls/urls ability as an MCP Tool.',
'v1.0.0',
array(
WPMCPTransportHttpTransport::class,
),
WPMCPInfrastructureErrorHandlingErrorLogMcpErrorHandler::class,
WPMCPInfrastructureObservabilityNullMcpObservabilityHandler::class,
array( 'list-all-urls/urls' ),
);
}
Dettaglio utile: qui non serve impostare meta.mcp.public sull’Ability list-all-urls/urls, perché la stai esponendo esplicitamente tramite server custom.
6) Attivare il plugin e aggiornare la configurazione nel client AI
Dopo aver attivato “List All URLs” da wp-admin, aggiorna la configurazione del tuo client AI per usare anche il nuovo server. Ecco un esempio di mcp.json per VS Code che include sia il server di default sia quello custom, entrambi in STDIO:
{
"servers": {
"wordpress-mcp-server": {
"command": "wp",
"args": [
"--path=/Users/jonathanbossenger/Studio/wordpress-mcp",
"mcp-adapter",
"serve",
"--server=mcp-adapter-default-server",
"--user=admin"
]
},
"list-all-urls-mcp-server": {
"command": "wp",
"args": [
"--path=/Users/jonathanbossenger/Studio/wordpress-mcp",
"mcp-adapter",
"serve",
"--server=list-all-urls-mcp-server",
"--user=admin"
]
}
}
}È perfettamente possibile configurare più server MCP nello stesso client: utile per passare tra siti diversi o tra set di Abilities esposte da plugin differenti. Dopo l’aggiornamento ricordati di riavviare l’app o (dove supportato) avviare il server MCP dal controllo integrato.
A questo punto puoi chiedere all’AI qualcosa come “Elenca tutti gli URL del mio sito WordPress” e il client chiamerà il tool list-all-urls-urls tramite MCP Adapter.
Sicurezza e best practice (da applicare sempre)
Un punto da tenere sempre presente: i client MCP agiscono come utenti WordPress autenticati. Quindi vanno trattati come parte della tua superficie applicativa.
- Usa
permission_callbackcon attenzione: ogni Ability deve verificare la capability minima necessaria (manage_options,edit_posts, ecc.). - Evita
__return_trueper operazioni distruttive (ad esempio cancellazioni o modifiche irreversibili). - Usa utenti dedicati per accesso MCP: soprattutto in produzione, crea un utente/ruolo specifico con capability limitate.
- Non esporre Abilities potenti a client AI non verificati/auditati.
- Preferisci Abilities read-only per endpoint MCP pubblici: se esponi HTTP su internet, concentrati su diagnostica, reportistica e accesso contenuti in sola lettura.
- Implementa autenticazione custom se serve: di default puoi usare application passwords, ma puoi adottare OAuth o altri metodi per alzare il livello di sicurezza.
- Monitora e fai logging dell’uso: valuta handler custom di error/observability per integrare logging e monitoring nel tuo stack.
Come iniziare a sperimentare subito (per davvero)
Il percorso minimo “hello AI” per uno sviluppatore WordPress è lineare:
- Registra una Ability (anche banale e read-only).
- Aggiungi MCP Adapter (plugin o Composer) e inizializzalo.
- Collega un client compatibile MCP (Claude Desktop, Cursor, VS Code, Claude Code) via STDIO o HTTP.
- Prova a far chiamare il tool dall’AI e controlla permessi/risposte/log.
Se hai già plugin basati su Abilities API, il MCP Adapter può trasformarli rapidamente in API pronte per agent AI, con uno sforzo aggiuntivo minimo. Il consiglio operativo è partire piccolo: poche Abilities non distruttive, test in locale, e poi espansione graduale a workflow più complessi.
Documentazione utile: Abilities API https://developer.wordpress.org/apis/abilities/ e repository MCP Adapter https://github.com/WordPress/mcp-adapter.
Riferimenti / Fonti
- From Abilities to AI Agents: Introducing the WordPress MCP Adapter
- Abilities API in WordPress 6.9
- Introducing the WordPress Abilities API
- Model Context Protocol – Introduction
- Model Context Protocol – Architecture (Primitives, Transport Layer)
- Model Context Protocol – Transport Layer
- MCP Adapter
- AI Building Blocks for WordPress
- @automattic/mcp-wordpress-remote
- mcp-wordpress-remote troubleshooting
- WP-CLI
- Application Passwords Integration Guide
- VS Code MCP servers customization
- List All URLs plugin
- Using Jetpack Autoloader (highly recommended)
Francesca Rossi
Caporedattrice del team italiano, specialista in design system e librerie di componenti. Non posso vivere senza Figma e Storybook. Il mio obiettivo è un'interfaccia utente coerente.
Tutti gli articoli