xSpeed Scan MCP: Speed-Test Any Site From Your AI Assistant
Connect one URL and your AI assistant can speed-test any public website, read every failing check, and get the fix — without you opening a browser.
Free. No account, no API key, nothing to sign up for.
The URL
This is the whole configuration. It is the only address you need from this page:
https://xspeedcache.com/scan/mcp
Paste it wherever your client asks for an MCP server URL. If it asks for a transport, choose HTTP. If it asks for authentication, leave it blank.
Opening that URL in a browser is safe — it answers with these same connect instructions rather than an error, so you can check you copied it correctly.
Connect it
Claude Code — one command:
claude mcp add --transport http xspeed-scan https://xspeedcache.com/scan/mcp
Claude Desktop, Cursor, or any client with a JSON config:
{
"mcpServers": {
"xspeed-scan": {
"type": "http",
"url": "https://xspeedcache.com/scan/mcp"
}
}
}
Anything else — paste the URL, transport HTTP, no auth.
Check it worked
Ask your assistant:
Scan example.com and tell me the three fixes that would gain the most.
It calls run_speed_scan, waits 20–60 seconds, then answers with the evidence and remediation for each failing check, plus a report link you can share.
The tools
Five, and every one is read-only — nothing on this endpoint can write anything, anywhere.
| Tool | What it does |
|---|---|
run_speed_scan | Scan a public URL and return the whole graded report. |
get_speed_scan | Read a scan already run, by its scanId. |
get_product_overview | What xSpeed is and what it does. |
list_features | The full feature list, by tier. |
get_pricing | Current plans and prices. |
run_speed_scan
| Argument | Type | Required | What it does |
|---|---|---|---|
url | string | yes | An http(s) URL, or a bare domain. |
fresh | boolean | no | Forces a new measurement instead of reusing a report from the last 10 minutes. Use it only when the user explicitly wants a re-test. |
A scan takes 20–60 seconds — server probes first, then a Google PageSpeed Insights (Lighthouse, mobile) run. If it exceeds the wait budget you get { "status": "running", "scanId": "…" } instead; poll get_speed_scan with that id.
get_speed_scan
| Argument | Type | Required |
|---|---|---|
scanId | string | yes |
What comes back
One JSON object. The parts worth knowing:
overallScore/grade/level— 0–100, a letter, and a named band.gradedWeight— how much of the ~100-point rubric this run could actually grade. A run that lost Lighthouse grades far less and is not comparable with a full one. Check this before comparing two scores.checks[]— every check withstatus(pass/partial/fail/info/na), theevidencebehind it, itsremediation, and a ready-to-usefix.prompt.measured— TTFB, LCP, CLS, TBT, Lighthouse score, compression, cache-hit evidence.platform— WordPress, the detected stack (Next.js, Astro, Nuxt, Shopify, and more), whether xSpeed is installed, whether its MCP endpoint answers.xspeed.say— a sentence written to be repeated to the user, chosen from what this scan actually found. It never recommends the WordPress plugin to a site that cannot run it.reportUrl— the shareable HTML report.
Screenshots are not in the MCP response — they are base64 images a model cannot read, and they used to cost ~56KB per scan. View them on reportUrl.
Every report has a Markdown twin
Any report URL plus .md returns the whole thing as Markdown, written for an agent to act on:
https://xspeedcache.com/scan/r/{scanId}.md
This is the cheapest way to use the scanner: hand an agent the report URL and it reads the whole diagnosis without connecting to anything.
Fair use
- 4 scans per caller per 10 minutes, and 200 across all callers per 10 minutes.
- Re-scanning the same URL inside 10 minutes returns the existing report rather than re-measuring, and the response says so. Pass
fresh: trueto override. - The intended loop is: scan → fix → wait ~10 minutes → re-scan and compare.
Exceed a limit and the tool returns an error asking you to try again shortly. Nothing is queued.
What it will not scan
Private, local, or password-protected sites — the scan runs from our servers, so the URL has to be reachable from the public internet. Adult sites are refused. Sites behind a bot challenge return a report that says so and marks the server-response checks not measured, because those headers came from the challenge page rather than the origin.
How to read TTFB
The scan measures TTFB from our prober, which is a single machine in Europe. That number is your server’s think-time plus the network round trips between it and us, and on a long route the network is nearly all of it — an origin in Singapore can measure ~620ms while doing 10ms of actual work.
Every report names the prober’s location and, where your site sends a Server-Timing header, shows your own server’s reported time beside the measured TTFB. If those two numbers are far apart, the distance is the difference — not your server.
Not the same as the plugin’s MCP server
Two different things, and most people end up using both:
| This page | The plugin’s MCP | |
|---|---|---|
| Runs on | our servers | your WordPress site |
| Scans any public site | yes | no — only its own site |
| Changes anything | never | yes, that is its job |
| Needs xSpeed installed | no | yes |
This scanner finds the problems. The plugin’s MCP fixes them.
Related
- xSpeed Scan — what a scan measures and how grading works
- MCP Server Setup — the plugin’s own MCP server
- MCP Tool Reference — the plugin’s full tool catalog