mult-fetch-mcp-server
This MCP server fetches web content in multiple formats and returns it with chunking, extraction, and optional browser/proxy controls.
Fetch a URL as HTML, JSON, plain text, Markdown, or plaintext via
fetch_html,fetch_json,fetch_txt,fetch_markdown, andfetch_plaintext.Retrieve large content in chunks using
startCursor,chunkId,contentSizeLimit, andenableContentSplitting.Optionally render pages with a headless browser (
useBrowser,autoDetectMode) and control browser behavior (waitForSelector,waitForTimeout,scrollToBottom,saveCookies,closeBrowser).Extract main article content with Readability (
extractContent) and include metadata (includeMetadata), with optional fallback to original content.Configure requests with custom headers, timeout, redirect limit, proxy/system proxy, and debug logging.
Enforce URL safety checks to block loopback, private networks, link-local/cloud metadata, and related private IPv6 targets.
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., "@mult-fetch-mcp-server fetch https://example.com and return as markdown"
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.
mult-fetch-mcp-server
This project implements an MCP-compliant client and server for communication between AI assistants and external tools.
Version 2.0
Call the fetch tool with a URL. The default format is Markdown, using an HTTP fetch plus readable-article extraction. startCursor is not required.
| What you get |
| Readable article as Markdown (default) |
| Readable article as plain text |
| HTML markup |
| JSON document |
| Raw response body |
A normal page comes back in one response. The default budget is maxChars 100000 and maxBytes 1048576, and a cut prefers a newline or a space. When the body is longer, the response includes nextCursor and chunkId. Call fetch again with cursor set to nextCursor.
fetch_html, fetch_json, fetch_txt, fetch_markdown, and fetch_plaintext are thin aliases of fetch with a fixed format.
Cursor
Add this to ~/.cursor/mcp.json, or to .cursor/mcp.json in a project:
{
"mcpServers": {
"mult-fetch": {
"command": "npx",
"args": ["-y", "@lmcc-dev/mult-fetch-mcp-server"],
"env": {
"MCP_LANG": "en"
}
}
}
}Claude Desktop
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"mult-fetch": {
"command": "npx",
"args": ["-y", "@lmcc-dev/mult-fetch-mcp-server"],
"env": {
"MCP_LANG": "en"
}
}
}
}Restart the host after saving. Ask it to fetch a URL. It should call fetch without startCursor.
Browser mode
The default HTTP fetcher does not need Chrome or Puppeteer. A normal install works without them (npm install --omit=optional skips the optional packages). To render pages in a headless browser, install the optional packages and set useBrowser to true:
npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealthautoDetectMode defaults to false, so a 403 does not launch a browser unless you set that flag.
Security
Every request, including redirects, is checked before it is sent:
Loopback (
127.0.0.0/8,::1,localhost)Private networks (
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16)Link-local and cloud metadata (
169.254.0.0/16, including169.254.169.254, and IPv6fe80::/10)Carrier-grade NAT
100.64.0.0/10, documentation ranges, and private addresses embedded in 6to4, NAT64, or IPv4-mapped IPv6
Direct connections are pinned to the addresses that passed that check. The default timeout is 30 seconds, and each response is limited by maxChars and maxBytes. Browser mode keeps the same URL checks. Set ALLOW_PRIVATE_NETWORK_REQUESTS=true only when you intentionally want the browser to open a private-network target.
Related MCP server: Crawl4AI MCP Server
Project Structure
fetch-mcp/
├── src/ # Source code directory
│ ├── lib/ # Library files
│ │ ├── fetchers/ # Web fetching implementation
│ │ │ ├── browser/ # Browser-based fetching
│ │ │ │ ├── BrowserFetcher.ts # Browser fetcher implementation
│ │ │ │ ├── BrowserInstance.ts # Browser instance management
│ │ │ │ └── PageOperations.ts # Page interaction operations
│ │ │ ├── node/ # Node.js-based fetching
│ │ │ └── common/ # Shared fetching utilities
│ │ ├── utils/ # Utility modules
│ │ │ ├── ChunkManager.ts # Content chunking
│ │ │ ├── ContentProcessor.ts # HTML to text conversion
│ │ │ ├── ContentExtractor.ts # Intelligent content extraction
│ │ │ ├── ContentSizeManager.ts # Content size limiting
│ │ │ └── ErrorHandler.ts # Error handling
│ │ ├── server/ # Server-related modules
│ │ │ ├── index.ts # Server entry
│ │ │ ├── browser.ts # Browser management
│ │ │ ├── fetcher.ts # Web fetching logic
│ │ │ ├── tools.ts # Tool registration and handling
│ │ │ ├── resources.ts # Resource handling
│ │ │ ├── prompts.ts # Prompt templates
│ │ │ └── types.ts # Server type definitions
│ │ ├── i18n/ # Internationalization support
│ │ └── types.ts # Common type definitions
│ ├── client.ts # MCP client implementation
│ └── mcp-server.ts # MCP server main entry
├── index.ts # Server entry point
├── tests/ # Test files
└── dist/ # Compiled filesMCP Specification
The Model Context Protocol (MCP) defines two main transport methods:
Standard Input/Output (Stdio): The client starts the MCP server as a child process, and they communicate through standard input (stdin) and standard output (stdout).
Server-Sent Events (SSE): Used to pass messages between client and server.
This project implements the Standard Input/Output (Stdio) transport method.
Features
Implementation based on the official MCP SDK
Support for Standard Input/Output (Stdio) transport
One
fetchtool withformatset to HTML, JSON, text, Markdown, or plain textHTTP fetch by default, with optional headless-browser rendering
Single-response content window (
maxChars/maxBytes) and optionalcursorcontinuation when the body is truncatedDetailed debug logging to stderr
Bilingual internationalization (English and Chinese)
Modular design for easy maintenance and extension
Intelligent Content Extraction: Based on Mozilla's Readability library, capable of extracting meaningful content from web pages while filtering out advertisements and navigation elements
Metadata Support: Ability to extract webpage metadata such as title, author, publication date, and site information
Smart Content Detection: Automatically detects if a page contains meaningful content, filtering out login pages, error pages, and other pages without substantial content
Browser Automation Enhancements: Support for page scrolling, cookie management, selector waiting, and other advanced browser interactions
Installation
Installing via Smithery
To install Mult Fetch MCP Server for Claude Desktop automatically via Smithery:
npx -y @smithery/cli install @lmcc-dev/mult-fetch-mcp-server --client claudeLocal Installation
pnpm installGlobal Installation
pnpm add -g @lmcc-dev/mult-fetch-mcp-serverOr run directly with npx (no installation required):
npx @lmcc-dev/mult-fetch-mcp-serverIntegration with Claude
To integrate this tool with Claude desktop, you need to add server configuration:
Configuration File Location
MacOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%/Claude/claude_desktop_config.json
Configuration Examples
Method 1: Using npx (Recommended)
This method is the simplest, doesn't require specifying the full path, and is suitable for global installation or direct use with npx:
{
"mcpServers": {
"mult-fetch-mcp-server": {
"command": "npx",
"args": ["@lmcc-dev/mult-fetch-mcp-server"],
"env": {
"MCP_LANG": "en" // Set language to English, options: "zh" or "en"
}
}
}
}Method 2: Specifying Full Path
If you need to use a specific installation location, you can specify the full path:
{
"mcpServers": {
"mult-fetch-mcp-server": {
"command": "path-to/bin/node",
"args": ["path-to/@lmcc-dev/mult-fetch-mcp-server/dist/index.js"],
"env": {
"MCP_LANG": "en" // Set language to English, options: "zh" or "en"
}
}
}
}Please replace path-to/bin/node with the path to the Node.js executable on your system, and replace path-to/@lmcc-dev/mult-fetch-mcp-server with the actual path to this project.
Usage Examples
Below is an example of using this tool in Claude desktop client:

