fetchrouter-mcp
This MCP server provides verified web fetching and route reliability data for AI agents.
Fetch public http(s) URLs with
fetch_page, returning content only if it really loaded; it detects block/challenge pages, CAPTCHAs, login walls, and empty JavaScript shells, then retries through other routes including a headless browser.Choose output as markdown (default), raw HTML, or forced browser-rendered mode.
Validate page content with
expect_textandexpect_selector; failures return reasons such asblocked:cloudflare,http_404, orexpect_text_missing.Cap spending with
max_cost: static-only, browser-allowed, or premium unblocking up to 25 credits. Successful pages are billed; failures are free.Query
domain_reliabilityfor 30-day pass rates per route for a domain, free and without a key, to choosemode/max_costbefore fetching.Designed for one URL at a time, not crawling, site mapping, or search; login/paywall pages are not supported.
Detects Akamai block and challenge pages during web fetches and retries through alternate routes, including a headless browser, to retrieve content from Akamai-protected pages.
Detects Cloudflare challenge and block pages during web fetches and retries through alternate routes, including a headless browser, to retrieve content from Cloudflare-protected pages.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fetchrouter-mcpfetch this page and verify it loaded: https://example.com/article"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
fetchrouter-mcp
MCP server for Fetch Router: web fetch for AI agents that only bills when the page actually loaded.
Agents often get a 200 OK that is really a Cloudflare challenge, a DataDome block or an empty React shell, and then summarise the error page. Fetch Router checks every page for HTTP errors, block and challenge pages (Cloudflare, DataDome, PerimeterX, Akamai, Imperva, Kasada…), login walls, empty JavaScript shells and text you expect to see. If a check fails it retries through another route, such as a headless browser. Failed fetches cost nothing.
When to use it
Your agent reads pages it didn't choose: search results, links from users, sites you don't control.
You need to know whether a page really loaded, not just that the request returned 200.
Some targets are single-page apps that need a browser, and you don't want to run Playwright yourself.
You want to pay per page that works, not per request.
Related MCP server: webscout-mcp
When not to use it
Crawling a whole site, mapping links or search. Use a crawler (Firecrawl, Crawl4AI, Apify). Fetch Router does one URL at a time.
Pages behind a login or paywall. Not supported, by policy.
One or two sites you know well. A plain
fetchor your own Playwright script is cheaper.Heavily protected retail and travel sites today. Premium unblocking routes aren't live for customer traffic yet. See the benchmark for what passes.
Setup
Get a free key (500 credits, no card) at https://fetchrouter.dev/#signup.
Remote (no install). Streamable HTTP at https://fetchrouter.dev/mcp, with your key in a header:
claude mcp add --transport http fetchrouter https://fetchrouter.dev/mcp --header "Authorization: Bearer fr_..."Other clients: URL https://fetchrouter.dev/mcp, header Authorization: Bearer fr_... (or X-API-Key: fr_...).
Claude Code plugin (MCP server plus a verified-fetch skill; asks for your key once and stores it securely):
claude plugin marketplace add JonnoGit/fetchrouter-mcp
claude plugin install fetchrouter@fetchrouterLocal (stdio via npx).
{
"mcpServers": {
"fetchrouter": {
"command": "npx",
"args": ["-y", "fetchrouter-mcp"],
"env": { "FETCHROUTER_API_KEY": "fr_..." }
}
}
}Claude Code: claude mcp add fetchrouter -e FETCHROUTER_API_KEY=fr_... -- npx -y fetchrouter-mcp
Tools
fetch_page(url, mode?, expect_text?, expect_selector?, max_cost?): returns markdown (default) or HTML, plus which route delivered it and what was tried.max_costcaps credits: 1 = plain HTTP only, 2 (default) allows a browser. If the page can't be loaded, the error says why (blocked:cloudflare,http_404,expect_text_missing…) and nothing is billed.domain_reliability(domain): pass rate per route for a site over the last 30 days, from real verified fetches. Free, no key needed.
How well does it work?
A fixed list of 166 public pages in six site types is fetched every night with plain HTTP and with a headless browser, from a datacenter IP. Results, method and CSV: https://fetchrouter.dev/benchmark
Pricing
1 credit ($0.001) per static page, 2 per browser-rendered page, failures free. Details: https://fetchrouter.dev/#pricing
Environment (stdio)
Variable | Default |
| required |
|
|
|
|
Development
npm install
npm run build
FETCHROUTER_API_KEY=fr_... node dist/index.jsThe tool definitions live in src/tools.ts and are shared with the hosted endpoint at https://fetchrouter.dev/mcp.
MIT licensed. Operated by One + Done LLC. Contact: hello@fetchrouter.dev
Available Tools
2 toolsdomain_reliabilityWhich fetch routes work for a siteARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain or URL, e.g. zillow.com |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds useful behavioral context beyond that: a 30-day window, real verified fetches as the data source, and no cost or key requirement. It does not describe output shape or latency, but the annotation coverage lowers the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with what the tool returns and followed by when to use it. Every clause contributes useful information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter, read-only lookup, the description covers the result type, time window, data source, and cost/auth context. Without an output schema it could say more about response structure, but it is sufficient for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single domain parameter is documented in the schema with an example. The description mentions 'for a domain' but adds no syntax or format meaning beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific data resource and scope: pass rates per route for a domain over the last 30 days. It implicitly distinguishes itself from fetch_page by framing itself as a pre-fetch reliability check, though it does not explicitly name the sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: use it to choose mode/max_cost before fetching a hard site. It also notes free access and no key needed. It lacks explicit when-not guidance or a named alternative, but the intended moment of use is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_pageFetch a web page (verified)ARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public http(s) URL | |
| mode | No | markdown (default, main content), html (raw page), rendered (always use a browser) | |
| max_cost | No | Most credits to pay: 1 static only, 2 (default) allows a browser, 10-25 allows premium unblocking | |
| expect_text | No | Text that must appear on the page for it to count as loaded, e.g. a product name | |
| expect_selector | No | CSS selector that must match |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld annotations: discloses the verification checks performed (block pages, CAPTCHAs, login walls, empty JS shells), automatic retry/headless-browser escalation, the billing rule (charged only on success), the default return format, and the failure-reason vocabulary (blocked:cloudflare, http_404, expect_text_missing). This is exactly the operational context an agent needs before spending credits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with purpose, then verification behavior, billing, default output, and failure handling. Every sentence contributes a distinct operational fact with no repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description supplies the return shape (markdown by default, ok flag, reason string with example codes) and the cost model. Combined with a fully documented 5-parameter schema, an agent has everything needed to call this correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter already documents its meaning, including the credit ladder for max_cost and the expect_text/expect_selector semantics. The description adds only marginal parameter meaning ('returns markdown by default') and introduces the ok/reason response fields, so the baseline of 3 is right.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch a public URL and get its content') plus the key qualifier that content is returned only if it genuinely loaded. It is clearly distinct from domain_reliability by implication (page content vs. domain reputation), but never names or contrasts with the sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-not rule: if ok is false, the reason explains why and the caller should not retry the same URL with the same settings. It also notes retries through other routes happen automatically, so the agent knows not to orchestrate fallbacks itself. It stops short of stating when to prefer domain_reliability or which mode/max_cost to pick for a given situation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.1.2- Changed
fetch_page1 field changed- changed
Input schema / properties / max_cost / descriptionPrevious value: -"Most credits to pay: 1 static only, 5 (default) allows a browser, 10-25 allows premium unblocking"New value: +"Most credits to pay: 1 static only, 2 (default) allows a browser, 10-25 allows premium unblocking"
2 tool updates
v0.1.1- First observed
domain_reliability - First observed
fetch_page
TDQS
Scored across 2 tools
The two tools serve clearly different roles: fetch_page performs an actual fetch, while domain_reliability reports historical route performance for a domain. An agent can easily choose between acting and planning/choosing settings.
Both names are snake_case and readable, but fetch_page follows a verb_noun pattern while domain_reliability follows noun_noun. This is a minor deviation rather than an inconsistency.
Two tools is thin even for a narrow fetch-routing server. Each tool is meaningful, but the surface could reasonably include batch fetching or provider listing without bloating.
The core lifecycle is covered: fetch a URL and inspect route reliability to choose settings. Minor gaps exist, such as batch fetching or explicit route/provider inspection, but agents can work around them.
Maintenance
Related MCP Connectors
Reliable web access for AI agents: smart HTTP, rotating proxies, and full-browser rendering.
Web search, browser automation, scraping, crawling and CAPTCHA solving for AI agents.
Reliable web fetching for AI agents with retry, circuit breaker, caching, and anti-bot bypass
Hosted browser for AI agents: screenshots, post-JS DOM, console, WCAG. No install, no API key.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides AI agents with reliable web fetching capabilities, handling retries, caching, and anti-bot bypass automatically.MIT
- AlicenseAqualityAmaintenanceEnables AI agents to perform web searches, fetch and extract page content, and crawl sites with caching, rate limiting, and robots.txt compliance, all without needing API keys.15325 PyPI1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to search the web, read and extract content from webpages, fetch JSON from REST APIs, and collect links while bypassing anti-bot protections.22 npmISC
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to reliably fetch public web URLs and extract clean, agent-ready text, Markdown, links, and metadata, with automatic browser fallback and optional x402 payment support.-