Skip to main content
Glama
JonnoGit

fetchrouter-mcp

by JonnoGit

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 fetch or 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@fetchrouter

Local (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_cost caps credits: 1 = plain HTTP only, 5 (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, 5 per browser-rendered page, failures free. Details: https://fetchrouter.dev/#pricing

Environment (stdio)

Variable

Default

FETCHROUTER_API_KEY

required

FETCHROUTER_BASE_URL

https://fetchrouter.dev

FETCHROUTER_MAX_CHARS

60000 (longer pages are truncated)

Development

npm install
npm run build
FETCHROUTER_API_KEY=fr_... node dist/index.js

The 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 tools
domain_reliabilityWhich fetch routes work for a siteA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
domainYesDomain or URL, e.g. zillow.com

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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)A
Read-only
Inspect

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.

NameRequiredDescriptionDefault
urlYesPublic http(s) URL
modeNomarkdown (default, main content), html (raw page), rendered (always use a browser)
max_costNoMost credits to pay: 1 static only, 5 (default) allows a browser, 10-25 allows premium unblocking
expect_textNoText that must appear on the page for it to count as loaded, e.g. a product name
expect_selectorNoCSS selector that must match

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only state readOnlyHint and openWorldHint; the description adds substantial context beyond them: automatic route retries including headless browser, block/CAPTCHA/login-wall detection, and success-only billing. It also discloses the failure contract (ok=false plus reason codes like blocked:cloudflare, http_404) and the anti-retry policy. That is exactly the behavioral load the annotations do not carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with the purpose and the success guarantee, then behavior, then cost, then the failure contract. Every sentence carries distinct information and nothing is redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must explain return semantics, and it does: markdown by default, an ok flag, and a reason string on failure. Combined with cost and retry policy, an agent has everything needed to call it and interpret the result correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all five parameters are already documented with defaults, enums and ranges; baseline is 3. The description only restates that markdown is the default return mode and refers vaguely to 'settings', adding no new meaning for max_cost, expect_text or expect_selector.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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') plus the differentiator that content is returned 'only if it really loaded'. An agent can immediately tell this is a verified fetch rather than a blind HTTP GET. It does not explicitly contrast with the sibling domain_reliability, which keeps it from a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear situational guidance: use it to obtain page content, and if ok is false, do not retry the same URL with the same settings. That is a real exclusion rule with an example error taxonomy. It lacks explicit routing to/against the sibling domain_reliability tool, so it stops short of 5.

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. 2 tool updatesv0.1.1
    • First observeddomain_reliability
    • First observedfetch_page

TDQS

A4.2/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have completely non-overlapping purposes: one performs a fetch, the other reports historical pass-rate statistics for routing decisions. An agent cannot reasonably confuse them, and the descriptions reinforce the distinction (fetch is billed, stats are free).

Naming Consistency4/5

Both names use clean snake_case, which is consistent at the style level. However, 'fetch_page' is verb_noun while 'domain_reliability' is a noun phrase, so the action-oriented pattern isn't uniform across the set.

Tool Count4/5

Two tools is on the thin side relative to the typical 3-15 range, but each earns its place: a core fetch operation plus a supporting diagnostic for choosing fetch settings. The surface is deliberately minimal rather than padded.

Completeness4/5

The stated purpose—reliably fetching a URL and choosing the right route—is well covered, including error reasons and a route-reliability lookup to guide retries. Minor gaps remain, such as batch fetching or a way to enumerate available routes/providers directly.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides AI agents with reliable web fetching capabilities, handling retries, caching, and anti-bot bypass automatically.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables 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.
    15
    325 PyPI
    1
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables 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.
    -