mult-fetch-mcp-server

This project implements an MCP-compliant client and server for communication between AI assistants and external tools.
English | δΈζζζ‘£
Project Structure
fetch-mcp/
βββ src/ # Source code directory
β βββ lib/ # Library files
β β βββ BrowserFetcher.ts # Browser mode fetcher
β β βββ NodeFetcher.ts # Node.js mode fetcher
β β βββ server/ # Server-related modules
β β β βββ index.ts # Server entry point
β β β βββ browser.ts # Browser management
β β β βββ fetcher.ts # Web fetching logic
β β β βββ logger.ts # Logging utilities
β β β βββ tools.ts # Tool registration and handling
β β β βββ types.ts # Server type definitions
β β βββ i18n/ # Internationalization support
β β β βββ index.ts # i18n configuration
β β β βββ logger.ts # i18n logger utilities
β β βββ 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
β βββ test-mcp.ts # MCP functionality tests
β βββ test-mini4k.ts # Specific website tests
β βββ test-direct-client.ts # Direct client call tests
βββ dist/ # Compiled files
βββ index.js # Compiled entry point
βββ src/ # Compiled source code
βββ tests/ # Compiled test files
MCP 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
- Multiple web scraping methods (HTML, JSON, text, Markdown)
- Intelligent mode switching: automatically switches between standard requests and browser mode
- Detailed debug logs output to standard error stream
- Support for Chinese and English bilingual internationalization
- Modular design for easy maintenance and extension
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 claude
Local Installation
pnpm install
Global Installation
pnpm add -g @lmcc-dev/mult-fetch-mcp-server
Or run directly with npx (no installation required):
npx @lmcc-dev/mult-fetch-mcp-server
Integration 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.json
- Windows:
%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"
}
}
}
}
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"
}
}
}
}
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_html
: Get HTML content of a webpage
fetch_json
: Get JSON data
fetch_txt
: Get plain text content
fetch_markdown
: Get Markdown formatted content
Build
pnpm run build
Run Server
pnpm run server
node dist/index.js
@lmcc-dev/mult-fetch-mcp-server
npx @lmcc-dev/mult-fetch-mcp-server
Run Client
pnpm run client <method> <params_json>
pnpm run client fetch_html '{"url": "https://example.com", "debug": true}'
Run Tests
npm run test:mcp
npm run test:mini4k
npm run test:direct
Language 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:
export MCP_LANG=en
npm run server
export MCP_LANG=zh
npm run server
set MCP_LANG=zh
npm run server
Using 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_LANG
environment variable
- Operating 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.com
Debug Log File
When debug mode is enabled, all debug messages are also written to a log file located at:
~/.mult-fetch-mcp-server/debug.log
This log file can be accessed through the MCP resources API:
const result = await client.readResource({ uri: "file:///logs/debug" });
console.log(result.contents[0].text);
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:
export HTTP_PROXY=http://your-proxy-server:port
export HTTPS_PROXY=http://your-proxy-server:port
npm run server
3. 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
set
command
- macOS/Linux: Reads proxy settings from environment variables using the
env
command
4. Proxy Troubleshooting
If you're having issues with proxy detection:
- Use the
debug: true
parameter to see detailed logs about proxy detection
- Explicitly specify the proxy using the
proxy
parameter
- Ensure your proxy URL is in the correct format:
http://host:port
or https://host:port
- For websites that require browser capabilities, set
useBrowser: true
to 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';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const transport = new StdioClientTransport({
command: 'node',
args: [path.resolve(__dirname, 'dist/index.js')],
stderr: 'inherit',
env: {
...process.env
}
});
const client = new Client({
name: "example-client",
version: "1.0.0"
});
await client.connect(transport);
const result = await client.callTool({
name: 'fetch_html',
arguments: {
url: 'https://example.com',
debug: true
}
});
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_html
: Get HTML content of a webpage
fetch_json
: Get JSON data
fetch_txt
: Get plain text content
fetch_markdown
: Get Markdown formatted content
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
const resourcesResult = await client.listResources({});
console.log('Available resources:', resourcesResult);
Supported Prompt Templates
The server provides the following prompt templates:
fetch-website
: Get website content, supporting different formats and browser mode
extract-content
: Extract specific content from a website, supporting CSS selectors and data type specification
debug-fetch
: Debug website fetching issues, analyze possible causes and provide solutions
Prompt Template Usage
- Use
prompts/list
to get a list of available prompt templates
- Use
prompts/get
to get specific prompt template content
const promptsResult = await client.listPrompts({});
console.log('Available prompts:', promptsResult);
const fetchPrompt = await client.getPrompt({
name: "fetch-website",
arguments: {
url: "https://example.com",
format: "html",
useBrowser: "false"
}
});
console.log('Fetch website prompt:', fetchPrompt);
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 is {})
proxy
: Proxy server URL in 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)
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 with useBrowser
)
autoDetectMode
: Whether to automatically detect and switch to browser mode (optional, default is true)
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)
Debug Parameters
debug
: Whether to enable debug output (optional, default is false)
Special Usage
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
proxy
parameter in the request
- Environment variables (if
useSystemProxy
is true)
- Git configuration (if
useSystemProxy
is true)
If proxy
is set, useSystemProxy
will be automatically set to false.
Debug Output
When debug: true
is set, the 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
License
MIT
Updated by lmcc-dev