# Raise a WordPress site's PageSpeed score with Kimi Code

> Raising a WordPress PageSpeed score with Kimi Code means asking Moonshot AI's terminal agent to preview and apply an xSpeed optimization through xSpeed Hub, then generate critical CSS on a Pro site, with your permission rules deciding what asks.

Page: https://xspeedcache.com/agent/kimi/optimize-site/
Last updated: October 2026

You are in the theme repository with Kimi Code, and the shop site has the Pro Critical CSS module. You ask for the whole sequence in one go: preview an optimization, apply it if I agree, then generate critical CSS and purge. Kimi Code reads list_modules first to confirm the module is there, because without it generate_critical_css answers with an unknown-tool error.

Then it calls optimize_site with dry_run on and shows the plan. You approve, and the pass runs: each setting applied one at a time, the page checked after each, anything that breaks undone, for up to about two minutes. Kimi Code goes straight on to generate_critical_css, which builds the above-the-fold CSS so the first screen paints without waiting for the full stylesheets, and then purge_cache with the page type, because pages cached before the critical CSS existed were built without it.

Kimi Code runs shell commands, so it can fetch the verify URLs and look at the HTML. That is the same check the plugin already ran. A broken script shows only in a browser, so open the pages yourself with the console visible. If something is wrong, the theme files that cause it are already open in front of you, and the items on the unfixable list, such as fonts loaded from another domain, are often a line or two in the theme.

## Set up Kimi Code 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 mcp.json

Put this in ~/.kimi-code/mcp.json to use the Hub in every project, or in .kimi-code/mcp.json inside one repository, where it overrides a user entry of the same name. You can also run /mcp-config and let Kimi Code add it. A server added while a session is open joins only the next session.

File: `~/.kimi-code/mcp.json`

```json
{
  "mcpServers": {
    "xspeedhub": {
      "url": "https://app.xspeedcache.com/xspeed/mcp"
    }
  }
}
```

### 3. Sign in with /mcp-config login

Start a new session with kimi, run this and approve access on the xSpeed Hub page that opens in your browser. There is no token to paste. Then run /mcp to check that xspeedhub is connected.

```
/mcp-config login xspeedhub
/mcp
```

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

### 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. In Kimi Code's default Always Ask mode, an MCP call that matches no permission rule asks for approval, and Approve for this session allows the same kind of call until the session ends. Permanent rules go in [[permission.rules]] in config.toml: allow mcp__xspeedhub__get_* and mcp__xspeedhub__list_* to let the reads run, and leave the write tools on the prompt. Ask When Needed mode, from /yolo, approves MCP calls automatically, and Never Ask, from /auto, approves everything. xSpeed Hub has no confirmation step of its own, so in either of those modes a purge or a settings change runs as soon as your connection allows writes. To remove writes altogether, list the read tools in the entry's enabledTools, or use a connection token with Read-only everywhere on.

## Prompts

- Use xSpeed Hub to check whether shop has the Pro Critical CSS module before we try anything.
- With xSpeed Hub, preview an optimization for shop, and if I agree, apply it, generate critical CSS and purge the page cache.
- Using xSpeed Hub, read the unfixable list from the last run on shop and tell me which items live in this theme.

## Example session

```
You: Use xSpeed Hub to preview an optimization for shop. If I agree, apply it, then generate critical CSS and purge.
  → list_modules(site: shop) [read-only]: 18 modules listed; Critical CSS (Pro) installed
  → optimize_site(site: shop, aggressiveness: standard, dry_run: true) [dry run]: plan: 3 settings to apply (CSS minify, defer JS, browser cache), nothing changed
Agent: Critical CSS is installed. The plan is CSS minify, script deferral and browser caching, and nothing has changed. Apply it, then generate critical CSS and purge the page cache?
You: Yes, all of it.
  → optimize_site(site: shop, aggressiveness: standard) [changes site]: applied 3, undone 0, unfixable: web fonts loaded from another domain
  → generate_critical_css(site: shop) [changes site]: critical CSS generated; pages pick it up on their next build
  → purge_cache(site: shop, type: page) [changes site]: page cache purged (318 entries)
Agent: Done. Three settings are on, critical CSS is generated and the page cache was purged so pages rebuild with it. Fonts loaded from another domain are what is left. Open the home page and a product page in a browser with the console visible.
```

## How it works

