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)

GrupoHerramientas
Entradaswp_list_posts, wp_get_post, wp_create_post, wp_update_post, wp_delete_post
Páginaswp_list_pages, wp_get_page, wp_create_page, wp_update_page, wp_delete_page
Categoríaswp_list_categories, wp_get_category, wp_create_category, wp_update_category, wp_delete_category
Etiquetaswp_list_tags, wp_get_tag, wp_create_tag, wp_update_tag, wp_delete_tag
Medioswp_upload_media, wp_list_media, wp_get_media, wp_update_media, wp_delete_media
Comentarioswp_list_comments, wp_get_comment, wp_create_comment, wp_update_comment, wp_delete_comment
Usuarioswp_list_users, wp_get_user
Descubrimientowp_list_post_types, wp_list_taxonomies
Menúswp_list_menus, wp_list_menu_items
Ajusteswp_get_settings, wp_update_settings
Plugins/temaswp_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úsquedawp_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_types primero para encontrar el rest_base correcto, no el slug interno del tipo de contenido: a menudo son diferentes. En el sitio de prueba, un tipo con slug event tenía rest_base: "events" (pluralizado), y lead_magnet tenía rest_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 404 rest_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: draft como 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 en wp_posts como 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 force en las herramientas de eliminación para categorías/etiquetas/medios tiene por defecto true por esta razón; entradas/páginas/comentarios tienen por defecto false.
  • WordPress bloquea los comentarios en entradas en borrador. Intentar wp_create_comment contra 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 estado hold que 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_search devuelve un objeto mucho más ligero que wp_get_post/wp_get_page — solo id, title, url, type, subtype, sin contenido ni metadatos. Continúa con wp_get_post/ wp_get_page/wp_get_custom_item para el contenido completo.
  • El campo roles de wp_get_user puede devolverse como undefined incluso para una cuenta de administrador, dependiendo de la configuración del sitio/plugin en torno a la capacidad edit_users — no es necesariamente un error si ves esto.
  • wp_upload_media valida 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 URLs https:// 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 cabecera Content-Length. Consulta el README de @urdigital/mcp-server-shared para 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_url apuntando a otro lugar por completo — confirmado en el sitio de prueba, que descarga a imagedelivery.net.

Licencia

MIT