# Manage every WordPress site at once with OpenCode

> Managing every WordPress site at once with OpenCode means asking the terminal agent for one xSpeed Hub action across your whole workspace and reading a result for each site when it returns.

Page: https://xspeedcache.com/agent/opencode/fleet/
Last updated: October 2026

OpenCode is open source and lives in your terminal, which makes it a natural home for an agency developer who wants the same tool for code and for operations. After a deploy that affects the whole portfolio, you ask it to clear every cache and warm them again. It calls purge_cache and start_preloader on the xspeedhub server with site set to "all", and the Hub processes the sites one after another with a pause of a second each, so a dozen sites take about twelve seconds.

The output is one result per site, each with ok and either data or an error, and OpenCode can lay that out in plain text. If the call clears eleven and fails one, you get the name of the one and the reason. The seven tools that accept "all" are purge_cache, toggle_cache, update_settings, start_preloader, stop_preloader, optimize_site and run_benchmark. For others, such as get_settings, OpenCode names the site and repeats the call.

Most OpenCode permissions default to allow, so with no rule of yours a Hub write tool runs without a prompt, site: "all" included. You change that with ask, allow and deny rules on the tool names, which carry the server prefix, such as xspeedhub_purge_cache. For a purge, toggle, settings change or preloader call on every site, the Hub tells the agent to confirm once, which is advice to the model and does not name optimize_site. A read-only connection (the connection token with Read-only everywhere on, or a Viewer sign-in) is the setting that refuses all writes whatever OpenCode is configured to do.

## Set up OpenCode once

### 1. Put your sites in xSpeed Hub

Sign in at app.xspeedcache.com with Google or email; the Hub is free and has no site cap. Then connect each WordPress site from its own dashboard: click Connect Hub in the xSpeed Cache top bar, then Connect via xSpeed Hub. Each site needs the free xSpeed Cache plugin.

### 2. Add xSpeed Hub to your config

Put this block in your global config, or in opencode.json at a project root to scope it to that project. OpenCode reads both JSON and JSONC. No other field is needed: when the Hub answers 401, OpenCode starts the OAuth flow and registers itself through dynamic client registration.

File: `~/.config/opencode/opencode.json`

```jsonc
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "xspeedhub": {
      "type": "remote",
      "url": "https://app.xspeedcache.com/xspeed/mcp"
    }
  }
}
```

### 3. Sign in with opencode mcp auth

Run this once. It opens a browser page on xSpeed Hub where you sign in and approve access. There is no token to paste; OpenCode stores the credentials it receives. Run opencode mcp list to see the server and its auth status, and opencode mcp debug xspeedhub if the connection fails.

```bash
opencode mcp auth xspeedhub
```

Full setup: https://xspeedcache.com/agent/opencode/

### Before you send a prompt that changes something

Reads change nothing on your sites, though contact_support emails xSpeed support. Writes run once your connection allows them, so your client's approval prompt and a read-only connection (the token's Read-only everywhere switch, or a Viewer sign-in) are the gates that matter. OpenCode checks MCP tools against its permission rules under the prefixed name, such as xspeedhub_purge_cache, and most permissions default to allow. With no rule of yours in place, a Hub write tool runs without a prompt. Add rules to change that: "xspeedhub_*": "ask" first, then "xspeedhub_get_*": "allow" and "xspeedhub_list_*": "allow", because the last matching rule wins. A deny rule holds even under opencode --auto, which approves everything that is not denied. The Hub itself has no confirmation step, so these rules and read-only access are the gates. For read-only access, send the connection token with Read-only everywhere on, or sign in as a Viewer member.

## Prompts

- Use xSpeed Hub to purge every site, start the preloader on each, and print one line per site with the outcome.
- With xSpeed Hub, run the benchmark on all sites and output a Markdown table of cached and uncached times.
- Using xSpeed Hub, which sites failed the last fleet purge? Run it again for only those handles.

## Example session

```
You: Deploy is live. Use xSpeed Hub to purge all sites.
  → list_sites [read-only]: 12 sites in the workspace
Agent: This will touch all 12 sites with a full purge. Go ahead?
You: Go ahead.
  → purge_cache(site: all, type: all) [changes site]: 11 of 12 purged; client-d timed out
  → purge_cache(site: client-d, type: all) [changes site]: purged
Agent: All 12 sites are clear. client-d timed out on the first pass, and the retry on that site alone went through.
```

## How it works

