WordPress MCP Adapter: cum îți expui Abilities ca „tools” pentru AI agents (Claude, Cursor, VS Code)
În WordPress, discuția despre AI nu mai e doar despre a genera text sau imagini, ci despre automatizare reală: AI agents care pot citi date și pot rula acțiuni în site, controlat și auditat. Două piese se leagă aici: Abilities API (în WordPress 6.9) și Model Context Protocol (MCP). Iar puntea dintre ele este WordPress MCP Adapter.
În articolul ăsta trec prin tot fluxul: de la recapitularea Abilities, la instalarea MCP Adapter, expunerea Abilities ca MCP tools, conectarea unor clienți populari (Claude Desktop, Cursor, Claude Code, VS Code), folosirea efectivă a tool-urilor și, la final, partea care contează cel mai mult în producție: securitate și bune practici.
Recapitulare rapidă: Abilities ca fundament (WordPress 6.9)
Abilities API oferă WordPress-ului un functional API de primă clasă, cross-context, care standardizează felul în care Core și pluginurile își expun capabilitățile: funcții standardizate, descoperibile (discoverable), tipizate (typed) și executabile.
O „ability” o definești o singură dată, folosind:
- un nume unic (formatul
namespace/ability-name) - o schemă tipizată pentru input (input schema) și output (output schema)
- un
permission_callbackcare aplică reguli de acces (capabilities) - un
execute_callbackcare face efectiv treaba (logica executabilă)
Ce rulează în execute_callback poate fi aproape orice unitate discretă de lucru: fetch de date, update de postări, diagnostic, raportare etc. Odată înregistrată, ability devine descoperibilă și executabilă din PHP, JavaScript și REST API.
WordPress 6.9 vine cu trei Abilities implicite (Core Abilities), utile ca bază de test:
core/get-site-info: întoarce informațiile de site configurate în WordPress (implicit toate câmpurile sau opțional un subset filtrat).core/get-user-info: întoarce detalii de profil de bază pentru utilizatorul autentificat curent (personalizare, audit, comportamente „access-aware”).core/get-environment-info: întoarce detalii despre runtime pentru diagnostic și compatibilitate (environment, PHP runtime, DB server info, versiunea WordPress).
Ce este WordPress MCP Adapter și de ce contează
WordPress MCP Adapter este un pachet oficial din inițiativa AI Building Blocks for WordPress. Rolul lui este să „adapteze” Abilities (înregistrate prin Abilities API) către primitivele din Model Context Protocol (MCP), astfel încât AI agents să poată:
- descoperi și executa funcționalități din site ca MCP tools
- citi date din WordPress ca MCP resources
Concret: dacă pluginul tău deja înregistrează Abilities, ești foarte aproape de a le face utilizabile de un agent AI, fără să inventezi un API separat.
Primer: MCP tools, resources și prompts
MCP organizează interacțiunea în trei primitive principale:
- tools: funcții executabile pe care AI le poate apela pentru acțiuni.
- resources: surse de date pasive (ex. fișiere, rânduri DB) pe care AI le citește pentru context.
- prompts: template-uri preconfigurate care ghidează fluxuri specifice.
Cu MCP Adapter, Abilities sunt expuse de regulă ca tools, pentru că reprezintă logică executabilă (fetch, update, diagnostic). Totuși, dacă o Ability oferă doar date read-only (de exemplu un debug log sau o configurație statică), poate fi configurată și ca resource, ca AI să o „înghită” drept context fără a rula efectiv o acțiune.
Instalare: MCP Adapter ca plugin (cel mai rapid start)
Cel mai rapid mod de a începe este instalarea MCP Adapter ca plugin, descărcat din pagina de releases a repo-ului GitHub: https://github.com/WordPress/mcp-adapter/releases.
După activare, pluginul înregistrează un default MCP server numit mcp-adapter-default-server și trei Abilities custom:
mcp-adapter/discover-abilitiesmcp-adapter/get-ability-infomcp-adapter/execute-ability
Acestea sunt expuse automat și ca MCP tools, cu nume adaptate:
mcp-adapter-discover-abilitiesmcp-adapter-get-ability-infomcp-adapter-execute-ability
Cele trei tool-uri oferă un model în „straturi” pentru accesarea Abilities: agentul poate descoperi ce există, poate cere detalii despre o ability și apoi o poate executa.
Cum permiți accesul Abilities prin default server: meta.mcp.public
Implicit, Abilities nu devin disponibile prin default MCP server decât dacă marchezi explicit că sunt publice pentru acces MCP. Asta se face adăugând flag-ul meta.mcp.public la argumentele din wp_register_ability().
'meta' => array(
'mcp' => array(
'public' => true, // Required for MCP default server access
),
),Pentru Core Abilities (cele din WordPress), nu le înregistrezi tu, dar poți interveni prin filtrul wp_register_ability_args și să modifici argumentele ca să includă meta.mcp.public.
<?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;
}
După ce ai făcut asta, poți conecta un client MCP la site și poți apela aceste Core Abilities prin tool-urile din default server.
Conectarea aplicațiilor AI la WordPress ca MCP server
Transport: STDIO vs HTTP
MCP suportă două mecanisme de transport: STDIO și HTTP. Alegerea depinde, în practică, de unde rulează WordPress și cum vrei să te conectezi.
Pentru medii locale de dezvoltare, cel mai simplu e STDIO, iar MCP Adapter îl face posibil via WP-CLI (deci WP-CLI trebuie să fie instalat local). Configurația minimă arată așa:
"wordpress-mcp-server": {
"command": "wp",
"args": [
"--path=/path/to/your/wordpress/installation",
"mcp-adapter",
"serve",
"--server=mcp-adapter-default-server",
"--user={admin_user}"
]
}Detalii importante:
- numele serverului în exemplu e
wordpress-mcp-server(poate fi orice nume alegi tu) commandestewp(WP-CLI)- în
args:--pathcătre instalarea WordPress,mcp-adapter servepornește serverul,--serveralege MCP server-ul (default),--usersetează utilizatorul WordPress pentru autentificare (ex. admin).
Pentru instalări public accesibile sau când nu vrei STDIO, poți folosi transport HTTP prin proxy-ul remote @automattic/mcp-wordpress-remote. Ai nevoie de Node.js instalat și de autentificare prin WordPress application passwords sau o implementare OAuth custom.
Configurația minimă pentru HTTP transport:
"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}"
}
}Detalii:
commandestenpx(execută pachete Node.js)-yacceptă automat instalarea pachetuluiWP_API_URLtrebuie să pointeze către endpoint-ul MCP al site-ului (în namespace-ul serverului)WP_API_USERNAMEșiWP_API_PASSWORDsunt credențialele (parola de aplicație).
Pentru instalări locale conectate via HTTP remote proxy, există și un ghid de troubleshooting (de obicei probleme de Node.js multiple sau certificate SSL locale): https://github.com/Automattic/mcp-wordpress-remote/blob/trunk/Docs/troubleshooting.md.
Configuri pe aplicații: Claude Desktop, Cursor, Claude Code, VS Code
Mai jos sunt locurile unde adaugi configurația MCP server în cele mai folosite aplicații.
Claude Desktop
În Claude Desktop, mergi în Developer (Claude → Settings → Developer). La Local MCP servers alegi Edit config. Se deschide fișierul claude_desktop_config.json, unde definești serverele într-un obiect mcpServers.

