The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Elementor MCP Agent listing page.
Agency-grade MCP server for WordPress Elementor. Multi-site management, safe Elementor edits with backup + auto-rollback + CSS flush, template export/import, global widget detection, screenshots, WP-CLI escape hatch.
Built for agencies running many client sites on Elementor / Elementor Pro who want Claude (or any MCP client) to drive the toil — without breaking pages.
elementor-mcp-agent was built end-to-end with Claude Code over ~48 hours. The process is intentionally open:
This isn't vibe-coded software thrown over the wall. Every release ran through lint + typecheck + 27 unit tests + (for v1.0) full E2E against a real WordPress install before publishing. The MCP itself hardcodes guardrails that prevent the model from making destructive WP-CLI calls.
I run a small WordPress agency and use this tool every day on client sites. If you're skeptical about agentic codegen for production infrastructure, the entire commit history is in the open — judge for yourself.
There are 25+ WordPress MCP servers on GitHub today. None targets the agency multi-site workflow with:
Generate the WordPress Application Password at https://{your-site}/wp-admin/profile.php#application-passwords-section.
The ssh block is optional but unlocks 8 additional tools (WP-CLI escape hatch + reliable custom-postmeta backups). The MCP works without SSH — backups go to local JSON files instead.
wp_cli_path auto-detects if omitted (tries wp, then ~/bin/wp.phar, then ~/wp-cli.phar).
list_sites — enumerate the poolping_site — auth + version probesite_health — multi-call health snapshotlist_elementor_pages — pages in builder moderead_page_elementor — parsed summary + optional full treelist_widgets_in_page — flat widget inventory with excerptslist_global_widgets — shared widgets (edit one → affects every page using it)preflight_check — validate a page is safe to editelementor_find_replace — text replace with dry-run → token → apply → backup → validate → rollback if invalidlist_elementor_backups / restore_elementor_backup — full restore chain with pre-restore safety backupduplicate_elementor_page — clone within a site (data + page_settings + edit_mode)list_elementor_templates — Theme Builder distinguished from regular libraryexport_elementor_template — portable JSONimport_elementor_template — drop into target siteapply_template_to_page — push template data onto an existing pagewp_cli_run — arbitrary wp-cli command with destructive-pattern detection + confirmationwp_search_replace — wp search-replace with mandatory dry-runwp_elementor_flush_css — 3-level fallbackwp_plugin_list / wp_plugin_update (with confirmation)screenshot_page — headless Chrome PNG of any URLcompare_screenshots — SHA-256 + byte-deltaread_widget — fetch one widget by id (read-only)update_widget_settings — shallow-merge settings, with backup + validate + flushdelete_widget — remove a widget from its parent containerduplicate_widget — clone as sibling with fresh idswap_widget_type — replace widgetType + settings, preserve id + positionadd_widget — append a widget into a parent containermove_widget — move a widget between containers (with position)bulk_find_replace_site — find/replace across every Elementor page of one site, per-page backup + validate + flushfleet_find_replace — same across every site in the pool (sequential, dry-run mandatory)restore_from_file — restore _elementor_data from a JSON file backup, with pre-restore safety backupcheck_elementor_versions — flag outdated installs against wordpress.org latestEvery mutating widget tool re-reads the page from canonical WP after the write and surfaces persisted state to the model. The HTTP write API can lie — return 200 OK while plugin filters or REST quirks silently drop the payload. This contract makes that observable.
Every applied response carries:
If verification.matches_requested === false, treat as a failure even if
the HTTP layer said OK. The original payload survives in
backup_meta_key — restore via restore_elementor_backup.
Hardcoded in src/elementor/policies.ts:
And these wp-cli patterns are hard-blocked regardless of confirmation:
rm -rfsudo *db reset --yes / db drop --yesv1.0.0 was tested in real conditions against a live WordPress install with Elementor 4.0.9:
wp elementor flush-css when SSH available, falls back to option-delete otherwise7 bugs found during testing, all fixed:
wp not in SSH PATH on managed hosts → auto-detection + wp_cli_path config_elementor_page_settings type object/string mismatch → normalisationv1.1 ✅ shipped
read_widget, update_widget_settings, delete_widget, duplicate_widget, swap_widget_type, add_widget, move_widgetbulk_find_replace_site (across all Elementor pages of one site)fleet_find_replace (across all sites in pool)restore_from_filev1.2
v2.0
The fastest way to support the project is a ⭐ star on GitHub — it helps other agencies running Elementor sites find this and tells me what to keep building.
You can also: