# Cross-plugin Composers

> Reference for the 4 cross-plugin composers in Royal MCP Pro: publish with backup and cache purge in one call, launch readiness, monthly report, theme assets.

- Canonical: <https://royalplugins.com/support/royal-mcp-pro/cross-plugin-composers/>
- Last updated: 2026-09-20
- HTML version: <https://royalplugins.com/support/royal-mcp-pro/cross-plugin-composers/>

---

Complete reference for the 4 cross-plugin composer tools in Royal MCP Pro. These orchestrate multiple plugins (SiteVault, ForgeCache, SEO plugins, GuardPress) plus core WordPress in a single MCP call — publishing with backup + cache purge in one shot, site launch readiness rollups, monthly maintenance reports, and site-wide theme asset URL migration.

## The `compose_mode` framework

Every composer accepts a `compose_mode` argument controlling how multi-step operations behave when one step fails. Three modes:

| Mode | What happens on step failure | Best for |
| --- | --- | --- |
| `strict` | Abort the composer immediately. If reversible steps ran successfully before the failure, they get rolled back. | Destructive workflows where partial completion is worse than nothing (e.g., publish-and-promote). |
| `best_effort` | Log the failure, continue with remaining steps. Response's steps array reports per-step status. | Read-only rollups where partial data is still useful (e.g., launch readiness, monthly reports). |
| `report_only` | Run every step in dry-run / read-only fashion. Never writes; returns what WOULD happen. | Previewing what a composer would do before committing. |

Defaults per tool:

- `wp_publish_and_promote_pro` → default `strict`
- `wp_prepare_for_launch` → default `best_effort`
- `wp_monthly_maintenance_report` → default `best_effort`
- `wp_migrate_theme_assets` → default `best_effort`

## Graceful degradation on missing plugin deps

Composers orchestrate multiple plugins — but they don't refuse when a plugin isn't installed. Instead, individual steps skip with a note in the response's per-step status. Examples:

- `wp_publish_and_promote_pro` tries to fire a **SiteVault pre-backup**. If SiteVault isn't active, the step is skipped-with-note and the composer continues to the next step.
- Same tool tries to **purge ForgeCache** after publish. If ForgeCache isn't active, skipped-with-note.
- Same tool routes **SEO meta** to whichever SEO plugin is active (Yoast / Rank Math / AIOSEO / SEObolt) — auto-detects. If none is active, SEO meta step is skipped-with-note.
- `wp_prepare_for_launch` tries to use SEObolt for the SEO audit step, falls back to native basic checks if SEObolt isn't installed.
- `wp_prepare_for_launch` tries to use GuardPress for the security status step, falls back to native basic checks.

The composer response's per-step details always tell you which plugin was used (or which fallback was used, or which step was skipped entirely).

## The 4 tools

### wp\_publish\_and\_promote\_pro

Full publish workflow with rollback: SiteVault pre-backup (when available) → featured image sideload → create post → set featured → categories/tags → SEO meta (Yoast/Rank Math/AIOSEO/SEObolt auto-detect) → ForgeCache purge (when available).

#### Arguments

| Name | Type | Description |
| --- | --- | --- |
| `title` required | `string` | Post title. |
| `content` required | `string` | Post body content (HTML / blocks). |
| `status` | `string` | Publish state. One of `publish` (default) / `draft` / `pending` / `private` / `future`. |
| `publish_date` | `string` | MySQL datetime (`YYYY-MM-DD HH:MM:SS`). If in the future + `status=publish`, WP auto-schedules it. |
| `featured_image_url` | `string` | Optional. Public URL to sideload as the post's featured image. Rolled back on strict-mode failure. |
| `category` | `string` | Category name — created if it doesn't exist. |
| `tags` | `array<string>` | Tag names to attach. WP creates any that don't exist. |
| `seo_title` | `string` | SEO title tag (routed to Yoast / Rank Math / AIOSEO / SEObolt, whichever is active). |
| `seo_description` | `string` | Meta description (routed to detected SEO plugin). |
| `seo_focus_keyword` | `string` | Focus keyword for the detected SEO plugin. |
| `compose_mode` | `string` | `strict` (default) / `best_effort` / `report_only`. |
| `pre_backup` | `boolean` | Trigger SiteVault snapshot before writing. Default `true` when SiteVault is active; skipped-with-note when absent. |
| `post_purge_cache` | `boolean` | Purge ForgeCache after publishing. Default `true` when ForgeCache is active; skipped-with-note when absent. |

Undo: 72h token — deletes the created post + attached media (sideloaded featured image).

### wp\_prepare\_for\_launch

Read-only site-readiness rollup: backup snapshot (SiteVault), SEO audit (SEObolt or native), broken-link scan of home-page same-origin refs, TTFB perf check, security status (GuardPress or native).

#### Arguments

| Name | Type | Description |
| --- | --- | --- |
| `compose_mode` | `string` | `strict` / `best_effort` (default) / `report_only`. |
| `skip_backup` | `boolean` | If `true`, skip the SiteVault backup step. Useful when a backup was just taken or when SiteVault isn't installed. |

No undo (read-only tool).

### wp\_monthly\_maintenance\_report