1. **See what you can reach**: list_sites returns each site's handle, URL, status and scopes. When you have more than one workspace, list_workspaces returns each one's handle, id, your role, its site count, which one is the default, and whether this connection can reach it.
2. **Choose the scope of the call**: The agent passes site: "all" for every site in one workspace, or an array of handles for exactly those sites. For a workspace other than the default it also passes the workspace argument. Omit workspace and the call acts on the default workspace.
3. **Confirm once**: Before a purge, toggle, settings change or preloader call that touches every site, the Hub tells the agent to say "this will touch all N sites" and wait for you, then make one call. That instruction does not name optimize_site, so for it your client's prompt is the gate. It is guidance to the agent, not a lock. It is one tool call, so one approval in your client covers every site in it.
4. **Run it as one call**: The Hub runs the sites one after another with a one-second pause between live calls, so a fleet purge is not a burst of traffic at your servers. Revoked sites are skipped from "all". Each site's action lands in the activity log as its own row.
5. **Read the result per site**: The reply is a summary of targets, succeeded and failed, plus one row per site with ok and either its data or its error. Some sites failing is a partial success. Only a run where every site failed comes back as an error.
6. **Follow up on the failures**: The agent reports which sites failed and why, then retries just those handles with an array. Tools that read one site, such as get_cache_status and get_health, do not fan out, so a fleet-wide check means one call per site.

## Reference

| | |
| --- | --- |
| Fan-out tools | purge_cache, toggle_cache, update_settings, start_preloader, stop_preloader, optimize_site, run_benchmark |
| Selector | site: "all", or an array of handles |
| What all covers | Every site this connection can see in one workspace, minus revoked ones |
| Pacing | One after another, with a 1 second pause between live calls |
| Result | summary (targets, succeeded, failed) and a row per site: ok, then data or error |
| Partial failure | Reported per site; the call counts as an error only when every site failed |
| Workspace argument | Optional. Omit it for the default workspace; name one by its handle or id from list_workspaces |
| Reach | Fixed when you approve the connection; list_workspaces shows reachable: false for the rest |
| Not fan-out | get_health, get_cache_status and every other tool take one site per call |
| Slow tools | optimize_site takes up to 2 minutes per site; a target_score run is capped at 12 rounds per call |
| Read-only | The connection token with Read-only everywhere on, or a Viewer sign-in, refuses every fan-out write; run_benchmark works. An OAuth sign-in gets the scopes the client asks for |
| Hub daily pass | Re-verifies sites, snapshots cache status and hit ratio, reads stored reports, alerts by Slack webhook or email |

## Rules

- Confirm once, then call once. The Hub has no confirmation step of its own, so your client's approval prompt and a read-only connection (the connection token with Read-only everywhere on, or a Viewer sign-in) are the gates that matter. The Hub's "this will touch all N sites" is an instruction to the agent for purge, toggle, settings and preloader calls, and it does not name optimize_site.
- "all" is one workspace, never every workspace. To act in another workspace, name it. A write to a non-default workspace must name it, and an array of handles is looked up only in the workspace the call names.
- Read every result per site. Treat some sites failing as a partial result, and never accept a blanket "done" from the agent.
- Try a behaviour change on one site before you send it to the fleet. toggle_cache and update_settings on every site are one call, and each site checks values against its own settings, so a Pro setting can fail on a Free site.
- optimize_site on many sites is slow, because each site can take up to two minutes inside one call. Use dry_run first, or name a short list of handles.
- The Hub has no scheduler for agent prompts. Its own daily pass and alerts run without an agent, and an agent can only act when you send a prompt or your AI client runs one on a timer.

## Good to know with OpenCode

Add a catch-all ask rule for the xspeedhub_ tools first, then allow rules for the reads, because the last matching rule wins: xspeedhub_get_* and xspeedhub_list_* as allow, and xspeedhub_run_benchmark if you want fleet benchmarks without a prompt. A rule names the tool, not its arguments, so an allow on a write tool covers the call with site set to "all" as well as a single site. A deny rule holds even under opencode --auto, which approves everything that is not denied. A retry on the one site that failed is a single-site call, so it touches only that site and does not need the fleet-wide confirmation again.

## More prompts for this job

They work in any client connected to xSpeed Hub.

- Use xSpeed Hub to list every site I can reach, and every workspace, and say which workspace you act in by default.
- With xSpeed Hub, purge the cache on every site in my workspace and tell me which ones failed.
- Use xSpeed Hub to run a benchmark on all my sites and rank them by cached response time.
- Use xSpeed Hub to start the preloader on blog, shop and docs only.
- With xSpeed Hub, turn page caching on for every site where it is off. Check each site first.
- Use xSpeed Hub to stop the preloader everywhere. The servers are busy.
- Ask xSpeed Hub to preview a safe optimize_site pass on every site with dry_run and summarize what it would change.
- Use xSpeed Hub to purge every site in the client-acme workspace, not my default one.

## Frequently asked questions

### How do I keep OpenCode from purging every site without asking?

Most OpenCode permissions default to allow, so add a rule that sets every tool whose name starts with xspeedhub_ to ask, then allow rules for the reads. The permission applies to the tool, not its arguments, so allow on purge_cache would also allow a call with site set to all.

### Can OpenCode retry only the sites that failed?

Yes. The per-site result names each failure, so you can ask OpenCode to call the tool again with just those handles, either one at a time or as an array of handles. An array is looked up in the workspace the call names, so a handle from another workspace comes back as a per-site no-site row.

### What does site "all" cover?

Every site the connection can see in one workspace. It never crosses workspaces, and revoked sites are skipped. If your connection is limited to some sites, "all" quietly means the sites you are allowed, with no error naming the rest. To act in another workspace, the agent names it with the workspace argument.

