--- name: mcp-jetengine description: MCP dedicado (node stdio, ligação `jetengine` em ~/.omp/agent/mcp.json) para JetEngine (Crocoblock) em descomplicar.pt — proxy transparente stdio<->HTTPS do MCP nativo do próprio plugin (Features API, v3.8.0+): registar CPT, CCT, taxonomias, meta boxes, queries do Query Builder, listings, glossários, gerir módulos, ler configuração/website-config/macros. Inclui playbooks (sequências de chamadas) para directório dinâmico CPT+Query+Listing, CCT de alta performance, activação de módulos opcionais. Não duplica lógica do plugin — reencaminha `tools/list`/`tools/call` tal como o JetEngine os expõe. Usar quando "mcp jetengine", "jetengine mcp", "criar cpt via mcp", "criar cct via mcp", "add-cpt", "add-cct", "query builder mcp", "jetengine features api", "ai command center jetengine", "playbook jetengine", "directorio dinamico jetengine", "activar modulo jetengine". layer: wiki --- # /mcp-jetengine — MCP dedicado ao JetEngine Projecto em `/media/ealmeida/Dados/Dev/mcp-jetengine/` (TypeScript, SDK MCP oficial, stdio). **Diferente dos MCPs irmãos (`mcp-wpfc`, `mcp-webp-express`):** o JetEngine, a partir da v3.8.0, já expõe o seu próprio servidor MCP nativo (`Jet_Engine\MCP_Tools`, "Features API") em `{site}/wp-json/jet-engine/v1/mcp` — JSON-RPC 2.0 sobre HTTP simples (POST, uma única resposta JSON por pedido, sem SSE, sem sessão), autenticado por `current_user_can('manage_options')`. Este projecto **não reimplementa nenhuma lógica de negócio** do plugin: é apenas uma ponte stdio↔HTTPS com autenticação Basic (Application Password), porque o harness liga-se a servidores MCP locais por stdio, não a endpoints HTTPS arbitrários fora do gateway. `tools/list` e `tools/call` são reencaminhados verbatim — os 11 tools, nomes, descrições e schemas vistos pelo agente são exactamente os que o próprio plugin regista, não uma cópia mantida à mão. ## Site Único site do bundle com JetEngine activo (19-08-2026): **descomplicar.pt** (`jet-engine` v3.8.11.1). Configurável via `JETENGINE_SITE_URL`/`JETENGINE_APP_USER`/ `JETENGINE_APP_PASSWORD` no `env` da entrada `jetengine` em `mcp.json` — sem parâmetro `site` por tool (ao contrário de `wpfc`/`webpx`) porque só há um site a servir; adicionar suporte multi-site (registo tipo `sites.ts`) se outro site do bundle activar o plugin. **Activação feita nesta sessão (19-08-2026):** `jet-engine-misc-settings` não existia (`enable_features_api` teria o default `true` mesmo assim, mas foi escrito explicitamente); Application Password dedicada `mcp-jetengine` criada para `ealmeida`. ## Âmbito Tudo o que o plugin regista na sua própria Features API. Não cobre: Relations (tabela `wp_jet_rel_default` — sem tool nativo, ver `references/automation.md` da skill `jetengine` para gestão via PHP/SQL), Profile Builder, Dynamic Tags dentro do Elementor, bridge MU-plugin (`descomplicar-jet-bridge.php`, endpoint próprio `POST /wp-json/descomplicar/v1/manage` — projecto à parte, ver skill `jetengine` §"Bridge Plugin"). ## Tools (11, nomes nativos do plugin — 19-08-2026) | Tool | Read-only | Uso | |---|---|---| | `resource-get-configuration` | sim | CPTs, taxonomias, meta boxes, options pages, queries, relations, CCTs, endpoints REST, glossários — visão geral em JSON, por `parts` | | `resource-get-website-config` | sim | Post types/taxonomias/plugins activos registados no WordPress (não só JetEngine) | | `resource-get-macros` | sim | Todas as macros JetEngine com argumentos e exemplos de uso | | `tool-manage-modules` | sim/não (`operation: list\|activate\|deactivate`) | Listar ou activar/desactivar módulos do JetEngine | | `tool-add-cpt` | não | Registar Custom Post Type — labels, storage, meta fields, admin columns/filters | | `tool-add-cct` | não | Registar Custom Content Type (tabela SQL própria) com campos tipados | | `tool-add-taxonomy` | não | Registar taxonomia e associar a post types | | `tool-add-meta-box` | não | Meta Box com campos e condições de visibilidade | | `tool-add-query` | não | Query do Query Builder — `sql`, `posts`, `terms`, `users`, `comments`, `repeater`, `current-wp-query`, `merged-query`, `relations-query` | | `tool-add-listing` | não | Listing item ligado a uma query existente (`elementor`/`bricks`/`twig`/`blocks`) | | `tool-add-glossary` | não | Glossário manual (`source: "manual"`) com pares `value`/`label` | Schemas de input completos: chamar `tools/list` (ou o `initialize` seguido de `tools/list` — o proxy devolve exactamente o que `wp-json/jet-engine/v1/mcp` responde). Não documentados campo a campo aqui para evitar duplicação que fica desactualizada — a fonte de verdade é o próprio plugin. ## Playbooks — como combinar as tools Referência da API acima diz o que cada tool faz isoladamente; `references/playbooks.md` mostra sequências reais de chamadas: 1. **Ler antes de criar** — `resource-get-configuration` para evitar slugs/queries duplicados. 2. **Módulos** — confirmar/activar módulo opcional (`custom-content-types`, `maps-listings`, etc.) antes de usar a tool que depende dele; CPT/Taxonomia/Meta Box/Query/Listing normais não precisam de nenhum módulo. 3. **CPT + Taxonomia + Meta Box** — conteúdo editorial estruturado, três chamadas em sequência. 4. **CCT** — dados de alta performance (requer módulo `custom-content-types`). 5. **Glossário** — opções reutilizáveis para campos `select`/`checkbox`/`radio`. 6. **Query Builder + Listing** — directório dinâmico; inclui o gotcha do `enum` de `query_type` não incluir `"custom-content-type"` apesar da descrição da tool o mencionar. 7. **Levantar contexto** — macros, config, plugins activos antes de escrever conteúdo dinâmico. ## Segurança - Autenticação por Application Password de um utilizador `administrator` (`manage_options`) — o próprio plugin recusa (`rest_forbidden`, 401/403) sem essa capability; o proxy traduz isso num `McpError` claro em vez de deixar a chamada rebentar em silêncio. - Sem lógica local de bloqueio de chaves — todo o `tools/call` chega ao plugin tal como recebido do agente. As guardas de segurança (validação de slug, sanitização de campos, etc.) são as do próprio JetEngine, não deste MCP. - Erros JSON-RPC de nível transporte (rede, HTTP != 200, `error` no envelope JSON-RPC — método desconhecido, parse error) tornam-se `McpError`. Erros de execução de tool (`isError: true` no `CallToolResult`, ex. "Tool not found") são devolvidos tal como o plugin os construiu — nunca convertidos em excepção, para o agente poder ler o texto do erro. ## Verificação Construído e testado ponta-a-ponta 19-08-2026: `tools/list` via stdio devolve os 11 tools idênticos ao pedido directo por `curl` contra `wp-json/jet-engine/v1/mcp` (mesmos nomes, descrições, schemas); `tools/call` real (`resource-get-macros`) devolve o mesmo JSON do plugin; `tools/call` com nome inexistente devolve `isError: true` + `"Tool not found"` passado verbatim. Ferramentas de escrita (`tool-add-cpt`, `tool-add-cct`, etc.) não foram exercidas contra produção nesta sessão — mesmo caminho de código (`callJetEngine` + `tools/call`) já validado pelas chamadas de leitura e pelo caso de erro. ## Skills relacionadas - `jetengine` — conhecimento do plugin (CPT vs CCT, Relations, Query Builder, Listings, Macros, Profile Builder, bridge MU-plugin). Consultar para entender o que uma tool faz antes de a chamar; este MCP é o "como executar". - `mcp-wpfc` / `mcp-webp-express` — MCPs irmãos para plugins sem API nativa (reimplementam a gestão via WP-CLI/SSH). `mcp-jetengine` é o primeiro caso do bundle em que o próprio plugin já fala MCP — o padrão aqui é ponte de transporte, não reimplementação.