Skip to main content
Glama
x51xxx

@trishchuk/mcp-fetch-server

by x51xxx

@trishchuk/mcp-fetch-server

npm version License: MIT MCP Compatible Node.js

A high-performance Model Context Protocol (MCP) server providing an anti-bot-resilient fetch tool for AI agents (Claude Code, Claude Desktop, Cursor, Windsurf, Cline, Antigravity, etc.).

Powered by @trishchuk/fetch — a native curl-impersonate-style HTTP client that accurately mimics real browser TLS (JA3/JA4, ClientHello) and HTTP/2 fingerprints.


🚀 Why this server?

Standard Node.js/Undici HTTP clients get immediately flagged and blocked by modern bot-protection systems (Cloudflare Turnstile / Under Attack Mode, DataDome, PerimeterX / HUMAN, Akamai, Kasada, AWS WAF).

Furthermore, standard MCP fetching tools often fail on large payloads or blow up LLM token contexts.

@trishchuk/mcp-fetch-server solves both problems:

  1. Realistic Browser Impersonation: Replicates exact cipher suites, TLS extensions, ALPN order, and HTTP/2 settings frames from modern browsers (Chrome, Safari, Firefox).

  2. LLM Context-Safe Truncation: Streams and caps response bodies at 2MB (maxResponseBytes). Oversized pages are cleanly truncated and flagged with "truncated": true rather than crashing with errors.

  3. Stateful Sessions: Maintain cookies, login states, and connection pools across multiple agent tool calls using the session parameter.

  4. Smart Encoding: Automatically detects MIME types and returns clean UTF-8 text for HTML/JSON/XML or Base64 for binary files (images, PDFs, documents).


Related MCP server: webfetch-mcp

✅ Requirements

  • Node.js >= 24 — required by @trishchuk/fetch.

  • Prebuilt native binaries ship for macOS (arm64, x64), Linux (x64/arm64, glibc and musl) and Windows (x64). Other platforms are not supported by the underlying client.


📦 Installation & Setup

Option 1: Run with npx (No installation needed)

You can run the server directly via npx:

npx -y @trishchuk/mcp-fetch-server

Option 2: Global or Local Installation

# Global
npm install -g @trishchuk/mcp-fetch-server

# Or clone & install locally
git clone https://github.com/x51xxx/mcp-fetch-server.git
cd mcp-fetch-server
npm install

⚙️ MCP Client Configuration

Claude Code

Add directly via CLI:

# Using npx (recommended)
claude mcp add fetch -- npx -y @trishchuk/mcp-fetch-server

# Or using local path
claude mcp add fetch -- node /path/to/mcp-fetch-server/src/index.js

Claude Desktop

Add to your claude_desktop_config.json:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "fetch": {
      "command": "npx",
      "args": ["-y", "@trishchuk/mcp-fetch-server"]
    }
  }
}

Cursor / Windsurf / Antigravity (.mcp.json)

Create or update .mcp.json in your workspace:

{
  "mcpServers": {
    "fetch": {
      "command": "npx",
      "args": ["-y", "@trishchuk/mcp-fetch-server"]
    }
  }
}

🛠️ Tool Reference: fetch

Input Parameters

Parameter

Type

Default

Description

url

string

required

