Verified web fetch for agents: detects blocks and empty JS pages, falls back, bills only on success.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Fetch Router API key (free, 500 credits): https://fetchrouter.dev/#signup
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Pass rates per route (plain HTTP, browser, providers) for a domain over the last 30 days, from real verified fetches. Use it to choose mode/max_cost before fetching a hard site. Free, no key needed.
Domain or URL, e.g. zillow.com
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http fetchrouter-mcp https://fetchrouter.dev/mcp \ --header 'X-API-Key: YOUR_X_API_KEY'
Headers
X-API-Key (required): Fetch Router API key (free, 500 credits): https://fetchrouter.dev/#signupPass rates per route (plain HTTP, browser, providers) for a domain over the last 30 days, from real verified fetches. Use it to choose mode/max_cost before fetching a hard site. Free, no key needed.
| Argument | Type | Description |
|---|---|---|
| domain* | string | Domain or URL, e.g. zillow.com |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"description": "Domain or URL, e.g. zillow.com"
}
}
}Fetch a public URL and get its content only if it really loaded. Checks for block pages, CAPTCHAs, login walls and empty JavaScript shells, and retries through other routes (including a headless browser) automatically. Billed only on success. Returns markdown by default. If ok is false, the reason says why (e.g. blocked:cloudflare, http_404, expect_text_missing): don't retry the same URL with the same settings.
| Argument | Type | Description |
|---|---|---|
| url* | string | Public http(s) URL |
| mode | string | markdown (default, main content), html (raw page), rendered (always use a browser) |
| max_cost | integer | Most credits to pay: 1 static only, 5 (default) allows a browser, 10-25 allows premium unblocking |
| expect_text | string | Text that must appear on the page for it to count as loaded, e.g. a product name |
| expect_selector | string | CSS selector that must match |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Public http(s) URL"
},
"mode": {
"enum": [
"markdown",
"html",
"rendered"
],
"type": "string",
"description": "markdown (default, main content), html (raw page), rendered (always use a browser)"
},
"max_cost": {
"type": "integer",
"maximum": 25,
"minimum": 1,
"description": "Most credits to pay: 1 static only, 5 (default) allows a browser, 10-25 allows premium unblocking"
},
"expect_text": {
"type": "string",
"description": "Text that must appear on the page for it to count as loaded, e.g. a product name"
},
"expect_selector": {
"type": "string",
"description": "CSS selector that must match"
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 2, 2026.