feat(wordpress): skill mcp-pro-elements — MCP dedicado ao PRO Elements (fork GPL Elementor Pro) via WP-CLI/SSH

This commit is contained in:
Emanuel Almeida
2026-08-19 07:59:57 +01:00
parent 9df437a48e
commit 7035eae927
+117
View File
@@ -0,0 +1,117 @@
---
name: mcp-pro-elements
description: MCP dedicado (node stdio, ligação `pro-elements` em ~/.omp/agent/mcp.json) para gerir o PRO Elements (fork GPL do Elementor Pro) em starter/ccv/care.descomplicar.pt — estado/versão do plugin, os 4 módulos com toggle próprio via Elementor Experiments (mega_menu, size_variables, atomic_form, pro_interactions), reCAPTCHA v2/v3 das Forms (secret sempre mascarada), licença (vestígio histórico, sempre mascarada), restrições do Element Manager por role (read-only), via WP-CLI/SSH. Usar quando "pro elements", "elementor pro fork", "modulos pro elements", "experiment mega menu", "recaptcha forms elementor", "licenca pro elements", "elementor experiment toggle".
layer: wiki
---
# /mcp-pro-elements — MCP dedicado ao PRO Elements
Projecto em `/media/ealmeida/Dados/Dev/mcp-pro-elements/` (TypeScript, SDK MCP oficial, stdio).
Sem código PHP novo no WordPress — cada tool executa `wp option get/update` via `ssh server` sobre
o WP-CLI já instalado. Não é uma extensão do EMCP Tools (plugin comercial Freemius, catálogo de
tools fixo curado pelo autor, sem mecanismo de terceiros).
## O que é o PRO Elements (achado por leitura de código-fonte, 19-08-2026)
**Não** é um addon pack de terceiros como o Element Pack Pro (BdThemes) — é literalmente o
código-fonte do **Elementor Pro**, rebrandeado: `pro-elements.php` define
`ELEMENTOR_PRO_VERSION`/`namespace ElementorPro`, os mesmos `core/`, `modules/`, `base/` do
Elementor Pro genuíno. A diferença está em `license/api.php`: `License\API::get_license_data()`
está **hardcoded** para devolver sempre `success:true, expires:'lifetime'` com a lista completa de
features Pro — não há licença real a validar. `wp elementor-pro license activate/deactivate`
(comando WP-CLI próprio) tem os métodos vazios (no-ops). A própria description do plugin em
care.descomplicar.pt confirma: *"This plugin enables GPL features of Elementor Pro... is not a
substitute for Elementor Pro."*
## Âmbito
Ao contrário do Element Pack Pro (~150 widgets num único array com toggle individual), o PRO
Elements **não tem ecrã "Modules" com toggle por widget**. Só **4 dos ~80 módulos** têm toggle
próprio, via **Elementor Experiments** (`wp_options.elementor_experiment-<nome>`, string simples
`active`/`inactive`/`default`):
| Tool id | Experiment | Default | Disponível |
|---|---|---|---|
| `mega_menu` | `mega-menu` | inactive | 3.31.2 e 3.35.0 (confirmado nos 3 sites) |
| `size_variables` | `e_pro_variables` | active | só 3.35.0 (starter/ccv) — pasta ausente em 3.31.2 (care) |
| `atomic_form` | `e_pro_atomic_form` | inactive | só 3.35.0 |
| `pro_interactions` | `e_pro_interactions` | inactive | só 3.35.0 |
Os restantes módulos (query-control, popup, theme-builder, forms, woocommerce, etc.) activam
sempre — `Module::is_active()` por omissão `true` + licença hardcoded sempre completa.
A única **configuração geral real e gravável** é o **reCAPTCHA das Forms** (v2/v3). Não existe
"Google Maps API key" própria do PRO Elements — o Google Maps usa a key do Elementor **core**
(`elementor_google_maps_api_key`), fora do âmbito deste MCP.
## Sites conhecidos
Confirmado por `wp plugin get pro-elements` nos 3 (19-08-2026) — únicos do bundle com o plugin
activo:
- `starter` → starter.descomplicar.pt, v3.35.0
- `ccv` → ccv.descomplicar.pt, v3.35.0
- `care` → care.descomplicar.pt, v3.31.2
`descomplicar.pt` (produção), `emanuelalmeida.pt` e os sites `*ecommerce*` **não** têm o plugin.
## Tools (8)
| Tool | Read-only | Uso |
|---|---|---|
| `pe_list_sites` | sim | Aliases conhecidos + versão confirmada, sem SSH |
| `pe_get_status` | sim | Versão/estado do plugin via `wp plugin get` |
| `pe_get_modules` | sim | Estado dos 4 módulos: `installed_in_this_version` (dir existe nesta versão), `raw_state` (valor gravado ou `null`), `effective_active` (resolvido incl. default) |
| `pe_set_module_state` | não | `active`/`inactive`/`default` num módulo; recusa se `installed_in_this_version=false` (nunca escreve lixo sem efeito) |
| `pe_get_recaptcha_settings` | sim | Site keys em claro (públicas), secret keys sempre mascaradas (`{configured, length}`) |
| `pe_set_recaptcha_settings` | não | Actualiza campos v2/v3 passados; `threshold` só válido em v3, 0–1 |
| `pe_get_license_status` | sim | Vestígio de `elementor_pro_license_key` mascarado + nota fixa sobre o bypass hardcoded |
| `pe_get_role_restrictions` | sim | `elementor_pro_element_manager_role_permission` — restrições de widgets por role (vazio nos 3 sites) |
## Segurança
- Allowlist fixa de option keys (`src/wpcli.ts`) — nunca `wp option update` genérico.
- **Secrets nunca em claro**: `secret_key` do reCAPTCHA e `elementor_pro_license_key` passam
sempre por `describeSecret()` → só `{configured: boolean, length: number}`. Site keys reCAPTCHA
são públicas por natureza (embutidas em JS no browser) e são devolvidas em claro.
- Escritas via base64 em stdin, nunca interpoladas no comando SSH remoto.
- `elementor_experiment-*` e as chaves `elementor_pro_recaptcha_*` são strings escalares simples
(nunca `--format=json` — corromperia o valor, mesmo gotcha da skill `mcp-wpfc`).
`elementor_pro_element_manager_role_permission` é o único array PHP nativo do allowlist —
lido com `--format=json`, nunca escrito por aqui (formato complexo por-widget-por-role gerido
pela app React do editor, sem valor real a expor um write raw).
- `elementor_pro_license_key` fica fora da allowlist de escrita — o runtime ignora-a de qualquer
forma (ver acima), escrevê-la não activaria nada.
## Verificação
Construído e testado ponta-a-ponta contra produção (19-08-2026), os 3 sites:
- `pe_get_status` idêntico a `wp plugin get pro-elements` directo em starter (3.35.0), ccv
(3.35.0) e care (3.31.2).
- `pe_get_modules(care)` confirmou `installed_in_this_version` correcto — só `mega_menu=true`
(os outros 3 `false`, ausência das pastas `modules/{variables,atomic-form,interactions}`
confirmada em disco); `pe_get_modules(ccv)` confirmou os 4 `true` e `size_variables.
effective_active=true` (resolve o default `active` porque `raw_state` nunca foi gravado).
- `pe_get_recaptcha_settings(care)` idêntico à leitura directa (`site_key`/`secret_key` vazios,
`threshold=0.5`).
- `pe_get_license_status`: `care` → `{configured:true, length:45}` (o vestígio real de uma
instalação Elementor Pro genuína anterior, encontrado em `wp_options`); `starter`/`ccv` →
`{configured:false}` (nunca tiveram licença real).
- **Escrita com round-trip idempotente**, duas vezes: `pe_set_module_state(care, mega_menu,
"default")` — valor antes/depois idêntico (`"default"`), confirmado por `wp option get`
directo fora do MCP; `pe_set_recaptcha_settings(care, v3, threshold=0.5)` — valor antes/depois
idêntico (`0.5`), confirmado da mesma forma.
- Guard testado: `pe_set_module_state(care, size_variables, "active")` recusado com erro claro
(módulo não existe em 3.31.2) — nenhuma escrita tentada.
- Nenhum segredo devolvido em claro em qualquer chamada.
## Skills relacionadas
- `mcp-element-pack` — Element Pack Pro (BdThemes), um addon pack de terceiros genuíno, com
~150 widgets num único array de toggle — **não confundir** com este MCP (o PRO Elements é o
próprio Elementor Pro rebrandeado, mecanismo de toggle completamente diferente).
- `element-pack-widgets` — catálogo/inserção de widgets Element Pack via EMCP; não aplicável ao
PRO Elements (os widgets Pro do Elementor inserem-se pela ligação EMCP normal do site, não por
este MCP de configuração admin).
- `mcp-wpfc` — mesmo padrão de gotcha JSON vs string escalar em `wp option get/update`.