@diviops/mcp-server
v1.5.74
Published
MCP server exposing Divi 5 Visual Builder as tools for Claude
Maintainers
Readme
DiviOps MCP Server
An AI harness for WordPress site authoring — Divi-native today, WordPress-wide by design.
The Node.js MCP server inside the DiviOps harness. It gives Claude Code, Codex, Claude Desktop, and other MCP clients a typed control layer over WordPress site state, dispatching to the DiviOps Agent plugin for Divi 5 page authoring, SCF and CPT data models, design tokens, presets, library and Theme Builder templates, site audits, and safe WP-CLI passthrough. Pairs with the diviops-divi-5 skill so the agent applies Divi's block format and design rules correctly.
Claude Code <-> MCP Server (stdio) <-> WordPress REST API <-> DiviOps Agent pluginMCP 1.5.74 source candidate
Adds the Free diviops_seo_storage_inspect tool for four literal Rank Math
storage keys on one editable page. Pair with Free Agent 1.5.47, then
restart/reconnect the MCP client to refresh startup capability evidence.
An older Free Agent returns capability_missing without a storage request;
reconnecting an older MCP binary does not add the new tool.
Inspection is permission-checked and bounded. Missing and empty values remain distinct; serialized values remain untrusted text, not computed SEO, inherited defaults, a write plan or evidence that an interrupted write is safe to retry. Existing semantic reads, previews, writes and recovery retain their exact-version gates. No automatic fallback, override or global version-floor change is added. SCF and TSF behavior is unchanged; Pro is optional and unchanged.
The merged inspector passed bounded native checks with Rank Math 1.0.280 on WordPress 7.1, PHP 8.3.35 and Divi 5.13.1. That feature result does not qualify arbitrary future versions or the exact newly versioned Free ZIP. Candidate package qualification and publication remain separate gates.
MCP 1.5.73 historical release note
Aligned Rank Math and SCF tool descriptions with the reviewed exact version sets. Free 1.5.45 improved provider diagnostics; Pro 1.0.19-beta extended its reviewed Rank Math controller support. Those releases added no MCP tools or schemas. Compatibility remains capability-based; component labels alone do not establish installed support.
1.5.72 historical release note
Adds five capability-gated Pro SEO text workflow tools: plan, advance, status/report, recovery plan and recover. Existing Free SEO tools gain bounded operation correlation and exact outcome lookup. Pair with Free 1.5.43 and Pro 1.0.18-beta for the complete reviewed workflow; availability follows capabilities, not a shared version floor.
Each advance affects at most one explicit page. After an interrupted request, read status before deciding whether to advance again; do not automatically retry. Single-page authoring and recovery remain Free. Restart or reconnect the MCP client after supported component updates to refresh discovery. Candidate packaging and publication remain separate.
1.5.68 release note — named site-wide CSS blocks
With Free Agent 1.5.39, diviops_custom_css_get, diviops_custom_css_upsert
and diviops_custom_css_restore read, preview, update and restore named blocks
in the active theme's native Custom CSS. Writes default to preview and require
an explicit apply with a fresh checksum. Unrelated CSS and theme options are
preserved; writes retain a seven-day recovery snapshot.
Initialize or reconcile storage through Divi > Theme Options > General > Custom CSS, save visibly, then read again before applying. Missing or divergent native storage is refused. A Customizer save can leave Divi's legacy mirror out of sync; the tools do not repair it automatically. CSS support is a bounded subset, and changing themes requires a fresh read. Check state after a cancelled or failed write before retrying; use the CSS-specific restore tool for recovery.
Native editing, frontend rendering, recovery and child-theme isolation were verified on WordPress 7.1, PHP 8.3 and Divi 5.13.1. Update both components and restart the MCP server.
1.5.67 release note — WP-CLI term metadata and assignments
term meta list <term-id> --format=json is available as a default read alongside
term meta get. Term-meta set/update and post-term add/set/remove require
individual opt-ins through DIVIOPS_WP_CLI_ALLOW; they remain denied by default.
For example, DIVIOPS_WP_CLI_ALLOW="term meta update,post term add" enables only
those additional commands. Restart the MCP server after changing configuration.
Existing */all configurations acquire the expanded extended set on update.
WP-CLI passthrough has no dry_run, checksum protection or automatic rollback.
Read current values before writing and check state before retrying a timed-out
write. See WP-CLI security for command tiers.
1.5.66 release note
Cancellation now reaches pending HTTP requests for page listing, variable listing and creation, cache flushing, and Theme Builder template trash or preview. Cancelling a dispatched write does not prove that WordPress stopped or rolled it back; check the resulting state before retrying. This correction does not establish the cause of the separately reported four-minute client timeouts.
WP-CLI rejection messages now identify the full opt-in command, such as
post meta delete. Existing permissions and opt-in guidance are preserved.
Update and restart the MCP server. These corrections require no Free Agent update; Free Agent remains 1.5.38 and public builder remains 1.4.11.
Previous 1.5.65 release note
Variable scans now report incompatible legacy non-color IDs, whether they are defined, and their known page/preset references. Scan coverage and truncation are explicit. Existing orphan and unused classifications are unchanged. Native page-usage detection is not proof of successful frontend rendering.
Existing mixed-case or underscore IDs still need reviewed replacement variables and reference updates. No variable is renamed or deleted automatically; zero known references does not establish that deletion is safe.
Pair with Free Agent 1.5.38. Public builder remains 1.4.11.
Previous 1.5.64 release note
Adds diviops_page_settings_get and diviops_page_settings_update with Free
Agent 1.5.37. Read and update page-wide Content Area and Section backgrounds on ordinary Divi pages. Supports previews, literal colors, transparency and clearing to native defaults, with checksum checks and preservation of unrelated page data. Explicit per-section backgrounds remain intact.
Verified on WordPress 7.1, PHP 8.3 and Divi 5.13.1, including native settings save/reopen and frontend rendering. Public builder and compatibility floors are unchanged.
Previous 1.5.63 release note
With Free Agent 1.5.36, runtime schema discovery accepts registered third-party Divi modules and routes their namespaced identifiers without dropping the namespace. The Free plugin also supports their module read/update/move and Theme Builder block insertion. Native short identifiers remain supported; unrelated WordPress blocks are refused and the native schema dump is unchanged.
Update both components for the complete correction. Native checks covered FluentCart Store Logo, not every extension or version. Public builder remains 1.4.11. Dependencies and compatibility floors are unchanged.
Previous 1.5.62 release note
With Free Agent 1.5.34, empty header/footer inputs on template creation link the active enabled default's existing layouts and preserve region enabled states. Preview and apply report resolved sources and IDs. Without an enabled default, the result explicitly reports native-theme fallback; invalid inheritance is refused before changes. Existing templates are not automatically repaired.
Links are resolved at creation, not automatically rebound when the default layout ID is replaced. Update the Free plugin to receive the fix; this MCP update supplies matching tool guidance. Public builder remains 1.4.11. Dependencies and compatibility floors are unchanged.
Previous 1.5.61 release note
With Free Agent 1.5.31, Theme Builder template trash and permanent deletion
preserve layouts referenced by another template. Preview excludes them from
destructive changes, and both preview and apply report preserved_layouts.
Failed reference checks stop before changes. Unshared cleanup is unchanged.
Update the Free plugin to receive the protection; this MCP update supplies matching tool guidance. Public builder remains 1.4.11. Dependencies and compatibility floors are unchanged.
Previous 1.5.60 release note
When WP-CLI is configured, diviops_meta_info now includes wp_cli.ignored:
the unique, trimmed entries from DIVIOPS_WP_CLI_ALLOW that were not recognized
at startup. Clients can inspect these alongside allowed and extendable
even when startup warnings are hidden. Command permissions and matching are
unchanged. Restart the MCP server after changing the environment configuration.
The MCP SDK dependency now requires v1.31.0 or later within v1, incorporating its OAuth client credential-routing fix. This package uses the SDK server/stdio path. Free remains 1.5.30, public builder remains 1.4.11, and compatibility floors are unchanged.
Previous 1.5.59 release note
Adds two default WP-CLI reads: option pluck <option> <key-path>... for a nested
option value, and term meta get <term-id> <key> for a term-meta field. Existing
write permissions are unchanged. Restart the MCP client connection after updating
to refresh the effective command list.
Public builder companion 1.4.11 corrects admin-label examples to use
module.meta.adminLabel.desktop.value. Updating npm does not update independently
installed skills or instructions already read by an agent. Free remains 1.5.30;
dependencies and compatibility floors are unchanged.
Previous 1.5.58 release note
With Free 1.5.30, module preset create/update accepts group_presets for native
root composition, and inspection exposes stored links. The supplied map replaces
the entire root map; omission preserves links and {} clears them. Slot/group
buckets and existing references are validated, including dry-run. Composition
requires preset_composition_v1; older or unverified plugins refuse it before
dispatch. Keep groupPresets out of attrs. Update both components and restart
the MCP client connection to refresh capabilities.
Public builder companion 1.4.10 and Free validation warnings ask for explicit heading levels according to document hierarchy, without changing typography or warning detection. Updating npm or WordPress does not update independently installed skills or instructions already read by an agent.
Free 1.5.30, MCP 1.5.58 and public builder 1.4.10 were delivered together. Dependencies and compatibility floors were unchanged.
Previous 1.5.57 candidate release note
Forwards diviops_module_update request cancellation to HTTP dispatch and pending
response-body reads. This does not establish the cause or resolution of the
reported four-minute hang. After dispatch, the WordPress write outcome remains
unknown: cancellation does not verify no changes, a stopped write or rollback.
Do not automatically retry; inspect readback and existing rollback evidence
before deciding any later action.
Corrects WP-CLI rejection hints to match actual extended opt-in commands. Command permissions, allowlists and opt-in requirements are unchanged.
Separately prepared Free 1.5.29 generates lowercase IDs for new non-color design variables and refuses invalid supplied IDs without silently renaming them. Existing IDs and references are not migrated or repaired. Additional module-write regression coverage is tests only, not a new serialization fix.
Delivered baseline: Free 1.5.28, MCP 1.5.56 and public builder companion 1.4.9.
Builder content is unchanged, so its version remains 1.4.9. This is source review,
not exact-package qualification, runtime acceptance or publication. A narrow
dependency correction pins proxy-addr to patched 2.0.8 after the original
qualification audit failed. Tool schemas, compatibility floors, Pro, Design
Library, paid skills, primer and launcher remain unchanged. Fresh package
qualification and hosted validation are authorized but pending; merge remains
gated on corrected-head review and all applicable checks.
Previous 1.5.56 candidate release note
Aligns shipped setup documentation and attribute-reference citations with the
renamed diviops-divi-5 skill. Updates three pinned production dependencies to
address reported advisories: fast-uri 3.1.8, hono 4.13.7 and ip-address
10.7.1. No DiviOps tool implementation, schema or compatibility-floor change
is included. Dependency advisories do not establish exploitability in DiviOps.
Separately prepared Free 1.5.28 corrects explicit-index targeting of canonical empty native Text modules and marks incomplete Inspector consumer reads as unavailable. These plugin corrections do not require a new MCP capability or raise the minimum MCP version.
Public builder companion 1.4.9 preserves existing Free/Pro guidance boundaries
and carries the renamed skill and preset typography ownership guidance. The
marketplace plugin identifier remains divi-5-builder; it is not the skill name.
Existing SCF/FluentCart guidance may still link to the old skill directory.
Keep that working installation until matching companion guidance is available,
or use an explicitly reviewed link-only migration. Do not leave two discoverable
builder copies or overwrite local edits. Updating npm or WordPress does not
update independently installed skills or refresh already-read instructions.
This is source preparation, not exact-package qualification, runtime acceptance or public delivery. Pro, Design Library and paid-skill delivery remain separate.
Previous 1.5.55 candidate release note
With Free 1.5.27, preset deletion supports real dry-run previews and guarded
preset_ids exact-set apply through preset_delete_exact_v1. Review the preview
and pass its registry checksum on apply; bounded reference checks run again.
Defaults, references and incomplete evidence refuse even with force. Legacy
single-ID deletion retains its default-only guard, without reference checks.
MCP refuses new safety parameters on old or capability-unverified handlers.
These checks are point-in-time, not a transaction or automatic rollback.
Native Code content strings may contain literal pseudo-escapes; shared validation and write serialization checks still require valid JSON and block delimiters. Free 1.5.27 also fixes uncached reads/readback of valid empty page content.
diviops_page_update_content can retain a successful reviewed dry-run using
retain_content:true; apply with content_ref instead of resending content,
keeping the same target, expected checksum and backup intent. References are
memory-only, MCP-process-local and one-use, expire five minutes from reservation,
and are limited to eight candidates, 2 MiB each and 8 MiB total. They are consumed
before apply checks/dispatch, even on failed or uncertain apply: inspect the
target and review a new dry-run instead of automatically retrying. Existing write
checks still run. Retention is not approval, a backup, cross-client isolation or
a reduction in content sent from MCP to WordPress. Direct-content calls remain.
Public builder companion 1.4.8 carries exact-ID deletion and retained-content guidance, stable native FAQ wrapper sizing, and source-qualified Divi 5.13.1 generated guidance. Dependencies and compatibility floors are unchanged. This is source preparation only: local source evidence does not qualify these packages or establish that staging has the fixes. Package validation, runtime adoption and publication require separate authorization.
Previous 1.5.54 candidate release note
Adds optional bounded:true to diviops_page_get for UTF-8-safe raw content
chunks of at most 4096 bytes, with a full-page checksum and byte-offset
continuation. Start at offset zero, then pass each next_offset and the initial
expected_checksum until complete:true. Content drift refuses continuation;
discard collected chunks and restart. Free 1.5.26 supplies the precise
page_get_bounded_utf8_v1 capability; unsupported older plugins are refused
before any page fetch, without an unbounded fallback. Reconnect after supported
plugin updates to refresh the capability handshake.
Default reads, authentication, permissions, writes, dependencies and global compatibility floors are unchanged. Each chunk request still reads and hashes the full upstream content. Bounded responses are not memory-bounded streaming, a snapshot service or a universal client-delivery guarantee. This is source candidate preparation, not new-package qualification or publication.
Independent public builder companion 1.4.7 carries three pending references:
targeted inspection and checksum-bound continuation in tools.md, a native CTA
preset-ownership example in presets.md, and opt-in native image-reveal guidance
in design-effects.md. The image-reveal runtime is already delivered separately
in Design Library 1.0.0-beta.24; this preparation does not re-release Design.
Previous 1.5.53 candidate release note
The only MCP change is an inspector tool-description clarification: direct variable references and partial coverage are now explicit. No new tools or input-schema, runtime, dependency or compatibility-floor changes are included. This is source candidate preparation, not package validation or publication.
Independent builder companion 1.4.6 carries already-merged guidance for native megamenu authoring, explicit local override/null semantics and implicit group defaults.
Previous 1.5.52 candidate release note
Adds diviops_scf_text_value_update for basic Free authoring of one existing
applicable top-level SCF 6.9.4 text field. It previews by default, requires exact
expected text, validates the field and verifies persisted value/reference after
one provider update. Free 1.5.23 supplies the capability-gated REST handler;
older plugins refuse before dispatch. No Pro or WP-CLI dependency is added.
Existing Divi bindings/design are not authored by this operation. Expected-state
checks are not atomic CAS, SCF snapshot rollback or full native-form equivalence.
SCF member 1.2 carries the writer's scope, failure handling and bounded local MCP proof, distinct from historical native-editor evidence. That proof used temporary Free 1.5.22/MCP 1.5.51, not this candidate pair. The feature remains a source candidate until separately validated and published; restart MCP after supported updates to refresh capabilities. No dependencies or global compatibility floors change.
Builder companion 1.4.5 carries the accepted Divi 5.13 source-derived schema references, Contact Form Show Labels and Map-height ownership guidance, and preset custom-ID precedence: use classes in reusable presets and unique module-local custom-ID rows, not the separate CSS-ID field as an override. It also carries native-portability guidance for importer/file handoffs, explicit preset references versus effective defaults, empty-array resets and saved-state readback. These are bounded guidance changes, not automatic preset repair, cross-version import fidelity or blanket native-save compatibility. The builder package version is independent of the SCF member version.
Previous 1.5.51 candidate release note
Adds diviops_managed_recovery_plan_check and
diviops_managed_recovery_restore_apply for an opt-in, reviewed one-site
recovery workflow. Plan and apply dry-run do not capture or restore; confirmed
apply delegates to the shared Free protection service. An exact completed
request replay returns the prior result without another restore, capture or
audit append. Inspect the separate recovery, readback and audit evidence rather
than inferring success from request completion.
The two tools require the active Pro managed-recovery target and
managed_recovery_plan_v1. Older compatible Free/Pro pairs retain the existing
policy, retention and audit tools; basic snapshot inspection and guarded undo
remain Free. Restart MCP after supported updates to refresh its capability
handshake. No dependency, transport, global version floor or restore UI change
is included. Candidate validation and publication are still separate steps.
Previous 1.5.50 candidate release note
Clarifies that the existing status tool targets standard WordPress Posts and Pages, not custom post types or attachments. Free Agent 1.5.20 corrects the endpoint's rejection of standard Posts while preserving edit and applicable publish permissions before dry-run plans and no-op responses. Existing request shapes and scheduling rules are unchanged; no Pro update is required.
Previous 1.5.49 candidate release note
- Adds bounded staff-body source/target evidence and preflight, plus guarded Pro apply dispatch to one existing isolated target body. Target records supply their own title, portrait, biography and plain-text role; records, fields and assignments are not created or changed. General body migration and arbitrary CPT/field mapping remain unsupported.
- Forwards an optional create-only product
slugindependently of SKU when Pro advertisesfluentcart_product_create_slug. Omission retains the existing create workflow. Dry-run reports intent without reserving a URL; read storedproduct.slugafter creation and later publication. Changed product titles still regenerate slugs; no slug update, URL preservation or redirects are added.
Selected source metadata is MCP 1.5.49, Free 1.5.18, Pro 1.0.14-beta and
FluentCart skill 0.14. Staff-body evidence requires Free's
cross_env_staff_body_evidence; apply also requires Pro's
cross_env_staff_body_apply and existing Pro/module gates. Component versions
remain independent: Free's minimum MCP requirement and Pro's existing Free
floor are unchanged. Restart MCP after supported updates to refresh capabilities.
This is source-only candidate preparation, not publication or packaged proof.
The prior bounded staff-body technical proof passed, but user visual acceptance
remains pending; no Visual Builder save or executed rollback was tested. That
proof does not qualify FluentCart creation or live WordPress slug collisions.
New-package inventories, build, production-only startup and runtime qualification
remain separate validation work. SCF 1.1, builder, Free primer, Design and
launcher are unchanged; modern health remains default-disabled and repository-only,
and the setup prototype remains uninstalled and unqualified.
Use cases
DiviOps fits multiple WordPress workflows where AI-driven authoring + management is the value:
- Page building (Divi authoring) — create + edit Divi pages, sections, modules, canvases via prompt; preset-driven design system reuse; Theme Builder layouts and templates.
- SCF setup + management — provision Secure Custom Fields field groups, sync schemas, export/import field group definitions; SCF data model becomes a tool surface, not an admin-UI flow.
- CPT + post population — register custom post types via wp-cli passthrough; bulk-populate posts and pages across any post type, not just Divi-built ones.
- Data model reasoning — schema introspection across Divi modules + SCF field groups + post meta; ask Claude what fields a post type carries, what attributes a module accepts, what tokens are defined.
- WordPress site auditing — preset audits, design-token usage scans, orphan detection (presets, variables, dangling references); broader site surveys via wp-cli (
wp option list,wp post list --format=json,wp post term list <id> <taxonomy> --format=json,wp user list). - Hybrid sites (Divi + custom PHP) — Divi authors the marketing pages; custom PHP templates handle dynamic ones (CPT listings, single-post views, member portals); design tokens harmonized across both surfaces via CSS custom properties driven from the Divi variable system.
Authoring policy
Use native Divi modules first. Intentional custom HTML is supported when native Divi cannot meet the agreed requirement; HTML shape is not a semantic refusal gate. Permissions, schemas, sanitization, bounded parsing, dry-run, required backups and readback still apply. Ordinary server startup and the seven full-content writes do not require a browser, trust registration or receipt. Visual QA is separate.
With an unreleased browser-gate plugin snapshot, its refusals remain authoritative: the migrated server removes private browser handoff data and does not retry or bypass the refusal. An unreleased browser-gate server snapshot tolerates the retired registration route on the migrated plugin, but retains its own startup-attestation overhead. Existing capability checks and authentication errors are unchanged. Published server 1.5.40 and Free 1.5.13 predate that experiment and did not require browser attestation or receipts. Source behavior is not a claim that current npm, WordPress.org or manually installed packages include the migration.
Quick start
The first three steps prove connectivity. Native Divi authoring additionally requires the client-side skill and first-run verification in steps 4 and 5.
1. Install the WordPress plugin
Download and activate the DiviOps Agent plugin from WordPress.org once it is listed there. For pre-listing test packages or a manual fallback install, use the direct zip or browse the public distribution repo. Requires Divi 5.1+ on WordPress 6.5+.
The npm MCP server updates through npm. WordPress.org installs of the Free plugin update through the normal WordPress plugin update flow. For pre-listing test packages or a manual fallback install, replace diviops-agent.zip through WP Admin → Plugins → Add New → Upload Plugin and choose Replace current with uploaded.
2. Create an Application Password
In WP Admin → Users → Your Profile → Application Passwords:
- Enter a name (e.g. "MCP Server")
- Click "Add New Application Password"
- Copy the generated password and strip the spaces
3. Register the MCP server
The successor server line requires Node.js 22 or newer. Upgrade Node before
selecting @diviops/[email protected] or a later release. Operators who must
remain on Node 18 can pin the previously shipped compatible server explicitly:
npx -y --package=@diviops/[email protected] diviops-mcpThat pin affects only the MCP server. Free and Pro WordPress plugin versions use independent version series and remain compatible through the advertised per-capability handshake. Direct npm/stdio and MCP v1 remain supported on the Node 22 successor; MCP v2 fixtures and the launcher sidecar are not published.
Claude Code:
claude mcp add diviops-mcp \
--env WP_URL=http://your-site.local \
--env WP_USER=your-wp-username \
--env WP_APP_PASSWORD=xxxxXXXXxxxxXXXXxxxxXXXX \
-- npx -y --package @diviops/mcp-server diviops-mcpCodex ~/.codex/config.toml:
[mcp_servers.diviops-mcp]
command = "npx"
args = ["-y", "--package", "@diviops/mcp-server", "diviops-mcp"]
[mcp_servers.diviops-mcp.env]
WP_URL = "http://your-site.local"
WP_USER = "your-wp-username"
WP_APP_PASSWORD = "xxxxXXXXxxxxXXXXxxxxXXXX"Then ask your AI client: "List the pages on my site." It calls
diviops_page_list and renders the result. This proves the plugin and MCP transport;
it does not prove that the client has loaded Divi authoring knowledge.
For Claude Desktop JSON, use "command": "npx" with args ["-y", "--package", "@diviops/mcp-server", "diviops-mcp"]. The package also ships diviops-preset, so the explicit package/bin form is required; shorthand package invocation cannot reliably infer which bin to run.
The public npm package exposes exactly three supported CLIs:
diviops-mcp, diviops-preset, and diviops-cross-env-preflight. The
launcher-managed MCP sidecar is a separate future artifact identity; it is not
a public npm bin or part of the npm tarball. Repository launcher development
builds and supplies that private entrypoint explicitly. This boundary does not
change direct npm/stdio support.
For a deeper walkthrough (containerized environments, WP-CLI configuration, troubleshooting installation), see setup-guide.md.
4. Load the diviops-divi-5 skill
Install it for Claude Code by running
claude plugin marketplace add oaris-dev/diviops and then
claude plugin install divi-5-builder@diviops, or copy the distribution's
skills/* into the supported skill directory for Codex/manual setups. WordPress
and npm updates do not update manual skill copies. Avoid simultaneous
plugin-managed and stale manual copies, then restart the client and confirm
diviops-divi-5 is visible. The plugin package keeps its historical
divi-5-builder identifier for update continuity; that is not the skill name.
For an existing installation, use the
selected-root replacement procedure before copying:
inventory both divi-5-builder and diviops-divi-5 roots, preserve local edits
and rollback outside discovery roots, and retire only the confirmed old copy.
Unknown ownership or modified copies require review; do not add a discoverable
old-name alias. Disk freshness alone does not establish loaded-session freshness.
5. Prove native module authoring
Run the disposable, fail-closed native Divi verification. Stop if the skill or required tools are unavailable. Do not accept page-sized HTML, Code modules, iframe layouts, or structural HTML in text/container fields as a fallback for editable native Divi modules.
Example workflow
You: Create a hero section on a new page called "Spring Launch" with a heading, subheading, and a CTA button. Use my brand colors.
Claude orchestrates a few tool calls in sequence:
diviops_global_color_list— discovers your brand palette.diviops_template_list/diviops_template_get— pulls a verified hero template that matches the request.diviops_validate_blockswith inlinecontent— confirms the constructed hero markup is well-formed before any write.diviops_page_create— createsSpring Launchas a draft using those exact validated bytes.diviops_validate_blockswith the savedpage_id— verifies persisted readback.diviops_render_preview— returns the rendered HTML so you can verify before publishing. Accepts inlinecontentor apage_idto preview an existing page.
The skill enforces the Divi block format, the design system, and the response contract throughout — you stay at the prompt level.
Tools at a glance
The server exposes 101 always-on tools across the categories below. Each category links to representative tools; the full table lives in server-reference.md.
| Category | Use case | Tool prefixes |
|----------|----------|---------------|
| Page authoring | Create, edit, restructure pages | page_*, section_*, module_* |
| Design system | Manage colors, fonts, variables, presets | variable_*, global_color_*, global_font_*, preset_* |
| Library + templates | Reusable layouts + Theme Builder | library_*, template_*, tb_* |
| Native Custom CSS | Read, preview, update and restore named site-wide CSS blocks | custom_css_* |
| WordPress menus | Author reusable nav menus and theme-location assignments | menu_* |
| Semantic SEO metadata | Inspect provider support; TSF and Rank Math title/description and canonical/noindex with checksum/readback guards | seo_* |
| Schema introspection | Module attribute discovery | schema_* |
| Canvas / off-canvas | Popups, modals, menus | canvas_* |
| SCF integration | Secure Custom Fields sync | scf_* |
| Render + validate | Preview HTML, validate block markup | render_preview, validate_blocks |
| WP-CLI passthrough | Escape hatch for site ops | meta_wp_cli |
| Cache + meta | Connection probe, identity, icons, cache flush | meta_* |
diviops_scf_text_value_update is a Free REST writer, separate
from the existing SCF CLI schema tools. It previews by default and updates one
existing applicable top-level text field on an editable post, with exact expected
value, field validation and persisted value/reference readback. It supports exactly
SCF 6.9.4 and 6.9.5. The 6.9.5 extension shipped in Free 1.5.44 (GitHub v1.5.86).
Separate bounded verification passed the 6.9.4 → 6.9.5 upgrade, one text-field
write, native save/reopen and restoration. It requires
the precise Free plugin capability, not Pro or WP-CLI. Empty/literal-"0", multiline,
markup, nested/conditional fields and schema changes are outside its initial
scope. See the separately supplied DiviOps SCF skill's text-value contract
for exact inputs and failure semantics. No full native-form equivalence, atomic
CAS, SCF snapshot backup or automatic rollback/retry. These provider fixtures do not qualify another runtime. The exact Free 1.5.44
ZIP separately passed its Free-alone package gate; see the
verification matrix.
Use diviops_meta_info as the S0 preflight before dogfooding or product work. It returns server_version, a numeric tool_count, a tools catalog summary (registered_total, always-on count, Pro possible/registered counts by target), plugins version records for diviops-agent, diviops-agent-pro, FluentCart, and FluentCart Pro when available, plus the existing handshake and slice state. In regular npm/stdio sessions, successfully observed plugin, module, capability, and registered-tool fields are the immutable handshake snapshot that built the session catalog. The additive startup_capture record supplies its non-secret timestamp, exact covered evidence, independent-component compatibility rule, and deterministic reconnect guidance. A failed handshake instead reports startup_unavailable, a bounded startup_handshake_failed reason class, and no covered target evidence. After a supported plugin, theme, or target change, reconnect or restart MCP before treating meta_info, the registered tools, or capability gates as current. Live read tools such as diviops_fc_status remain separate current observations; they do not rewrite startup registry truth.
Launcher health mode keeps its stricter existing contract: diviops_meta_ping and diviops_meta_info re-observe model-visible target evidence on every call. The regular stdio startup_capture record does not alter launcher behavior, direct npm/stdio compatibility, or tool registration after initialization.
Additional conditionally-registered Pro tools appear only on sites that have the Pro plugin (diviops-agent-pro) active alongside the target coverage plugin:
| Category | Conditional gate | Tool names |
|----------|------------------|------------|
| FluentCart reads (V1) | Pro plugin + FluentCart installed + module enabled | diviops_fc_product_list, diviops_fc_product_get |
| FluentCart simple product writes (V2) | Pro plugin + FluentCart installed + module enabled | diviops_fc_product_create, diviops_fc_product_update, diviops_fc_product_delete |
| Optional product-create slug | Existing create tool; supplying slug additionally requires Pro capability fluentcart_product_create_slug from a fresh startup handshake | Native WordPress normalization/collision handling; dry-run reports intent without reservation, apply reads stored product.slug. Omission stays compatible; changed product titles still regenerate slugs. No slug-update/redirect support. |
| FluentCart variation read/write (V3) | Pro plugin + FluentCart installed + module enabled | diviops_fc_variation_list, diviops_fc_variation_update |
| FluentCart license-settings read/write, incl. update-file pointer + readiness (V3/V3.3) | Pro plugin + FluentCart Pro installed + module enabled | diviops_fc_license_settings_get, diviops_fc_license_settings_update |
| FluentCart managed downloads + license changelog (V3.4) | Pro plugin + FluentCart installed + module enabled | diviops_fc_download_list, diviops_fc_download_attach, diviops_fc_license_changelog_get, diviops_fc_license_changelog_update |
| FluentCart order readback + guarded mark-paid (V3.1) | Pro plugin + FluentCart installed + module enabled | diviops_fc_order_list, diviops_fc_order_get, diviops_fc_order_mark_paid |
| FluentCart license readback (V3.1) | Pro plugin + FluentCart Pro installed + module enabled | diviops_fc_license_list, diviops_fc_license_get, diviops_fc_license_activations_list |
| FluentCart checkout readiness / gateway inspection (V3.2) | Pro plugin + FluentCart installed + module enabled | diviops_fc_status, diviops_fc_gateway_list, diviops_fc_gateway_get |
| Cross-env reviewed layout rollout | Pro plugin + cross_env module enabled | diviops_cross_env_header_apply, diviops_cross_env_layout_apply |
| Managed recovery Phase 1A | Pro plugin + opt-in managed_recovery module enabled | diviops_managed_recovery_policy_get, diviops_managed_recovery_policy_preview, diviops_managed_recovery_policy_update, diviops_managed_recovery_retention_preview, diviops_managed_recovery_retention_apply, diviops_managed_recovery_audit_list |
| Managed recovery Phase 1B | Same opt-in module + Free protected restore service + managed_recovery_plan_v1 | diviops_managed_recovery_plan_check, diviops_managed_recovery_restore_apply |
When the gates are not satisfied, the tools simply don't appear on the MCP surface — no error envelope, no missing-capability hint. See the diviops-fluentcart skill bundle for the operator-side guide.
See server-reference.md for per-tool descriptions.
Native preset composition
diviops_preset_create and diviops_preset_update accept optional group_presets
for module presets only, stored as native root groupPresets, never in attrs:
{"group_presets":{"title.decoration.font":{"presetId":["existing-font-id"],"groupName":"divi/font"}}}Omit it to preserve existing links; {} replaces them with an empty map. Each
native slot binding requires a nonempty string-array presetId and groupName,
with optional nonnegative integer segmentBoundary. Slot/group compatibility
and target existence in that group bucket are checked before writing, also in
dry-run. No defaults or IDs are substituted. attrs.groupPresets rejects with
a corrective hint. New composition calls require preset_composition_v1;
older/unverified plugins refuse before dispatch, while omitted-link calls keep
their existing behavior. Reconnect after updating a supported plugin.
diviops_preset_inspect exposes the outgoing root map without resolving inherited
styles or broadening its partial consumer coverage. Preview writes nothing and
allocates no UUID; native Builder/rendering qualification remains separate.
Bundled CLI — diviops-preset
The package also ships a standalone command-line preset emitter, diviops-preset,
that produces byte-canonical Divi 5.5.x preset JSON gated by the verified-attrs
registry (data/verified-attrs.json). It is independent of the MCP stdio server —
run it directly. Current commands:
| Command | Emits |
|---|---|
| diviops-preset button [options] | divi/button group preset |
| diviops-preset heading-font [options] | divi/font group preset for divi/heading (Pattern A — Google Fonts — or Pattern B — local-hosted) |
| diviops-preset text-body-font [options] | divi/font-body group preset for divi/text — Pattern A (Google Fonts) only; Pattern B for body-text has no registered canonical shape and is refused |
| diviops-preset spacing [options] | divi/spacing group preset (currently divi/section only; padding + margin, desktop state). Other module cells are SCHEMA_OBSERVED and refused at the gate |
diviops-preset button --name "Primary" --bg-color gcid-primary-color \
--bg-color-hover gcid-secondary-color --radius 8px \
--font-family Inter --font-weight 600 --font-color gcid-body-color
diviops-preset heading-font --name "Heading H1" --pattern google \
--font-family Inter --font-weight 700 \
--font-color gcid-heading-color --font-size 48px
diviops-preset text-body-font --name "Body Text" --pattern google \
--font-family Inter --font-weight 400 \
--font-color gcid-body-color --font-size 16px
diviops-preset spacing --name "Section Rhythm" --module divi/section \
--padding-top 80px --padding-bottom 80px --margin-bottom 40px--dry-run (the default) composes and prints the canonical JSON with no
credentials and no network. --apply posts to the existing /preset/create
REST route, reusing the same WP_URL / WP_USER / WP_APP_PASSWORD env vars.
The CLI's coverage is intentionally narrow: only the (module, group, variant)
combinations whose canonical shape is VB-verified in the registry are
emittable. It is not an all-module or all-font-family emitter — each
additional vertical slice lands with its own verified evidence. See the
preset-cli reference
for the full command reference (the src/ tree is not part of the published
npm package — this link resolves on the repository).
Bundled CLI — diviops-cross-env-preflight
The package also ships a dry-run-only cross-environment Theme Builder header sync preflight:
diviops-cross-env-preflight --source source.json --target target.json --dry-runThis command reads two secret-free JSON files and prints a report. It does not
connect to WordPress, does not accept credentials, and has no write/apply path.
The CLI supports tb_header_layout, tb_footer_layout, and the bounded
staff-detail tb_body_layout recipe described below, preflighted against existing
same-kind targets. Header-only inputs retain the
shipped header-v1 report/fingerprint; footer and supported body inputs use the generic layout-v1
binding by default. Pass --contract layout-v1 to emit the generic binding for
a header rollout through diviops_cross_env_layout_apply; --contract
header-v1 explicitly selects the compatibility contract and accepts header
inputs only. It reports source-domain upload URL
rewrites, attachment remap status, gcid-* target resolution including Divi
built-in customizer colors, resolved target global-color value evidence,
referenced modulePreset target-presence status, off-canvas/canvas refusal, and
the required cache cleanup plan. Each report also emits a deterministic
confirmation_binding fingerprint over the reviewed source identity/checksum,
target identity/current target checksum, rewrite plan, cache plan,
blocker/operator-action codes, reference-resolution summaries, target module
preset resolution, and the per-gcid value evidence for target colors
referenced by the source layout.
The fingerprint is reviewed-plan evidence for the Pro-gated compatibility
diviops_cross_env_header_apply or generic diviops_cross_env_layout_apply
tool. The CLI itself still has no apply path.
The Free plugin advertises cross_env_footer_layout_evidence when its source
export and target-context routes support footer kinds. The server selects those
two tools' public enums only after handshake: older or unproven plugins retain
the shipped header-only schemas instead of advertising unsupported footer input.
Body evidence requires cross_env_staff_body_evidence; body apply additionally
requires cross_env_staff_body_apply alongside the existing Pro/module gates.
The existing footer/generic-apply flags alone do not authorize body promotion.
The body exception is limited to the existing diviops_staff recipe: native
current-post title, featured image, Post Content and the unchanged
custom_meta_diviops_staff_role binding with raw HTML off. The target must have
the registered CPT, one active applicable top-level text field named
diviops_staff_role with key field_diviops_staff_role, and one enabled,
non-default existing body assignment for all singular staff posts, with no
exclusions or conflicting same-condition assignment. Source/proposed content
must match this recipe; the existing target body can be replaced without already
containing it. Field definitions, target staff records and assignments are not
changed. Other CPTs/selectors, fixed-post/loop contexts, missing or ambiguous
fields, and prerequisite drift refuse. There is no general body migration or
field mapping. Source and target exports include a staff_body proof with
versioned evidence and a SHA-256 digest; the generic body confirmation binds both.
The field group must contain a standalone post_type == diviops_staff location
branch; other OR branches are allowed and remain part of the reviewed evidence.
Current prerequisite evidence is bound into confirmation and
independently recomputed by the target apply route. Source tests do not certify
a live cross-site rollout or authorize installation/release.
For this body recipe, diviops_cross_env_layout_apply accepts dry_run: true
with the reviewed fingerprint and confirmation to validate without mutation.
That option refuses non-body requests rather than silently applying them.
A real body write retains a snapshot through the existing Free recovery store;
dry-run and already-converged requests create no snapshot.
To collect the source JSON from the source WordPress site, call the Free/core
read-only MCP tool diviops_cross_env_source_export_get and save the returned
data object as source.json. The export includes the source origin, same-kind
layout metadata, sanitized markup, a bare SHA-256 checksum of the exported
markup, export metadata, and best-effort attachment inventory from upload URLs
and attachment IDs. It also inventories referenced attrs.modulePreset IDs
without exporting preset definitions. It strips query strings, fragments,
credentials, nonces, cookies, signed URL material, admin URLs, and local
filesystem paths.
The MCP server also writes the same source payload to a bounded local artifact
under .diviops-tmp/cross-env-source-payloads/ and returns
data.source_payload_ref. Use that reference for large real layouts when
calling a Pro layout apply tool; it avoids asking an LLM
to re-emit large markup byte-for-byte. The reference is a server-created handle
plus checksum, not an arbitrary filesystem path.
To collect the target JSON from the target WordPress site, call the Free/core
read-only MCP tool diviops_cross_env_target_context_get against the target
server and save the returned data object as target.json. Optional
source_asset_hints, source_upload_paths, and source_attachment_ids let the
target site search for media-library candidates. source_upload_paths preserves
exact path provenance, including for root-level filenames; basename-only hints
remain ambiguous when multiple target paths share a filename. No media is
uploaded and no global colors or layouts are created. The export includes a
SHA-256 checksum of the current target layout
post_content as destination_checksum so preflight can bind the reviewed plan
to the target state without exposing the raw target content. It also includes
global_color_value_evidence, a deterministic SHA-256 digest map for resolved
user global colors and WP Customizer-backed built-ins; preflight binds only the
entries that are referenced by source markup.
It also includes target D5 module preset IDs, without preset definitions, so the
preflight can fail closed when source markup references a module preset the
target site does not have.
For generic layout preflight it also includes exact target post type and
a canonical template-linkage digest over the active Theme Builder master ID,
its exact _et_template order, and linked-template slot, enabled, condition,
and exclusion evidence. Header/footer empty linkage uses master_template_ids: []
and links: []; bounded staff bodies require the isolated assignment above.
Assignment state is evidence only and is never mutated by rollout.
Workflow:
- Call
diviops_cross_env_source_export_geton the source site and save the returneddataobject assource.json. - Call
diviops_cross_env_target_context_geton the target site and save the returneddataobject astarget.json. - Run
diviops-cross-env-preflight --source source.json --target target.json --dry-run --contract layout-v1fordiviops_cross_env_layout_apply. Omit the contract flag (or selectheader-v1) only for the compatibility header apply tool.
--apply is intentionally refused. To mutate a target, use the separate
Pro-gated diviops_cross_env_layout_apply tool with the generic reviewed
fingerprint and either inline source_payload for small/disposable tests or
source_payload_ref for large layouts. The existing header tool remains the
header-v1 compatibility path. Both refuse media
upload/import, global color creation/import, off-canvas reconcile, and new
target layout creation.
Response contract
Tools return a standardized envelope. The shape lets clients branch on ok and machine-readable error.code without parsing freeform messages.
// Success
{ "ok": true, "data": <payload> }
// Failure
{ "ok": false, "error": { "code": "<code>", "message": "<human>", "hint": "<optional>" } }Standard error codes
| code | HTTP | meaning |
|---|---|---|
| not_found | 404 | Target ID does not resolve |
| invalid_input | 400 | Schema violation, malformed args |
| validation_failed | 400 | validate_blocks-detected shape error |
| conflict | 409 | Uniqueness collision |
| forbidden | 403 | Row-level WordPress auth signal |
| capability_missing | 412 | Connected plugin does not advertise the capability required by this tool; component versions are independent |
| wp_error | 500 | Underlying WordPress error |
| divi_error | 500 | Divi-specific error (block parser, validator, etc.) |
Namespace-specific codes
Namespaces extend the vocabulary using the <namespace>.<reason> convention — e.g. meta_wp_cli.command_failed, scf.not_configured, preset.bucket_mismatch, variable.customizer_default_immutable, seo.provider_absent, and seo.metadata_drift. Namespace-prefixed codes carry structured error.data documenting the failure (exit codes, conflicting fields, reference counts, checksums, rollback evidence, etc.). Per-tool descriptions name the codes each tool emits and the error.data shape that accompanies them.
Per-tool error.data extensions
Some tools attach a structured error.data payload alongside the code/message/hint envelope — e.g. meta_wp_cli carries { exit_code, stdout, stderr } on meta_wp_cli.command_failed, global_color_delete carries { id, ref_count, locations[], scan_truncated, scanned_posts[] } on conflict, and conflict-class adopters across canvas_*/library_*/variable_* echo the conflicting fields. The shape is per-tool and documented in each tool's description prose, not in this canonical envelope summary. The summary stays terse because (a) most tools never emit error.data and advertising it universally would be misleading, and (b) the per-tool shape diverges and data?: unknown would be information-free. The runtime mechanism is withCode's 4th data argument (server-local) / envelope_error()'s $data parameter (plugin-routed); both flow through wrapResponse to land on error.data.
dry_run plan shape
Every write tool accepts dry_run: boolean (default false). When true, the response carries a uniform plan shape and no state is mutated:
{
"ok": true,
"data": {
"dry_run": true,
"plan": {
"summary": "Would update 1 attr path(s) on module 'Hero CTA' (page #42, type divi/button).",
"changes": [
{ "kind": "module.update", "target": "page#42/divi/button/Hero CTA#button.decoration.font.font.desktop.value.color", "before": "#000", "after": "#ff0066" }
]
}
}
}meta_wp_cli and scf_import do not accept dry_run (raw passthrough / upstream gap respectively). scf_sync passes dry_run through to upstream wp scf json sync --dry-run, so its preview is the upstream plain-text summary rather than a plugin-built data.plan. For bulk preview-then-commit flows (preset reassign, preset cleanup), see safety-patterns.md.
Preset deletion requires preset_delete_exact_v1 for real dry-run or guarded preset_ids (1-200 exact IDs). Preview returns a registry checksum; exact-set apply requires it and rechecks defaults/references across all post content, postmeta and canonical preset definitions. Incomplete evidence refuses, and force cannot bypass exact-set checks. Legacy preset_id remains default-guard-only, with its existing force override. MCP never forwards new safety parameters to old or capability-unverified handlers, which could otherwise ignore dry_run and delete. See coverage, limits and nontransactional semantics.
Selected guarded post-content write tools also accept backup: true. In apply
mode the Free plugin stores an option-backed rollback snapshot before writing
and returns data.backup evidence with the snapshot id and status. With
dry_run: true, backup: true only reports the planned snapshot; it never
creates an option record.
diviops_rollback_snapshot_restore restores those snapshots only to their
captured post/page or Theme Builder layout target. It requires row-level edit
permission, refuses content or supported Divi post-meta drift before mutation,
uses the same full-content integrity/readback guard, and has no force override
or second pre-restore snapshot in this MVP.
diviops_seo_metadata_update accepts fixed semantic fields and requires the
checksum from diviops_seo_metadata_get. TSF retains its title/description
set/clear contract and request-local rollback. The Rank Math
adapter supports exactly 1.0.279 and 1.0.280 and adds canonical_url set/clear and noindex set with the string
value noindex, on pages only. It requires per-page edit permission and Rank
Math general/advanced metadata capabilities. Other robots writes are refused.
Preview with dry_run:true. Rank Math noindex preserves other directives;
when those directives were inherited, the preview explains that the local
robots array will pin them. A computed canonical is not proof of an emitted
tag: Rank Math suppresses canonical output under noindex. Frontend filters and
query context require separate verification.
Every non-noop Rank Math apply saves a private typed recovery record and returns
snapshot_id. To preview or apply restoration, call the same update tool with
restore_snapshot_id, a fresh expected_checksum, and no changes. Restore
checks the provider/version/page and current permissions, refuses third-party
changes to affected fields, and preserves later changes to untouched fields.
Records use non-autoloaded options, have no automatic expiry and remain until
operator cleanup; they are not listed or restored by the page-content snapshot
tools. A failed or uncertain response can include applied changes: retain its
snapshot ID and inspect state rather than retrying blindly. Provider sitemap
invalidation does not establish external cache eviction.
TSF 5.1.4 additionally supports page canonical_url set/clear and noindex
set with noindex or reset_default without a value. Use the additive
indexing.checksum from a fresh read for these operations and their typed
restore_snapshot_id; retain the top-level checksum for title/description.
Do not mix text and indexing changes. Reset resumes provider inheritance;
it does not force indexing. Other robots fields keep their inherited state.
TSF retains a custom canonical under noindex and suppresses generated fallback.
Homepage canonical settings can override a page value. Typed recovery records
have no automatic expiry and require operator cleanup.
Historical indexing qualification used MCP 1.5.71 with Free Agent 1.5.42. Native Classic editor save/reopen, frontend canonical/robots, primed sitemap exclusion and restoration, defaults drift and permission refusal passed on WordPress 7.1, PHP 8.3 and Divi 5.13.1 for Rank Math 1.0.279 and TSF 5.1.4. TSF additionally passed exact empty/zero/force-index restore and homepage/scheme checks. Block editor, other provider versions, external cache eviction and MCP stdio runtime are outside that historical qualification. A separate 2026-10-14 run passed the bounded Rank Math 1.0.279 → 1.0.280 upgrade and metadata/indexing/recovery workflows; see the current matrix. Rank Math title/description set/clear uses the same plain-text safety checks, top-level checksum and typed recovery. Its separate native qualification passed both page save/reopen paths, frontend output, clear/default fallback, exact absent/empty/template recovery and legacy-record compatibility. Refresh checksums after updating; legacy canonical/noindex recovery records remain supported. Computed text may contain unresolved provider templates and is not a verified frontend tag. Yoast, social/schema and bulk edits remain outside these adapters. See the Rank Math contract and TSF contract.
Rank Math stored-value inspection (source candidate)
diviops_seo_storage_inspect({post_id, provider:"rank_math"}) is a separate
Free inspector requiring affirmative seo_storage_inspect plugin capability.
Older or capability-unverified connections refuse before a request; there is no
fallback. Plugin and MCP updates are separate; this source addition has not yet
been released or native-qualified.
It reports literal rank_math_title, rank_math_description,
rank_math_canonical_url and rank_math_robots values for one authorized page,
including on unreviewed provider versions. It requires active declared Rank Math
identity, page edit and both Rank Math on-page permissions, plus permission for
each fixed metadata key. Multiple active supported SEO providers refuse.
Duplicate, invalid or oversized storage refuses without partial values; missing
and empty differ. Each value is at most4096 UTF-8 bytes; robots serialization is
returned as text, never decoded. No caller-selected keys or generic SQL access.
inspection_only:true is not provider compatibility, effective SEO, a checksum,
a write plan, recovery evidence or an operation outcome. Treat strings as
untrusted data. Never infer retry safety from matching values. Existing exact
Rank Math/SCF gates and Pro behavior are unchanged; TSF and SCF inspection are
outside this slice. WordPress bootstrap and ordinary hooks still run. See the
bounded storage contract.
_meta.idempotent markers
Every tool's _meta.idempotent field documents how it behaves under repeat calls with identical inputs. Some tools are silent-success idempotent (e.g. page_trash on an already-trashed post returns ok: true with data.already_trashed = true); others are side-effect-equivalent (re-running produces the same final state via different intermediate effects). See idempotency-audit.md for the per-tool record.
Configuration
Environment variables
| Variable | Required | Description |
|----------|----------|-------------|
| WP_URL | Yes | WordPress site URL (e.g. http://mysite.local) |
| WP_USER | Yes | WordPress username with Editor or Admin role |
| WP_APP_PASSWORD | Yes | Application Password (spaces stripped) |
| WP_PATH | No | WordPress filesystem path for Local by Flywheel, or wrapper working directory when WP_CLI_CMD needs project context |
| WP_CLI_CMD | No | Custom WP-CLI command prefix for containerized environments (e.g. ddev wp, npx wp-env run cli wp) |
| LOCAL_SITE_ID | No | Override auto-detection of Local by Flywheel site ID |
| DIVIOPS_WP_CLI_ALLOW | No | Opt-in extended WP-CLI commands — see wp-cli-security.md |
| DIVIOPS_WP_CLI_SAFE_FS_ROOT | No | Path to constrain filesystem-touching wp-cli commands. Required in WP_CLI_CMD wrapper mode |
| DIVIOPS_WP_CLI_UNSAFE_FS | No | Set to 1 to disable filesystem flag validation entirely |
Containerized environments
The server connects via standard WordPress REST API and works with any environment that exposes WordPress over HTTP with Application Password support — Local by Flywheel, DDEV, wp-env, WordPress Studio, DevKinsta, custom hosts. See setup-guide.md for environment-specific WP_CLI_CMD examples and HTTPS / WP_ENVIRONMENT_TYPE notes.
Troubleshooting
Common quick fixes — full reference in troubleshooting.md.
- "Missing required environment variable(s)" — ensure
WP_URL,WP_USER,WP_APP_PASSWORDare all set onclaude mcp add. npxfails with "could not determine executable to run" — usenpx -y --package @diviops/mcp-server diviops-mcp; this explicitly selects the MCP server bin.- "Connection failed" — verify the plugin is active by visiting
{WP_URL}/wp-json/diviops/v1/schema/settings; test the credentials withcurl -u "user:pass" …. - "This tool requires plugin capability" — the connected plugin does not advertise the capability this tool needs. Server and plugin versions are independent; install a compatible plugin from the same DiviOps suite release or a newer supported component, then reconnect or restart the MCP session to refresh the handshake.
- Cancelled
diviops_module_update: MCP request cancellation is forwarded to the HTTP request, including pending response-body reads. Once dispatched, the WordPress write outcome remains unknown: cancellation does not verify that the write stopped, made no changes, or rolled back. Do not automatically retry; use readback and existing rollback evidence to determine any later action. - Preset edits not visible on the frontend — Divi serves frontend CSS from
wp-content/et-cache/{post_id}/, whichwp cache flushdoesn't touch. Usediviops_meta_flush_cacheafter preset writes;post_idmode also sweeps that exact directory and reportspost_dir_sweepevidence.
Learn more
- setup-guide.md — full onboarding walkthrough (containerized envs, HTTPS, Application Passwords)
- server-reference.md — full per-tool reference table
- wp-cli-security.md — allowlist, extended commands, FS validation
- safety-patterns.md — Pattern A (refuse-with-override) + Pattern B (preview-then-commit) + universal
dry_run - troubleshooting.md — common errors and resolutions
- idempotency-audit.md — repeat-call semantics per tool
diviops-divi-5skill — block format rules, design patterns, workflow guidance (ships in the dist repo)
Requirements
- Node.js >= 22.0.0
- PHP >= 7.4
- WordPress >= 6.5
- Divi 5 theme active
- DiviOps Agent WordPress plugin installed and active
License
MIT