1. **See where the site stands**: The agent reads get_score_history for the last stored scores and list_modules for which modules exist on that site and what state they are in. Neither changes anything.
2. **Preview with dry_run**: optimize_site with dry_run: true returns the plan: each change and its tier, what would be skipped (already on, or needing a higher aggressiveness) and what it cannot fix. Nothing is applied. The tool description tells the agent to prefer this before the first real run on a site you have not optimized before.
3. **Apply it**: optimize_site without dry_run applies the plan. aggressiveness is safe (removals and server-side changes only), standard (the default) or aggressive, which includes settings known to break some themes and should be opted into deliberately. A run can take up to about 2 minutes per site.
4. **Look at the site afterwards**: When changes were applied, the result carries verify_urls and a note. The site checks its own HTML and reverts anything that breaks it, but it cannot run JavaScript, so verified: true does not prove the page works in a browser. The Hub tells the agent to open those URLs and check the page renders and the console is clean, or to tell you which URLs to check.
5. **Reach for a number only if you named one**: target_score (1 to 100, Pro sites only) turns one pass into repeated rounds toward that score, up to max_rounds, with 3 as the most per site. Each round is a real PageSpeed measurement and up to about 2 minutes. The result says why it stopped, and diminishing returns means what is left is outside what caching can reach.
6. **Critical CSS on Pro sites**: generate_critical_css generates above-the-fold CSS so the first screen can paint without waiting for the full stylesheets. It needs the Pro Critical CSS module on that site, and the site answers with an unknown-tool error without it. Pages are rebuilt with it on their next build, so the agent purges the cache afterwards.

## Reference

| | |
| --- | --- |
| Main tool | optimize_site (write): measure, apply one setting at a time, verify, undo what breaks, re-measure |
| Preview | dry_run: true returns the plan and changes nothing |
| aggressiveness | safe, standard (default) or aggressive |
| Every site at once | site: "all" or a list of handles, one result per site, sites run one after another; the Hub's confirm-once instruction does not name optimize_site, so your client's prompt is the gate |
| Time | Up to about 2 minutes per site |
| target_score | 1 to 100; needs Pro on the site; without it the site runs one pass and says so |
| max_rounds | Up to 3 per site; only sent along with target_score; 12 rounds in total per call |
| Wide fan-out with a target | Each site gets fewer rounds, and the result carries a note saying so |
| Result fields | applied, skipped, reverted, unfixable, score, verified, rounds; verify_urls after a run that changed something |
| Already tuned site | Returns "everything is already on" plus what it cannot fix; that is an answer, not a failure |
| Critical CSS | generate_critical_css (write), Pro Critical CSS module required; purge_cache afterwards |
| Read-only connection | optimize_site and generate_critical_css are refused; dry_run is still a write call, so it is refused too. Applies to the connection token with Read-only everywhere on and to a Viewer sign-in, not to other OAuth sign-ins |

## Rules

- Run dry_run first. optimize_site changes live site settings as soon as your connection allows writes. The tool description tells the agent to preview first on a site that has not been optimized, but that is guidance, 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 real gates.
- Keep aggressive for a deliberate choice. It includes settings known to break some themes, and the agent should say so before using it.
- After a run that changed something, open the pages in verify_urls. The HTML checks cannot run JavaScript, so a page can pass them and still be broken in a browser. Do not call a run safe because verified is true.
- Relay the unfixable list. When a site is already tuned, the honest answer is that caching is done and the rest is page weight, hotlinked images or DOM size. The agent should not retry the tool or claim a gain it did not make.
- Only ask for target_score when you want the site driven to a number. Each round costs a real PageSpeed measurement, and a plain "make it faster" is one pass.

## Good to know with Kimi Code

Kimi Code names each Hub tool mcp__xspeedhub__ followed by the tool name, and in the default Always Ask mode any call without a matching permission rule asks. Allow rules for mcp__xspeedhub__get_* and mcp__xspeedhub__list_* let list_modules and get_score_history run quietly, and leave optimize_site, generate_critical_css and purge_cache on the prompt. Be careful with Approve for this session on optimize_site: the preview and the real pass are the same tool, so approving the preview that way lets the real pass through without asking. Ask When Needed, from /yolo, approves MCP calls automatically, and Never Ask, from /auto, approves everything, and xSpeed Hub has no confirmation step of its own, so either mode runs the whole sequence without a word. A connection token with Read-only everywhere on refuses even the dry run.