{
"mcpServers": {
}
}Exemplu pentru STDIO transport:
{
"mcpServers": {
"wordpress-mcp-server": {
"command": "wp",
"args": [
"--path=/Users/jonathanbossenger/Studio/wordpress-mcp",
"mcp-adapter",
"serve",
"--server=mcp-adapter-default-server",
"--user=admin"
]
}
}
}Exemplu pentru HTTP transport:
{
"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"
}
}
}
}După ce salvezi fișierul, trebuie restart la Claude Desktop (citește config-ul doar la pornire). În Developer tab, dacă vezi status running lângă server, ești gata.

Cursor
În Cursor: Settings (Cursor → Settings → Cursor Settings), apoi secțiunea Tools and MCP. Apeși Add Custom MCP și se deschide fișierul mcp.json. Formatul configurației este același ca în Claude Desktop.
După ce adaugi serverul, salvezi și revii în Tools and MCP: ar trebui să vezi serverul listat și îl poți activa pentru sesiuni de coding.
Claude Code
În Claude Code poți adăuga MCP servers fie global (în .claude.json din home), fie per proiect (în .mcp.json în directorul proiectului). Varianta per proiect e utilă când ai configurații diferite pe proiecte. Formatul pentru servere este același ca la Cursor/Claude Desktop.
VS Code
În VS Code, conectarea la un MCP server se face printr-un fișier JSON (de obicei mcp.json) pus în .vscode/ în workspace. Documentație: https://code.visualstudio.com/docs/copilot/customization/mcp-servers.
Diferența cheie: în VS Code serverele se definesc într-un obiect servers, nu mcpServers.
{
"servers": {
// MCP server definitions go here
}
}După ce creezi fișierul, VS Code îți afișează o bară de control MCP (start/stop/restart). Când serverul pornește corect, vezi și câte tools sunt disponibile (în exemplul de bază: trei).
Cum folosești MCP tools expuse de WordPress
După ce MCP serverul este conectat în aplicația AI, poți începe să folosești tool-urile expuse de MCP Adapter.
Un exemplu simplu: în Claude Desktop poți cere „Get the site info from my WordPress site”. În spate, agentul va:
- detecta că există un MCP server disponibil
- apela tool-ul
mcp-adapter-discover-abilitiesca să vadă ce Abilities sunt disponibile - decide că
core/get-site-inforezolvă cererea - apela
mcp-adapter-execute-abilityși va trimite numele ability-uluicore/get-site-info - primi datele despre site și va formula răspunsul pe baza lor.
Custom MCP servers în pluginul tău (control mai fin)
Default server-ul din MCP Adapter acoperă multe cazuri, dar uneori vrei un custom MCP server în plugin: control mai bun asupra a ceea ce expui ca tools/resources/prompts și cum arată serverul în aplicațiile AI.
Pentru asta instalezi MCP Adapter ca dependență (Composer) și înregistrezi un server custom.
1) Instalează pachetul via Composer
composer require wordpress/mcp-adapter2) Încarcă autoloader-ul Composer în plugin
if ( file_exists( __DIR__ . '/vendor/autoload.php' ) ) {
require_once __DIR__ . '/vendor/autoload.php';
}Dacă există șanse ca mai multe pluginuri să depindă de MCP Adapter sau Abilities API, recomandarea este să folosești Jetpack Autoloader pentru a evita conflicte de versiuni: https://github.com/WordPress/mcp-adapter/blob/trunk/docs/getting-started/installation.md#using-jetpack-autoloader-highly-recommended.
3) Inițializează 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) Creează un custom server în mcp_adapter_init
Te legi la action-ul mcp_adapter_init. Callback-ul primește instanța McpAdapter, iar tu folosești create_server() cu parametrii necesari.
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).
);
}
Parametrii care contează cel mai mult în practică:
- 1) identificator unic de server: îl folosești inclusiv când pornești serverul via WP-CLI
- 2) namespace + route pentru REST API
- 4) + 5) nume și descriere (vizibile în aplicațiile AI)
- 6) versiunea serverului
- 10) lista de Abilities expuse ca MCP tools (poți include mai multe)
- restul: transport, error handling și observability. Poți folosi handler-ele din pachet sau îți poți crea propriile integrări (logging/monitoring/transport).
Exemplu complet: adaugi un MCP server într-un plugin (List All URLs)
Un exemplu concret de custom server: pluginul List All URLs (repo GitHub): https://github.com/wptrainingteam/list-all-urls. Scopul: expui ability-ul list-all-urls/urls ca MCP tool printr-un server dedicat.
Înainte să începi, dezactivează MCP Adapter plugin dacă îl ai activat.
1) Clonează repo-ul în directorul de pluginuri
cd wp-content/plugins
git clone git@github.com:wptrainingteam/list-all-urls.git2) Schimbă pe branch-ul cu Abilities API
cd list-all-urls
git checkout abilities3) Instalează dependențele și adaugă mcp-adapter
composer installcomposer require wordpress/mcp-adapter4) Modifică list-all-urls.php: inițializează adapter-ul și creează serverul
În fișierul principal list-all-urls.php, adaugă la final codul de mai jos:
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' ),
);
}
Observație importantă: aici nu mai ai nevoie de meta.mcp.public pentru list-all-urls/urls, pentru că îl expui explicit prin custom server.
5) Activează pluginul și actualizează configurația MCP din aplicația AI
După activare, modifici configurația din aplicația AI ca să pornești și noul server. Exemplu de config în VS Code cu două servere (ambele pe STDIO): default + custom List All URLs.
{
"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"
]
}
}
}Poți avea mai multe MCP servers în aceeași aplicație AI (site-uri diferite sau pluginuri diferite cu seturi distincte de Abilities). După update, fie restartezi aplicația, fie pornești serverul din UI (depinde de client). Apoi poți cere, de exemplu, „List all URLs on my WordPress site”, iar agentul va apela tool-ul list-all-urls-urls via MCP Adapter.
Securitate și best practices (nu sări peste partea asta)
MCP clients acționează ca utilizatori WordPress autentificați. Tratează-i ca parte din suprafața aplicației și aplică reguli stricte:
- Folosește
permission_callbackcu atenție - Fiecare ability trebuie să verifice capabilitatea minimă necesară (
manage_options,edit_postsetc.). - Evită
__return_truepentru operațiuni destructive (de exemplu ștergeri de conținut). - Folosește utilizatori dedicați pentru acces MCP
- Mai ales în producție, creează un user/rol dedicat cu capabilități limitate.
- Nu expune Abilities puternice către clienți AI neauditați.
- Preferă Abilities read-only pentru endpoint-uri MCP publice
- Pentru HTTP transport expus pe internet, concentrează-te pe diagnostic, raportare și acces de conținut (read-only).
- Adaugă autentificare custom dacă ai nevoie
- Implicit poți folosi application passwords, dar poți implementa OAuth sau alte metode pentru securitate mai bună.
- Monitorizează și loghează utilizarea
- Folosește error handlers și observability handlers custom pentru integrare cu stack-ul tău de logging/monitoring.
Cum începi să experimentezi azi (minimal „hello AI”)
Un parcurs minim pentru un developer WordPress arată așa:
- înregistrezi o ability (cu schema + permisiuni + execute)
- instalezi/inițializezi MCP Adapter
- conectezi un AI client care știe MCP (Claude Desktop, Cursor, Claude Code, VS Code)
Dacă ai deja pluginuri care folosesc Abilities API, MCP Adapter practic le transformă în AI-ready APIs cu efort minim. Începe cu ceva sigur: câteva Abilities read-only, non-destructive, testate local. Apoi poți crește gradual spre fluxuri mai complexe și automatizări reale.
Pentru documentație oficială, două puncte de plecare bune sunt: Abilities API (https://developer.wordpress.org/apis/abilities/) și repo-ul MCP Adapter (https://github.com/WordPress/mcp-adapter).
Notă despre WordPress.com vs self-hosted (aliniere și autentificare)
În discuțiile recente din comunitate, o întrebare importantă a fost dacă tool-urile MCP de pe WordPress.com se aliniază cu același model (Abilities API + MCP Adapter) folosit self-hosted. Răspunsul este că ele sunt alimentate de aceeași fundație (Abilities API + MCP Adapter), deci, teoretic, scenariul în care un plugin developer „înregistrează capabilități o singură dată” și funcționează în ambele lumi este posibil.
Diferența majoră, în momentul de față, este autentificarea: WordPress.com folosește OAuth 2.1, în timp ce pe self-hosted nu există o soluție OAuth disponibilă „out of the box”, iar opțiunile rămân JWT tokens sau Application Passwords. Pentru context pe OAuth 2.1 în WordPress.com: https://wordpress.com/blog/2026/01/22/connect-ai-agents-to-wordpress-oauth-2-1/.
Referințe / Surse
- 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)
- Model Context Protocol – Transport Layer
- MCP Adapter
- AI Building Blocks for WordPress
- @automattic/mcp-wordpress-remote
- mcp-wordpress-remote troubleshooting
- Application Passwords Integration Guide
- VS Code MCP servers configuration
- Abilities API docs
- WordPress MCP Adapter repository
- List All URLs plugin
- Connect AI Agents to WordPress with OAuth 2.1
- Build MCP tools like ogres with layers
Maria Popa
Cercetător UX și designer de produs. Testarea utilizatorilor și prototiparea sunt preferatele mele. Cred în designul centrat pe om.
Toate articoleleMai multe de la Maria Popa
European Accessibility Act (EAA) a intrat în vigoare: ce ai de făcut acum pe un site WordPress
Porturi SMTP în 2026: cum alegi 587 vs 465 ca să nu-ți mai dispară emailurile din WordPress
WP Media Cleanup (de la echipa Duplicator): cum elimini în siguranță variațiile de imagini nefolosite din WordPress și recuperezi spațiu