mcp-wp-go: WordPress por MCP sem SSH

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

Editar um WordPress por automação costuma virar uma escolha ruim entre credenciais de SSH, comandos frágeis e APIs genéricas demais. O mcp-wp-go é um servidor MCP escrito em Go que usa a REST API nativa do WordPress para criar, editar, publicar, despublicar, validar posts e administrar mídias — sem executar shell remoto no servidor. A ideia é dar a agentes de IA uma interface controlada para operar conteúdo, mantendo permissões, hooks e cache do próprio WordPress no caminho.

O problema: automação editorial não deve depender de SSH

SSH e WP-CLI continuam excelentes para manutenção do host, mas não são a melhor fronteira para uma tarefa editorial rotineira. Um agente que precisa somente criar um rascunho, subir uma imagem ou conferir se uma URL está pública não deve receber acesso irrestrito ao sistema operacional. A REST API do WordPress já oferece autenticação, capacidades por usuário e endpoints para posts, mídia, categorias e tags.

O mcp-wp-go conecta essa API ao Model Context Protocol (MCP). Na prática, o cliente MCP conversa pelo stdio com o binário local; o binário conversa com um único WordPress configurado via HTTPS. A URL do site não é aceita como argumento de ferramenta, evitando que uma chamada seja redirecionada para outro destino.

Como a arquitetura funciona

  • Cliente MCP: Codex, Claude Code ou outro cliente chama ferramentas tipadas.
  • mcp-wp-go: processo local em Go; stdout fica reservado ao protocolo e logs vão para stderr.
  • WordPress REST API: recebe chamadas autenticadas por uma senha de aplicativo, não pela senha do servidor.
  • WordPress: aplica permissões do usuário, hooks e integração de cache da própria instalação.

Esse desenho não substitui o controle de acesso do WordPress: ele o torna a camada central. Crie uma senha de aplicativo exclusiva para a automação, use um usuário com o menor conjunto de capacidades que resolva o trabalho e revogue a senha caso ela seja exposta. Nunca coloque a senha em Git, README, logs ou no arquivo de configuração versionado do cliente MCP.

O que o mcp-wp-go faz

O projeto organiza as ferramentas em quatro grupos:

  • Posts: listar, ler HTML editável, criar rascunhos, atualizar conteúdo, publicar, despublicar e enviar para a lixeira.
  • Mídias: listar, obter metadados, fazer upload de GIF, JPEG, PNG ou WebP, atualizar texto alternativo/legenda e excluir.
  • Capas: enviar uma imagem, colocá-la como primeiro elemento do corpo e usar a URL relativa retornada pelo próprio site. A ferramenta não define imagem destacada, evitando duplicação em temas que a renderizam separadamente.
  • Validação: consultar categorias e tags, testar a autenticação e verificar se um post está publicado e se seu permalink responde HTTP 2xx.

Nas versões recentes, wordpress_get_post também devolve featured_media. Isso permite a uma rotina de QA confirmar que a capa ficou no corpo e não foi marcada, sem querer, como imagem destacada.

Instalação no Linux

O projeto exige Go 1.27 ou mais recente para compilar. Clone o repositório, execute os testes, gere o binário e instale-o no diretório local padrão do usuário. A configuração sensível fica fora do clone:

git clone https://github.com/jniltinho/mcp-wp-go.git
cd mcp-wp-go
make check
make build

# Instala o binário para o usuário atual.
install -D -m 0755 dist/mcp-wp-go "$HOME/.local/bin/mcp-wp-go"

# Cria uma configuração privada fora do repositório.
install -d -m 700 "$HOME/.config"
install -m 600 .env.example "$HOME/.config/mcp-wp-go.env"
$EDITOR "$HOME/.config/mcp-wp-go.env"

command -v mcp-wp-go

O artefato de compilação fica em dist/mcp-wp-go, mas o caminho estável usado pelo cliente é ~/.local/bin/mcp-wp-go. Assim, o clone pode ficar em qualquer diretório e ser atualizado ou removido sem quebrar a configuração MCP. Se ~/.local/bin ainda não estiver no PATH da sessão, use o caminho absoluto no cliente ou adicione-o à configuração do shell. O carregador de ambiente entende linhas simples CHAVE=VALOR; ele não executa expansão de shell nem comandos escondidos.

WP_BASE_URL=https://wp.exemplo.com
WP_USERNAME=editor-automacao
WP_APP_PASSWORD=senha-de-aplicativo-do-wordpress
WP_TIMEOUT=30s
WP_MAX_UPLOAD_BYTES=26214400
# Recomendado: limita quais diretórios locais podem ser lidos para upload.
WP_UPLOAD_ROOT=/srv/capas

