elementor-mcp-agent
Servidor MCP de nível profissional para WordPress Elementor — gerenciamento de frota multi-site, edição segura em nível de página/widget, exportação/importação de modelos, rastreamento de versões com snapshot/rollback.
Documentação
elementor-mcp-agent
Servidor MCP de nível agência para WordPress Elementor. Gerenciamento multi-site, edições seguras do Elementor com backup + rollback automático + limpeza de CSS, exportação/importação de templates, detecção de widgets globais, capturas de tela, saída de emergência via WP-CLI.
Construído para agências que gerenciam muitos sites de clientes em Elementor / Elementor Pro e querem que o Claude (ou qualquer cliente MCP) assuma o trabalho braçal — sem quebrar páginas.
Como isso foi construído
O elementor-mcp-agent foi construído de ponta a ponta com o Claude Code em cerca de 48 horas. O processo é intencionalmente aberto:
- Arquitetura, código, testes, documentação — tudo gerado em sessões de pair-programming com o Claude Code
- Os 7 bugs documentados em este post-mortem foram capturados em testes E2E reais contra uma instalação ao vivo de WordPress + Elementor, não depois do fato
- O padrão de verificação pós-escrita da v1.2 foi lançado 2 horas após um comentário de leitor (Mads Hansen no Dev.to) — o changelog credita a fonte
Isso não é software "vibe-coded" jogado por cima do muro. Cada versão passou por lint + typecheck + 27 testes unitários + (para v1.0) E2E completo contra uma instalação real de WordPress antes da publicação. O próprio MCP tem guardrails embutidos que impedem o modelo de fazer chamadas destrutivas ao WP-CLI.
Eu administro uma pequena agência de WordPress e uso esta ferramenta todos os dias em sites de clientes. Se você é cético sobre codegen agêntico para infraestrutura de produção, todo o histórico de commits está aberto — julgue por si mesmo.
Por que isso existe
Existem mais de 25 servidores MCP de WordPress no GitHub hoje. Nenhum atende ao fluxo de trabalho multi-site para agências com:
- Backup real antes de cada edição (postmeta via WP-CLI quando SSH está disponível, fallback para arquivo JSON — nunca perdido silenciosamente)
- Confirmação em duas chamadas para qualquer operação destrutiva (TTL 60s)
- Validação JSON + rollback automático se uma edição produzir dados inválidos do Elementor
- Fallback de limpeza de CSS em 3 níveis (REST → wp-cli nativo → exclusão de option/meta → re-salvar)
- Consciência de widgets globais — verificação prévia avisa se uma página referencia widgets compartilhados
- Saída de emergência via WP-CLI para tudo que a API REST não pode fazer com segurança
- Capturas de tela via Chrome headless (sem dependência de puppeteer)
Instalação
npx -y elementor-mcp-agent
Configuração
export ELEMENTOR_MCP_SITES='[{
"id": "client-acme",
"url": "https://acme.example.com",
"username": "admin",
"application_password": "xxxx xxxx xxxx xxxx xxxx xxxx",
"ssh": {
"host": "host.example.com",
"user": "username",
"port": 22,
"path": "/path/to/wordpress",
"wp_cli_path": "wp"
}
}]'
Gere a Senha de Aplicativo do WordPress em https://{your-site}/wp-admin/profile.php#application-passwords-section.
O bloco ssh é opcional, mas desbloqueia 8 ferramentas adicionais (saída de emergência via WP-CLI + backups confiáveis de postmeta personalizado). O MCP funciona sem SSH — os backups vão para arquivos JSON locais.
wp_cli_path é auto-detectado se omitido (tenta wp, depois ~/bin/wp.phar, depois ~/wp-cli.phar).
Configuração do Claude Desktop
{
"mcpServers": {
"elementor": {
"command": "npx",
"args": ["-y", "elementor-mcp-agent"],
"env": {
"ELEMENTOR_MCP_SITES": "[{\"id\":\"acme\",\"url\":\"https://acme.com\",\"username\":\"admin\",\"application_password\":\"...\"}]"
}
}
}
}
Ferramentas (34)
Sites e saúde
list_sites— enumerar o poolping_site— sonda de autenticação + versãosite_health— snapshot de saúde com múltiplas chamadas
Páginas
list_elementor_pages— páginas em modo construtorread_page_elementor— resumo analisado + árvore completa opcionallist_widgets_in_page— inventário plano de widgets com trechoslist_global_widgets— widgets compartilhados (editar um → afeta todas as páginas que o usam)preflight_check— validar se uma página é segura para editarelementor_find_replace— substituição de texto com dry-run → token → aplicar → backup → validar → rollback se inválidolist_elementor_backups/restore_elementor_backup— cadeia completa de restauração com backup de segurança pré-restauraçãoduplicate_elementor_page— clonar dentro de um site (data + page_settings + edit_mode)
Templates
list_elementor_templates— Theme Builder distinguido da biblioteca regularexport_elementor_template— JSON portátilimport_elementor_template— inserir no site de destinoapply_template_to_page— empurrar dados de template para uma página existente
Saída de emergência via WP-CLI (requer SSH)
wp_cli_run— comando wp-cli arbitrário com detecção de padrões destrutivos + confirmaçãowp_search_replace—wp search-replacecom dry-run obrigatóriowp_elementor_flush_css— fallback em 3 níveiswp_plugin_list/wp_plugin_update(com confirmação)
Visual
screenshot_page— PNG via Chrome headless de qualquer URLcompare_screenshots— SHA-256 + delta de bytes
Widgets (v1.1 — CRUD em nível de widget)
read_widget— buscar um widget por id (somente leitura)update_widget_settings— mesclagem superficial de configurações, com backup + validação + limpezadelete_widget— remover um widget do contêiner paiduplicate_widget— clonar como irmão com novo idswap_widget_type— substituir widgetType + configurações, preservar id + posiçãoadd_widget— anexar um widget a um contêiner paimove_widget— mover um widget entre contêineres (com posição)
Em massa e frota (v1.1)
bulk_find_replace_site— localizar/substituir em todas as páginas Elementor de um site, com backup por página + validação + limpezafleet_find_replace— o mesmo em todos os sites do pool (sequencial, dry-run obrigatório)restore_from_file— restaurar_elementor_dataa partir de um backup em arquivo JSON, com backup de segurança pré-restauração
Frota
check_elementor_versions— sinalizar instalações desatualizadas em relação ao wordpress.org mais recente
Verificação pós-escrita (v1.2)
Toda ferramenta de mutação de widget relê a página do WP canônico após a escrita e expõe o estado persistido ao modelo. A API de escrita HTTP pode mentir — retornar 200 OK enquanto filtros de plugin ou peculiaridades do REST descartam silenciosamente o payload. Este contrato torna isso observável.
Toda resposta de applied carrega:
{
"mutated": true, // false = no-op OR silent drop
"warnings": [], // non-fatal issues
"verification": {
"method": "Re-read /wp/v2/pages/42 and check widget abc settings…",
"reread_ok": true,
"matches_requested": true, // false = write API lied
"persisted": { /* canonical state */ },
"notes": "…explanation when something diverged"
}
}
Se verification.matches_requested === false, trate como falha mesmo que
a camada HTTP tenha dito OK. O payload original sobrevive em
backup_meta_key — restaure via restore_elementor_backup.
Garantias de segurança
Embutidos em src/elementor/policies.ts:
BACKUP_BEFORE_WRITE = true
BACKUP_PAGE_SETTINGS = true
VALIDATE_JSON_AFTER_EDIT = true
BLOCK_GLOBAL_WIDGET_WRITES_BY_DEFAULT = true
CONFIRMATION_TTL_SECONDS = 60
GLOBAL_WIDGET_CONFIRMATION_TTL_SECONDS = 30
FLUSH_CSS_AFTER_WRITE = true
MAX_ELEMENTOR_DATA_BYTES = 5_000_000
E estes padrões de wp-cli são bloqueados à força independentemente de confirmação:
rm -rfsudo *db reset --yes/db drop --yes
Verificado de ponta a ponta
A v1.0.0 foi testada em condições reais contra uma instalação ao vivo de WordPress com Elementor 4.0.9:
- ✅ 21/24 ferramentas validadas de ponta a ponta na linha de base v1.0.0 (a suíte agora expõe 34 — veja Ferramentas)
- ✅ find_replace → backup → restauração preserva dados
- ✅ duplicate_page copia data + page_settings + edit_mode
- ✅ apply_template_to_page com backup automático
- ✅ fluxo destrutivo do wp_cli_run (exclusão de post) requer confirmação
- ✅ detecção de capturas de tela idênticas via SHA-256
- ✅ limpeza de CSS usa
wp elementor flush-cssquando SSH está disponível, cai para exclusão de option caso contrário
7 bugs encontrados durante os testes, todos corrigidos:
- A API REST descarta silenciosamente escritas de postmeta não registradas → mudou para WP-CLI como principal para backups
wpnão está no PATH do SSH em hosts gerenciados → auto-detecção + configuraçãowp_cli_path- Poluição de banner pós-quântico do SSH → filtro de stderr
- Kit padrão retornado como "widget" → filtro no lado do cliente
- Incompatibilidade de tipo object/string em
_elementor_page_settings→ normalização - Timeout de captura de tela no cold-start do Chrome → aumentado para 60s
- Bug de filtro na listagem de templates → corrigido
Roadmap
v1.1 ✅ lançada
- CRUD em nível de widget:
read_widget,update_widget_settings,delete_widget,duplicate_widget,swap_widget_type,add_widget,move_widget bulk_find_replace_site(em todas as páginas Elementor de um site)fleet_find_replace(em todos os sites do pool)restore_from_file
v1.2
- Leitura/escrita de estilos globais
- Envio de templates do Theme Builder entre sites
- Operações em nível de seção/coluna
v2.0
- Ferramentas com consciência WooCommerce
- Diff visual (comparação de pixels)
- Agendamento + cron
Se isso economizou seu tempo
A forma mais rápida de apoiar o projeto é um ⭐ star no GitHub — ajuda outras agências que gerenciam sites Elementor a encontrar isto e me diz o que continuar construindo.
Você também pode:
- Abrir uma issue para bugs, casos extremos ou ferramentas ausentes
- Iniciar uma discussão para dúvidas de design ou fluxo de trabalho
- Compartilhar o que você construiu com isso — adoraria saber