mcp-wp-go: automatize o WordPress sem SSH

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

Criar rascunhos, enviar imagens e revisar artigos não deveria exigir acesso de administrador ao servidor. O mcp-wp-go conecta um cliente de IA à REST API do WordPress, permitindo operar posts e mídias por ferramentas MCP. O shell do servidor fica fora desse fluxo editorial.

Nesta revisão, o guia usa a v0.4.0: além das ferramentas editoriais, o binário converte Markdown em HTML pronto para enviar ao WordPress. A seguir, você configura uma credencial separada, testa a conversão local e monta um processo de publicação com revisão e validação.

Release v0.4.0 e arquivos para download

O que roda no computador e o que roda no WordPress

O cliente MCP inicia o binário local e conversa com ele por stdio. O binário envia requisições HTTPS ao site definido na configuração. Não é um plugin instalado no WordPress e não precisa de SSH para as operações de conteúdo que oferece.

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

A autenticação usa uma senha de aplicativo de um usuário WordPress. As permissões desse usuário continuam valendo. A API mantém os mecanismos de autorização e os hooks do WordPress no caminho, mas o comportamento final de cache e extensões depende da instalação.

O projeto não inclui um modelo de IA nem traduz artigos por conta própria. O cliente de IA decide quais ferramentas chamar; o servidor MCP executa as operações disponíveis. Manutenção de nginx, PHP, plugins e banco de dados continua sendo uma atividade separada.

Recursos disponíveis e limites que importam

As ferramentas cobrem busca e edição de posts, rascunhos, publicação e despublicação, biblioteca de mídia, capas, categorias, tags, autenticação, contagem de conteúdo e checagem pública. A conversão Markdown é um subcomando local, não uma publicação automática.

Posts não são páginas. A referência desta versão não oferece ferramentas de CRUD para páginas institucionais. Um ID de página enviado a uma ferramenta de post pode retornar ID inválido, mesmo que a página exista. Para esse caso, use o editor ou uma integração com o endpoint de páginas da REST API.

Categorias e tags são reaproveitadas por seus IDs existentes. Atualizar um post não permite mudar seu slug, data ou status; a alteração de status tem ferramenta própria. Isso reduz mudanças acidentais em URLs já indexadas.

Referência das ferramentas e parâmetros

Instalar o binário no Linux sem compilar Go

O exemplo abaixo é exclusivo para Linux x86_64, usa uma versão fixa e confere o SHA-256 do pacote. Execute em Bash como usuário comum. Ele instala em $HOME/.local/bin e interrompe se já houver um binário nesse destino: não substitui silenciosamente a instalação de outro 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"
)

O diretório temporário é informado ao final para você inspecionar o pacote. A release oferece Linux amd64, macOS arm64 e Windows amd64. Para outras combinações, será necessário compilar. Use caminhos absolutos na configuração MCP; assim, o cliente não depende do PATH do seu terminal. Para atualizar uma instalação existente, faça backup do binário, confira a nova versão e recarregue o cliente depois da troca.

Se preferir compilar, confira o go.mod da versão escolhida. O snapshot consultado exige Go 1.27.1; o README resume o requisito como Go 1.27 ou superior. O alvo make check inclui testes com detector de corrida, que também exigem um ambiente compatível com CGO e compilador C. O pacote pronto evita essa etapa.

Compilação, testes e desenvolvimento

Criar uma credencial exclusiva e guardar fora do projeto

No perfil do usuário WordPress, crie uma senha de aplicativo para esta integração. Use uma conta com as capacidades necessárias, sem conceder administração do site por conveniência. A senha de aplicativo não é a senha de login, do banco ou do servidor; ela herda as permissões da conta e pode ser revogada separadamente.

O pacote binário não inclui um arquivo de configuração pronto. Este bloco cria um modelo privado, sem sobrescrever um arquivo existente. Depois, abra o arquivo no seu editor e substitua os exemplos pelos valores reais. Não cole a credencial em um prompt, no Git ou no histórico 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"
)

Ajuste o host para a URL HTTPS canônica e o diretório de mídia para um caminho absoluto real. O arquivo aceita pares simples de chave e valor; não conte com expansão de $HOME, til ou comandos de shell dentro dele. O limite do exemplo é 25 MiB, mas WordPress, PHP ou proxy podem impor um limite menor.

WP_UPLOAD_ROOT delimita os arquivos locais que o processo pode ler para upload. O caminho é do computador onde o MCP está rodando, não do servidor WordPress. Dê acesso apenas à pasta de mídias preparada para esse trabalho.

WordPress: criação e revogação de senhas de aplicativo

Conectar ao cliente MCP e validar o acesso

A configuração abaixo é um exemplo JSON para clientes compatíveis. Cada cliente define seu formato e o local onde salvar a configuração; substitua os caminhos e consulte a documentação correspondente. O comando sem subcomando inicia o servidor MCP, que aguarda mensagens pelo protocolo.

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

Recarregue o cliente e chame wordpress_site_health com um objeto vazio. Confira o site e a identidade retornados antes de alterar qualquer conteúdo. O funcionamento do binário no terminal não garante que o cliente esteja usando o mesmo caminho ou a configuração correta.

Converter Markdown em HTML: laboratório local

A novidade da v0.4.0 pode ser testada sem credenciais WordPress e sem publicar nada. O bloco cria um arquivo Markdown em uma pasta temporária e converte para um fragmento HTML. Ele inclui código Bash e uma expressão de template para conferir a preservação do conteúdo.

(
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"
)