Read-only monthly rollup: pending plugin updates, WP\_DEBUG\_LOG tail, SiteVault last-backup status, Royal MCP Pro audit-log tool-call summary for the window, home-page perf snapshot.

#### Arguments

| Name | Type | Description |
| --- | --- | --- |
| `compose_mode` | `string` | `strict` / `best_effort` (default) / `report_only`. |
| `window_days` | `integer` | How many days back to summarize (audit-log rollup, backup recency, etc.). Range 1–365. Default 30. |

Attachment gating for privacy

By default the response contains only the summary + an admin-view URL. The **full report attachment** (which can contain more sensitive data like error log contents) is gated behind the `royal_mcp_pro_maintenance_report_include_attachment` filter. Admins who want the full attachment inline in the MCP response can opt in via a small mu-plugin:

```
add_filter( 'royal_mcp_pro_maintenance_report_include_attachment', '__return_true' );
```

Without the filter, the attachment lives only at the admin-view URL (protected by admin authentication), not in the AI's chat log.

No undo (read-only tool).

### wp\_migrate\_theme\_assets

Rewrite theme-scoped asset URLs (`/wp-content/themes/{from}/` → `/wp-content/themes/{to}/`) across `post_content` on the specified post types. Handles both raw and JSON-escaped slash variants. Snapshots every touched post.

#### Arguments

| Name | Type | Description |
| --- | --- | --- |
| `from_theme_slug` required | `string` | Source theme slug being replaced (as it appears in the `/wp-content/themes/<slug>/` URL path). |
| `to_theme_slug` required | `string` | Destination theme slug to substitute in. |
| `dry_run` | `boolean` | If `true`, report matches without writing. No undo token issued in dry\_run. |
| `compose_mode` | `string` | `strict` / `best_effort` (default) / `report_only`. |
| `post_types` | `array<string>` | Which post types to scan. Default `[post, page]`. Add custom types (e.g. `product`, `elementor_library`) to broaden the sweep. |

#### Example

```
Do a dry run of wp_migrate_theme_assets from theme "twentytwentythree" to theme "custom-child" across post, page, and product post types.

If the dry run looks clean, commit with dry_run=false.
```

Undo: 72h token — restores prior `post_content` per touched post.

## Related documentation

- [**Site Launch Readiness workflow**](https://royalplugins.com/support/royal-mcp-pro/site-launch-readiness/) — end-to-end flagship guide for `wp_prepare_for_launch`
- [Universal Audit Log](https://royalplugins.com/support/royal-mcp-pro/#audit-log) — the `wp_monthly_maintenance_report` rollup pulls from this
- [Undo Tokens explainer](https://royalplugins.com/support/royal-mcp-pro/#undo-tokens)

## Still Stuck? Two-Step Support Path

If a composer isn't running the steps you expected, work through these two steps in order.

### Step 1: Start with the Royal MCP Troubleshooting Guide

[**Royal MCP Troubleshooting — Start Here**](https://royalplugins.com/support/royal-mcp/troubleshooting-start-here/) covers MCP-layer issues. If Claude can't reach your site, the composer never fires.

For Pro-specific patterns:

- [Undo token errors](https://royalplugins.com/support/royal-mcp-pro/undo-token-errors/) — expired, consumed, or handler missing
- [Pro tool returned upgrade prompt with valid license](https://royalplugins.com/support/royal-mcp-pro/pro-tool-returned-upgrade-prompt/)

### Step 2: Email priority support

If you've worked through Start Here and the relevant Pro-specific doc and the issue still isn't resolved, email priority support from your purchase email address at **[support@royalplugins.com](mailto:support@royalplugins.com)**. Priority email support is included with your license — typical response within 24 hours. **Never include your license key in email**; we look it up from your purchase address.

What to include in your email

- **Your hosting provider** (SiteGround, Cloudways, Hostinger, Kinsta, WP Engine, Liquid Web, self-hosted VPS, etc.)
- **Royal MCP Pro version** from WP Admin → Plugins
- **Which composer** you called and the **full args** you passed (including `compose_mode`)
- **Which sibling Royal Plugins are active** — SiteVault, ForgeCache, GuardPress, SEObolt, RAIF, Royal SMTP, etc. + version numbers
- **Which third-party plugins are active** that a composer might touch — Yoast SEO, Rank Math, AIOSEO, WooCommerce, etc.
- **Active caching plugins** (LiteSpeed Cache, WP Rocket, W3 Total Cache, SpeedyCache, Hummingbird, none)
- **Active security plugins** (Wordfence, Defender Pro, Solid Security, NinjaFirewall, none)
- **Which MCP client** — claude.ai web custom connector, Claude Desktop with `mcp-remote`, ChatGPT MCP, Cursor, or another MCP-compatible client
- **The composer's per-step response** (the `steps` array showing which succeeded, which errored, which skipped)
- **Screenshot of the most recent `oauth:` row in Activity Log** AND **the most recent Pro tool row in Audit Log** with View Details expanded (or confirmation that the logs are empty after a reproduced failure)

[← WooCommerce Bulk Tools](https://royalplugins.com/support/royal-mcp-pro/woocommerce-bulk-tools/)
[SEO Agency Suite →](https://royalplugins.com/support/royal-mcp-pro/seo-agency-suite/)
