wordpress: adiciona skills element-pack-widgets e mcp-element-pack

- element-pack-widgets: catalogo verificado 168 widgets core + 95 integracao
  Element Pack Pro (BdThemes), get_name() extraido do codigo-fonte, 11
  excepcoes de nome confirmadas
- mcp-element-pack: documenta o MCP dedicado (node stdio) para licenca/
  modulos/mega-menu/white-label/custom-code do Element Pack Pro
This commit is contained in:
2026-08-19 04:47:07 +01:00
parent 000faca193
commit 67f6d6e6e1
3 changed files with 467 additions and 0 deletions
@@ -0,0 +1,80 @@
---
name: element-pack-widgets
description: Catálogo completo e verificado dos widgets Element Pack Pro (BdThemes) para Elementor — 168 widgets core (`element_pack_active_modules`) + 95 widgets de integração com plugins de terceiros, com o widgetType real de cada um extraído do código-fonte (`get_name()` em `modules/<slug>/widgets/*.php`) — não estão no catálogo curado do EMCP Tools (list-widgets), por isso precisam de get-widget-schema com full:true. Usar quando "element pack", "bdt-widget", "advanced heading elementor", "mega menu elementor", "custom carousel elementor", "brand grid", "crypto currency widget".
layer: wiki
---
# /element-pack-widgets — Catálogo de Widgets Element Pack Pro (BdThemes)
Element Pack Pro (plugin `bdthemes-element-pack`, activo em **descomplicar.pt**, v9.8.12) regista
os próprios widgets Elementor **fora** do catálogo curado do EMCP Tools — `list-widgets` não os
lista e `get-widget-schema` sem `full:true` devolve `"Not in the curated catalog"`.
Catálogo extraído directamente de `get_name()` em cada `modules/<slug>/widgets/*.php`, num site em
produção — **não adivinhado por convenção de nomes**, o que importa porque a convenção
`bdt-<slug-do-módulo>` tem 11 excepções reais confirmadas (ver `references/catalogo.md`). Catálogo
completo (168 core + 95 integração) em `references/catalogo.md`.
## Como usar (workflow)
1. Confirmar que `bdthemes-element-pack` está activo: `list-plugins`, procurar o slug (ou
`wp option get element_pack_active_modules --format=json` via SSH para ver módulos on/off).
2. `get-widget-schema({ widget_type: "bdt-<slug>", full: true })` — **sempre `full:true`**, nunca
confiar no catálogo curado. Devolve o schema de controlos real e vivo do widget (responsivo,
condições de exibição, efeitos).
3. Adicionar com `add-free-widget({ post_id, parent_id, widget_type, settings })` num container
**legacy** (`add-container`) — mesma mecânica de `elementskit-widgets`/`powerpack-widgets`, sem
equivalente atómico v4.
4. **Nunca assumir o `widgetType` pela pasta do módulo** — confirmado no código-fonte, 11 excepções
reais: `we-forms` → `bdt-we-form` (singular), `gravity-forms` → `bdt-gravity-form`,
`ninja-forms` → `bdt-ninja-form`, `edd-download-history` → `bdt-easy-digital-download-history`,
`edd-profile-editor` → `bdt-easy-digital-profile-editor`, `edd-purchase-history` →
`bdt-easy-digital-purchase-history`, `events-calendar-carousel/grid/list` → `bdt-event-*` (sem
"calendar"), `fooevents-calendar` → `fooevents-calendar` (sem prefixo `bdt-`). E **um caso não
resolvido**: `lightbox` resolve para `widgetType: "lightbox"` no código, mas `get-widget-schema`
devolve 0 propriedades para `bdt-lightbox` e uma resposta anormalmente grande (1624 propriedades
— provável fallback do EMCP, não o schema real) para `lightbox`; tratar como **não confirmado**
até verificar directamente numa página de teste antes de usar em produção.
5. Testado ponta-a-ponta em produção (19-08-2026): página draft → `add-container` →
`add-free-widget` com `bdt-advanced-heading` → `get-page-structure`/`get-element-settings`
confirmaram persistência → limpeza da página de teste.
## Widgets mais usados (ver `references/catalogo.md` para os 168+95 completos)
| `widgetType` | Título | Uso |
|---|---|---|
| `bdt-advanced-heading` | Advanced Heading | título com sub-heading, split text, efeitos de fundo |
| `bdt-custom-carousel` | Custom Carousel | carrossel genérico de slides imagem/vídeo/template |
| `bdt-mega-menu` | Mega Menu | menu mega multi-coluna, requer `element_pack_other_settings.mega-menu = on` |
| `bdt-brand-grid` / `bdt-brand-carousel` | Brand Grid/Carousel | logótipos de marcas em grelha/carrossel |
| `bdt-price-table` | Price Table | tabela de preços |
| `bdt-flip-box` | Flip Box | cartão com flip ao hover |
| `bdt-testimonial-carousel` | Testimonial Carousel | testemunhos em carrossel |
| `bdt-countdown` | Countdown | temporizador de contagem decrescente |
| `bdt-crypto-currency-ticker` | Crypto Ticker | ticker de criptomoedas em tempo real |
| `bdt-post-grid` | Post Grid | grelha de posts com query control |
| `bdt-timeline` | Timeline | linha do tempo vertical/horizontal |
| `bdt-table-of-content` | Table of Content | índice automático da página |
| `bdt-instagram` | Instagram Feed | feed do Instagram |
| `bdt-svg-maps` | SVG Maps | mapas SVG interactivos por região |
| `bdt-review-card` | Review Card | cartão de avaliação/review |
## Notas
- 168 widgets são **core**, controlados por `element_pack_active_modules` (todos `on` neste site
excepto `cookie-consent`, verificado 19-08-2026) — ver `mcp-element-pack` para ligar/desligar via
MCP dedicado.
- 95 widgets são **de integração**: só funcionam com o plugin de terceiros correspondente activo
(ACF, bbPress, BuddyPress, Charitable, Easy Digital Downloads, The Events Calendar, Tutor LMS,
WooCommerce, Give, LearnPress, vários plugins de formulários). Confirmar o plugin dependente antes
de inserir — `add-free-widget` não valida isto, pode inserir um widget "órfão" que não renderiza.
- `mega-menu` é widget **e** módulo de outros_settings — o widget só produz saída com
`element_pack_other_settings['mega-menu'] = 'on'` (hoje `off` em produção); confirmar/activar via
`mcp-element-pack` antes de o usar.
## Skills relacionadas
- `mcp-element-pack` — MCP dedicado para gerir licença/módulos/mega-menu/white-label/custom-code
do Element Pack Pro em descomplicar.pt via WP-CLI/SSH (não cobre inserção de widgets).
- `emcp-page-building` — mecânica de coexistência atómico/legacy, sequência de construção.
- `elementskit-widgets` / `powerpack-widgets` — catálogos dos addons concorrentes, mesmo padrão de
descoberta (`full:true` obrigatório, fora do catálogo curado).
@@ -0,0 +1,338 @@
# Catálogo completo — Element Pack Pro (BdThemes) widgets
Extraído do código-fonte real (`get_name()` em cada `modules/<slug>/widgets/*.php`) em descomplicar.pt, Element Pack Pro 9.8.12, 19-08-2026. 168 widgets core (gerados por `element_pack_active_modules`, todos activos neste site) + 95 widgets de integração com plugins de terceiros (activos independentemente do toggle de módulos core).
## Widgets core (168) — controlados por `element_pack_active_modules`
| Módulo | `widgetType` |
|---|---|
| `accordion` | `bdt-accordion` |
| `advanced-button` | `bdt-advanced-button` |
| `advanced-calculator` | `bdt-advanced-calculator` |
| `advanced-counter` | `bdt-advanced-counter` |
| `advanced-divider` | `bdt-advanced-divider` |
| `advanced-gmap` | `bdt-advanced-gmap` |
| `advanced-heading` | `bdt-advanced-heading` |
| `advanced-icon-box` | `bdt-advanced-icon-box` |
| `advanced-image-gallery` | `bdt-advanced-image-gallery` |
| `advanced-progress-bar` | `bdt-advanced-progress-bar` |
| `age-gate` | `bdt-age-gate` |
| `air-pollution` | `bdt-air-pollution` |
| `animated-card` | `bdt-animated-card` |
| `animated-heading` | `bdt-animated-heading` |
| `animated-link` | `bdt-animated-link` |
| `audio-player` | `bdt-audio-player` |
| `barcode` | `bdt-barcode` |
| `brand-carousel` | `bdt-brand-carousel` |
| `brand-grid` | `bdt-brand-grid` |
| `breadcrumbs` | `bdt-breadcrumbs` |
| `business-hours` | `bdt-business-hours` |
| `calendly` | `bdt-calendly` |
| `call-out` | `bdt-call-out` |
| `carousel` | `bdt-carousel` |
| `changelog` | `bdt-changelog` |
| `chart` | `bdt-chart` |
| `circle-info` | `bdt-circle-info` |
| `circle-menu` | `bdt-circle-menu` |
| `comment` | `bdt-comment` |
| `comparison-list` | `bdt-comparison-list` |
| `contact-form` | `bdt-contact-form` |
| `content-switcher` | `bdt-content-switcher` |
| `cookie-consent` | `bdt-cookie-consent` |
| `countdown` | `bdt-countdown` |
| `coupon-code` | `bdt-coupon-code` |
| `creative-button` | `bdt-creative-button` |
| `crypto-currency-card` | `bdt-crypto-currency-card` |
| `crypto-currency-carousel` | `bdt-crypto-currency-carousel` |
| `crypto-currency-chart` | `bdt-crypto-currency-chart` |
| `crypto-currency-chart-carousel` | `bdt-crypto-currency-chart-carousel` |
| `crypto-currency-grid` | `bdt-crypto-currency-grid` |
| `crypto-currency-list` | `bdt-crypto-currency-list` |
| `crypto-currency-table` | `bdt-crypto-currency-table` |
| `crypto-currency-ticker` | `bdt-crypto-currency-ticker` |
| `custom-carousel` | `bdt-custom-carousel` |
| `custom-gallery` | `bdt-custom-gallery` |
| `dark-mode` | `bdt-dark-mode` |
| `device-slider` | `bdt-device-slider` |
| `document-viewer` | `bdt-document-viewer` |
| `dropbar` | `bdt-dropbar` |
| `dual-button` | `bdt-dual-button` |
| `dynamic-carousel` | `bdt-dynamic-carousel` |
| `dynamic-grid` | `bdt-dynamic-grid` |
| `facebook-feed` | `bdt-facebook-feed` |
| `facebook-feed-carousel` | `bdt-facebook-feed-carousel` |
| `fancy-card` | `bdt-fancy-card` |
| `fancy-icons` | `bdt-fancy-icons` |
| `fancy-list` | `bdt-fancy-list` |
| `fancy-slider` | `bdt-fancy-slider` |
| `fancy-tabs` | `bdt-fancy-tabs` |
| `featured-box` | `bdt-featured-box` |
| `flip-box` | `bdt-flip-box` |
| `floating-knowledgebase` | `bdt-floating-knowledgebase` |
| `google-reviews` | `bdt-google-reviews` |
| `helpdesk` | `bdt-helpdesk` |
| `honeycombs` | `bdt-honeycombs` |
| `horizontal-scroller` | `bdt-horizontal-scroller` |
| `hover-box` | `bdt-hover-box` |
| `hover-video` | `bdt-hover-video` |
| `icon-mobile-menu` | `bdt-icon-mobile-menu` |
| `iconnav` | `bdt-iconnav` |
| `iframe` | `bdt-iframe` |
| `image-accordion` | `bdt-image-accordion` |
| `image-compare` | `bdt-image-compare` |
| `image-expand` | `bdt-image-expand` |
| `image-magnifier` | `bdt-image-magnifier` |
| `image-stack` | `bdt-image-stack` |
| `instagram` | `bdt-instagram` |
| `interactive-card` | `bdt-interactive-card` |
| `interactive-tabs` | `bdt-interactive-tabs` |
| `lightbox` | `lightbox` ⚠️ excepção de nome |
| `logo-carousel` | `bdt-logo-carousel` |
| `logo-grid` | `bdt-logo-grid` |
| `lottie-icon-box` | `bdt-lottie-icon-box` |
| `lottie-image` | `bdt-lottie-image` |
| `mailchimp` | `bdt-mailchimp` |
| `marker` | `bdt-marker` |
| `marquee` | `bdt-marquee` |
| `mega-menu` | `bdt-mega-menu` |
| `member` | `bdt-member` |
| `modal` | `bdt-modal` |
| `navbar` | `bdt-navbar` |
| `news-ticker` | `bdt-news-ticker` |
| `notification` | `bdt-notification` |
| `offcanvas` | `bdt-offcanvas` |
| `open-street-map` | `bdt-open-street-map` |
| `panel-slider` | `bdt-panel-slider` |
| `post-block` | `bdt-post-block` |
| `post-block-modern` | `bdt-post-block-modern` |
| `post-card` | `bdt-post-card` |
| `post-comments` | `bdt-post-comments` |
| `post-content` | `bdt-post-content` |
| `post-featured-image` | `bdt-post-featured-image` |
| `post-gallery` | `bdt-post-gallery` |
| `post-grid` | `bdt-post-grid` |
| `post-grid-tab` | `bdt-post-grid-tab` |
| `post-info` | `bdt-post-info` |
| `post-list` | `bdt-post-list` |
| `post-slider` | `bdt-post-slider` |
| `post-title` | `bdt-post-title` |
| `price-list` | `bdt-price-list` |
| `price-table` | `bdt-price-table` |
| `product-carousel` | `bdt-product-carousel` |
| `product-grid` | `bdt-product-grid` |
| `profile-card` | `bdt-profile-card` |
| `progress-pie` | `bdt-progress-pie` |
| `protected-content` | `bdt-protected-content` |
| `qrcode` | `bdt-qrcode` |
| `reading-progress` | `bdt-reading-progress` |
| `reading-timer` | `bdt-reading-timer` |
| `remote-arrows` | `bdt-remote-arrows` |
| `remote-fraction` | `bdt-remote-fraction` |
| `remote-pagination` | `bdt-remote-pagination` |
| `remote-thumbs` | `bdt-remote-thumbs` |
| `review-card` | `bdt-review-card` |
| `review-card-carousel` | `bdt-review-card-carousel` |
| `review-card-grid` | `bdt-review-card-grid` |
| `scroll-button` | `bdt-scroll-button` |
| `scroll-image` | `bdt-scroll-image` |
| `scrollnav` | `bdt-scrollnav` |
| `search` | `bdt-search` |
| `single-post` | `bdt-single-post` |
| `slider` | `bdt-slider` |
| `slideshow` | `bdt-slideshow` |
| `slinky-vertical-menu` | `bdt-slinky-vertical-menu` |
| `social-proof` | `bdt-social-proof` |
| `social-share` | `bdt-social-share` |
| `source-code` | `bdt-source-code` |
| `stacker` | `bdt-stacker` |
| `static-carousel` | `bdt-static-carousel` |
| `static-grid-tab` | `bdt-static-grid-tab` |
| `step-flow` | `bdt-step-flow` |
| `sub-menu` | `bdt-sub-menu` |
| `svg-blob` | `bdt-svg-blob` |
| `svg-image` | `bdt-svg-image` |
| `svg-maps` | `bdt-svg-maps` |
| `switcher` | `bdt-switcher` |
| `table` | `bdt-table` |
| `table-of-content` | `bdt-table-of-content` |
| `tabs` | `bdt-tabs` |
| `tags-cloud` | `bdt-tags-cloud` |
| `threesixty-product-viewer` | `bdt-threesixty-product-viewer` |
| `thumb-gallery` | `bdt-thumb-gallery` |
| `time-zone` | `bdt-time-zone` |
| `timeline` | `bdt-timeline` |
| `toggle` | `bdt-toggle` |
| `total-count` | `bdt-total-count` |
| `trailer-box` | `bdt-trailer-box` |
| `twitter-carousel` | `bdt-twitter-carousel` |
| `twitter-grid` | `bdt-twitter-grid` |
| `twitter-slider` | `bdt-twitter-slider` |
| `user-login` | `bdt-user-login` |
| `user-register` | `bdt-user-register` |
| `vertical-menu` | `bdt-vertical-menu` |
| `video-gallery` | `bdt-video-gallery` |
| `video-player` | `bdt-video-player` |
| `weather` | `bdt-weather` |
| `webhook-form` | `bdt-webhook-form` |
## Widgets de integração (95) — plugin de terceiros tem de estar activo
### ACF (Advanced Custom Fields) (5)
| Módulo | `widgetType` |
|---|---|
| `acf-accordion` | `bdt-acf-accordion` |
| `acf-gallery` | `bdt-acf-gallery` |
| `acf-list` | `bdt-acf-list` |
| `acf-slider` | `bdt-acf-slider` |
| `acf-tabs` | `bdt-acf-tabs` |
### BuddyPress (3)
| Módulo | `widgetType` |
|---|---|
| `buddypress-friends` | `bdt-buddypress-friends` |
| `buddypress-group` | `bdt-buddypress-group` |
| `buddypress-member` | `bdt-buddypress-member` |
### Charitable (8)
| Módulo | `widgetType` |
|---|---|
| `charitable-campaigns` | `bdt-charitable-campaigns` |
| `charitable-donation-form` | `bdt-charitable-donation-form` |
| `charitable-donations` | `bdt-charitable-donations` |
| `charitable-donors` | `bdt-charitable-donors` |
| `charitable-login` | `bdt-charitable-login` |
| `charitable-profile` | `bdt-charitable-profile` |
| `charitable-registration` | `bdt-charitable-registration` |
| `charitable-stat` | `bdt-charitable-stat` |
### Easy Digital Downloads (15)
| Módulo | `widgetType` |
|---|---|
| `edd-cart` | `bdt-edd-cart` |
| `edd-category-carousel` | `bdt-edd-category-carousel` |
| `edd-category-grid` | `bdt-edd-category-grid` |
| `edd-checkout` | `bdt-edd-checkout` |
| `edd-download-history` | `bdt-easy-digital-download-history` ⚠️ excepção de nome |
| `edd-login` | `bdt-edd-login` |
| `edd-mini-cart` | `bdt-edd-mini-cart` |
| `edd-product` | `bdt-edd-product` |
| `edd-product-carousel` | `bdt-edd-product-carousel` |
| `edd-product-review-carousel` | `bdt-edd-product-review-carousel` |
| `edd-product-reviews` | `bdt-edd-product-reviews` |
| `edd-profile-editor` | `bdt-easy-digital-profile-editor` ⚠️ excepção de nome |
| `edd-purchase-history` | `bdt-easy-digital-purchase-history` ⚠️ excepção de nome |
| `edd-register` | `bdt-edd-register` |
| `edd-tabs` | `bdt-edd-tabs` |
### FooEvents (1)
| Módulo | `widgetType` |
|---|---|
| `fooevents-calendar` | `fooevents-calendar` ⚠️ excepção de nome |
### Formulários (vários plugins) (6)
| Módulo | `widgetType` |
|---|---|
| `contact-form-7` | `bdt-contact-form-7` |
| `gravity-forms` | `bdt-gravity-form` ⚠️ excepção de nome |
| `ninja-forms` | `bdt-ninja-form` ⚠️ excepção de nome |
| `quform` | `bdt-quform` |
| `we-forms` | `bdt-we-form` ⚠️ excepção de nome |
| `wp-forms` | `bdt-wp-forms` |
### Outros / a confirmar dependência (30)
| Módulo | `widgetType` |
|---|---|
| `download-monitor` | `bdt-download-monitor` |
| `everest-forms` | `bdt-everest-forms` |
| `faq` | `bdt-faq` |
| `fluent-forms` | `bdt-fluent-forms` |
| `fooevents-calendar-carousel` | `bdt-fooevents-calendar-carousel` |
| `fooevents-calendar-events` | `bdt-fooevents-calendar-events` |
| `formidable-forms` | `bdt-formidable-forms` |
| `forminator-forms` | `bdt-forminator-forms` |
| `give-donation-history` | `bdt-give-donation-history` |
| `give-donor-wall` | `bdt-give-donor-wall` |
| `give-form` | `bdt-give-form` |
| `give-form-grid` | `bdt-give-form-grid` |
| `give-goal` | `bdt-give-goal` |
| `give-login` | `bdt-give-login` |
| `give-profile-editor` | `bdt-give-profile-editor` |
| `give-receipt` | `bdt-give-receipt` |
| `give-register` | `bdt-give-register` |
| `give-totals` | `bdt-give-totals` |
| `instagram-feed` | `bdt-instagram-feed` |
| `layer-slider` | `bdt-layer-slider` |
| `learnpress-carousel` | `bdt-learnpress-carousel` |
| `learnpress-grid` | `bdt-learnpress-grid` |
| `mailchimp-for-wp` | `bdt-mailchimp-for-wp` |
| `portfolio-carousel` | `bdt-portfolio-carousel` |
| `portfolio-gallery` | `bdt-portfolio-gallery` |
| `portfolio-list` | `bdt-portfolio-list` |
| `testimonial-carousel` | `bdt-testimonial-carousel` |
| `testimonial-grid` | `bdt-testimonial-grid` |
| `testimonial-slider` | `bdt-testimonial-slider` |
| `the-newsletter` | `bdt-the-newsletter` |
### Slider Revolution (1)
| Módulo | `widgetType` |
|---|---|
| `revolution-slider` | `bdt-revolution-slider` |
### Tabelas (WP Data Tables / TablePress) (2)
| Módulo | `widgetType` |
|---|---|
| `tablepress` | `bdt-tablepress` |
| `wpdatatable` | `bdt-wpdatatable` |
### The Events Calendar (3)
| Módulo | `widgetType` |
|---|---|
| `events-calendar-carousel` | `bdt-event-carousel` ⚠️ excepção de nome |
| `events-calendar-grid` | `bdt-event-grid` ⚠️ excepção de nome |
| `events-calendar-list` | `bdt-event-list` ⚠️ excepção de nome |
### Tutor LMS (2)
| Módulo | `widgetType` |
|---|---|
| `tutor-lms-course-carousel` | `bdt-tutor-lms-course-carousel` |
| `tutor-lms-course-grid` | `bdt-tutor-lms-course-grid` |
### WooCommerce (7)
| Módulo | `widgetType` |
|---|---|
| `wc-add-to-cart` | `bdt-wc-add-to-cart` |
| `wc-carousel` | `bdt-wc-carousel` |
| `wc-categories` | `bdt-wc-categories` |
| `wc-elements` | `bdt-wc-elements` |
| `wc-mini-cart` | `bdt-wc-mini-cart` |
| `wc-products` | `bdt-wc-products` |
| `wc-slider` | `bdt-wc-slider` |
### bbPress (12)
| Módulo | `widgetType` |
|---|---|
| `bbpress-forum-form` | `bdt-bbpress-forum-form` |
| `bbpress-forum-index` | `bdt-bbpress-forum-index` |
| `bbpress-reply-form` | `bdt-bbpress-reply-form` |
| `bbpress-single-forum` | `bdt-bbpress-single-forum` |
| `bbpress-single-reply` | `bdt-bbpress-single-reply` |
| `bbpress-single-tag` | `bdt-bbpress-single-tag` |
| `bbpress-single-topic` | `bdt-bbpress-single-topic` |
| `bbpress-single-view` | `bdt-bbpress-single-view` |
| `bbpress-stats` | `bdt-bbpress-stats` |
| `bbpress-topic-form` | `bdt-bbpress-topic-form` |
| `bbpress-topic-index` | `bdt-bbpress-topic-index` |
| `bbpress-topic-tags` | `bdt-bbpress-topic-tags` |
@@ -0,0 +1,49 @@
---
name: mcp-element-pack
description: MCP dedicado (node stdio, ligação `element-pack` em ~/.omp/agent/mcp.json) para gerir o Element Pack Pro (BdThemes) em descomplicar.pt — licença (read-only), módulos, mega menu, white-label, custom CSS/JS, via WP-CLI/SSH sem passar pelo EMCP Tools. Usar quando "element pack licença", "módulos element pack", "mega menu toggle", "white label element pack", "activar/desactivar widget element pack".
layer: wiki
---
# /mcp-element-pack — MCP dedicado Element Pack Pro (admin settings)
Projecto em `/media/ealmeida/Dados/Dev/mcp-element-pack/` (TypeScript, SDK MCP oficial, stdio).
Não é uma extensão do EMCP Tools — é um MCP independente porque o EMCP Tools é plugin comercial
(Freemius) com catálogo de tools fixo, curado pelo autor, sem mecanismo de terceiros registarem
abilities visíveis no `list-tools`. Sem código PHP novo no WordPress: cada tool executa
`wp option get/update` via `ssh server` sobre o WP-CLI já instalado.
## Âmbito
Gestão de **configuração admin** do Element Pack Pro. Para **inserir/editar widgets** em páginas
Elementor (qualquer um dos 168+95 catalogados), usar a skill `element-pack-widgets` via ligação EMCP
normal — este MCP não cobre isso.
## Tools (9)
- `ep_get_license_status` (read-only) — licença nunca é escrita por aqui; activação exige handshake
com a API da BdThemes (`Element_Pack_Base::get_lic_key_param`), não é um simples `option update`.
- `ep_get_modules` / `ep_set_module_state` — grupos `active_modules`, `third_party_widget`,
`elementor_extend`, `other_settings`; read-modify-write, nunca substitui o array inteiro.
- `ep_get_mega_menu_toggle` / `ep_set_mega_menu_toggle` — só o toggle global
(`element_pack_other_settings.mega-menu`); edição por item de menu (postmeta `_ep_mega_menu_*`)
fica fora do âmbito v1.
- `ep_get_white_label` / `ep_set_white_label`
- `ep_get_custom_code` / `ep_set_custom_code` — blocos `ep_custom_css`/`_js` (1 e 2).
## Segurança
Allowlist fixa de option keys (`src/wpcli.ts`, `element_pack_*`/`ep_*`) — nunca `wp option update`
genérico. Escritas via base64 em stdin, nunca interpoladas no comando SSH remoto.
## Verificação
Construído e testado ponta-a-ponta contra produção 19-08-2026: leitura real (`ep_get_license_status`
→ `it@descomplicar.pt`; `ep_get_mega_menu_toggle` → `off`, ambos confirmados contra `wp option get`
directo) e escrita real com round-trip (`ep_set_custom_code`/`ep_get_custom_code` num slot vazio,
sem alterar comportamento do site).
## Skills relacionadas
- `element-pack-widgets` — catálogo de widgets e workflow de inserção via EMCP (`get-widget-schema`
com `full:true`).
- `full-cliente` — se a licença Element Pack Pro algum dia passar a ser gerida via FULL.Cliente em
vez de licença directa BdThemes, é essa a skill certa, não esta.