Royal MCP’s Elementor Tools — Reference
Royal MCP ships seven Elementor tools today. This page is the per-tool reference: what each one does, what arguments it takes, what to ask Claude, and the gotchas worth knowing. The design philosophy behind the deliberately narrow tool surface is on the blog; this page is the how.
Why Only Seven Tools
The design commitment: never generate Elementor JSON from scratch — always work from an existing-known-good source. Every tool below either reads a page, clones a page, or modifies content inside a page that already exists. None of them try to invent Elementor’s widget schemas from a prompt. That commitment is what keeps the tool surface deliberately narrow.
Atomic widgets (Elementor 4.0+ Editor V4 elements) pass through opaquely on clones. We don’t decode atomic schemas because Elementor itself may shift them — and shift them they have (the 4.1 Classes API refactor broke direct _elementor_data writes in third-party tools that decode). Working from a known-good source survives that.
Tools at a Glance
| Tool | Purpose | Best used when |
|---|---|---|
elementor_clone_page |
Duplicate a page with fresh element IDs | Building a variant of an existing page |
elementor_replace_text |
Bulk text substitution across widget settings | Retargeting a cloned page (city, brand, product) |
elementor_replace_image |
Swap image URLs across image-bearing widgets | Retargeting hero, gallery, background images on a clone |
elementor_get_page_outline |
Compact structural summary of a page (~2KB) | Letting Claude reason over a page’s shape before editing |
elementor_list_local_templates |
Enumerate saved templates from the Library | Finding an existing template to import into a page |
elementor_import_template |
Create a new template from a JSON payload | Storing a design in the Library for reuse |
elementor_add_widget |
Insert a new widget or container into a page | Adding a specific widget to a specific spot |
The Seven Tools
elementor_clone_page
Duplicate an existing Elementor page or post as a new draft, with all element IDs regenerated.
What it does
Reads the full _elementor_data tree from the source post, deep-clones the JSON, regenerates every element’s id so the new page opens cleanly in the Elementor editor (Elementor requires unique IDs per document; collisions break the editor). Preserves the Container model, legacy section/column trees, and atomic widgets as-is. Returns the new post ID.
Arguments
source_post_id(integer, required) — post or page ID to clone from. Must have Elementor data.new_title(string, required) — title for the new post.new_status(string, optional) — one ofdraft,publish,private,pending. Defaults todraft.
Example prompt
Returns
New post ID + edit URL. Draft by default so you can review before publishing.
Gotchas
- Featured images copy over; large numbers of unique element IDs are regenerated in memory (fine for any real-world page but not tuned for pathological ID counts).
- Atomic widgets pass through opaquely — their internal IDs are regenerated at the outer element level.
elementor_replace_text
Bulk text substitution across every text-bearing widget on a page.
What it does
Walks the _elementor_data tree and replaces every occurrence of a target string inside known text fields — heading title, text-editor content, button text, image caption/alt, testimonial content, icon-list items, tab labels, accordion titles, call-to-action text, and more. Atomic widgets are skipped (opaque passthrough by design). Case-sensitive by default.
Arguments
post_id(integer, required)find(string, required) — text to search for.replace(string, required) — text to substitute.case_insensitive(boolean, optional) — defaults tofalse.
Example prompt
Returns
Count of replacements made, so Claude knows how much actually changed.
Gotchas
- Substring-based, not word-boundary-aware. If “New York” appears inside a longer phrase you don’t want changed, be more specific with the target string.
- Only rewrites text-field values. Doesn’t touch link URLs, image URLs (that’s
elementor_replace_image), or CSS.
elementor_replace_image
Swap image URLs across every image-bearing widget on a page.
What it does
Walks the page and rewrites matching image URLs in the image widget, image-box, background image (on sections, columns, and containers), gallery items, and other image-carrying widgets. Optionally also remaps the corresponding WordPress attachment ID so the Media Library reference stays clean.
Arguments
post_id(integer, required)old_url(string, required) — URL to find.new_url(string, required) — URL to replace with.old_id(integer, optional) — old WP attachment ID.new_id(integer, optional) — new WP attachment ID. Passing bothold_idandnew_idkeeps the attachment reference consistent.
Example prompt
hero-nyc.jpg to the LA skyline photo I uploaded on Tuesday.”Returns
Count of URL replacements. If you passed attachment IDs, the attachment reference count is included too.
Gotchas
- Only swaps image URLs. Doesn’t touch
<a href>destinations or video URLs. - WebP conversions and Elementor’s image size variants aren’t automatically regenerated — if the new image needs different derivative sizes, an image-optimizer or force-regen may still be worth running.
elementor_get_page_outline
A ~2KB structural summary of a page for AI reasoning.
What it does
Returns a simplified outline — section/container hierarchy, widget types per slot, and short text snippets pulled from text-bearing widgets. Small enough for an AI to reason over a full page without consuming the entire _elementor_data budget. Useful before calling clone or replace to understand what you’re about to touch.
Arguments
post_id(integer, required)- No filters — the outline is intentionally compact.
Example prompt
Returns
Nested JSON: sections/containers with type, layout, child widget types, and short text snippets.
Gotchas
- Not a full serialization. If you need every setting on every widget, this isn’t the tool — use it as a map, not the territory.
- Atomic widgets show as opaque nodes (widget type only, no snippet).
elementor_list_local_templates
Enumerate saved templates from the Elementor Library.
What it does
Lists entries from the elementor_library custom post type — the Elementor Template Library. Returns id, name, type, and last-modified date for each. Filter by type if you’re looking for something specific.
Arguments
type(string, optional) — filter:page,section,widget,popup,header,footer,single,archive.limit(integer, optional) — max templates to return. Defaults to 50.
Example prompt
Returns
Array of templates with id, name, type, and date_modified.
Gotchas
- Returns metadata only, not the template payload. To use a template, call
elementor_import_templatewith the exported JSON — the Library entries here are references you can inspect in the Elementor editor.
elementor_import_template
Create a new template in the Elementor Library from a JSON payload.
What it does
Accepts the JSON shape the Elementor editor exports (an array of section/container elements), validates the top-level structure, and stores it as _elementor_data on a new post in the elementor_library CPT. Returns the new template post ID.
Arguments
title(string, required) — template name.template_type(string, optional) —page,section,widget,popup,header,footer,single, orarchive. Defaults topage.template_json(string, required) — JSON-encoded array of Elementor elements (the export shape).
Example prompt
Returns
New template post ID. Templates land in the Library and are usable from the Elementor editor immediately.
Gotchas
- Top-level shape validation only — malformed nested settings will still store but may produce editor warnings.
- Element IDs from the source JSON are preserved; if you’re copying between sites, that’s fine (templates live in their own namespace).
elementor_add_widget
Add a new widget or container to an existing Elementor page.
What it does
Dual-surface tool. The curated path takes high-frequency widget types (container, heading, text-editor, button, image, image-box, icon-box, icon-list, video, divider, spacer) with flat parameters — the tool expands them into Elementor’s canonical settings object internally, saving tokens on the AI side. The raw path takes any widget type plus a full settings object for widgets outside the curated list. Container widgets can include children inline in a single call. Atomic widgets (Editor V4, prefixed a- or e-) pass through opaquely on the raw path.
Common arguments
post_id(integer, required) — target post or page. Must be Elementor-edited.widget_type(string, required) — Elementor widget slug (e.g.heading,button,html), orcontainerfor a Flexbox container.parent_id(string, optional) — element ID to insert under. Must be a container, section, or column. Omit to append at document top level.position(integer, optional) — zero-indexed position within parent. Omit to append at end.
Curated shortcut arguments (used per widget_type)
- container:
flex_direction(row/column),content_width(boxed/full),children(array of inline child definitions). - heading:
title,header_size(h1–h6, div, span, p; default h2). - text-editor:
editor(HTML content). - button:
text,link_url,link_target(_blank/_self). - image / image-box:
image_url,image_alt,link_url,link_target. - …plus curated params for icon-box, icon-list, video, divider, spacer.
Raw fallback
For any widget type outside the curated list, supply settings as a full Elementor settings object. When settings is provided, raw wins — curated params are ignored.
Example prompt (curated)
/contact/.”Returns
New element ID, parent context, and an edit URL you can jump straight to in Elementor.
Gotchas
- Cap-checked via
edit_poston the target post. - Elementor’s own core MCP module (behind the
e_wp_abilities_apiexperimental flag as of July 2026) is building aCreate_Element_Abilitythat will cover this same primitive layer inside Elementor itself. We shipelementor_add_widgetbecause it’s genuinely useful today; the tools that don’t overlap with what Elementor’s core module will offer — clone, replace, template ops — are the durable ones. See Editing Elementor with Claude for the full context.
Why This Design Survives Elementor Version Boundaries
Elementor 4.1 shipped a Classes API refactor that broke direct _elementor_data write paths for third-party tools decoding widget schemas. The tools that survived that refactor were the ones treating existing pages as opaque known-good sources. That’s the design commitment carried through this whole toolset: read a source, clone it, modify content inside it — never invent structure from a prompt. When Elementor 4.2 or 5.0 shifts the atomic model again (they will), this approach keeps working.