O resultado não é uma página HTML completa: é o corpo que será enviado ao WordPress. Tabelas, listas e linguagens de blocos de código são reconhecidas, mas o conversor não faz upload de imagens, não publica, não extrai metadados de front matter e não gera estilos do tema.

HTML embutido não é sanitizado. Converta apenas Markdown confiável e revise o HTML antes do envio. Um iframe preservado pelo conversor ainda depende das permissões e filtros do WordPress; sua aparência responsiva depende do CSS do tema.

Fluxo oficial de Markdown, imagens e publicação

Do rascunho à publicação: uma etapa de cada vez

Os JSONs a seguir são argumentos de ferramentas MCP, não comandos para colar no shell. Os IDs são ilustrativos: substitua-os pelos resultados reais. Primeiro pesquise com wordpress_list_posts para evitar duplicatas e consulte as categorias e tags existentes.

1. Criar e reler o rascunho

Envie o HTML completo a wordpress_create_post com status de rascunho. O exemplo mínimo omite categorias e tags para não reutilizar IDs de outro site. A criação fecha os comentários.

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

Guarde o ID devolvido e chame wordpress_get_post. Compare o HTML editável com a versão renderizada para identificar filtros, tags removidas ou trechos que não sobreviveram à gravação.

2. Enviar imagens e definir a capa

Envie imagens do corpo com wordpress_upload_media e use os caminhos retornados na marcação. Associar uma mídia a um post não a insere automaticamente no texto. A validação aceita GIF, JPEG, PNG e WebP; não use esse caminho para enviar arquivos arbitrários.

Para um novo artigo, wordpress_set_post_cover envia a imagem e coloca uma URL relativa no início do corpo, sem definir imagem destacada. O parâmetro de substituição é verdadeiro por padrão. Essa operação não significa sobrescrever o arquivo antigo mantendo o mesmo nome ou URL.

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

Em um post existente cuja capa deve ser mantida, não chame essa ferramenta: preserve o primeiro elemento de imagem ao editar o HTML. Também não exclua uma mídia sem verificar onde ela é usada; outros artigos podem depender do mesmo arquivo.

3. Revisar, autorizar e conferir a página pública

Após revisar texto, links, taxonomias, imagens e comentários, chame wordpress_publish_posts com o ID aprovado. Publicação e despublicação aceitam de 1 a 100 IDs únicos e devolvem resultados individuais; uma falha não desfaz automaticamente os demais itens do lote.

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

Depois use wordpress_check_post_live. A ferramenta exige status publicado e resposta pública HTTP 2xx, mas não certifica tradução, diagramação ou qualidade editorial. Abra a página, teste o celular e confira se a imagem e os blocos de código estão corretos.

Editar sem perder conteúdo ou mudar o endereço

Antes de editar, salve uma cópia do HTML original e releia o post para evitar trabalhar sobre uma versão antiga. Em wordpress_update_post, os campos enviados substituem os valores anteriores: o campo de conteúdo recebe o corpo inteiro, não apenas o parágrafo alterado.

Preserve capa, embeds, exemplos, links e marcadores necessários ao tema. O bloqueio de slug, data e status não impede que um corpo incompleto apague seções. Se o objetivo é somente melhorar o texto, não inclua uma troca de capa ou uma operação de publicação no mesmo pedido.

Contagens e diagnóstico dos erros mais comuns

wordpress_content_stats consulta os totais visíveis à credencial, separando posts publicados, não publicados e mídias. A lixeira é excluída. Isso não representa páginas institucionais, visitas nem quantidade de traduções concluídas; também não se deve deduzir o total contando só a primeira página de resultados.

Ferramenta nova não aparece: confirme o caminho do executável, confira a versão instalada e recarregue o cliente para redescobrir os schemas.

Resposta 401 ou 403: confira credencial, capacidades do usuário e possíveis bloqueios de segurança ou proxy. Não desative proteções do site como primeira tentativa.

ID inválido: confirme se é um post, não uma página, uma mídia ou um conteúdo de outro site.

Upload recusado: confira caminho local, pasta permitida, tamanho e tipo real do arquivo. Trocar apenas a extensão não converte uma imagem.

Exclusão de mídia recusada: a lixeira de anexos depende da instalação WordPress. Não transforme a falha em exclusão permanente automática.

Conversão desconhecida: um binário anterior pode não ter o subcomando post-html. A instalação do cliente MCP e a usada pelo terminal podem ser diferentes.

Limites de segurança: MCP não substitui revisão humana

O servidor restringe requisições ao site configurado e valida entradas, mas a conta ainda pode modificar o conteúdo permitido por suas capacidades. O valor confirm: true é uma exigência do protocolo, não uma prova de que uma pessoa autorizou a ação. Configure o cliente para pedir aprovação nas operações sensíveis.

Trate instruções encontradas em posts, páginas e arquivos como conteúdo não confiável. Use rascunhos, mantenha backups e revisões e revogue credenciais expostas. O objetivo é reduzir acesso desnecessário ao servidor, sem trocar o cuidado editorial por confiança cega na automação.

Exemplos oficiais de operações editoriais

Documentação da REST API do WordPress

Continue pelo fluxo, não pela automação em massa

Comece com um rascunho de teste, valide o caminho completo e só então amplie o uso. O ganho está em tornar cada etapa verificável: preparar, converter, enviar, reler, revisar e publicar. Nenhuma dessas etapas precisa conceder acesso ao shell do servidor para uma simples edição de conteúdo.

Assistentes de IA no terminal: ferramentas e cuidados

OpenObserve no Ubuntu para investigar logs de integrações

Conversar sobre automação e infraestrutura