The image shows how Claude can use the fetch tools to retrieve web content and process it according to your instructions.
Usage
After configuration, restart Claude desktop, and you can use the following tools in your conversation:
fetch: Fetch a URL. Setformattohtml,markdown(default),plaintext,json, ortxtfetch_html,fetch_json,fetch_txt,fetch_markdown,fetch_plaintext: aliases offetchkept from 1.x
Build
pnpm run buildRun Server
pnpm run server
# or
node dist/index.js
# if globally installed, you can run directly
@lmcc-dev/mult-fetch-mcp-server
# or use npx
npx @lmcc-dev/mult-fetch-mcp-serverClient Demo Tools
Note: The following client.js functionality is provided for demonstration and testing purposes only. When used with Claude or other AI assistants, the MCP server is driven by the AI, which manages the chunking process automatically.
Command Line Client
The project includes a command-line client for testing and development purposes:
pnpm run client <method> <params_json>
# example
pnpm run client fetch_html '{"url": "https://example.com", "debug": true}'Demo Client Chunk Control Parameters
When testing with the command-line client, you can use these parameters to demonstrate content chunking capabilities:
--all-chunks: Command line flag to automatically fetch all chunks in sequence (demonstration purpose only)--max-chunks: Command line flag to limit the maximum number of chunks to fetch (optional, default is 10)
Real-time Output Demo
The client.js demo tool provides real-time output capabilities:
node dist/src/client.js fetch_html '{"url":"https://example.com", "startCursor": 0, "contentSizeLimit": 500}' --all-chunks --debugThe demo client will automatically fetch all chunks in sequence and display them immediately, showcasing how large content can be processed in real-time.
Run Tests
# Run MCP functionality tests
npm run test:mcp
# Run mini4k.com website tests
npm run test:mini4k
# Run direct client call tests
npm run test:directLanguage Settings
This project supports Chinese and English bilingual internationalization. You can set the language using environment variables:
Using Environment Variables
Set the MCP_LANG environment variable to control the language:
# Set to English
export MCP_LANG=en
npm run server
# Set to Chinese
export MCP_LANG=zh
npm run server
# Windows system
set MCP_LANG=zh
npm run serverUsing environment variables ensures that all related processes (including the MCP server) use the same language settings.
Default Language
By default, the system will choose a language according to the following priority:
MCP_LANGenvironment variableOperating system language (if it starts with "zh", use Chinese)
English (as the final fallback option)
Debugging
This project follows the MCP protocol specification and does not output any logs by default to avoid interfering with JSON-RPC communication. Debug information is controlled through call parameters:
Using the debug Parameter
Set the debug: true parameter when calling a tool:
{
"url": "https://example.com",
"debug": true
}Debug messages are sent to the standard error stream (stderr) using the following format:
[MCP-SERVER] MCP server starting...
[CLIENT] Fetching URL: https://example.comDebug Log File
When debug mode is enabled, all debug messages are also written to a log file located at:
~/.mult-fetch-mcp-server/debug.logThis log file can be accessed through the MCP resources API:
// Access the debug log file
const result = await client.readResource({ uri: "file:///logs/debug" });
console.log(result.contents[0].text);
// Clear the debug log file
const clearResult = await client.readResource({ uri: "file:///logs/clear" });
console.log(clearResult.contents[0].text);Proxy Settings
This tool supports various methods to configure proxy settings:
1. Using the proxy Parameter
The most direct way is to specify the proxy in the request parameters:
{
"url": "https://example.com",
"proxy": "http://your-proxy-server:port",
"debug": true
}2. Using Environment Variables
The tool will automatically detect and use proxy settings from standard environment variables:
# Set proxy environment variables
export HTTP_PROXY=http://your-proxy-server:port
export HTTPS_PROXY=http://your-proxy-server:port
# Run the server
npm run server3. System Proxy Detection
The tool attempts to detect system proxy settings based on your operating system:
Windows: Reads proxy settings from environment variables using the
setcommandmacOS/Linux: Reads proxy settings from environment variables using the
envcommand
4. Proxy Troubleshooting
If you're having issues with proxy detection:
Use the
debug: trueparameter to see detailed logs about proxy detectionExplicitly specify the proxy using the
proxyparameterEnsure your proxy URL is in the correct format:
http://host:portorhttps://host:portFor websites that require browser capabilities, set
useBrowser: trueto use browser mode
5. Browser Mode and Proxies
When using browser mode (useBrowser: true), the tool will:
First try to use the explicitly specified proxy (if provided)
Then try to use system proxy settings
Finally, proceed without a proxy if none is found
Browser mode is particularly useful for websites that implement anti-scraping measures or require JavaScript execution.
Parameter Handling
This project handles parameters in the following ways:
debug: Passed through call parameters, each request can individually control whether to enable debug output
MCP_LANG: Retrieved from environment variables, controls the language settings of the entire server
Usage
Creating a Client
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
import path from 'path';
import { fileURLToPath } from 'url';
// Get the directory path of the current file
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Create client transport layer
const transport = new StdioClientTransport({
command: 'node',
args: [path.resolve(__dirname, 'dist/index.js')],
stderr: 'inherit',
env: {
...process.env // Pass all environment variables, including MCP_LANG
}
});
// Create client
const client = new Client({
name: "example-client",
version: "1.0.0"
});
// Connect to transport layer
await client.connect(transport);
// Use client
const result = await client.callTool({
name: 'fetch_html',
arguments: {
url: 'https://example.com',
debug: true // Control debug output through parameters
}
});
if (result.isError) {
console.error('Fetch failed:', result.content[0].text);
} else {
console.log('Fetch successful!');
console.log('Content preview:', result.content[0].text.substring(0, 500));
}Supported Tools
fetch: Fetch a URL.formatishtml,markdown(default),plaintext,json, ortxtfetch_html,fetch_json,fetch_txt,fetch_markdown,fetch_plaintext: 1.x aliases offetch
Resources Support
The server includes support for the resources/list and resources/read methods, but currently no resources are defined in the implementation. The resource system is designed to provide access to project files and documentation, but this feature is not fully implemented yet.
Resource Usage Example
// Example: List available resources
const resourcesResult = await client.listResources({});
console.log('Available resources:', resourcesResult);
// Note: Currently this will return empty lists for resources and resourceTemplatesSupported Prompt Templates
The server provides the following prompt templates:
fetch-website: Get website content, supporting different formats and browser modeextract-content: Extract specific content from a website, supporting CSS selectors and data type specificationdebug-fetch: Debug website fetching issues, analyze possible causes and provide solutions
Prompt Template Usage
Use
prompts/listto get a list of available prompt templatesUse
prompts/getto get specific prompt template content
// Example: List available prompt templates
const promptsResult = await client.listPrompts({});
console.log('Available prompts:', promptsResult);
// Example: Get website content prompt
const fetchPrompt = await client.getPrompt({
name: "fetch-website",
arguments: {
url: "https://example.com",
format: "html",
useBrowser: "false"
}
});
console.log('Fetch website prompt:', fetchPrompt);
// Example: Debug website fetching issues
const debugPrompt = await client.getPrompt({
name: "debug-fetch",
arguments: {
url: "https://example.com",
error: "Connection timeout"
}
});
console.log('Debug fetch prompt:', debugPrompt);Parameter Options
Each tool supports the following parameters:
Basic Parameters
url: URL to fetch (required)headers: Custom request headers (optional, default {})proxy: Proxy server URL in the format http://host:port or https://host:port (optional)
Network Control Parameters
timeout: Timeout in milliseconds (optional, default is 30000)maxRedirects: Maximum number of redirects to follow (optional, default is 10)noDelay: Whether to disable random delay between requests (optional, default is false)useSystemProxy: Whether to use system proxy (optional, default is true)
Content Window
maxChars: Maximum characters in this response (optional, default 100000). The cut prefers a newline or space.maxBytes: Maximum UTF-8 bytes in this response (optional, default 1048576).cursor: Continuation token fromnextCursor. Omit it on the first call. When it is set, the server does not refetch the URL.enableContentSplitting: When false, oversized content is truncated with no cursor (optional, default true).contentSizeLimit: Legacy byte-chunk size. When set withoutmaxCharsormaxBytes, the 1.x byte splitter is used.startCursor: Legacy byte offset. Not required. Use it only with a 1.xchunkId.
Chunk Management
chunkId: Document id returned withnextCursorwhen a response was truncated.
Pass cursor back to fetch to read the next slice. startCursor is not part of that flow.
Mode Control Parameters
useBrowser: Whether to use browser mode (optional, default is false)useNodeFetch: Whether to force using Node.js mode (optional, default is false, mutually exclusive withuseBrowser)autoDetectMode: Retry a 403 or challenge page in the browser (optional, default false). Requires the optional Puppeteer packages.
Browser Mode Specific Parameters
waitForSelector: Selector to wait for in browser mode (optional, default is 'body')waitForTimeout: Timeout to wait in browser mode in milliseconds (optional, default is 5000)scrollToBottom: Whether to scroll to the bottom of the page in browser mode (optional, default is false)saveCookies: Whether to save cookies in browser mode (optional, default is true)closeBrowser: Whether to close the browser instance (optional, default is false)
Content Extraction Parameters
extractContent: Use Readability before conversion (optional). Default true formarkdownandplaintext, false forhtml,json, andtxt.includeMetadata: Whether to include metadata in the extracted content (optional, default false, only works whenextractContentis true)fallbackToOriginal: Whether to fall back to the original content when extraction fails (optional, default true, only works whenextractContentis true)
Debug Parameters
debug: Whether to enable debug output (optional, default false)
Content Extraction Feature
Use the content extraction feature to get the core content of a webpage, filtering out navigation bars, advertisements, sidebars, and other distracting elements:
{
"url": "https://example.com/article",
"extractContent": true,
"includeMetadata": true
}The extracted content will include the following metadata (if available):
Title
Byline (author)
Site name
Excerpt
Content length
Readability flag (isReaderable)
Special Usage
Content Extraction Examples
To extract only the meaningful content from an article webpage:
{
"url": "https://example.com/news/article",
"extractContent": true,
"includeMetadata": true
}For websites where content extraction might fail, you can use fallbackToOriginal to ensure you get some content:
{
"url": "https://example.com/complex-layout",
"extractContent": true,
"fallbackToOriginal": true
}Closing Browser Without Fetching
To close the browser instance without performing any fetch operation:
{
"url": "about:blank",
"closeBrowser": true
}Proxy Priority
The proxy is determined in the following order:
Command line specified proxy
proxyparameter in the requestEnvironment variables (if
useSystemProxyis true)Git configuration (if
useSystemProxyis true)
If proxy is set, useSystemProxy will be automatically set to false.
Debug Output
When debug: true is set, logs will be output to stderr with the following prefixes:
[MCP-SERVER]: Logs from the MCP server[NODE-FETCH]: Logs from the Node.js fetcher[BROWSER-FETCH]: Logs from the browser fetcher[CLIENT]: Logs from the client[TOOLS]: Logs from the tool implementation[FETCHER]: Logs from the main fetcher interface[CONTENT]: Logs related to content handling[CONTENT-PROCESSOR]: Logs from the HTML content processor[CONTENT-SIZE]: Logs related to content size management[CHUNK-MANAGER]: Logs related to content chunking operations[ERROR-HANDLER]: Logs related to error handling[BROWSER-MANAGER]: Logs from the browser instance manager[CONTENT-EXTRACTOR]: Logs from the content extractor
License
MIT
Updated by lmcc-dev
Available Tools
6 toolsfetchA
Fetch an http(s) URL and return its content in one response. Use this to read a web page or a JSON/text URL. Default format is markdown with readable-article extraction. Do not send startCursor. Parameters that matter: url (required on the first call), format (html | markdown | plaintext | json | txt, default markdown). Optional: maxChars (default 100000), maxBytes (default 1048576), timeout (default 30000). If the response is truncated it includes nextCursor and chunkId; call fetch again with that cursor to continue. Private, loopback, and link-local targets are blocked. Browser rendering is off unless useBrowser or autoDetectMode is true.
Inputs: url (required), debug, proxy, cursor, +22 more.
fetch_htmlA
Deprecated alias of fetch with format="html". Returns HTML. Prefer the fetch tool. startCursor is not required.
Inputs: url (required), debug, proxy, cursor, +21 more.
fetch_jsonA
Deprecated alias of fetch with format="json". Returns a JSON document. Prefer the fetch tool. startCursor is not required.
Inputs: url (required), debug, proxy, cursor, +18 more.
fetch_markdownA
Deprecated alias of fetch with format="markdown". Returns Markdown. Prefer the fetch tool. startCursor is not required.
Inputs: url (required), debug, proxy, cursor, +21 more.
fetch_plaintextA
Deprecated alias of fetch with format="plaintext". Returns plain text extracted from HTML. Prefer the fetch tool. startCursor is not required.
Inputs: url (required), debug, proxy, cursor, +21 more.
fetch_txtA
Deprecated alias of fetch with format="txt". Returns the raw response body. Prefer the fetch tool. startCursor is not required.
Inputs: url (required), debug, proxy, cursor, +18 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
The five alias tools are explicitly deprecated duplicates of fetch with a preset format, so an agent can easily pick fetch_html instead of fetch with format=html. The descriptions do warn against this, but the tool set still presents six overlapping entry points for essentially one operation.
All names use a consistent snake_case fetch_* pattern, with the base tool simply named fetch. The convention is predictable, though the aliases create redundant variants rather than distinct operations.
Six tools are listed, but five are deprecated aliases that add no new capability. The effective surface is one tool, making the count misleading and cluttered rather than well-scoped.
The core fetch tool covers multiple formats, truncation cursors, timeouts, size limits, and optional browser rendering, which is solid coverage for an HTTP fetching server. The aliases do not fill real gaps, but the primary tool is fairly complete.
Maintenance
Related MCP Connectors
Web scraping, browser automation, screenshots and AI data extraction for AI agents via MCP.
Web search API and MCP server for developers building AI agents.
One MCP server for all web data. Scrape, search, crawl, and AI research in one install.
Hosted Web Crawler MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that fetches web pages and extracts clean, AI-friendly Markdown content using Mozilla Readability. It provides secure web access for LLMs with built-in SSRF protection and automated content cleaning for improved context retrieval and summarization.198 npmMIT
- FlicenseNot gradedqualityDmaintenanceA locally-hosted MCP server that provides AI assistants with advanced web crawling capabilities, including structured data extraction, deep site crawling, and page screenshots. It enables users to convert single or multiple URLs into clean Markdown content for processing by LLMs without requiring external API keys for basic features.-
- AlicenseNot gradedqualityDmaintenanceAn MCP server that gives AI tools a reliable way to fetch content from the web, handling anti-bot protection and JavaScript-rendered pages.1,986 npmMIT

Wickofficial
FlicenseNot gradedqualityCmaintenanceAn MCP server that provides browser-grade web access for AI agents, using Chrome's actual network stack to bypass anti-bot protections and return clean markdown.9-