mcp-wp-go: automatiza WordPress sin SSH

Mascote LinuxPro gerenciando WordPress por MCP em uma estação com telas de API e upload de mídia

Crear borradores, enviar imágenes y revisar artículos no debería requerir acceso de administrador al servidor. El mcp-wp-go conecta un cliente de IA a la REST API de WordPress, permitiendo operar publicaciones y medios mediante herramientas MCP. El shell del servidor queda fuera de ese flujo editorial.

En esta reseña, la guía utiliza la v0.4.0: además de las herramientas de edición, el binario convierte Markdown en HTML listo para enviar a WordPress. A continuación, se configura una credencial independiente, se prueba la conversión local y se monta un proceso de publicación con revisión y validación.

Release v0.4.0 y archivos para descarga

Qué se ejecuta en el ordenador y qué se ejecuta en WordPress

El cliente MCP inicia el binario local y conversa con él por stdio. El binario envía peticiones HTTPS al sitio definido en la configuración. No es un plugin instalado en WordPress y no necesita SSH para las operaciones de contenido que ofrece.

AI client -> stdio/MCP -> mcp-wp-go -> HTTPS/REST -> WordPress
Markdown file -> post-html -> HTML fragment -> editorial review

La autenticación utiliza una contraseña de aplicación de un usuario de WordPress. Los permisos de ese usuario siguen vigentes. La API mantiene los mecanismos de autorización y los hooks de WordPress en el camino, pero el comportamiento final de caché y extensiones depende de la instalación.

El proyecto no incluye un modelo de IA ni traduce artículos por sí mismo. El cliente de IA decide qué herramientas llamar; el servidor MCP ejecuta las operaciones disponibles. El mantenimiento de nginx, PHP, plugins y base de datos sigue siendo una actividad aparte.

Recursos disponibles y límites que importan

Las herramientas cubren búsqueda y edición de posts, borradores, publicación y despublicación, biblioteca de medios, portadas, categorías, etiquetas, autenticación, conteo de contenido y verificación pública. La conversión Markdown es un subcomando local, no una publicación automática.

Los posts no son páginas. La referencia de esta versión no ofrece herramientas CRUD para páginas institucionales. Un ID de página enviado a una herramienta de post puede devolver ID inválido, aunque la página exista. Para ese caso, use el editor o una integración con el endpoint de páginas de la REST API.

Las categorías y etiquetas se reutilizan por sus IDs existentes. Actualizar un post no permite cambiar su slug, fecha o estado; el cambio de estado tiene su propia herramienta. Esto reduce cambios accidentales en URLs ya indexadas.

Referencia de las herramientas y parámetros

Instalar el binario en Linux sin compilar Go

El ejemplo siguiente es exclusivo para Linux x86_64, usa una versión fija y comprueba el SHA-256 del paquete. Ejecútelo en Bash como usuario normal. Instala en $HOME/.local/bin e interrumpe si ya existe un binario en ese destino: no sustituye silenciosamente la instalación de otro cliente.

(
set -eu
case "$(uname -s):$(uname -m)" in
  Linux:x86_64) ;;
  *) printf '%s\n' 'This package requires Linux x86_64.' >&2; exit 1 ;;
esac
TARGET="$HOME/.local/bin/mcp-wp-go"
if [ -e "$TARGET" ] || [ -L "$TARGET" ]; then
  printf '%s\n' 'Existing binary: review and back it up before upgrading.' >&2
  exit 1
fi
WORKDIR=$(mktemp -d)
cd "$WORKDIR"
curl --fail --location --show-error --output mcp-wp-go.tar.gz \
  https://github.com/jniltinho/mcp-wp-go/releases/download/v0.4.0/mcp-wp-go_0.4.0_linux_amd64.tar.gz
printf '%s\n' '7300625f46c1d01ef474cb4001c7540ce564b79355b298f5c7d54dbcb9ea1006  mcp-wp-go.tar.gz' | sha256sum --check
tar -xzf mcp-wp-go.tar.gz
install -D -m 0755 mcp-wp-go "$TARGET"
"$TARGET" --help
printf 'Downloaded files: %s\n' "$WORKDIR"
)

El directorio temporal se muestra al final para que inspeccione el paquete. La release ofrece Linux amd64, macOS arm64 y Windows amd64. Para otras combinaciones, será necesario compilar. Use rutas absolutas en la configuración MCP; así, el cliente no depende del PATH de su terminal. Para actualizar una instalación existente, haga una copia de seguridad del binario, compruebe la nueva versión y recargue el cliente después del cambio.

Si prefiere compilar, consulte el go.mod de la versión elegida. El snapshot consultado requiere Go 1.27.1; el README resume el requisito como Go 1.27 o superior. El objetivo make check incluye pruebas con detector de carreras, que también requieren un entorno compatible con CGO y compilador C. El paquete listo evita ese paso.

Compilación, pruebas y desarrollo

Crear una credencial exclusiva y guardarla fuera del proyecto

