Elementor MCP Server
Elementor page designs and WordPress data accessible for programmatic AI editing.
Data last scanned today · Reviewed yesterday
Overview
Elementor MCP Server acts as an extension for the WordPress MCP Adapter, exposing site elements, widgets, and design tools directly to MCP-compatible AI clients. It allows AI agents to read, search, and modify Elementor content through a specialized set of tools designed for programmatic site manipulation. Beyond basic integration, the server includes features for page snapshots, content mirroring to JSON, and natural-language search across templates and global styles. It also maintains a change history ledger, enabling AI agents to track and roll back modifications made to the database or filesystem.
Our verdict
This server carries a high-risk level with a security score of 33/100. The primary concern is the lack of any authentication method, meaning anyone with access to the configuration can execute commands on the target site. Additionally, the server lacks a read-only mode, providing full write access to all connected clients. Due to these significant security exposures, it is not recommended for use on production or sensitive WordPress environments.
- Integrated change history and rollback functionality
- Zero direct dependencies reduce supply-chain surface
- Active development with commits within the last 24 hours
- Supports natural-language searching of site content and styles
- No authentication mechanism implemented
- Full write access granted by default with no read-only option
- Community-maintained rather than supported by the official vendor
Tools
| Tool | Description | Risk |
|---|---|---|
| list-widgets | All registered widget types with names, titles, icons, categories, keywords | low |
| get-widget-schema | Full JSON Schema for a widget's settings (auto-generated from Elementor controls) | low |
| get-page-structure | Element tree for a page (containers, widgets, nesting) | low |
| get-element-settings | Current settings for a specific element on a page | low |
| list-pages | All Elementor-enabled pages/posts | low |
| list-templates | Saved Elementor templates from the template library | low |
| get-global-settings | Active kit/global settings (colors, typography, spacing) | low |
| list-post-types | List registered public post types (read-only) | low |
| list-taxonomies | List registered taxonomies and their object types (read-only) | low |
| create-post | Create a post/page/CPT — title, content (HTML or block markup), status, slug, author, terms, custom fields, featured image | medium |
| get-post | Read a single post by ID (read-only; includes is_elementor flag) | low |
| update-post | Update an existing post's fields, terms, custom fields, featured image | medium |
| list-posts | List/query posts of any type with filters (read-only) | low |
| delete-post | Delete a post — trashes by default; force:true permanently deletes | high |
| set-post-terms | Assign taxonomy terms to a post | medium |
| get-settings | Read allowlisted WordPress settings across all groups; doubles as discovery (read-only, manage_options) | low |
| update-settings | Batch-update allowlisted settings; rejects reported in skipped[]; permalink changes auto-flush rewrite rules (manage_options) | medium |
| list-plugins | List installed plugins with active/inactive status, version, update-available flag, and protected marker (read-only, activate_plugins) | low |
| search-plugins | Search the wordpress.org plugin directory by keyword — returns slug, name, version, rating, requirements (read-only, install_plugins) | low |
| install-plugin | Install a plugin from wordpress.org by slug; optionally activate after install (install_plugins) | high |
| activate-plugin | Activate an installed plugin by file path or slug (activate_plugins) | medium |
| deactivate-plugin | Deactivate a plugin; refuses to deactivate EMCP Tools or Elementor (activate_plugins) | medium |
| update-plugin | Update an installed plugin to the latest wordpress.org version; reports up-to-date when no update is pending (update_plugins) | high |
| delete-plugin | Permanently delete an inactive, unprotected plugin (delete_plugins) | high |
| list-themes | List installed themes with active status, version, update-available flag, and whether it is protected (read-only, switch_themes) | low |
| search-themes | Search the wordpress.org theme directory by keyword (read-only, install_themes) | low |
| install-theme | Install a theme from wordpress.org by slug (install_themes) | high |
| switch-theme | Switch the active theme by stylesheet slug (switch_themes) | medium |
| update-theme | Update an installed theme to the latest wordpress.org version (update_themes) | high |
| delete-theme | Permanently delete an inactive, unprotected theme (delete_themes) | high |
| get-media | Full detail for one attachment — every registered image size (URL + dimensions), mime type, filesize, alt text, caption, description, and raw attachment metadata (read-only, edit_posts) | low |
| update-media | Edit an attachment's title, alt text, caption, and/or description — only the fields you pass change (edit_post on ID) | medium |
| delete-media | Delete an attachment; destructive and effectively permanent; disabled-by-default; requires confirm:true; pass force:true to skip Trash even when MEDIA_TRASH is defined (delete_post on ID) | high |
| list-users | List WordPress users; filter by role or search text; paginated. Returns id, username, display name, email, roles, registration date, and post count. Never returns passwords or auth data (read-only, list_users) | low |
| get-user | Full profile detail for one user — adds first/last name, nickname, URL, description, and an is_admin flag (true users are off-limits to update-user) (read-only, list_users) | low |
| create-user | Create a new non-admin WordPress user. A strong password is auto-generated and emailed; the password is never returned. Role defaults to subscriber; administrator and any admin-grade role are refused (create_users) | medium |
| update-user | Update a non-admin user's profile (email, first/last name, display name, nickname, URL, description). Cannot change roles or passwords; refuses any user with admin-level capabilities (edit_users) | medium |
| list-acf-field-groups | List field groups: key, title, active state, field count, local flag; filter by search text, active state, or the post they apply to (read-only, edit_posts) | low |
| get-acf-field-group | One group's location rules and recursive field tree — names, keys, types, required, choices, sub_fields, flexible layouts. The schema-discovery step before writing values (read-only, edit_posts) | low |
| list-acf-options-pages | Registered ACF options pages with the post_id string to target them (ACF PRO; empty list with pro:false on free ACF) (read-only, edit_posts) | low |
| get-acf-fields | Read field values from a post (post_id) or options page (options_page) — formatted values, repeaters/flexible as nested arrays, images/posts as compact objects, unsaved fields as null/empty; optional fields[] filter (read-only, edit_post / manage_options for options) | low |
| update-acf-fields | Write field values on a post or options page: repeater rows, flexible content rows (validated acf_fc_layout), galleries (attachment IDs), relationships. Unknown fields are skipped with a reason; results are confirmed by re-reading (edit_post / manage_options; disabled-by-default) | medium |
| create-acf-field-group | Create a field group with fields (including nested sub_fields/layouts) and location rules, persisted to the database (manage_options; disabled-by-default) | medium |
| update-acf-field-group | Edit a database-stored group: settings, append new fields, or adjust existing fields' settings by key — no deletes, no renames, local groups refused (manage_options; disabled-by-default) | medium |
| list-acf-post-types | List the Custom Post Types managed by ACF — slug, title, visibility, hierarchy, supports, attached taxonomies; search/active_only filters (read-only, manage_options) | low |
| get-acf-post-type | One ACF-managed CPT's full definition (labels, supports, REST, taxonomies) by key or ID (read-only, manage_options) | low |
| create-acf-post-type | Register a new CPT through ACF (saved as data, then registered by ACF — no code executed); slug validated (≤ 20 chars, not reserved/existing); labels auto-generated (manage_options; disabled-by-default) | medium |
| update-acf-post-type | Edit an ACF-managed CPT (labels, visibility, supports, taxonomies); slug is immutable; native CPTs refused (manage_options; disabled-by-default) | medium |
| list-acf-taxonomies | List the taxonomies managed by ACF — slug, title, hierarchy, and the post types each is attached to (object_type); search/active_only filters (read-only, manage_options) | low |
| get-acf-taxonomy | One ACF-managed taxonomy's full definition (labels, hierarchy, REST, object_type) by key or ID (read-only, manage_options) | low |
| create-acf-taxonomy | Register a new taxonomy through ACF; requires object_type (post type slugs); slug validated (≤ 32 chars); labels auto-generated (manage_options; disabled-by-default) | medium |
| update-acf-taxonomy | Edit an ACF-managed taxonomy (labels, hierarchy, attached post types); slug is immutable (manage_options; disabled-by-default) | medium |
| metabox-read | Read Meta Box field groups, field definitions, and values (posts + object_type passthrough) | low |
| metabox-write | Write Meta Box field values (disabled by default) | medium |
| analyze-performance | Audit server config, WordPress internals (DB size, | low |
| scan-security | Scan across malware heuristics, WordPress core-file integrity, hardening, and outdated/abandoned software. | low |
| read-file | Return the contents of any file inside ABSPATH | low |
| list-directory | List the entries in a directory inside ABSPATH | low |
| search-files | Search for files matching a pattern or containing a string within ABSPATH | low |
| write-file | Write (create or overwrite) a file inside ABSPATH | high |
| edit-file | Apply a targeted find-and-replace or line-range edit to a file inside ABSPATH | high |
| delete-file | Delete a file inside ABSPATH | high |
| list-tables | List all tables in the WordPress database with row counts and sizes | low |
| describe-table | Return the column definitions and indexes for a table | low |
| query | Run a read-only SQL query (SELECT/SHOW/DESCRIBE/EXPLAIN only) | low |
| insert-row | Insert a row into a table using $wpdb | medium |
| update-rows | Update rows matching a WHERE clause | medium |
| delete-rows | Delete rows matching a WHERE clause | high |
| create-page | Create a new WP page/post with Elementor enabled | medium |
| update-page-settings | Update page-level Elementor settings (background, padding, etc.) | medium |
| delete-page-content | Clear all Elementor content from a page | medium |
| import-template | Import JSON template structure into a page | medium |
| export-page | Export page's full Elementor data as JSON | low |
| add-container | Add a flexbox container (top-level or nested) | medium |
| update-container | Update settings on an existing container | medium |
| move-element | Move an element to a new parent/position | medium |
| remove-element | Remove an element and all children | medium |
| duplicate-element | Duplicate element with fresh IDs | medium |
| get-container-schema | Returns the JSON schema for container settings | low |
| find-element | Find elements by type, settings, or CSS class within a page | low |
| update-element | Update settings on any element (widget or container) by ID | medium |
| batch-update | Apply multiple element updates in a single call | medium |
| reorder-elements | Reorder child elements within a container | medium |
| add-free-widget | Add any free/core widget by type | medium |
| add-pro-widget | Add an Elementor Pro / WooCommerce widget by type | medium |
| update-widget | Update settings on an existing widget | medium |
| detect-elementor-version | Returns Elementor version and whether atomic elements are supported. | low |
| add-flexbox | Atomic flexbox container (e-flexbox). | medium |
| add-div-block | Atomic div-block container (e-div-block). | medium |
| add-atomic-widget | Universal: add any atomic widget by type with raw $$type settings | medium |
| update-atomic-widget | Universal: partial-merge update on an existing atomic widget | medium |
| add-atomic-heading | Atomic heading (e-heading). | medium |
| add-atomic-paragraph | Atomic paragraph (e-paragraph). | medium |
| add-atomic-button | Atomic button (e-button). | medium |
| add-atomic-image | Atomic image (e-image). | medium |
| add-atomic-svg | Atomic SVG (e-svg). | medium |
| add-atomic-youtube | Atomic YouTube embed (e-youtube). | medium |
| add-atomic-video | Atomic self-hosted video (e-self-hosted-video). | medium |
| add-atomic-divider | Atomic divider (e-divider). | medium |
| save-as-template | Save a page or element as reusable template | medium |
| apply-template | Apply a saved template to a page | medium |
| create-theme-template | Pro: Create theme builder template | medium |
| set-template-conditions | Pro: Set display conditions on a theme builder template | medium |
| list-dynamic-tags | Pro: List all available dynamic tags with groups and categories | low |
| set-dynamic-tag | Pro: Bind a dynamic tag to a specific element setting | medium |
| create-popup | Pro: Create a popup template | medium |
| set-popup-settings | Pro: Set triggers, display conditions, and timing on a popup | medium |
| update-global-colors | Update site-wide color palette in Elementor kit | medium |
| update-global-typography | Update site-wide typography in Elementor kit | medium |
| build-page | Create complete page from declarative structure in one call | medium |
| search-images | Search Unsplash, Pexels or Pixabay for stock photos by keyword | low |
| sideload-image | Download an external image URL into the WordPress Media Library | medium |
| add-stock-image | Search + sideload + add image widget to page in one call | medium |
| upload-svg-icon | Upload an SVG icon (from URL or raw markup) for use with icon/icon-box widgets | medium |
| add-custom-css | Add custom CSS to an element or page-level with selector keyword support (Pro) | medium |
| add-custom-js | Inject JavaScript via HTML widget with automatic <script> wrapping | medium |
| add-code-snippet | Create site-wide Custom Code snippets for head/body injection (Pro) | high |
| list-code-snippets | List all Custom Code snippets with location and status filters (Pro) | low |
| list-control-types | List the supported control types + spec shape so agents build valid specs | low |
| validate-widget-spec | Schema + generator dry-run; returns errors without persisting | low |
| create-custom-widget | Generate + register a widget from a spec (auto-activates) | high |
| update-custom-widget | Replace a widget's spec, regenerate, re-validate | high |
| get-custom-widget | Return a widget's spec + generated PHP + status | low |
| list-custom-widgets | List generated widgets (id, title, name, status) | low |
| set-widget-status | Activate or deactivate a widget | medium |
| delete-custom-widget | Delete a widget (CPT + sandbox files) | high |
| validate-php-snippet | Static parse + security scan; no store, no run | low |
| create-php-snippet | Create an inactive draft (critical findings rejected) | medium |
| update-php-snippet | Update a snippet's code/settings; re-validates | medium |
| get-php-snippet | Return code, status, shortcode + validation report | low |
| list-php-snippets | List snippets with status and run context | low |
| delete-php-snippet | Delete a snippet and its sandbox file | high |
| list-global-classes | Resolve Class Manager g- IDs to their names and the CSS each defines, per breakpoint/state (read-only) | low |
Compatibility
| Client | Local | Docker | Remote | Read-only |
|---|---|---|---|---|
| Claude Desktop | ||||
| Cursor | ||||
| VS Code | ||||
| Windsurf | ||||
| ChatGPT |
Frequently asked questions
›What are the system requirements for installing this MCP server?
This server requires PHP 8.1 or higher, WordPress 6.9 or higher, and Elementor 3.20 or higher.
›Are all available MCP tools active by default?
No, 39 of the available tools ship disabled-by-default, including those for filesystem and database management, to ensure a smaller active surface until you choose to opt in via the Tools tab.
›How can I manage multiple WordPress installations with one connection?
You can use the multi-site proxy provided by @msrbuilds/emcp-proxy 1.9.0, which allows you to manage multiple sites using a site registry and the emcp_use_site command.
›How does the server handle sensitive write operations?
Certain write operations for WooCommerce, such as refunds and deletions, require the confirm:true parameter to be set for execution.
›Can I revert changes made by an AI agent?
Yes, the server includes a change history ledger that allows you to roll back changes either through MCP tools or via the new History admin tab.
›How are Advanced Custom Fields (ACF) or Meta Box tools configured?
These tools are provided as dispatchers that can be toggled on or off under the Tools menu for each respective plugin, with read operations typically enabled by default and write operations disabled by default.
Alternatives
Changelog
- Fix
- Fixv3.4.1 — OAuth sign-in for MCP clients
2026-07-15
- Securityv3.4.0 — Themes, WP-CLI, SVG Uploads
2026-07-14
- Fix
- Fix
- Security
- Fixv3.1.3
2026-07-08
- Fixv3.1.2
2026-07-08
- Fixv3.1.1
2026-07-07
- Fix
Badge
Maintain this server? Add the live badge to your README.