Server data from the Official MCP Registry
Agency-grade MCP for WordPress Elementor — multi-site, safe edits, templates, versions.
Agency-grade MCP for WordPress Elementor — multi-site, safe edits, templates, versions.
Valid MCP server (1 strong, 1 medium validity signals). 5 known CVEs in dependencies (1 critical, 2 high severity) Package registry verified. Imported from the Official MCP Registry.
5 files analyzed · 6 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
Set these up before or after installing:
Environment variable: ELEMENTOR_MCP_SITES
Environment variable: ELEMENTOR_MCP_CONFIG_PATH
Environment variable: ELEMENTOR_MCP_DEFAULT_SITE_ID
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-mogacode-ma-elementor-mcp-agent": {
"env": {
"ELEMENTOR_MCP_SITES": "your-elementor-mcp-sites-here",
"ELEMENTOR_MCP_CONFIG_PATH": "your-elementor-mcp-config-path-here",
"ELEMENTOR_MCP_DEFAULT_SITE_ID": "your-elementor-mcp-default-site-id-here"
},
"args": [
"-y",
"elementor-mcp-agent"
],
"command": "npx"
}
}
}From the project's GitHub README.
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:
npx -y elementor-mcp-agent
export ELEMENTOR_MCP_SITES='[{
"id": "client-acme",
"url": "https://acme.example.com",
"username": "admin",
"application_password": "xxxx xxxx xxxx xxxx xxxx xxxx",
"ssh": {
"host": "host.example.com",
"user": "username",
"port": 22,
"path": "/path/to/wordpress",
"wp_cli_path": "wp"
}
}]'
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).
{
"mcpServers": {
"elementor": {
"command": "npx",
"args": ["-y", "elementor-mcp-agent"],
"env": {
"ELEMENTOR_MCP_SITES": "[{\"id\":\"acme\",\"url\":\"https://acme.com\",\"username\":\"admin\",\"application_password\":\"...\"}]"
}
}
}
}
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:
{
"mutated": true, // false = no-op OR silent drop
"warnings": [], // non-fatal issues
"verification": {
"method": "Re-read /wp/v2/pages/42 and check widget abc settings…",
"reread_ok": true,
"matches_requested": true, // false = write API lied
"persisted": { /* canonical state */ },
"notes": "…explanation when something diverged"
}
}
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:
BACKUP_BEFORE_WRITE = true
BACKUP_PAGE_SETTINGS = true
VALIDATE_JSON_AFTER_EDIT = true
BLOCK_GLOBAL_WIDGET_WRITES_BY_DEFAULT = true
CONFIRMATION_TTL_SECONDS = 60
GLOBAL_WIDGET_CONFIRMATION_TTL_SECONDS = 30
FLUSH_CSS_AFTER_WRITE = true
MAX_ELEMENTOR_DATA_BYTES = 5_000_000
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
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
by Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.