exjsx deploy, eu-studio, and the MCP server write through, and it hardens
the CSS lifecycle around Elementor’s atomic pages so automated deploys and human
editor sessions can coexist. It ships bundled in the
playground snapshot and as a zip in the
elementor-ultra-mcp releases
for real sites.
All routes live under elementor-ultra/v1, authenticated with standard
WordPress application passwords and capability checks. The plugin loads
defensively: it serves what it can regardless of Pro presence or Elementor
version, and site/capabilities always answers so health checks work even on a
degraded site.
The REST seams
Notes agents hit in practice:
design/classes is cursor-paginated (default
limit 25 with next_cursor); SVG uploads are sanitized with Elementor’s own
sanitizer before import; media sideload byte-sniffs extensionless CDN URLs and
rejects anything that is not a known image type.
The CSS lifecycle guards, in plain words
Elementor’s atomic CSS pipeline has failure modes that only show up under automation. The plugin defuses each one at the seam where it happens.Post-scoped invalidation
Priming one page must not invalidate every other page’s CSS. The primer scopes its cache invalidation to the post being primed (local and global per post
id, mirroring Elementor’s own internal callers), instead of the unscoped form
that made multi-page sites play whack-a-mole: priming page B silently
invalidated the file page A’s prime had just written. Only the shared base
stylesheet stays unscoped, because every page regenerates it identically.
The license-churn defuse
Elementor runs a full CSS cache wipe whenever the Pro license option is updated or deleted. On any site with Pro installed but unlicensed (every local and dev stack), admin and editor sessions re-check the license on heartbeats, churning that option: admin-ajax, license option write, sitewide CSS wipe, “the whole site lost styling”. The plugin detaches that wipe-on-churn hook. A real license change still takes effect on the next save, deploy, or regen.Global-classes wipe protection: backup plus restore
The class store is the styling for every deployed atomic page, and a normal Elementor editor visit has been observed to empty it. Defense in two parts:- The plugin continuously snapshots the store whenever it is written non-empty (an empty store never overwrites a non-empty backup).
POST /elementor-ultra/v1/design/classes/restorewrites the snapshot back.
The mass-deletion guard (409)
The editor keeps an in-memory copy of the class store and PUTs the whole store back on save, last-writer-wins. If its copy was incomplete (a raced classes fetch at editor load), that save silently deletes most of the classes sitewide. The plugin refuses any single write that would delete more than half of a non-trivial store, returning a 409 with codeEMCP_MASS_DELETE_BLOCKED and a
message that explains the situation and the escape hatches: retry with the
header X-EMCP-Allow-Mass-Delete: 1 if the deletion is intentional, and the
restore endpoint if it was not. A failed save the user can see beats a silent
wipe.
The static-404 guard
Hosts that route unresolved static files into WordPress (the WASM playground; any standard rewrite setup) letredirect_canonical() 301 a missing stylesheet
to the homepage, so HTTP clients see a healthy 200 text/html for a sheet that
is gone, browsers silently drop it, and health checks read false positives. The
plugin makes any request for a missing asset file under wp-content or
wp-includes return a real 404. Files that exist on disk are untouched.
The publish quarantine
A conversion or build that fails its verify gate marks the post quarantined, and the plugin enforces it atwp_insert_post_data: the one seam every publish
flows through (core REST, wp-admin, WP-CLI, MCP). A quarantined post is forced
back to draft on any publish attempt, no matter the vector, until a passing
re-run or a human clears the flag.
Why the editor and agents can coexist
Put together: deploys write through validated endpoints with backups and rollback; priming is scoped so pages do not eat each other’s CSS; the class store is continuously backed up, guarded against editor mass-deletes, and restorable; license churn cannot wipe the site; and dead assets fail loudly instead of lying. An agent can deploy while a human owns the editor, and the failure modes that used to silently unstyle a site now either cannot happen or leave a visible, recoverable trace.On the playground specifically, still avoid opening deployed pages in the
editor; the dev bench favors fast iteration over full guard coverage. See
Playground.