SiteAgent Elementor Studio
Helps with WordPress + Elementor work via the elementor-mcp MCP server — building new pages, editing existing ones, inspecting site state, or exploring what's possible. Auto-detects Elementor Pro (native Form, Theme Builder, Loop Grid, Popups, Dynamic Tags, Sticky/Motion vs free-tier workarounds) AND the page engine (classic vs Elementor 4 atomic/V4 — atomic uses add-flexbox/add-atomic-* tools since classic writes don't persist on a V4 page). Detects ACF + Crocoblock/JetEngine for dynamic-data binding (Tier-0; bind ACF via Pro dynamic tags, place Jet widgets via add-widget with runtime-verified types). On atomic (V4) sites, authors the Elementor 4 design system — Global Classes, Variables (design tokens), and per-element Interactions — and recovers from the fork's schema-in-error and governance responses. Asks what the user wants before acting. Use when the user references the Elementor MCP, invokes `/siteagent-elementor-studio`, or runs `mcp__elementor__elementor-mcp-*` tools. Also covers initial install of the MCP Adapter + elementor-mcp plugins, app-password auth wiring, schema-loading discipline, and the widget-vs-HTML decision tree. SKIP for Bricks, Divi, Beaver Builder, or non-Elementor WordPress builds.
Rank
62
Safety
84
Downloads
1.1k
Updated
Oct 11, 2026
Version
1.7.1
Source
CLAWHUB
About
What it does, and when to use it.
Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.
Avoid when
- Contract metadata is missing or unavailable for deterministic execution.
Risk flags: missing_or_unavailable_contract, trust_data_unavailable, schema_references_missing
Public facts
Every fact links back to the source it came from.
- Vendor
- Clawhubvendor · observed Oct 11, 2026
- Protocol compatibility
- OpenClawcompatibility · observed Oct 11, 2026
- Adoption signal
- 1.1K downloadsadoption · observed Oct 11, 2026
- Latest release
- 1.7.1release · observed Sep 14, 2026
- Handshake status
- UNKNOWNsecurity
Install and run
Setup complexity: low.
clawhub skill install s17b8qfjfq0g8kveh2g8v1179h83ejwb:siteagent-elementor-studio- Install using `clawhub skill install s17b8qfjfq0g8kveh2g8v1179h83ejwb:siteagent-elementor-studio` in an isolated environment before connecting it to live workloads.
- No published capability contract is available yet, so validate auth and request/response behavior manually.
- Review the upstream CLAWHUB listing at https://clawhub.ai/benkalsky/siteagent-elementor-studio before using production credentials.
Contract: missing
curl -s "https://www.xpersona.co/api/v1/agents/clawhub-benkalsky-siteagent-elementor-studio/snapshot"
Documentation
CLAWHUB
156,277 characters of source documentation, loaded on request.
Extracted files
5 files captured from the source.
SKILL.md
---
name: siteagent-elementor-studio
version: 1.7.1
license: MIT
description: Helps with WordPress + Elementor work via the elementor-mcp MCP server — building new pages, editing existing ones, inspecting site state, or exploring what's possible. Auto-detects Elementor Pro (native Form, Theme Builder, Loop Grid, Popups, Dynamic Tags, Sticky/Motion vs free-tier workarounds) AND the page engine (classic vs Elementor 4 atomic/V4 — atomic uses add-flexbox/add-atomic-* tools since classic writes don't persist on a V4 page). Detects ACF + Crocoblock/JetEngine for dynamic-data binding (Tier-0; bind ACF via Pro dynamic tags, place Jet widgets via add-widget with runtime-verified types). On atomic (V4) sites, authors the Elementor 4 design system — Global Classes, Variables (design tokens), and per-element Interactions — and recovers from the fork's schema-in-error and governance responses. Asks what the user wants before acting. Use when the user references the Elementor MCP, invokes `/siteagent-elementor-studio`, or runs `mcp__elementor__elementor-mcp-*` tools. Also covers initial install of the MCP Adapter + elementor-mcp plugins, app-password auth wiring, schema-loading discipline, and the widget-vs-HTML decision tree. SKIP for Bricks, Divi, Beaver Builder, or non-Elementor WordPress builds.
permissions:
shell: "Runs the bundled setup script (files/setup-elementor-mcp.sh) — only on explicit user confirmation. It shells out to curl/unzip/zip/python3 and, for Local sites, drives Local by Flywheel's bundled WP-CLI (plugin install/activate) against the running site's PHP + MySQL socket."
network:
- "GitHub release download over HTTPS from the trusted Digitizers/elementor-mcp repo (api.github.com + release asset host) — the elementor-mcp plugin zip. By default the release this kit pins (EMCP_DEFAULT_VERSION in the setup script), checked before it is unpacked or installed against the sha256 recorded beside the pin — out of band from the download. EMCP_PIN_VERSION=<tag> or =latest selects another release, checked against the digest that release publishes (integrity, not provenance) or EMCP_EXPECTED_SHA256. Nothing is installed unverified"
- "The target WordPress site's REST API (/wp-json/ — auth check, plugin list/install, MCP route verification). Plaintext http:// is refused for a non-local host unless that exact host is named in WP_ALLOW_HTTP, because the run sends a reusable application password on every request"
filesystem:
- "Writes .mcp.json in the current working directory, created mode 600 before the credential is written (it embeds a reusable Basic-Auth WordPress credential), and appends .mcp.json to .gitignore there"
- "Reads Local by Flywheel site paths + bundled WP-CLI/PHP binaries; creates a temp working dir for the plugin zip"
env:
- "WP_URL / WP_USERNAME / WP_APP_PASSWORD (when used to supply the target site + Application Password auth)"
- "EMCP_PIN_VERSION (optional — a release tag, or latest, instead of the re_meta.json
{
"ownerId": "kn7afv05r120atbc75whrv1zkx825tt5",
"slug": "siteagent-elementor-studio",
"version": "1.7.1",
"publishedAt": 1789427139989
}references/atomic-v4.md
# Building on Elementor 4 (atomic / V4) — reference
## Building on Elementor 4 (atomic / V4)
Apply this section **only when you detected the atomic engine** (atomic tools
present). On a classic-engine site, ignore it and use the classic widget tools
everywhere. **Never mix:** classic `add-heading`/`add-container` writes do not
persist on an atomic page, and atomic writes don't belong on a classic page.
### Atomic tool family — use instead of the classic ones
| Need | Classic (don't use on V4) | **Atomic (V4)** |
|---|---|---|
| Flex container | `add-container` | `add-flexbox` *(direction/justify/align/gap/wrap/padding/background_color)* |
| Block container | `add-container` | `add-div-block` |
| Heading | `add-heading` | `add-atomic-heading` |
| Body text | `add-text-editor` | `add-atomic-paragraph` |
| Button | `add-button` | `add-atomic-button` |
| Image | `add-image` | `add-atomic-image` |
| SVG / video / divider | `add-icon` / `add-html` | `add-atomic-svg` / `add-atomic-youtube` / `add-atomic-video` / `add-atomic-divider` |
| Anything else | `add-widget` | `add-atomic-widget` *(any atomic type; pass raw `$$type` settings — correct on every version, see note)* / `update-atomic-widget` |
### The atomic data model (what's different)
- **Typed props (`$$type`).** Atomic settings are typed values, not flat strings.
For the **dedicated** helper tools (`add-atomic-heading`, `add-atomic-paragraph`,
`add-atomic-button`, `add-flexbox`, …) the MCP wraps them for you — **pass simple
flat values** (e.g. `title: "Hello"`, a hex `color`, a `{size,unit}` dimension) and
it stores them in the `$$type` format Elementor's atomic engine expects.
**For the universal `add-atomic-widget` / `update-atomic-widget`, always pass raw
`$$type` values** (fetch the shape with `get-widget-schema`). That is correct on
every plugin version: since 1.27.0 the save path coerces flat values through
`Atomic_Props::coerce_tree()`, and already-typed props pass through it untouched —
whereas on older builds those two tools wrote settings verbatim and a flat value
was silently saved as empty. Typed values work either way, and the version is not
always knowable mid-session, so don't make the write depend on it.
**A direct `_elementor_data` patch has no wrapper on any version.** It bypasses the
plugin entirely, so every prop must be raw `$$type` there too.
- **Styles live in a separate `styles` map**, not inline on the element. Layout
props on `add-flexbox` (direction/justify/align/gap) are written as local styles
automatically — you don't hand-build the styles map.
**Since plugin 1.28.1, `update-atomic-widget` takes flat style params too**
(`padding`, `width`, `border_*`, `css_position`, `shadow_*`, typography, …) and
merges them into the element's base style variant, preserving props it wasn't
asked to change. Before that it wrote only `settings`, so a padding sent there
saved, reported success and rendered nothing — which is why older noreferences/brand-kit.md
# Brand kit — token vocabulary & intake
The studio's brand tokens. Every client site sets these once; every build
references them **by name, never raw hex/font**. Tokens map to **named Elementor
custom globals** (the `update-global-colors` / `update-global-typography` tools
write `custom_colors` / `custom_typography`, merged by `_id`).
## Color tokens (8 named custom globals)
| token `_id` | title | role |
|---|---|---|
| `brand` | Brand | primary brand color — buttons, links, emphasis |
| `accent` | Accent | secondary highlight |
| `heading` | Heading | heading text color |
| `text` | Text | body text color |
| `bg` | Background | page background |
| `surface` | Surface | card / section panel background |
| `muted` | Muted | secondary / subtle text, captions |
| `border` | Border | hairlines, dividers, card borders |
If a client supplies fewer than 8, derive and state it: `surface` = a light tint of
`bg`; `muted` = `text` at ~60% contrast; `border` = `text` at ~12% / a light grey.
## Typography tokens (2 named custom globals)
| token `_id` | title | role |
|---|---|---|
| `heading-font` | Heading Font | headings |
| `body-font` | Body Font | body / UI |
## Type scale (applied per-widget by recipes — not a global object)
| step | size (px, desktop) | typical use |
|---|---|---|
| h1 | 48 | hero title |
| h2 | 36 | section title |
| h3 | 28 | card title |
| h4 | 22 | sub-heading |
| body-lg | 18 | lead paragraph |
| body | 16 | default text |
| small | 14 | captions, labels |
Defaults: heading weight 700, heading line-height 1.15; body weight 400, body
line-height 1.6. Scale down ~15–20% on mobile.
## Logo
Record the logo media id / URL in the intake record. Header recipes use the Site
Logo widget (Pro/UAE) or a Heading fallback.
## Intake template (fill one per client)
```json
{
"client": "Acme",
"colors": {
"brand": "#1A56DB",
"accent": "#F59E0B",
"heading": "#0F172A",
"text": "#334155",
"bg": "#FFFFFF",
"surface": "#F8FAFC",
"muted": "#64748B",
"border": "#E2E8F0"
},
"fonts": { "heading-font": "Rubik", "body-font": "Inter" },
"logo": "https://acme.example/logo.svg"
}
```
## Applying it (MCP tool shapes)
`update-global-colors` — one entry per color token:
```json
{ "colors": [
{ "_id": "brand", "title": "Brand", "color": "#1A56DB" },
{ "_id": "accent", "title": "Accent", "color": "#F59E0B" },
{ "_id": "heading", "title": "Heading", "color": "#0F172A" },
{ "_id": "text", "title": "Text", "color": "#334155" },
{ "_id": "bg", "title": "Background", "color": "#FFFFFF" },
{ "_id": "surface", "title": "Surface", "color": "#F8FAFC" },
{ "_id": "muted", "title": "Muted", "color": "#64748B" },
{ "_id": "border", "title": "Border", "color": "#E2E8F0" }
] }
```
`update-global-typography` — one entry per font token:
```json
{ "typography": [
{ "_id": "heading-font", "title": "Heading Font",
"typography_font_family": "Rubik",
"tyreferences/design-system-crud.md
# Elementor 4 design system CRUD — Global Classes, Variables, Interactions
Apply this only on an **atomic (V4) site** (atomic tools present) with the matching
Elementor experiments on. These tools author the *shared design system* — the same
Class Manager / Variables / Interactions an editor user would build by hand — so an
agent can create reusable styling instead of re-styling every element inline.
All three families register **conditionally**. If the tools below aren't in your
`mcp__elementor__elementor-mcp-*` list, the site's engine/experiments don't support
them — fall back to inline atomic local styles (see `atomic-v4.md`).
> **Permissions.** Every *write* here needs `manage_options` (mutating the shared
> design system / kit is site-wide, not per-post). Variable/interaction *reads*
> (`list-variables`, `get-variable`, `list-interactions`) need `edit_posts`;
> interaction tools additionally require `edit_post` on the target page. If a call
> returns a `forbidden` error, the connected app-password user lacks the cap.
---
## 1. Global Classes (reusable style bundles) — Elementor 4 Class Manager
A Global Class is a named, reusable set of styles (a `g-<7hex>` id) you author once and
apply to many atomic elements — the design-system equivalent of a CSS utility class.
Companion read tool: `list-global-classes` (resolves opaque `g-` ids → names + CSS).
| Tool | Does | Key params |
|---|---|---|
| `create-global-class` | Author a new class | `label` (e.g. `"card-base"`), `styles` (CSS-prop→value map), optional `variants` |
| `update-global-class` | Edit in place, **keeps the `g-` id** so bindings survive | `class_id`, any of `label` / `styles` / `variants` |
| `delete-global-class` | Remove by id | `class_id` |
| `apply-global-class` | Bind an existing class to one element | `class_id`, `post_id`, `element_id` |
- **Ergonomic styles.** `styles` is a plain map like `{"color":"#111","padding":24,"font-size":"1.25rem"}`.
The tool wraps values into Elementor's atomic `$$type` props automatically. Colors
(`color`, `border-color`, …), sizes (`padding`, `margin`, `width`, `font-size`, …),
and unitless numbers (`z-index`, `flex-grow`, …) are typed correctly; anything else
is stored as a string prop.
- **`styles` replaces only the base/desktop variant** on `update-global-class` — other
variants are kept. `variants` replaces matching breakpoint/state variants (see
Responsive below). `label` renames without touching styles.
- **`apply-global-class` is idempotent** — re-applying an already-present class is a
no-op. It appends the `g-` id to the element's `settings.classes`. A **non-atomic**
element (no `classes` control) is rejected with error code `not_atomic`, and the
error embeds the element's compact settings schema so you can see what it *is*.
- **Delete does not cascade.** Elementor ignores dangling `g-` references left on
elements — those elements simply lose that styling, the page isn't rewritten.
- **Cap: 100 classes.** `crAionUi
Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!
activepieces
AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents
cherry-studio
AI productivity studio with smart chat, autonomous agents, and 300+ assistants.
CopilotKit
The Frontend for Agents & Generative UI. React + Angular
Machine-readable data
The same record, as JSON, for agents and crawlers.
{
"facts": [
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Clawhub",
"href": "https://clawhub.ai/benkalsky/skills/siteagent-elementor-studio",
"sourceUrl": "https://clawhub.ai/benkalsky/skills/siteagent-elementor-studio",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-10-11T11:08:17.193Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "OpenClaw",
"href": "https://www.xpersona.co/api/v1/agents/clawhub-benkalsky-siteagent-elementor-studio/contract",
"sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-benkalsky-siteagent-elementor-studio/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-10-11T11:08:17.193Z",
"isPublic": true
},
{
"factKey": "traction",
"category": "adoption",
"label": "Adoption signal",
"value": "1.1K downloads",
"href": "https://clawhub.ai/benkalsky/siteagent-elementor-studio",
"sourceUrl": "https://clawhub.ai/benkalsky/siteagent-elementor-studio",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-10-11T11:08:17.193Z",
"isPublic": true
},
{
"factKey": "latest_release",
"category": "release",
"label": "Latest release",
"value": "1.7.1",
"href": "https://clawhub.ai/benkalsky/siteagent-elementor-studio",
"sourceUrl": "https://clawhub.ai/benkalsky/siteagent-elementor-studio",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-09-14T23:05:39.989Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://www.xpersona.co/api/v1/agents/clawhub-benkalsky-siteagent-elementor-studio/trust",
"sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-benkalsky-siteagent-elementor-studio/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
],
"events": [
{
"eventType": "release",
"title": "Release 1.7.1",
"description": "siteagent-elementor-studio 1.7.1 - Updated installer to pin and describe the new Digitizers/elementor-mcp fork v1.34.1 (was v1.24.0). - Noted in documentation that the fork now includes a built-in update checker (since v1.28.0), surfacing new GitHub releases in the WordPress Updates screen. - Clarified not to use the fork together with the Premium plugin due to naming conflicts. - Removed redundant documentation file (skill-card.md). - Minor documentation and setup instruction improvements.",
"href": "https://clawhub.ai/benkalsky/siteagent-elementor-studio",
"sourceUrl": "https://clawhub.ai/benkalsky/siteagent-elementor-studio",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-09-14T23:05:39.989Z",
"isPublic": true
}
]
}Record generated Oct 11, 2026.