### What happens if one site fails?

The other sites still run. The reply has a summary and a row for each site with ok and its data or its error, so a site that was unreachable is named. A run counts as an error only when every site failed. Ask the agent to retry just the failed handles.

### Can the agent check the health of every site in one call?

No. get_health and get_cache_status take one site per call, so the agent loops. The tools that fan out are purge_cache, toggle_cache, update_settings, start_preloader, stop_preloader, optimize_site and run_benchmark. The Hub dashboard has a fleet overview for health.

### Does the Hub watch my fleet when no agent is running?

Yes, on its own. A daily pass re-verifies each site, retrying a failed probe once, snapshots cache status and hit ratio, and reads the PageSpeed and GTmetrix reports your sites already stored. It can alert you by Slack webhook or email when a site becomes unreachable, caching is switched off, the hit ratio falls below a floor you set, or a score regresses. Each alert fires once per incident, not every day.

### Does the Hub ask before it touches every site?

The Hub has no confirmation step. Its instructions tell the agent to confirm once with you, saying how many sites a call will touch, but that is guidance and not a lock. Your AI client's approval prompt and a read-only connection (the connection token with Read-only everywhere on, or a Viewer sign-in) are what stop a write. The instruction covers purge, toggle, settings and preloader calls, not optimize_site. The dashboard's own Purge all button does confirm before it runs.

### Can the agent add sites, remove sites or change who has access?

No. It cannot add, remove or rename sites, change members, roles or billing, mint or rotate tokens, or widen the workspaces this connection reaches. Those stay in the Hub dashboard.

## Manage every site at once with other agents

[Claude Code](https://xspeedcache.com/agent/claude-code/fleet/) · [Claude](https://xspeedcache.com/agent/claude/fleet/) · [Claude Cowork](https://xspeedcache.com/agent/claude-cowork/fleet/) · [ChatGPT](https://xspeedcache.com/agent/chatgpt/fleet/) · [Codex](https://xspeedcache.com/agent/codex/fleet/) · [Cursor](https://xspeedcache.com/agent/cursor/fleet/) · [GitHub Copilot in VS Code](https://xspeedcache.com/agent/github-copilot/fleet/) · [Windsurf](https://xspeedcache.com/agent/windsurf/fleet/) · [Gemini CLI](https://xspeedcache.com/agent/gemini-cli/fleet/) · [Antigravity](https://xspeedcache.com/agent/antigravity/fleet/) · [Zed](https://xspeedcache.com/agent/zed/fleet/) · [Kiro](https://xspeedcache.com/agent/kiro/fleet/) · [OpenClaw](https://xspeedcache.com/agent/openclaw/fleet/) · [Hermes Agent](https://xspeedcache.com/agent/hermes-agent/fleet/) · [Grok Build](https://xspeedcache.com/agent/grok-build/fleet/) · [ChatGPT dots](https://xspeedcache.com/agent/chatgpt-dots/fleet/) · [Grok](https://xspeedcache.com/agent/grok/fleet/) · [Grok Bot](https://xspeedcache.com/agent/grok-bot/fleet/) · [Muse](https://xspeedcache.com/agent/muse/fleet/) · [Manus](https://xspeedcache.com/agent/manus/fleet/) · [Kimi Code](https://xspeedcache.com/agent/kimi/fleet/) · [Paperclip](https://xspeedcache.com/agent/paperclip/fleet/) · [NanoClaw](https://xspeedcache.com/agent/nanoclaw/fleet/)

## More with OpenCode

- [Purge the WordPress cache with OpenCode](https://xspeedcache.com/agent/opencode/purge-cache/)
- [Find out why WordPress pages are not cached with OpenCode](https://xspeedcache.com/agent/opencode/troubleshoot-cache/)
- [Scan a website for speed problems with OpenCode](https://xspeedcache.com/agent/opencode/speed-scan/)
- [Run and track PageSpeed tests with OpenCode](https://xspeedcache.com/agent/opencode/pagespeed-tests/)
- [Raise a WordPress site's PageSpeed score with OpenCode](https://xspeedcache.com/agent/opencode/optimize-site/)
- [Tune WordPress cache settings with OpenCode](https://xspeedcache.com/agent/opencode/cache-settings/)
- [Warm the WordPress cache with OpenCode](https://xspeedcache.com/agent/opencode/preload-cache/)
- [Set up the Redis object cache with OpenCode](https://xspeedcache.com/agent/opencode/object-cache/)
- [Manage Cloudflare caching with OpenCode](https://xspeedcache.com/agent/opencode/cloudflare/)

## Documentation

- Managing your fleet with xSpeed Hub: https://xspeedcache.com/docs/managing-your-fleet-with-xspeed-hub/
- Teams, roles and workspaces in xSpeed Hub: https://xspeedcache.com/docs/hub-teams-and-workspaces/
- Scoped AI connections in xSpeed Hub: https://xspeedcache.com/docs/hub-connection-scopes/
- Connecting to xSpeed Hub: https://xspeedcache.com/docs/connecting-to-xspeed-hub/