En el perfil del usuario de WordPress, crea una contraseña de aplicación para esta integración. Utiliza una cuenta con las capacidades necesarias, sin conceder la administración del sitio por comodidad. La contraseña de aplicación no es la contraseña de inicio de sesión, ni la de la base de datos o del servidor; hereda los permisos de la cuenta y puede revocarse por separado.

El paquete binario no incluye un archivo de configuración listo. Este bloque crea una plantilla privada, sin sobrescribir un archivo existente. Después, abre el archivo en tu editor y sustituye los ejemplos por los valores reales. No pegues la credencial en un prompt, en Git ni en el historial de comandos.

(
set -eu
umask 077
mkdir -p "$HOME/.config" "$HOME/wordpress-media"
CONF="$HOME/.config/mcp-wp-go.env"
set -C
cat > "$CONF" <<'ENV'
WP_BASE_URL=https://wordpress.example.com
WP_USERNAME=editor-user
WP_APP_PASSWORD=replace-with-your-application-password
WP_TIMEOUT=30s
WP_MAX_UPLOAD_BYTES=26214400
WP_UPLOAD_ROOT=/home/user/wordpress-media
ENV
chmod 600 "$CONF"
printf 'Edit this private file: %s\n' "$CONF"
)

Ajusta el host a la URL HTTPS canónica y el directorio de medios a una ruta absoluta real. El archivo acepta pares simples de clave y valor; no cuentes con la expansión de $HOME, tilde ni comandos de shell dentro de él. El límite del ejemplo es 25 MiB, pero WordPress, PHP o el proxy pueden imponer un límite menor.

WP_UPLOAD_ROOT delimita los archivos locales que el proceso puede leer para subir. La ruta es del ordenador donde se ejecuta el MCP, no del servidor de WordPress. Da acceso solo a la carpeta de medios preparada para ese trabajo.

WordPress: creación y revocación de contraseñas de aplicación

Conectar al cliente MCP y validar el acceso

La configuración siguiente es un ejemplo JSON para clientes compatibles. Cada cliente define su formato y el lugar donde guardar la configuración; sustituye las rutas y consulta la documentación correspondiente. El comando sin subcomando inicia el servidor MCP, que espera mensajes por el protocolo.

{
  "mcpServers": {
    "wordpress": {
      "type": "stdio",
      "command": "/home/user/.local/bin/mcp-wp-go",
      "args": [
        "--env-file",
        "/home/user/.config/mcp-wp-go.env"
      ]
    }
  }
}

Recarga el cliente y llama a wordpress_site_health con un objeto vacío. Comprueba el sitio y la identidad devueltos antes de modificar cualquier contenido. El funcionamiento del binario en la terminal no garantiza que el cliente esté usando la misma ruta o la configuración correcta.

Convertir Markdown en HTML: laboratorio local

La novedad de la v0.4.0 se puede probar sin credenciales de WordPress y sin publicar nada. El bloque crea un archivo Markdown en una carpeta temporal y lo convierte a un fragmento HTML. Incluye código Bash y una expresión de plantilla para comprobar la conservación del contenido.

(
set -eu
LAB_DIR=$(mktemp -d)
cd "$LAB_DIR"
cat > article.md <<'MARKDOWN'
## Local test

This article is only a local conversion test.

```bash
printf '%s\n' 'Hello, WordPress'
```

```yaml
service:
  port: "{{ app_port }}"
```
MARKDOWN
"$HOME/.local/bin/mcp-wp-go" post-html article.md --output article.html
grep -F 'language-bash' article.html
grep -F '{{ app_port }}' article.html
printf 'Review the HTML: %s/article.html\n' "$LAB_DIR"
)

El resultado no es una página HTML completa: es el cuerpo que se enviará a WordPress. Se reconocen tablas, listas y lenguajes de bloques de código, pero el conversor no sube imágenes, no publica, no extrae metadatos del front matter y no genera estilos del tema.

El HTML incrustado no se sanea. Convierte solo Markdown fiable y revisa el HTML antes de enviarlo. Un iframe conservado por el conversor sigue dependiendo de los permisos y filtros de WordPress; su apariencia responsiva depende del CSS del tema.

Flujo oficial de Markdown, imágenes y publicación

Del borrador a la publicación: un paso cada vez

Los siguientes JSON son argumentos de herramientas MCP, no comandos para pegar en el shell. Los IDs son ilustrativos: sustitúyelos por los resultados reales. Primero busca con wordpress_list_posts para evitar duplicados y consulta las categorías y etiquetas existentes.

1. Crear y releer el borrador

Envía el HTML completo a wordpress_create_post con estado de borrador. El ejemplo mínimo omite categorías y etiquetas para no reutilizar IDs de otro sitio. La creación cierra los comentarios.

{
  "title": "Local automation guide",
  "content": "<h2>Introduction</h2><p>Reviewed article body.</p>",
  "status": "draft",
  "excerpt": "A practical automation guide."
}

