The Gap

Why Core MCP Tools Stop at the Page Builder Boundary

⏱ 14 min

Courses 1 and 2 built real abilities around wp_insert_post(), wp_update_post(), and plain post meta, and that’s genuinely the right foundation for most WordPress content. But a large share of real-world WordPress sites don’t store their pages that way at all. Elementor, Divi, WPBakery, and Beaver Builder each layer a proprietary visual layout format on top of standard WordPress storage, and none of the core Abilities API’s built-in knowledge extends into that layer. This lesson is the honest framing for the rest of the course: what an ability can already see, what it can’t, and why nobody has shipped an official plugin that closes this gap for you.

What you'll learn in this lesson
What core abilities actually operate on
post_content, post meta, and taxonomy data, nothing deeper.
Where each builder actually stores its layout
A quick map before the next two lessons go deep on Elementor and Divi specifically.
Why there is no official fix for this
Page builder data formats are proprietary and unversioned by WordPress core, on purpose.
The shape of the pattern this course builds
Structure-aware abilities, a duplicate-and-approve workflow, and an environment guardrail.
Prerequisites

Courses 1 and 2 completed, with a working MCP server and at least one registered ability. A local WordPress install with one of the four page builders active is useful for the “test it” section, but not required to follow the lesson.

Step 1: What a core ability can see on a page-builder page

Open any post edited with Elementor, Divi, WPBakery, or Beaver Builder and look at it through core WordPress’s eyes: get_post( $id )->post_content and get_post_meta( $id ) still return something. The problem is what that something actually is.

On an Elementor page, post_content is often close to empty or holds a rendered cache fragment, the real content lives in a JSON blob in post meta (Lesson 2 covers the exact structure). On a classic Divi or WPBakery page, post_content is full of text, but it’s shortcode markup like [et_pb_section][et_pb_row]... or [vc_row][vc_column]..., not the human-readable sentence a “change this heading” request refers to. On a Beaver Builder page, the layout is a serialized PHP array in a meta key, unreadable as text at all without unserializing it first.

An ability built to update post_content with a plain string will technically succeed on any of these pages, WordPress will happily save whatever string you pass it. It just won’t do what the user asked, because the actual heading the user means lives somewhere that ability never looked.

Step 2: Why WordPress core doesn’t (and shouldn’t) know this

WordPress core has no concept of “Elementor’s widget settings” or “Divi’s module attributes” because those formats belong to third-party plugins, not core. Each builder is free to change its own internal structure between major versions, and several have: Elementor’s older section/column/widget tree and its newer flexbox container structure coexist depending on when a page was built, and Divi 5 is moving away from shortcodes entirely toward a JSON format (Lesson 3 covers both in detail). Baking any one builder’s format into WordPress core or the Abilities API would tie core to a moving target it doesn’t control and can’t guarantee stays stable.

No official plugin does this for you

There is no WordPress.org plugin, no Elementor add-on, and no part of the MCP Adapter that exposes “edit this Elementor widget” or “edit this Divi module” as a ready-made ability. Every ability in this course is a custom pattern built by hand, against each builder’s real, current stored data. If you find a plugin claiming to do this generically across builders, treat that claim with real skepticism, and verify its actual behavior against your own site’s stored data before trusting it with a live page.

Step 3: The shape of the pattern this course builds

The rest of this course follows one consistent shape, repeated for each builder:

The pattern, builder by builder
Understand the real stored format
JSON tree, shortcode markup, or serialized array, verified against your own site, not assumed from a blog post.
Write a structure-aware ability
One that finds a specific component by a stable identifier and edits only its settings, not the whole tree.
Never edit the live post
Duplicate first, let the agent work on the copy, require explicit human approval before it replaces the original.
Gate destructive abilities on environment
Using wp_get_environment_type() so nothing destructive is even reachable in production by accident.

That last two points aren’t optional extras bolted onto the end of the course, they’re the actual point. A structure-aware ability that edits Elementor JSON correctly is only half the job, the other half is making sure it’s structurally impossible for that ability to corrupt a live, published page without a human looking at the result first.

Test it: confirm the gap on your own site

If you have a page builder active locally, look at what a core ability would actually see versus what the builder stores:

# File: terminal
# What core WordPress thinks the content is
wp post get <post_id> --field=post_content

# What Elementor actually stores (if active)
wp post meta get <post_id> _elementor_data

# What Beaver Builder actually stores (if active)
wp post meta get <post_id> _fl_builder_data

Compare the two. On an Elementor or Beaver Builder page, post_content will usually look thin or empty next to the real layout sitting in post meta. On a classic Divi or WPBakery page, post_content will be full of shortcode text that no ability from Courses 1 or 2 was ever written to parse.

Assuming an empty post_content means an empty page

An Elementor or Beaver Builder page with little or nothing in post_content is not broken and is not missing content, the content just lives elsewhere. Don’t write an ability that treats a thin post_content field as a signal to overwrite it, that’s the single fastest way to accidentally wipe a page builder’s real layout while leaving its JSON or serialized data (now orphaned and possibly still rendering from cache) behind.

Recap

Core abilities operate on post_content, post meta, and taxonomy data, the same shape covered in Courses 1 and 2. That’s exactly what a standard WordPress post needs and exactly what a page builder page doesn’t provide in a directly usable form, since the builder’s real layout lives in a proprietary JSON tree, shortcode markup, or serialized array instead. No official plugin bridges that gap, so the rest of this course builds the bridge by hand, one builder at a time, wrapped in a duplicate-and-approve workflow and an environment guardrail that keeps any of it away from a live production page without explicit human review.

Resources & further reading

Understanding Elementor's Data Structure →