# Site Launch Readiness

> The wp_prepare_for_launch composer in Royal MCP Pro runs 5 read-only health checks in one MCP call: backup, SEO, broken links, TTFB performance, and security.

- Canonical: <https://royalplugins.com/support/royal-mcp-pro/site-launch-readiness/>
- HTML version: <https://royalplugins.com/support/royal-mcp-pro/site-launch-readiness/>

---

End-to-end walkthrough for the `wp_prepare_for_launch` composer. Runs 5 read-only health checks (backup + SEO + broken links + TTFB perf + security) in one MCP call and returns a rolled-up report. Named for the "am I ready to ship this?" moment, but used more often as a routine monthly / pre-campaign health check.

When to run this

- About to flip a staging site to production for the first time
- About to publish a large content push or start a marketing campaign
- Monthly routine "is this site still healthy" check
- Post-update sanity: after a plugin/theme update batch, confirm nothing regressed
- Handing a client site over from build phase to their own team
- Before a support conversation with hosting ("here's what's actually failing right now")

## Prerequisites

- Royal MCP Pro installed and licensed (see [Getting Started](https://royalplugins.com/support/royal-mcp-pro/getting-started/))
- MCP client connected to your site
- Cap: `manage_options` (required for the composer to run at all)
- Optional: SiteVault Pro (for the backup step to actually fire — skipped-with-note when absent)
- Optional: SEObolt Pro (for the SEO step to return the full audit — falls back to basic native scan when absent)
- Optional: GuardPress Pro (for the security step to return the full security overview — falls back to basic wp-config checks when absent)

## The 5 checks, in order

### backup\_snapshot

Kicks off a SiteVault backup so you have a known-good restore point before shipping. Skips silently when SiteVault isn't active or when `skip_backup: true` is passed.

#### Skip condition

The step evaluates as skipped (status not run) when either: (a) `skip_backup: true` was passed, OR (b) SiteVault isn't installed / active. Neither condition is an error; both are surfaced with `status: skipped`.

#### When it fires

Calls SiteVault's backup entry function. Returns `{via: 'sitevault_create_backup', id, result}` on success. Whether the actual backup completes synchronously or runs in the background depends on SiteVault's own configuration — check SiteVault's backup log to confirm completion rather than assuming the tool response means done.

### seo\_audit

Confirms basic on-page SEO surfaces are present on the home page. Uses SEObolt Pro if installed; otherwise fetches home HTML and does a native scan.

#### SEObolt path

Returns `{via: 'seobolt', note: 'SEObolt is active — run its Audit page for full report'}`. The composer intentionally doesn't duplicate SEObolt's audit — it just confirms the plugin is available and hints at where the full report lives.

#### Native fallback

Fetches `home_url('/')` and checks the returned HTML for: `has_title` (a `<title>` tag with at least 5 chars), `has_meta_description` (a `<meta name="description">`), `has_h1` (at least one `<h1>`). Returns all three booleans in the response.

If the home page can't be fetched at all, this step returns `status: error, message: 'could not fetch home page'` — usually a symptom of the site being genuinely broken (500 error, DNS issue, hosting-layer WAF blocking self-requests).

### broken\_link\_scan\_home

Extracts `href` and `src` attributes from the home page pointing at same-origin URLs, HEAD-checks the first 25 unique ones, reports any that return 400+ or fail to connect.

#### Scope + limits

- **Home page only.** The scan is not site-wide — only URLs referenced on the home page get checked.
- **Same-origin only.** External links (to social media, partner sites, CDNs on a different domain) are skipped.
- **Capped at 25 unique URLs.** A home page with dozens of internal links gets its scan truncated to the first 25 after dedup.
- **3-second HEAD timeout per URL.** Slow-to-respond URLs count as broken (`code: 0`).

#### Response shape

Returns `{sampled, broken_count, broken_urls: [{url, code}]}`. `code: 0` means the HEAD request itself failed (timeout, DNS, connection refused).

### perf\_check\_ttfb

Times a single GET request to the home page. Returns time-to-first-byte in milliseconds and the HTTP status code.

#### How it measures

Records `microtime(true)`, fires `wp_safe_remote_get(home_url('/'), ['timeout' => 8])`, records elapsed time on response. Returns `{home_elapsed_ms, home_status}`.

#### What to read from it

- **Under 400ms:** healthy for most stacks. No action needed.
- **400–1000ms:** workable but a page-cache miss or first-visitor cold start could push it into user-perceptible territory.
- **1000ms+:** likely user-visible. Check page cache is working, image sizes, database query count.
- **Over 8000ms:** exceeds the tool's timeout — step returns `status: error`. Genuine hosting-layer problem or the site is straight-up unreachable.

One measurement is noisy — run the composer 2-3 times and take a rough median. Sub-second differences between runs are normal.

### security\_status

Confirms basic security posture. Uses GuardPress Pro if installed; otherwise checks wp-config flags directly.

#### GuardPress path

Returns `{via: 'guardpress', note: 'GuardPress active — see its Overview page'}`. Like the SEO step, the composer defers to GuardPress's own security dashboard rather than duplicating it.

#### Native fallback

Returns `{via: 'native_scan, wp_debug_enabled, wp_debug_display, disallow_file_edit, file_mods_allowed, is_ssl}`. Each flag is a boolean read from constants and helpers:

- `wp_debug_enabled` should be **false** in production
- `wp_debug_display` should be **false** in production (never expose PHP errors)
- `disallow_file_edit` should be **true** in production (locks down wp-admin theme/plugin editor)
- `file_mods_allowed` should be **true** for auto-updates to work; can be false on managed hosts that push updates externally
- `is_ssl` should be **true** for any modern production site

## Running the check

### Basic call

The tool takes no required arguments. Just ask your AI:

```
Run wp_prepare_for_launch on my site and summarize what's flagged.
```

Response shape (with all 5 steps returning ok):

```
{
  "isError": false,
  "content": [
    { "type": "text", "text": "Launch readiness (best_effort): 5 ok, 0 skipped, 0 error." }
  ],
  "structuredContent": {
    "compose_mode": "best_effort",
    "dependencies_probed": {
      "sitevault":  { "available": true },
      "seobolt":    { "available": false },
      "guardpress": { "available": false }
    },
    "steps": [
      { "name": "backup_snapshot",       "status": "ok", "reversible": false, "data": { "via": "sitevault_create_backup", "id": "bk_123" } },
      { "name": "seo_audit",             "status": "ok", "reversible": false, "data": { "via": "native_scan", "has_title": true, "has_meta_description": true, "has_h1": true } },
      { "name": "broken_link_scan_home", "status": "ok", "reversible": false, "data": { "sampled": 18, "broken_count": 0, "broken_urls": [] } },
      { "name": "perf_check_ttfb",       "status": "ok", "reversible": false, "data": { "home_elapsed_ms": 312, "home_status": 200 } },
      { "name": "security_status",       "status": "ok", "reversible": false, "data": { "via": "native_scan", "wp_debug_enabled": false, "wp_debug_display": false, "disallow_file_edit": true, "file_mods_allowed": true, "is_ssl": true } }
    ],
    "counts":  { "ok": 5, "skipped": 0, "error": 0 },
    "summary": { "…": "rolled-up launch_summary object" }
  }
}
```

### Skip the backup step

If you just took a backup manually or don't need one for this check:

```
Run wp_prepare_for_launch with skip_backup=true.
```

The `backup_snapshot` step is evaluated as `skipped` in the response and counted separately.

### Compose mode variants

Same three modes as every other composer (see [Cross-plugin Composers](https://royalplugins.com/support/royal-mcp-pro/cross-plugin-composers/#compose-modes)):

- **`best_effort` (default):** every step runs independently. A failing step is recorded and the composer moves on.
- **`strict`:** first failing step aborts the composer. Useful if you want a hard-stop on any red flag.
- **`report_only`:** lists which steps would run but doesn't execute them. Useful if you're piping the composer's plan into a runbook.

## Acting on each failure type

### `backup_snapshot` failed

SiteVault fired but the backup itself errored. Check SiteVault's backup log in wp-admin for the actual failure reason. Common causes: disk-space limit on cloud storage, credential rotation, cron not firing. If SiteVault isn't the problem, the composer step's error message tells you what the entry function returned.

### `seo_audit` shows missing title / description / h1

Fix in whichever tool you use for SEO meta:

- Missing title: check theme's `<head>` template or SEO plugin's home-page title setting
- Missing meta description: set one in Yoast / Rank Math / SEOPress / AIOSEO / SEObolt home settings
- Missing h1: check theme, or add a Section Heading module (Divi) / Heading widget (Elementor) at the top of the home page

### `broken_link_scan_home` reports broken URLs

For each URL in `broken_urls`:

- **404:** the target post/page was deleted or renamed. Either restore it, redirect to a live equivalent (via the Redirection plugin + `redirection_bulk_import`), or edit the source home-page reference.
- **500:** the target renders but errors out. Fix the target's underlying error (WP\_DEBUG\_LOG will have specifics).
- **0 (connection failed):** DNS problem, hosting-layer WAF blocking self-requests, or a firewall between WP and its own site. Same class of issue as most Royal MCP host-layer problems — see [Free Troubleshooting](https://royalplugins.com/support/royal-mcp/troubleshooting-start-here/).

### `perf_check_ttfb` over 1000ms

- Verify page cache is working (ForgeCache, WP Rocket, LiteSpeed Cache, W3 Total Cache — whichever you use). If cache-status header says MISS on repeated requests, cache isn't warming.
- Check image weight on home page (large images = large HTML response = higher TTFB even before rendering).
- Check for slow DB queries (Query Monitor plugin will show them per request).
- Check for outbound API calls in the home-page render path (weather widgets, currency converters, third-party embeds).
- If none of the above: escalate to your host with the TTFB numbers. Might be shared-hosting neighbor-noise or server-config issues.

### `security_status` shows a risky flag

- `wp_debug_enabled: true` in production: set `define('WP_DEBUG', false);` in wp-config.php (leave WP\_DEBUG\_LOG on if you want log-only debugging).
- `wp_debug_display: true`: set `define('WP_DEBUG_DISPLAY', false);` in wp-config.php. Never expose PHP errors to visitors.
- `disallow_file_edit: false`: add `define('DISALLOW_FILE_EDIT', true);` to wp-config.php. Prevents in-admin theme/plugin file edits.
- `is_ssl: false`: your site is on plain HTTP. Get an SSL cert (Let's Encrypt is free via most hosts), install it, update WP address settings to https://, add a permanent redirect.

## Common scenarios

### Staging-to-production flip

Run the composer on staging first to establish a healthy baseline, then run again immediately after flipping DNS or migrating to prod. Compare the two reports — any step that was ok on staging and now shows error on prod is your first diagnostic target.

### Monthly agency health check across 20+ client sites

Same composer call on each site. Log the response to a shared spreadsheet (TTFB numbers over time are especially valuable — a slow-creeping upward TTFB trend catches degradation before customers complain).

### Pre-content-push safety net

Big content push planned for tomorrow morning? Run this the night before. Any red flag caught now is easier to fix than firefighting during peak-traffic launch hour.

### Post-plugin-update regression scan

Update WordPress core + a batch of plugins → run this composer. If TTFB spiked or a security flag flipped from safe to risky, you know which update batch caused it. Rollback is easier when you know what changed and when.

## Related documentation

- [Cross-plugin Composers reference](https://royalplugins.com/support/royal-mcp-pro/cross-plugin-composers/) — full args + `compose_mode` framework for all 4 composers
- [SEO Audit → Fix → Report workflow](https://royalplugins.com/support/royal-mcp-pro/seo-audit-fix-report-workflow/) — the deeper SEO check that `wp_prepare_for_launch`'s seo\_audit step defers to when SEObolt is active

## Still Stuck? Two-Step Support Path

If the 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.

For Pro-specific patterns:

- [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 composer still isn't working, 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**
- **Royal MCP Pro version**
- **Which sibling Royal Plugins are active** — SiteVault, ForgeCache, GuardPress, SEObolt + version numbers (the composer routes through these when available)
- **Which MCP client**
- **The full `steps` array from the response** including `status`, `message`, and `data` for each step
- **Whether re-running the composer produces the same result** or if it's intermittent (TTFB and broken-link scans are especially variable)
- **Screenshot of the Pro tool row in Audit Log** with View Details expanded

[← Bulk Price Updates + Undo](https://royalplugins.com/support/royal-mcp-pro/bulk-price-updates-with-undo/)
[SEO Audit → Fix → Report →](https://royalplugins.com/support/royal-mcp-pro/seo-audit-fix-report-workflow/)
