Features
xSpeed Hub Pricing Docs Blog Scan
Appearance
Get Plugin

xSpeed Scan MCP: Speed-Test Any Site From Your AI Assistant

Tools 5 min read Updated Sep 2026

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.

ToolWhat it does
run_speed_scanScan a public URL and return the whole graded report.
get_speed_scanRead a scan already run, by its scanId.
get_product_overviewWhat xSpeed is and what it does.
list_featuresThe full feature list, by tier.
get_pricingCurrent plans and prices.

run_speed_scan

ArgumentTypeRequiredWhat it does
urlstringyesAn http(s) URL, or a bare domain.
freshbooleannoForces 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

ArgumentTypeRequired
scanIdstringyes

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 with status (pass / partial / fail / info / na), the evidence behind it, its remediation, and a ready-to-use fix.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: true to 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 pageThe plugin’s MCP
Runs onour serversyour WordPress site
Scans any public siteyesno — only its own site
Changes anythingneveryes, that is its job
Needs xSpeed installednoyes

This scanner finds the problems. The plugin’s MCP fixes them.