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)
| Grupo | Ferramentas |
|---|---|
| Posts | wp_list_posts, wp_get_post, wp_create_post, wp_update_post, wp_delete_post |
| Páginas | wp_list_pages, wp_get_page, wp_create_page, wp_update_page, wp_delete_page |
| Categorias | wp_list_categories, wp_get_category, wp_create_category, wp_update_category, wp_delete_category |
| Tags | wp_list_tags, wp_get_tag, wp_create_tag, wp_update_tag, wp_delete_tag |
| Mídia | wp_upload_media, wp_list_media, wp_get_media, wp_update_media, wp_delete_media |
| Comentários | wp_list_comments, wp_get_comment, wp_create_comment, wp_update_comment, wp_delete_comment |
| Usuários | wp_list_users, wp_get_user |
| Descoberta | wp_list_post_types, wp_list_taxonomies |
| Menus | wp_list_menus, wp_list_menu_items |
| Configurações | wp_get_settings, wp_update_settings |
| Plugins/temas | wp_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 |
| Busca | wp_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_typesprimeiro para encontrar orest_basecorreto, não o slug interno do tipo de post — eles costumam ser diferentes. No site de teste, um tipo com slugeventtinharest_base: "events"(pluralizado), elead_magnettinharest_base: "lead-magnets"(pluralizado e hifenizado em vez de sublinhado). Chamar o endpoint com o slug em vez do rest_base retorna um 404rest_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: draftcomo 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 emwp_postscomo 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
forcenas ferramentas de exclusão para categorias/tags/mídia usa por padrãotruepor esse motivo; posts/páginas/comentários usam por padrãofalse. - O WordPress bloqueia comentários em posts em rascunho. Tentar
wp_create_commentem 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 statusholdque 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_searchretorna um objeto muito mais leve do quewp_get_post/wp_get_page— apenasid,title,url,type,subtype, sem conteúdo ou metadados. Acompanhe comwp_get_post/wp_get_page/wp_get_custom_itempara o conteúdo completo. - O campo
rolesdewp_get_userpode voltar comoundefinedmesmo para uma conta de admin, dependendo da configuração do site/plugin em relação à capacidadeedit_users— não é necessariamente um bug se você vir isso. wp_upload_mediavalida 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 URLshttps://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çalhoContent-Length. Veja o README de@urdigital/mcp-server-sharedpara 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_urlapontando para outro lugar completamente — confirmado no site de teste, que faz offload paraimagedelivery.net.
Licença
MIT