WordPress MCP Server
46 herramientas en un servidor MCP. Accede a contenido, medios, comentarios, CPTs y gestión del sitio. Consulta el repositorio de Github para todas las herramientas.
Documentación
@urdigital/mcp-server-wordpress
Un servidor MCP (Model Context Protocol) que expone la API REST de WordPress a Claude, Claude Code y cualquier otro cliente compatible con MCP: contenido, medios, comentarios, tipos de contenido personalizados y gestión del sitio.
Instalación
No se necesita instalación: ejecútalo directamente con npx:
npx -y @urdigital/mcp-server-wordpress
Configuración
Crea una contraseña de aplicación en wp-admin → Usuarios → Perfil → Contraseñas de aplicación. Esto es autenticación básica sobre HTTPS, separada de tu contraseña real de cuenta.
Añade esto a la configuración de tu cliente MCP (por ejemplo, el claude_desktop_config.json de Claude Desktop):
{
"mcpServers": {
"wordpress": {
"command": "npx",
"args": ["-y", "@urdigital/mcp-server-wordpress"],
"env": {
"WORDPRESS_SITE_URL": "https://example.com",
"WORDPRESS_USERNAME": "your-username",
"WORDPRESS_APP_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx"
}
}
}
}
WORDPRESS_SITE_URL no debe tener barra diagonal final.
Herramientas (46 en total, todas probadas contra un sitio WordPress headless real)
| Grupo | Herramientas |
|---|---|
| Entradas | wp_list_posts, wp_get_post, wp_create_post, wp_update_post, wp_delete_post |
| Páginas | wp_list_pages, wp_get_page, wp_create_page, wp_update_page, wp_delete_page |
| Categorías | wp_list_categories, wp_get_category, wp_create_category, wp_update_category, wp_delete_category |
| Etiquetas | wp_list_tags, wp_get_tag, wp_create_tag, wp_update_tag, wp_delete_tag |
| Medios | wp_upload_media, wp_list_media, wp_get_media, wp_update_media, wp_delete_media |
| Comentarios | wp_list_comments, wp_get_comment, wp_create_comment, wp_update_comment, wp_delete_comment |
| Usuarios | wp_list_users, wp_get_user |
| Descubrimiento | wp_list_post_types, wp_list_taxonomies |
| Menús | wp_list_menus, wp_list_menu_items |
| Ajustes | wp_get_settings, wp_update_settings |
| Plugins/temas | wp_list_plugins, wp_list_themes (solo lectura — ver más abajo) |
| Tipos de contenido personalizados (genéricos) | wp_list_custom_items, wp_get_custom_item, wp_create_custom_item, wp_update_custom_item, wp_delete_custom_item |
| Búsqueda | wp_search |
Las entradas y páginas establecen por defecto el estado draft para el contenido nuevo, de modo que nada se publique
sin querer.
Deliberadamente no incluido: instalación, activación, desactivación y eliminación de plugins/temas
La gestión de plugins y temas se limita al listado de solo lectura
(wp_list_plugins, wp_list_themes). Instalar, activar, desactivar
o eliminar plugins/temas son las acciones de escritura de mayor riesgo disponibles en
un sitio de WordPress: una activación incorrecta puede tumbar el sitio por completo, y
constituyen una categoría de riesgo significativamente distinta a las operaciones de contenido. Si
necesitas esto, es una decisión deliberada de alcance, no un descuido.
Trabajar con tipos de contenido personalizados
wp_list_custom_items/wp_get_custom_item/etc. funcionan con cualquier tipo de
contenido que un plugin haya registrado: no estás limitado a los tipos que este servidor
conoce por nombre. Dos cosas confirmadas mediante pruebas contra un sitio real
que usa Custom Post Type UI + ACF:
- Usa
wp_list_post_typesprimero para encontrar elrest_basecorrecto, no el slug interno del tipo de contenido: a menudo son diferentes. En el sitio de prueba, un tipo con slugeventteníarest_base: "events"(pluralizado), ylead_magnetteníarest_base: "lead-magnets"(pluralizado y con guiones en lugar de guiones bajos). Llamar al endpoint con el slug en lugar del rest_base devuelve un 404rest_no_route— confirmado por pruebas, no una hipótesis. - El soporte de campos (título, contenido, estado, campos personalizados) varía según cómo el
plugin registró el tipo.
status: draftcomo creación segura por defecto funcionó correctamente contra un tipo personalizado real en las pruebas, ya que la mayoría de los tipos de contenido personalizados se almacenan aún enwp_postscomo las entradas estándar — pero esto no está garantizado universalmente en todos los plugins.
Otro comportamiento confirmado por pruebas, que vale la pena conocer
- Las categorías, etiquetas y medios no tienen estado de papelera en WordPress.
Eliminar cualquiera de estos es efectivamente siempre permanente — a diferencia de las entradas,
páginas y comentarios, que por defecto van a una papelera reversible. El parámetro
forceen las herramientas de eliminación para categorías/etiquetas/medios tiene por defectotruepor esta razón; entradas/páginas/comentarios tienen por defectofalse. - WordPress bloquea los comentarios en entradas en borrador. Intentar
wp_create_commentcontra una entrada en estado borrador devuelve un 403 (rest_comment_draft_post) — la entrada debe estar publicada (o al menos no en borrador) primero. Confirmado directamente. - Los comentarios creados por un administrador autenticado omiten la moderación y vuelven
con
status: "approved"inmediatamente, en lugar del estadoholdque probablemente recibiría el comentario de un visitante anónimo real. Si estás probando un flujo de moderación, probar como administrador puede ocultar comportamientos que solo aparecen con comentarios genuinos enviados por visitantes. - El endpoint
wp_searchdevuelve un objeto mucho más ligero quewp_get_post/wp_get_page— soloid,title,url,type,subtype, sin contenido ni metadatos. Continúa conwp_get_post/wp_get_page/wp_get_custom_itempara el contenido completo. - El campo
rolesdewp_get_userpuede devolverse comoundefinedincluso para una cuenta de administrador, dependiendo de la configuración del sitio/plugin en torno a la capacidadedit_users— no es necesariamente un error si ves esto. wp_upload_mediavalida las URLs antes de obtenerlas. Una revisión de código señaló que la implementación original obtenía cualquier URL que se le diera sin validación — incluidas direcciones internas, localhost y endpoints de metadatos en la nube (169.254.169.254), lo que podría exponer servicios internos o credenciales de la nube a quien lea la salida de la herramienta. Esto está corregido: solo se permiten URLshttps://que resuelvan a direcciones públicas no reservadas, y el archivo descargado está limitado a 25MB, aplicado contando bytes reales transmitidos en lugar de confiar en una cabeceraContent-Length. Consulta el README de@urdigital/mcp-server-sharedpara el detalle completo y una limitación declarada (rebinding de DNS) que no queda completamente cerrada con esta corrección.- Las URLs de medios pueden no estar en tu dominio de WordPress en absoluto. Los sitios que usan
un plugin de descarga (por ejemplo, a Cloudflare Images, S3, etc.) devolverán
source_urlapuntando a otro lugar por completo — confirmado en el sitio de prueba, que descarga aimagedelivery.net.
Licencia
MIT