A community-driven registry for Claude, Cursor, Windsurf, Cline & more. Not affiliated with Anthropic.
Are you the author? Sign in to claim
WordPress plugin that turns Elementor into an MCP server — 118+ AI-ready tools for building, editing, and managing page
A WordPress plugin that extends the WordPress MCP Adapter to expose Elementor data, widgets, and page design tools as MCP (Model Context Protocol) tools. This enables AI agents like Claude, Cursor, and other MCP-compatible clients to create and manipulate Elementor page designs programmatically.
add-atomic-widget / update-atomic-widget and detect-elementor-versionapply-brand-kit MCP tool are ProWidget_Base class (35 control types, optional per-widget CSS/JS) that appears under a "Custom (EMCP)" category in the editor; a runtime safety net keeps a bad widget from breaking the editor| Dependency | Version |
|---|---|
| WordPress | >= 6.9 |
| PHP | >= 8.0 |
| Elementor | >= 3.20 (container support required) |
| WordPress MCP Adapter | Bundled (no separate install) |
| WordPress Abilities API | Bundled in WP 6.9+, or via Composer |
Connect to your WordPress site from any AI client using HTTP. No proxy or Node.js needed — just a WordPress Application Password.
echo -n "username:app-password" | base64https://your-site.com/wp-json/mcp/elementor-mcp-serverTip: The plugin's EMCP Tools > Connection admin screen can generate all configs automatically — just enter your username and Application Password.
Add as .mcp.json in your project root:
{
"mcpServers": {
"elementor-mcp": {
"type": "http",
"url": "https://your-site.com/wp-json/mcp/elementor-mcp-server",
"headers": {
"Authorization": "Basic BASE64_ENCODED_CREDENTIALS"
}
}
}
}
Add to claude_desktop_config.json (%APPDATA%\Claude\ on Windows, ~/Library/Application Support/Claude/ on macOS):
{
"mcpServers": {
"elementor-mcp": {
"type": "http",
"url": "https://your-site.com/wp-json/mcp/elementor-mcp-server",
"headers": {
"Authorization": "Basic BASE64_ENCODED_CREDENTIALS"
}
}
}
}
Add to .cursor/mcp.json in your project root, or ~/.cursor/mcp.json for global config:
{
"mcpServers": {
"elementor-mcp": {
"url": "https://your-site.com/wp-json/mcp/elementor-mcp-server",
"headers": {
"Authorization": "Basic BASE64_ENCODED_CREDENTIALS"
}
}
}
}
Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"elementor-mcp": {
"serverUrl": "https://your-site.com/wp-json/mcp/elementor-mcp-server",
"headers": {
"Authorization": "Basic BASE64_ENCODED_CREDENTIALS"
}
}
}
}
Add to ~/.gemini/antigravity/mcp_config.json:
{
"mcpServers": {
"elementor-mcp": {
"serverUrl": "https://your-site.com/wp-json/mcp/elementor-mcp-server",
"headers": {
"Authorization": "Basic BASE64_ENCODED_CREDENTIALS"
}
}
}
}
For local development with WP-CLI available, you can use the stdio transport (no HTTP auth needed):
{
"mcpServers": {
"elementor-mcp": {
"type": "stdio",
"command": "wp",
"args": [
"mcp-adapter", "serve",
"--server=elementor-mcp-server",
"--user=admin",
"--path=/path/to/wordpress"
]
}
}
}
For remote WordPress sites, environments without WP-CLI, or when your AI client needs a different MCP protocol version, use the Node.js proxy. Your AI client launches it as a local subprocess, so it must run on the machine with the client — not on the WordPress server. On shared hosting you have no local access to the plugin directory, so use one of the two methods below.
Recommended — npx runner (nothing to install or keep in sync):
{
"mcpServers": {
"elementor-mcp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@msrbuilds/emcp-proxy@latest"],
"env": {
"WP_URL": "https://your-site.com",
"WP_USERNAME": "admin",
"WP_APP_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx",
"MCP_PROTOCOL_VERSION": "2024-11-05"
}
}
}
}
npx fetches the latest proxy on each launch, so there is no local copy to drift from the plugin version. Requires Node.js 18+ on the client machine.
Alternative — local copy of the proxy file:
Extract bin/mcp-proxy.mjs from the plugin ZIP, save it anywhere on the machine running your AI client, and point args at that local path (e.g. ["C:\\local\\path\\to\\mcp-proxy.mjs"]) — not at the copy inside wp-content/plugins/... on the server. Re-extract it after plugin updates to pick up proxy fixes.
Optional environment variables:
| Variable | Description |
|---|---|
MCP_LOG_FILE | Path to a debug log file (e.g., /tmp/elementor-mcp.log) |
MCP_PROTOCOL_VERSION | Override the protocol version in initialize responses (e.g., 2024-11-05). Use this if your client doesn't support 2025-06-18. |
npx @modelcontextprotocol/inspector wp mcp-adapter serve \
--server=elementor-mcp-server --user=admin --path=/path/to/wordpress
| Tool | Description |
|---|---|
list-widgets | All registered widget types with names, titles, icons, categories, keywords |
get-widget-schema | Full JSON Schema for a widget's settings (auto-generated from Elementor controls) |
get-page-structure | Element tree for a page (containers, widgets, nesting) |
get-element-settings | Current settings for a specific element on a page |
list-pages | All Elementor-enabled pages/posts |
list-templates | Saved Elementor templates from the template library |
get-global-settings | Active kit/global settings (colors, typography, spacing) |
| Tool | Description |
|---|---|
create-page | Create a new WP page/post with Elementor enabled |
update-page-settings | Update page-level Elementor settings (background, padding, etc.) |
delete-page-content | Clear all Elementor content from a page |
import-template | Import JSON template structure into a page |
export-page | Export page's full Elementor data as JSON |
| Tool | Description |
|---|---|
add-container | Add a flexbox container (top-level or nested) |
update-container | Update settings on an existing container |
move-element | Move an element to a new parent/position |
remove-element | Remove an element and all children |
duplicate-element | Duplicate element with fresh IDs |
get-container-schema | Returns the JSON schema for container settings |
find-element | Find elements by type, settings, or CSS class within a page |
update-element | Update settings on any element (widget or container) by ID |
batch-update | Apply multiple element updates in a single call |
reorder-elements | Reorder child elements within a container |
| Tool | Description |
|---|---|
add-widget | Universal: add any widget type to a container |
update-widget | Universal: update settings on an existing widget |
add-heading | Convenience: heading widget |
add-text-editor | Convenience: rich text editor widget |
add-image | Convenience: image widget |
add-button | Convenience: button widget |
add-video | Convenience: video widget |
add-icon | Convenience: icon widget |
add-spacer | Convenience: spacer widget |
add-divider | Convenience: divider widget |
add-icon-box | Convenience: icon box widget |
add-accordion | Convenience: collapsible accordion widget |
add-alert | Convenience: alert/notice widget |
add-counter | Convenience: animated counter widget |
add-google-maps | Convenience: embedded Google Maps widget |
add-icon-list | Convenience: icon list for features/checklists |
add-image-box | Convenience: image box (image + title + description) |
add-image-carousel | Convenience: rotating image carousel |
add-progress | Convenience: animated progress bar |
add-social-icons | Convenience: social media icon links |
add-star-rating | Convenience: star rating display |
add-tabs | Convenience: tabbed content widget |
add-testimonial | Convenience: testimonial with quote and author |
add-toggle | Convenience: toggle/expandable content |
add-html | Convenience: custom HTML code widget |
add-menu-anchor | Convenience: invisible anchor for one-page navigation |
add-shortcode | Convenience: embed WordPress shortcodes |
add-rating | Convenience: customizable rating widget |
add-text-path | Convenience: curved/circular text on a path |
add-form | Pro: form widget |
add-posts-grid | Pro: posts grid widget |
add-countdown | Pro: countdown timer widget |
add-price-table | Pro: price table widget |
add-flip-box | Pro: flip box widget |
add-animated-headline | Pro: animated headline widget |
add-call-to-action | Pro: call-to-action widget |
add-slides | Pro: full-width slides/slider |
add-testimonial-carousel | Pro: testimonial carousel/slider |
add-price-list | Pro: price list for menus/services |
add-gallery | Pro: advanced gallery (grid/masonry/justified) |
add-share-buttons | Pro: social share buttons |
add-table-of-contents | Pro: auto-generated table of contents |
add-blockquote | Pro: styled blockquote widget |
add-lottie | Pro: Lottie animation widget |
add-hotspot | Pro: image hotspot widget |
add-nav-menu | Pro: WordPress navigation menu |
add-loop-grid | Pro: dynamic post/CPT loop grid |
add-loop-carousel | Pro: dynamic post/CPT loop carousel |
add-media-carousel | Pro: media carousel for images/videos |
add-nested-tabs | Pro: nested tabs with container content |
add-nested-accordion | Pro: nested accordion with container content |
add-portfolio | Pro: portfolio grid widget |
add-author-box | Pro: post author box widget |
add-login | Pro: login form widget |
add-code-highlight | Pro: syntax-highlighted code block widget |
add-reviews | Pro: reviews/testimonials carousel widget |
add-off-canvas | Pro: off-canvas panel widget |
add-progress-tracker | Pro: scroll progress tracker widget |
add-search | Pro: search widget with live results support |
add-wc-products | Pro + WC: WooCommerce products grid |
add-wc-add-to-cart | Pro + WC: add-to-cart button |
add-wc-cart | Pro + WC: cart page widget |
add-wc-checkout | Pro + WC: checkout page widget |
add-wc-menu-cart | Pro + WC: menu cart icon widget |
These tools only register when Elementor >= 4.0 is detected. Legacy widget tools continue to work alongside them.
| Tool | Description |
|---|---|
detect-elementor-version | Returns Elementor version and whether atomic elements are supported. Call first to choose tool family. |
add-flexbox | Atomic flexbox container (e-flexbox). Params: direction, justify, align, gap, wrap, tag, padding, background_color |
add-div-block | Atomic div-block container (e-div-block). Params: tag, padding, background_color |
add-atomic-widget | Universal: add any atomic widget by type with raw $$type settings |
update-atomic-widget | Universal: partial-merge update on an existing atomic widget |
add-atomic-heading | Atomic heading (e-heading). Params: title, tag (h1-h6), link, css_id |
add-atomic-paragraph | Atomic paragraph (e-paragraph). Params: content, link, css_id |
add-atomic-button | Atomic button (e-button). Params: text, link, target_blank, css_id |
add-atomic-image | Atomic image (e-image). Params: image_id, image_url, alt, link, css_id |
add-atomic-svg | Atomic SVG (e-svg). Params: svg_id, svg_url, css_id |
add-atomic-youtube | Atomic YouTube embed (e-youtube). Params: video_url, css_id |
add-atomic-video | Atomic self-hosted video (e-self-hosted-video). Params: video_url, video_id, css_id |
add-atomic-divider | Atomic divider (e-divider). Params: css_id |
| Tool | Description |
|---|---|
save-as-template | Save a page or element as reusable template |
apply-template | Apply a saved template to a page |
create-theme-template | Pro: Create theme builder template (header/footer/single/archive/error-404/loop-item) |
set-template-conditions | Pro: Set display conditions on a theme builder template |
list-dynamic-tags | Pro: List all available dynamic tags with groups and categories |
set-dynamic-tag | Pro: Bind a dynamic tag to a specific element setting |
create-popup | Pro: Create a popup template |
set-popup-settings | Pro: Set triggers, display conditions, and timing on a popup |
| Tool | Description |
|---|---|
update-global-colors | Update site-wide color palette in Elementor kit |
update-global-typography | Update site-wide typography in Elementor kit |
| Tool | Description |
|---|---|
build-page | Create complete page from declarative structure in one call |
| Tool | Description |
|---|---|
search-images | Search Openverse for Creative Commons images by keyword |
sideload-image | Download an external image URL into the WordPress Media Library |
add-stock-image | Search + sideload + add image widget to page in one call |
| Tool | Description |
|---|---|
upload-svg-icon | Upload an SVG icon (from URL or raw markup) for use with icon/icon-box widgets |
| Tool | Description |
|---|---|
add-custom-css | Add custom CSS to an element or page-level with selector keyword support (Pro) |
add-custom-js | Inject JavaScript via HTML widget with automatic <script> wrapping |
add-code-snippet | Create site-wide Custom Code snippets for head/body injection (Pro) |
list-code-snippets | List all Custom Code snippets with location and status filters (Pro) |
Design and register custom Elementor widgets from a structured spec — no hand-written PHP. The generator compiles the spec + an HTML template ({{control}}, {{#if}}, {{#each}}) into a sandboxed Widget_Base class, escaping every value by its control type.
| Tool | Description |
|---|---|
list-control-types | List the supported control types + spec shape so agents build valid specs |
validate-widget-spec | Schema + generator dry-run; returns errors without persisting |
create-custom-widget | Generate + register a widget from a spec (auto-activates) |
update-custom-widget | Replace a widget's spec, regenerate, re-validate |
get-custom-widget | Return a widget's spec + generated PHP + status |
list-custom-widgets | List generated widgets (id, title, name, status) |
set-widget-status | Activate or deactivate a widget |
delete-custom-widget | Delete a widget (CPT + sandbox files) |
Let an AI agent author server-side PHP behind a hard human-approval gate. The AI can validate code and create drafts, but a draft never runs until an admin activates it in EMCP Tools → Sandbox — there is deliberately no "activate" tool. Every snippet is statically parse-checked and security-scanned (blocks exec/eval/backticks/file-writes/network/destructive SQL/obfuscation) before it can be saved or activated.
| Tool | Description |
|---|---|
validate-php-snippet | Static parse + security scan; no store, no run |
create-php-snippet | Create an inactive draft (critical findings rejected) |
update-php-snippet | Update a snippet's code/settings; re-validates |
get-php-snippet | Return code, status, shortcode + validation report |
list-php-snippets | List snippets with status and run context |
delete-php-snippet | Delete a snippet and its sandbox file |
| Tool | Description |
|---|---|
list-global-classes | Resolve Class Manager g- IDs to their names and the CSS each defines, per breakpoint/state (read-only) |
All tool names are prefixed with
elementor-mcp/in the MCP namespace (e.g.,elementor-mcp/list-widgets). The MCP Adapter converts these toelementor-mcp-list-widgetsfor transport.
| Tool Group | Required WordPress Capability |
|---|---|
| Read/Query | edit_posts |
| Page creation | publish_pages or edit_pages |
| Widget/layout manipulation | edit_posts + ownership check |
| Template management | edit_posts |
| Theme builder / Popups | edit_posts |
| Dynamic tags | edit_posts + ownership check |
| Global settings | manage_options |
| Delete operations | delete_posts + ownership check |
| Stock image search | edit_posts |
| Stock image sideload | upload_files |
| Custom CSS/JS | edit_posts + ownership check |
| Code snippets | manage_options + unfiltered_html |
If the MCP server connects but no tools appear in Claude Code, Cursor, or other clients:
Verify tools are registered. Test the endpoint directly with curl to confirm the server returns tools:
curl -s -u admin:YOUR_APP_PASSWORD \
https://your-site.com/wp-json/mcp/elementor-mcp-server \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'
If this returns a valid JSON-RPC response with serverInfo, the server is working. The issue is likely a protocol version mismatch between the server and your client.
Check for protocol version mismatch. The WordPress MCP Adapter reports protocol version 2025-06-18. Some clients only support 2024-11-05. If using the Node.js proxy, set the MCP_PROTOCOL_VERSION environment variable to override:
"env": {
"MCP_PROTOCOL_VERSION": "2024-11-05"
}
Enable debug logging. Add the MCP_LOG_FILE environment variable to your proxy config to capture the full request/response flow:
"env": {
"MCP_LOG_FILE": "/tmp/elementor-mcp-debug.log"
}
The log will show the protocol version, session IDs, tools count, and response bodies.
Use the proxy instead of direct HTTP. If you're using type: "http" to connect directly, your client must handle Mcp-Session-Id headers. Clients that don't support session management should use the Node.js proxy instead, which handles sessions automatically.
edit_posts capability.Mcp-Session-Id header on all requests after initialize. Use the Node.js proxy (which handles this automatically) instead of direct HTTP connections.Mcp-Session-Id response header from initialize and include it on all subsequent requests.php.exe and wp-cli.phar.The prompts/ directory includes ready-to-use landing page prompts that demonstrate the full power of MCP Tools for Elementor tools. Each prompt is a complete blueprint — paste it into your AI client and watch an entire page get built automatically.
| Prompt | Industry | Description |
|---|---|---|
| Local Business | General | Multi-purpose small business landing page with hero, services, testimonials, and contact |
| Dental Clinic | Health & Wellness | Professional dental practice with services, team, insurance info, and appointment booking |
| Web Developer Portfolio | Professional Services | Developer portfolio with project showcase, tech stack, and contact form |
| Hair Salon | Lifestyle | Stylish salon page with services menu, stylist profiles, and booking |
| Car Wash | Lifestyle | Car wash with wash packages, add-on services, and membership plans |
Each prompt includes:
Want more? A premium collection of 50 industry-specific prompts covering restaurants, med spas, law firms, florists, photography studios, and more is available separately.
We welcome contributions from the community! Whether it's bug reports, feature requests, documentation improvements, or code contributions — every bit helps.
See CONTRIBUTING.md for detailed guidelines on how to get started.
Quick start:
git checkout -b feature/amazing-tool)This project is licensed under the GNU General Public License v3.0.
MCP server integration for DaVinci Resolve Studio
mcp-language-server gives MCP enabled clients access semantic tools like get definition, references, rename, and diagnos
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots