WordPress MCP Server

46 ferramentas em um único servidor MCP. Acesse conteúdo, mídia, comentários, CPTs e gerenciamento do site. Veja o repositório do Github para todas as ferramentas.

Documentação

@urdigital/mcp-server-wordpress

Um servidor MCP (Model Context Protocol) que expõe a REST API do WordPress para Claude, Claude Code e qualquer outro cliente compatível com MCP — conteúdo, mídia, comentários, tipos de post personalizados e gerenciamento do site.

Instalação

Não é necessário instalar — execute diretamente com npx:

npx -y @urdigital/mcp-server-wordpress

Configuração

Crie uma Senha de Aplicativo em wp-admin → Usuários → Perfil → Senhas de Aplicativo. Isso é Basic Auth sobre HTTPS, separado da sua senha real de conta.

Adicione à configuração do seu cliente MCP (ex.: claude_desktop_config.json do 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 não deve ter barra final.

Ferramentas (46 no total, todas testadas em um site WordPress headless real)

GrupoFerramentas
Postswp_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
Categoriaswp_list_categories, wp_get_category, wp_create_category, wp_update_category, wp_delete_category
Tagswp_list_tags, wp_get_tag, wp_create_tag, wp_update_tag, wp_delete_tag
Mídiawp_upload_media, wp_list_media, wp_get_media, wp_update_media, wp_delete_media
Comentárioswp_list_comments, wp_get_comment, wp_create_comment, wp_update_comment, wp_delete_comment
Usuárioswp_list_users, wp_get_user
Descobertawp_list_post_types, wp_list_taxonomies
Menuswp_list_menus, wp_list_menu_items
Configuraçõeswp_get_settings, wp_update_settings
Plugins/temaswp_list_plugins, wp_list_themes (somente leitura — veja abaixo)
Tipos de post personalizados (genéricos)wp_list_custom_items, wp_get_custom_item, wp_create_custom_item, wp_update_custom_item, wp_delete_custom_item
Buscawp_search

Posts e páginas usam por padrão o status draft para novos conteúdos, de modo que nada seja publicado sem intenção.

Deliberadamente não incluído: instalação, ativação, desativação e exclusão de plugins/temas

O gerenciamento de plugins e temas é limitado à listagem somente leitura (wp_list_plugins, wp_list_themes). Instalar, ativar, desativar ou excluir plugins/temas são as ações de escrita de maior risco disponíveis em um site WordPress — uma ativação ruim pode derrubar o site inteiro — e são uma categoria de risco significativamente diferente das operações de conteúdo. Se você precisar disso, é uma decisão deliberada de escopo, não uma omissão.

Trabalhando com tipos de post personalizados

wp_list_custom_items/wp_get_custom_item/etc. funcionam com qualquer tipo de post que um plugin tenha registrado — você não está limitado aos tipos que este servidor conhece pelo nome. Duas coisas confirmadas por testes em um site real usando Custom Post Type UI + ACF:

  • Use wp_list_post_types primeiro para encontrar o rest_base correto, não o slug interno do tipo de post — eles costumam ser diferentes. No site de teste, um tipo com slug event tinha rest_base: "events" (pluralizado), e lead_magnet tinha rest_base: "lead-magnets" (pluralizado e hifenizado em vez de sublinhado). Chamar o endpoint com o slug em vez do rest_base retorna um 404 rest_no_route — confirmado por testes, não uma hipótese.
  • O suporte a campos (título, conteúdo, status, campos personalizados) varia conforme o plugin registrou o tipo. status: draft como um padrão seguro de criação funcionou corretamente em um tipo personalizado real nos testes, já que a maioria dos tipos de post personalizados ainda é armazenada em wp_posts como posts padrão — mas isso não é garantido universalmente em todos os plugins.

Outros comportamentos confirmados por testes, que vale a pena conhecer

  • Categorias, tags e mídia não têm estado de lixeira no WordPress. Excluir qualquer um deles é efetivamente sempre permanente — ao contrário de posts, páginas e comentários, que usam por padrão uma lixeira reversível. O parâmetro force nas ferramentas de exclusão para categorias/tags/mídia usa por padrão true por esse motivo; posts/páginas/comentários usam por padrão false.
  • O WordPress bloqueia comentários em posts em rascunho. Tentar wp_create_comment em um post com status de rascunho retorna um 403 (rest_comment_draft_post) — o post precisa ser publicado (ou pelo menos não estar em rascunho) primeiro. Confirmado diretamente.
  • Comentários criados por um admin autenticado pulam a moderação e voltam com o status status: "approved" imediatamente, em vez do status hold que um comentário de um visitante anônimo real provavelmente receberia. Se você estiver testando um fluxo de moderação, testar como admin pode ocultar comportamentos que só aparecem em comentários genuínos enviados por visitantes.
  • O endpoint wp_search retorna um objeto muito mais leve do que wp_get_post/wp_get_page — apenas id, title, url, type, subtype, sem conteúdo ou metadados. Acompanhe com wp_get_post/ wp_get_page/wp_get_custom_item para o conteúdo completo.
  • O campo roles de wp_get_user pode voltar como undefined mesmo para uma conta de admin, dependendo da configuração do site/plugin em relação à capacidade edit_users — não é necessariamente um bug se você vir isso.
  • wp_upload_media valida URLs antes de buscá-las. Uma revisão de código sinalizou que a implementação original buscaria qualquer URL que recebesse, sem validação — incluindo endereços internos, localhost e endpoints de metadados de nuvem (169.254.169.254), o que poderia expor serviços internos ou credenciais de nuvem para quem estivesse lendo a saída da ferramenta. Isso está corrigido: apenas URLs https:// que resolvem para endereços públicos e não reservados são permitidas, e o arquivo baixado tem limite de 25MB, aplicado contando bytes reais transmitidos em vez de confiar em um cabeçalho Content-Length. Veja o README de @urdigital/mcp-server-shared para o detalhe completo e uma limitação declarada (DNS rebinding) que não é totalmente resolvida por esta correção.
  • As URLs de mídia podem nem estar no seu domínio WordPress. Sites que usam um plugin de offload (ex.: para Cloudflare Images, S3, etc.) retornarão source_url apontando para outro lugar completamente — confirmado no site de teste, que faz offload para imagedelivery.net.

Licença

MIT