Skip to main content
Glama
fetchrouter-mcp

fetchrouter-mcp

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, 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

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, 2 (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?

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

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 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.

Usage Guidelines4/5

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. 1 tool updatev0.1.2
    • Changedfetch_page1 field changed
      • changedInput schema / properties / max_cost / description
        Previous 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. 2 tool updatesv0.1.1
    • First observeddomain_reliability
    • First observedfetch_page

TDQS

A4.1/5.0

Scored across 2 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count3/5

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.

Completeness4/5

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

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.
    -