Não use a senha de root, a senha normal da conta WordPress ou credenciais do banco de dados. A senha de aplicativo é específica para essa integração e pode ser revogada independentemente.

Registrar no cliente MCP

Guarde a configuração sensível fora do repositório e aponte o cliente para caminhos absolutos:

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

Depois de recarregar o cliente, chame wordpress_site_health. A resposta identifica o usuário autenticado, mas não expõe a senha. Esse é o primeiro teste antes de qualquer mudança editorial.

Fluxo seguro: rascunho, capa, publicação e checagem

Um fluxo editorial previsível começa com rascunho. Primeiro, use wordpress_list_categories e wordpress_list_tags para reaproveitar taxonomias existentes; depois crie o post em draft. A criação fecha comentários automaticamente.

{
  "title": "Novo guia técnico",
  "content": "<p>Introdução do artigo.</p>",
  "status": "draft",
  "categories": [46],
  "tags": [311, 31]
}

Em seguida, use wordpress_set_post_cover com uma imagem local WebP e um alt_text descritivo. A ferramenta aceita apenas imagens regulares permitidas, confere tipo e extensão, respeita o limite configurado e pode restringir a leitura a WP_UPLOAD_ROOT.

A publicação e a despublicação foram separadas da edição comum. As ferramentas wordpress_publish_posts e wordpress_unpublish_posts aceitam de um a cem IDs únicos, mas exigem confirmação explícita:

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

Operações em lote não são transacionais: se um ID falhar, os demais podem já ter sido processados. Por isso a resposta lista o resultado de cada post. Antes de publicar em massa, valide a seleção com wordpress_get_post ou wordpress_list_posts.

Por fim, wordpress_check_post_live confirma duas coisas: o status do post é publish e o permalink público retorna HTTP 2xx. Para uma capa, confira também featured_media, a primeira imagem do HTML e o resultado visual no navegador. Automação diminui trabalho repetitivo; ela não elimina revisão editorial.

Proteções contra erros comuns

  • Excluir post ou mídia requer confirm: true; o padrão é mover para a lixeira. Exclusão definitiva requer permanent: true.
  • Editar post não altera slug, data ou status. As mudanças de status têm ferramentas próprias e confirmação obrigatória.
  • Upload não aceita arquivos arbitrários: GIF, JPEG, PNG e WebP passam por validação de extensão, assinatura e tamanho.
  • O cliente HTTP limita redirects e não aceita que um redirecionamento saia do host WordPress configurado.
  • A checagem pública rejeita permalinks fora do host configurado, reduzindo o risco de usar uma URL devolvida pela API para fazer requisições externas.

Há uma diferença importante entre reduzir o acesso ao host e resolver toda a segurança de conteúdo. Um agente ainda pode escrever um texto ruim, apagar um post se receber confirmação ou reproduzir uma instrução maliciosa de uma fonte. Trabalhe com rascunhos, faça revisão humana antes de alterações destrutivas e mantenha backups e histórico de revisões do WordPress.

Go, testes e releases

O projeto usa a SDK oficial do MCP para Go e mantém main.go na raiz do repositório. O Makefile oferece make fmt, make vet, make test e make check. Os testes cobrem, entre outros pontos, fechamento de comentários na criação, URL relativa de capa, validação de featured_media e mudança de status sem alterar outros campos.

As tags acionam GitHub Actions. A release v0.2.0 publica pacotes para Linux amd64, macOS arm64 e Windows amd64, com notas de versão revisadas. Isso facilita testar o mesmo servidor MCP em estações de trabalho e servidores sem exigir que cada operador compile Go localmente.

Onde esse projeto se encaixa

O mcp-wp-go é uma peça de automação editorial, não uma substituição para observabilidade, backup ou hardening do WordPress. Ele combina bem com uma rotina que gera imagens, pesquisa fontes, redige rascunhos e valida links; para conteúdo técnico, é útil aplicar a mesma disciplina de mudança que já usamos em infraestrutura. Quem mantém agentes e ferramentas também pode aproveitar o guia de OpenObserve no Ubuntu para centralizar logs e investigar falhas de integração.

O projeto é aberto e recebe contribuições no GitHub. Antes de usar em produção, leia o README, ajuste as permissões do usuário WordPress e teste em um ambiente não crítico.

Fontes: repositório e README do mcp-wp-go · release v0.2.0 · SDK oficial MCP para Go · WordPress REST API · WordPress Application Passwords.