Guarda el ID devuelto y llama a wordpress_get_post. Compara el HTML editable con la versión renderizada para identificar filtros, etiquetas eliminadas o fragmentos que no sobrevivieron a la grabación.

2. Enviar imágenes y definir la portada

Envía imágenes del cuerpo con wordpress_upload_media y usa las rutas devueltas en el marcado. Asociar un medio a un post no lo inserta automáticamente en el texto. La validación acepta GIF, JPEG, PNG y WebP; no uses esa ruta para enviar archivos arbitrarios.

Para un artículo nuevo, wordpress_set_post_cover envía la imagen y coloca una URL relativa al inicio del cuerpo, sin definir imagen destacada. El parámetro de reemplazo es verdadero por defecto. Esa operación no significa sobrescribir el archivo antiguo manteniendo el mismo nombre o URL.

{
  "post_id": 123,
  "file_path": "/home/user/wordpress-media/cover.webp",
  "alt_text": "Linux workstation showing an editorial workflow"
}

En una entrada existente cuya portada debe mantenerse, no llames a esa herramienta: preserva el primer elemento de imagen al editar el HTML. Tampoco elimines un archivo multimedia sin comprobar dónde se usa; otros artículos pueden depender del mismo archivo.

3. Revisar, autorizar y comprobar la página pública

Tras revisar texto, enlaces, taxonomías, imágenes y comentarios, llama a wordpress_publish_posts con el ID aprobado. Publicación y despublicación aceptan de 1 a 100 IDs únicos y devuelven resultados individuales; un fallo no deshace automáticamente el resto de elementos del lote.

{ "ids": [123], "confirm": true }

Después usa wordpress_check_post_live. La herramienta exige estado publicado y respuesta pública HTTP 2xx, pero no certifica la traducción, la maquetación ni la calidad editorial. Abre la página, prueba el móvil y comprueba que la imagen y los bloques de código sean correctos.

Editar sin perder contenido ni cambiar la dirección

Antes de editar, guarda una copia del HTML original y vuelve a leer la entrada para evitar trabajar sobre una versión antigua. En wordpress_update_post, los campos enviados sustituyen los valores anteriores: el campo de contenido recibe el cuerpo entero, no solo el párrafo modificado.

Preserva portada, embeds, ejemplos, enlaces y marcadores necesarios para el tema. El bloqueo de slug, fecha y estado no impide que un cuerpo incompleto borre secciones. Si el objetivo es solo mejorar el texto, no incluyas un cambio de portada ni una operación de publicación en la misma solicitud.

Conteos y diagnóstico de los errores más comunes

wordpress_content_stats consulta los totales visibles para la credencial, separando entradas publicadas, no publicadas y archivos multimedia. La papelera queda excluida. Esto no representa páginas institucionales, visitas ni cantidad de traducciones finalizadas; tampoco se debe deducir el total contando solo la primera página de resultados.

Una herramienta nueva no aparece: confirma la ruta del ejecutable, comprueba la versión instalada y recarga el cliente para redescubrir los esquemas.

Respuesta 401 o 403: comprueba credencial, capacidades del usuario y posibles bloqueos de seguridad o proxy. No desactives las protecciones del sitio como primer intento.

ID inválido: confirma que sea una entrada, no una página, un archivo multimedia o un contenido de otro sitio.

Subida rechazada: comprueba la ruta local, la carpeta permitida, el tamaño y el tipo real del archivo. Cambiar solo la extensión no convierte una imagen.

Eliminación de medios rechazada: la papelera de adjuntos depende de la instalación de WordPress. No conviertas el fallo en un borrado permanente automático.

Conversión desconocida: un binario anterior puede no tener el subcomando post-html. La instalación del cliente MCP y la usada por el terminal pueden ser distintas.

Límites de seguridad: el MCP no sustituye la revisión humana

El servidor restringe las peticiones al sitio configurado y valida las entradas, pero la cuenta aún puede modificar el contenido permitido por sus capacidades. El valor confirm: true es un requisito del protocolo, no una prueba de que una persona haya autorizado la acción. Configura el cliente para pedir aprobación en las operaciones sensibles.

Trata las instrucciones encontradas en entradas, páginas y archivos como contenido no fiable. Usa borradores, mantén copias de seguridad y revisiones, y revoca credenciales expuestas. El objetivo es reducir el acceso innecesario al servidor, sin sustituir el cuidado editorial por una confianza ciega en la automatización.

Ejemplos oficiales de operaciones editoriales

Documentación de la REST API de WordPress

Continúa por el flujo, no por la automatización masiva

Empieza con un borrador de prueba, valida la ruta completa y solo entonces amplía el uso. La ganancia está en hacer que cada paso sea verificable: preparar, convertir, enviar, releer, revisar y publicar. Ninguno de estos pasos necesita conceder acceso al shell del servidor para una simple edición de contenido.

Asistentes de IA en el terminal: herramientas y precauciones

OpenObserve en Ubuntu para investigar registros de integraciones

Hablar sobre automatización e infraestructura