## More prompts for this job

They work in any client connected to xSpeed Hub.

- Ask xSpeed Hub to preview what optimize_site would change on shop with a safe pass. Do not apply anything.
- Use xSpeed Hub to optimize the blog site with the standard pass, then give me the pages to check by hand.
- With xSpeed Hub, get docs to a mobile PageSpeed score of 90 if you can, and tell me why it stopped if it does not get there.
- Use xSpeed Hub to show me what optimize_site would do on every site, as a dry run, and list which sites have the most left to change.
- Use xSpeed Hub to generate critical CSS for shop, then purge the cache so the pages are rebuilt with it.
- With xSpeed Hub, optimize shop, then compare the new PageSpeed score with the last stored one.
- Using xSpeed Hub, what could optimize_site not fix on the shop site?

## Frequently asked questions

### Can Kimi Code generate critical CSS through xSpeed Hub?

Yes, on a site with the Pro Critical CSS module. Without it the site answers with an unknown-tool error, so ask Kimi Code to read list_modules first. Purge the page cache afterwards so cached pages rebuild with the critical CSS.

### Does Approve for this session in Kimi Code cover the real optimization pass?

Yes, if you chose it on optimize_site. The preview and the real pass are the same tool, so approve the preview once and keep the real pass on its own prompt.

### What does optimize_site actually do?

It measures the site, applies the recommended xSpeed settings one at a time, checks that the page still renders after each change, and undoes any change that breaks it. It then reports what was applied, skipped and reverted, and what it could not fix. It reaches caching and asset delivery only.

### Should I run a dry run first?

Yes, especially on a site you have not optimized before. dry_run: true returns the plan, what would be skipped and what cannot be fixed, and changes nothing. The tool description tells the agent to prefer it, but nothing forces it, so say so in your prompt if you want a preview.

### Can I tell it to get my site to a score of 90?

Yes, with target_score, on a site that has xSpeed Pro. It repeats measure, apply and re-measure for up to 3 rounds per site and stops early when rounds stop helping, saying why. On a Free site the score target is ignored and you get a single pass with a note that no iterative tuner is installed.

### Why did it say everything is already on?

That is a real answer. The settings it can apply were already enabled, so there was nothing to change. The result also lists what it could not fix, such as page weight, images hosted on another domain or DOM size, and those need changes outside a caching plugin.

### Does the agent check that my pages still work?

The site checks its own HTML after each change and reverts anything that breaks it, but it cannot run JavaScript. After a run that changed something, the Hub tells the agent to open the returned verify_urls and check the page renders and the console is clean, or to give you the URLs to check yourself.

### Does generate_critical_css work on a Free site?

No. It needs the Pro Critical CSS module on that site, and without it the site answers with an unknown-tool error. On a Pro site, purge the cache afterwards, because pages already cached were built without the critical CSS.

## Raise the PageSpeed score with other agents

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

## More with Kimi Code

- [Purge the WordPress cache with Kimi Code](https://xspeedcache.com/agent/kimi/purge-cache/)
- [Find out why WordPress pages are not cached with Kimi Code](https://xspeedcache.com/agent/kimi/troubleshoot-cache/)
- [Scan a website for speed problems with Kimi Code](https://xspeedcache.com/agent/kimi/speed-scan/)
- [Run and track PageSpeed tests with Kimi Code](https://xspeedcache.com/agent/kimi/pagespeed-tests/)
- [Tune WordPress cache settings with Kimi Code](https://xspeedcache.com/agent/kimi/cache-settings/)
- [Warm the WordPress cache with Kimi Code](https://xspeedcache.com/agent/kimi/preload-cache/)
- [Set up the Redis object cache with Kimi Code](https://xspeedcache.com/agent/kimi/object-cache/)
- [Manage Cloudflare caching with Kimi Code](https://xspeedcache.com/agent/kimi/cloudflare/)
- [Manage every WordPress site at once with Kimi Code](https://xspeedcache.com/agent/kimi/fleet/)

## Documentation

- How to generate Critical CSS: https://xspeedcache.com/docs/critical-css/
- Performance recommendations: https://xspeedcache.com/docs/performance-recommendations/
- How to run a speed test: https://xspeedcache.com/docs/external-score/
- Free vs Pro: what is included: https://xspeedcache.com/docs/free-vs-pro/