Target absolute URL (e.g. https://example.com/api).

method

string

"GET"

HTTP method (GET, POST, PUT, DELETE, PATCH, HEAD, etc.).

headers

object

undefined

Request headers as key-value pairs ({"Authorization": "Bearer ..."}).

body

string

undefined

Request body sent as UTF-8 string (JSON, form-encoded, raw text).

impersonate

string

"chrome_147"

Browser fingerprint preset (e.g. "chrome_147", "safari_26", "random").

platform

string

undefined

Declared OS: "windows", "macos", "linux", "android", or "ios".

proxy

string

undefined

Proxy URL: http://, https://, or socks5:// (supports user:pass@host:port).

session

string

undefined

Session ID for sharing client connections and cookie jars across multiple calls.

resolve

object

undefined

Custom DNS pinning (e.g. {"example.com": "1.2.3.4"}). SSRF-safe testing.

redirect

string

"follow"

Redirect mode: "follow", "manual", or "error".

httpVersion

string

undefined

Force protocol version: "http1" or "http2".

tlsMinVersion

string

undefined

Minimum TLS version: "1.0", "1.1", "1.2", "1.3".

tlsMaxVersion

string

undefined

Maximum TLS version: "1.0", "1.1", "1.2", "1.3".

timeoutMs

number

undefined

Overall request timeout in milliseconds.

maxResponseBytes

number

2097152

Body limit in bytes (max 2MB). Responses exceeding this are safely truncated.

encoding

string

"auto"

Body return format: "auto" (text for textual MIME types, base64 for binary), "text", or "base64".


Response Schemas

1. Successful HTTP Exchange

Any completed HTTP transfer returns a standard JSON result (including 404, 500, or 3xx under redirect: "manual"):

{
  "status": 200,
  "statusText": "OK",
  "ok": true,
  "url": "https://example.com/data",
  "redirected": false,
  "headers": {
    "content-type": "application/json; charset=utf-8",
    "cache-control": "max-age=3600"
  },
  "bodyEncoding": "text",
  "body": "{\"message\": \"Hello world\"}",
  "truncated": false
}

2. Network / Transport Failure

If the network connection fails, times out, or the URL is invalid, the tool returns isError: true:

{
  "error": true,
  "code": "TIMEOUT",
  "message": "failed to read response body: request or response body error: operation timed out"
}

💡 Usage Examples for Agents

1. Bypass Bot Detection on Protected Target

{
  "url": "https://protected-site.com/products",
  "impersonate": "chrome_147",
  "platform": "macos",
  "headers": {
    "Accept-Language": "en-US,en;q=0.9"
  }
}
// Step 1: Login / Obtain Session Cookie
{
  "url": "https://example.com/api/login",
  "method": "POST",
  "session": "agent-crawler-01",
  "headers": { "Content-Type": "application/json" },
  "body": "{\"user\":\"admin\",\"password\":\"secret\"}"
}

// Step 2: Access protected resource (session cookies automatically preserved)
{
  "url": "https://example.com/api/dashboard",
  "session": "agent-crawler-01"
}

3. Route Through a SOCKS5 Proxy

{
  "url": "https://geo-restricted.example.com",
  "proxy": "socks5://user:pass@proxy.example.com:1080",
  "impersonate": "safari_26"
}

4. Fetching Binary Assets (Images, PDFs)

{
  "url": "https://example.com/report.pdf",
  "encoding": "base64"
}

5. DNS Pinning for SSRF-Safe Ingestion

{
  "url": "https://internal-origin.example.com/feed",
  "resolve": {
    "internal-origin.example.com": "192.0.2.42"
  },
  "redirect": "manual"
}

🔬 Impersonation Presets & Fingerprints

@trishchuk/mcp-fetch-server supports a wide range of browser fingerprints:

  • Chrome: "chrome_100""chrome_149" (e.g. "chrome_147", "chrome_131", "chrome_116")

  • Edge: "edge_101""edge_148"

  • Opera: "opera_116""opera_131"

  • Firefox: "firefox_109", "firefox_133", "firefox_147" …, plus "firefox_private_136" and "firefox_android_135"

  • Safari: "safari_15.3""safari_26.4", plus iOS/iPad variants ("safari_ios_26", "safari_ipad_26")

  • OkHttp (Android apps): "okhttp_3.9""okhttp_5"

  • Dynamic: "random", "weighted_random" (rotates fingerprints automatically, pinned per session)

Version numbers use underscores (chrome_147, not chrome147). An unknown name fails fast with an InvalidArg error that lists every accepted variant.


🧪 Development

npm install
npm start          # run the server over stdio
npm test           # end-to-end smoke tests, no network required
npm run format     # format with Biome
npm run lint       # lint with Biome
npm run check      # format + lint check, also run before publish

The tests spawn the real server over stdio and drive it with an MCP client against a local HTTP server, covering truncation at the cap, redirect modes, HEAD, base64 bodies, timeouts and transport errors.


📄 License

MIT © Taras Trishchuk

Available Tools

1 tool
fetchFetchA

HTTP fetch backed by @trishchuk/fetch: a curl-impersonate-style client that emulates a real browser TLS/HTTP2 fingerprint (JA3/JA4, ClientHello, ALPN) so requests are not flagged by fingerprint-based bot detection (Cloudflare, DataDome, PerimeterX, etc.) the way Node's default HTTP client is. Use it for GET/POST/etc. against sites that block or challenge plain scrapers.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute URL to request.
bodyNoRequest body, sent as UTF-8 text (e.g. JSON string, form-encoded string).
proxyNoProxy URL: http://, https://, or socks5://, optionally with user:pass@.
methodNoHTTP method.GET
headersNoRequest headers.
resolveNoHostname-to-IP pinning, e.g. { "example.com": "192.0.2.1" }. Useful to pin DNS for SSRF-safety or A/B hosts.
sessionNoOpaque session id. Reusing it across calls keeps the same underlying client and cookie jar (e.g. to stay logged in).
encodingNoHow to return the body: "auto" picks text for text-like content-types and base64 otherwise.auto
platformNoDeclared OS for the fingerprint.
redirectNoRedirect handling. Defaults to "follow".
timeoutMsNoRequest deadline in milliseconds.
httpVersionNoForce HTTP/1.1 or HTTP/2 instead of negotiating.
impersonateNoBrowser fingerprint profile, e.g. "chrome_147", "safari_26", "random". Defaults to the library default.
tlsMaxVersionNo
tlsMinVersionNo
maxResponseBytesNoResponse body cap in bytes (max 2097152, i.e. 2MB, to keep tool output usable). A larger body is truncated to this size and flagged with "truncated": true, not rejected.

TDQS

A4.1/5.0
Behavior4/5

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

The description discloses the critical behavioral trait of browser fingerprint emulation (JA3/JA4, TLS, HTTP/2) to avoid detection. Without annotations, this provides transparency about why requests succeed. However, it does not mention whether the tool is read-only or has side effects, though HTTP fetch is inherently non-destructive to local state.

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?

The description is extremely concise: two sentences that front-load the core purpose and differentiator, followed by usage guidance. Every sentence serves a purpose, and there is no redundancy or filler.

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

Completeness3/5

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

Given the tool has 16 parameters, no annotations, and no output schema, the description is somewhat incomplete. It does not explain what the tool returns (e.g., status code, headers, body format) or that the response is a standard HTTP response. While the schema covers some constraints like maxResponseBytes, the agent lacks clarity on what to expect after 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 88%, so the input schema already documents most parameters. The description adds general context about the underlying library and fingerprinting motivation but does not provide additional details on individual parameters beyond what schema descriptions offer. The baseline of 3 is appropriate.

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

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as an HTTP fetch client with browser fingerprint emulation to bypass bot detection. It specifies the verb 'fetch', the resource (URLs), and the unique value proposition (curl-impersonate style). This distinguishes it from standard HTTP clients and makes its purpose immediately obvious.

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?

The description explicitly states when to use the tool: 'against sites that block or challenge plain scrapers'. It contrasts with Node's default HTTP client, implying an alternative. However, it does not list explicit sibling tools or provide when-not-to-use guidance, such as for sites without bot detection.

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. Dates show when Glama detected each change.

  1. 1 tool updatev0.1.0
    • First observedfetch

TDQS

A3.8/5.0
Disambiguation5/5

With only a single tool, there is no possibility of confusion with other tools. The tool's purpose is clearly described and distinct by default.

Naming Consistency3/5

With only one tool, there is no pattern to judge. The name 'fetch' is simple and conventional, matching common HTTP client terminology, but the lack of a verb_noun convention is neutral.

Tool Count2/5

A single tool for an HTTP fetch server is too minimal. Most similar servers would include additional tools for managing headers, cookies, or caching, making this feel under-scoped for its stated purpose of scraping.

Completeness2/5

The server only provides a basic fetch tool with no support for managing sessions, handling redirects, managing cookies, or performing other common HTTP operations. This leaves significant gaps for any realistic scraping workflow.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to perform undetectable browser automation that bypasses Cloudflare, antibots, and social media blocks. Provides 105 tools for element extraction, network debugging, and real-world web scraping with a 98.7% success rate on protected sites.
    1,883
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Drop-in MCP replacement for the built-in WebFetch tool. Adds domain-scoped custom HTTP headers via YAML config, with bot-block detection, HTML-to-text extraction, retries, proxies, and prompt-injection sanitization.
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Context-aware web fetching for LLMs, providing 7 tools to check page size, fetch with truncation, extract code/sections/links/tables, and paginate large documents.
    7
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/x51xxx/mcp-fetch-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server