多点取mcp服务器
](https://www.npmjs.com/package/@lmcc-dev/mult-fetch-mcp-server)  ](https://nodejs.org/)   ](https://github.com/lmcc-dev/mult-fetch-mcp-server/stargazers) ](https://github.com/lmcc-dev/mult-fetch-mcp-server/network/members) ](https://github.com/lmcc-dev/mult-fetch-mcp-server/issues) ](https://github.com/lmcc-dev/mult-fetch-mcp-server/pulls) ](https://www.npmjs.com/package/@lmcc-dev/mult-fetch-mcp-server) ](https://github.com/lmcc-dev/mult-fetch-mcp-server/commits/main) ](https://github.com/lmcc-dev/mult-fetch-mcp-server/graphs/contributors) ](https://smithery.ai/server/@lmcc-dev/mult-fetch-mcp-server)  
该项目实现了一个符合MCP的客户端和服务器,用于AI助手和外部工具之间的通信。
项目结构
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规范
模型上下文协议(MCP)定义了两种主要的传输方法:
- 标准输入/输出(Stdio):客户端将MCP服务器作为子进程启动,它们通过标准输入(stdin)和标准输出(stdout)进行通信。
- 服务器发送事件(SSE):用于在客户端和服务器之间传递消息。
本项目采用标准输入/输出(Stdio)传输方法。
特性
- 基于官方MCP SDK的实现
- 支持标准输入/输出(Stdio)传输
- 多种网络抓取方法(HTML、JSON、文本、Markdown、纯文本转换)
- 智能模式切换:在标准请求和浏览器模式之间自动切换
- 内容大小管理:自动将大型内容拆分为可管理的块,以解决AI模型上下文大小的限制
- 分块内容检索:在保持上下文连续性的同时请求特定大内容块的能力
- 详细的调试日志记录到stderr
- 双语国际化(中英文)
- 模块化设计,易于维护和扩展
- 智能内容提取:基于Mozilla的可读性库,能够从网页中提取有意义的内容,同时过滤掉广告和导航元素
- 元数据支持:能够提取网页元数据,如标题、作者、发布日期和网站信息
- 智能内容检测:自动检测页面是否包含有意义的内容,过滤掉登录页面、错误页面和其他没有实质内容的页面
- 浏览器自动化增强功能:支持页面滚动、cookie管理、选择器等待和其他高级浏览器交互
安装
通过Smithery安装
通过以下方式自动为Claude Desktop安装Mult Fetch MCP服务器 史密瑟里:
npx -y @smithery/cli install @lmcc-dev/mult-fetch-mcp-server --client claude本地安装
pnpm install全球安装
pnpm add -g @lmcc-dev/mult-fetch-mcp-server或者直接使用npx运行(无需安装):
npx @lmcc-dev/mult-fetch-mcp-server与Claude整合
要将此工具与Claude桌面集成,您需要添加服务器配置:
配置文件位置
- MacOS:
~/Library/Application Support/Claude/claude_desktop_config.json - 视窗:
%APPDATA%/Claude/claude_desktop_config.json
配置示例
方法1:使用npx(推荐)
此方法最简单,不需要指定完整路径,适用于全局安装或直接与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"
}
}
}
}方法2:指定完整路径
如果需要使用特定的安装位置,可以指定完整路径:
{
"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"
}
}
}
}请更换 path-to/bin/node 使用系统上Node.js可执行文件的路径,并替换 path-to/@lmcc-dev/mult-fetch-mcp-server 与这个项目的实际路径。
使用示例
下面是在Claude桌面客户端中使用此工具的示例:
该图显示了Claude如何使用fetch工具检索web内容并根据您的指示进行处理。
用法
配置后,重新启动Claude桌面,您可以在对话中使用以下工具:
fetch_html:获取网页的HTML内容fetch_json:获取JSON数据fetch_txt:获取纯文本内容fetch_markdown:获取Markdown格式的内容fetch_plaintext:获取从HTML转换的纯文本内容(去除HTML标签)
构建
pnpm run build运行服务器
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-server客户端演示工具
备注:以下client.js功能仅用于演示和测试目的。当与Claude或其他AI助手一起使用时,MCP服务器由AI驱动,AI会自动管理分块过程。
命令行客户端
该项目包括一个用于测试和开发目的的命令行客户端:
pnpm run client
# example
pnpm run client fetch_html '{"url": "https://example.com", "debug": true}'演示客户端块控制参数
在使用命令行客户端进行测试时,您可以使用这些参数来演示内容分块功能:
--all-chunks:命令行标志,用于按顺序自动获取所有块(仅用于演示目的)--max-chunks:命令行标志,用于限制要获取的最大块数(可选,默认值为10)
实时输出演示
client.js演示工具提供实时输出功能:
node dist/src/client.js fetch_html '{"url":"https://example.com", "startCursor": 0, "contentSizeLimit": 500}' --all-chunks --debug演示客户端将自动按顺序获取所有块并立即显示,展示如何实时处理大型内容。
运行测试
# 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:direct语言设置
该项目支持中英文双语国际化。您可以使用环境变量设置语言:
使用环境变量
设置 MCP_LANG 用于控制语言的环境变量:
# 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 server使用环境变量可确保所有相关进程(包括MCP服务器)使用相同的语言设置。
默认语言
默认情况下,系统将根据以下优先级选择语言:
MCP_LANG环境变量- 操作系统语言(如果以“zh”开头,请使用中文)
- 英语(作为最后的后备选项)
调试
此项目遵循MCP协议规范,默认情况下不输出任何日志,以避免干扰JSON-RPC通信。调试信息通过调用参数进行控制:
使用调试参数
设置 debug: true 调用工具时的参数:
{
"url": "https://example.com",
"debug": true
}调试消息使用以下格式发送到标准错误流(stderr):
[MCP-SERVER] MCP server starting...
[CLIENT] Fetching URL: https://example.com调试日志
启用调试模式时,所有调试消息也会写入位于以下位置的日志文件:
~/.mult-fetch-mcp-server/debug.log此日志文件可通过MCP资源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);代理服务器设置
此工具支持配置代理设置的各种方法:
1.使用 proxy 参数
最直接的方法是在请求参数中指定代理:
{
"url": "https://example.com",
"proxy": "http://your-proxy-server:port",
"debug": true
}2.使用环境变量
该工具将自动检测并使用标准环境变量中的代理设置:
# 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.系统代理检测
该工具尝试根据您的操作系统检测系统代理设置:
- 视窗:使用从环境变量读取代理设置
set命令 - macOS/Linux:使用从环境变量读取代理设置
env命令
4.代理故障排除
如果您在代理检测方面遇到问题:
- 使用
debug: true参数,用于查看有关代理检测的详细日志 - 使用以下命令明确指定代理
proxy参数 - 确保您的代理URL格式正确:
http://host:port或https://host:port - 对于需要浏览器功能的网站,设置
useBrowser: true使用浏览器模式
5.浏览器模式和代理
使用浏览器模式时(useBrowser: true),该工具将:
- 首先尝试使用明确指定的代理(如果提供)
- 然后尝试使用系统代理设置
- 最后,如果找不到代理,则在没有代理的情况下继续
浏览器模式对于实施反抓取措施或需要执行JavaScript的网站特别有用。
参数处理
此项目以以下方式处理参数:
- 调试:通过调用参数传递,每个请求都可以单独控制是否启用调试输出
- MCP_LANG:从环境变量中检索,控制整个服务器的语言设置
用法
创建客户端
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));
}支持的工具
fetch_html:获取网页的HTML内容fetch_json:获取JSON数据fetch_txt:获取纯文本内容fetch_markdown:获取Markdown格式的内容fetch_plaintext:获取从HTML转换的纯文本内容(去除HTML标签)
资源支持
服务器包括对资源/列表和资源/读取方法的支持,但目前在实现中没有定义资源。资源系统旨在提供对项目文件和文档的访问,但此功能尚未完全实现。
资源使用示例
// Example: List available resources
const resourcesResult = await client.listResources({});
console.log('Available resources:', resourcesResult);
// Note: Currently this will return empty lists for resources and resourceTemplates支持的提示模板
服务器提供以下提示模板:
fetch-website:获取网站内容,支持不同格式和浏览器模式extract-content:从网站中提取特定内容,支持CSS选择器和数据类型规范debug-fetch:调试网站抓取问题,分析可能的原因并提供解决方案
提示模板使用
- 使用
prompts/list获取可用提示模板的列表 - 使用
prompts/get获取特定的提示模板内容
// 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);参数选项
每个工具支持以下参数:
基本参数
url:要获取的URL(必需)headers:自定义请求标头(可选,默认{})proxy:格式为的代理服务器URLhttp://host:port或https://host:port(可选)
网络控制参数
timeout:超时时间(毫秒)(可选,默认值为30000)maxRedirects:要遵循的最大重定向数(可选,默认值为10)noDelay:是否禁用请求之间的随机延迟(可选,默认为false)useSystemProxy:是否使用系统代理(可选,默认为true)
内容大小控制参数
enableContentSplitting:是否将大内容拆分为块(可选,默认为true)contentSizeLimit:拆分前的最大内容大小(以字节为单位)(可选,默认值为50000)startCursor:从特定位置检索内容的起始光标位置(以字节为单位)(可选,默认值为0)
这些参数有助于管理超过AI模型上下文大小限制的大型内容,使您能够以可管理的块检索web内容,同时保持处理完整信息的能力。
区块管理
chunkId:内容拆分时块集的唯一标识符(用于请求后续块)
当内容被分割成块时,响应包括元数据,允许AI使用 chunkId 和 startCursor 参数。该系统使用字节级块管理来提供对内容检索的精确控制,从而能够无缝处理来自任何位置的内容。
模式控制参数
useBrowser:是否使用浏览器模式(可选,默认为false)useNodeFetch:是否强制使用Node.js模式(可选,默认为false,与互斥useBrowser)autoDetectMode:如果标准模式失败,出现403/禁止错误,是否自动检测并切换到浏览器模式(可选,默认为真)。设置为false,严格使用指定模式,不自动切换。
浏览器模式特定参数
waitForSelector:浏览器模式下等待的选择器(可选,默认为“body”)waitForTimeout:浏览器模式下的等待超时(毫秒)(可选,默认值为5000)scrollToBottom:是否在浏览器模式下滚动到页面底部(可选,默认为false)saveCookies:是否在浏览器模式下保存Cookie(可选,默认为true)closeBrowser:是否关闭浏览器实例(可选,默认为false)
内容提取参数
extractContent:是否使用可读性算法提取主要内容(可选,默认为false)includeMetadata:是否在提取的内容中包含元数据(可选,默认为false,仅在以下情况下有效extractContent是真的)fallbackToOriginal:提取失败时是否回退到原始内容(可选,默认为true,仅在以下情况下有效extractContent是真的)
调试参数
debug:是否启用调试输出(可选,默认为false)
内容提取功能
使用内容提取功能获取网页的核心内容,过滤掉导航栏、广告、侧边栏和其他分散注意力的元素:
{
"url": "https://example.com/article",
"extractContent": true,
"includeMetadata": true
}提取的内容将包括以下元数据(如果可用):
- 标题
- Byline(作者)
- 站点名称
- 摘录
- 内容长度
- 可读性标志(isReadable)
特殊用法
内容提取示例
要从文章网页中仅提取有意义的内容,请执行以下操作:
{
"url": "https://example.com/news/article",
"extractContent": true,
"includeMetadata": true
}对于内容提取可能失败的网站,您可以使用 fallbackToOriginal 为了确保您获得一些内容:
{
"url": "https://example.com/complex-layout",
"extractContent": true,
"fallbackToOriginal": true
}关闭浏览器而不获取
要关闭浏览器实例而不执行任何获取操作,请执行以下操作:
{
"url": "about:blank",
"closeBrowser": true
}代理优先级
代理按以下顺序确定:
- 命令行指定的代理
proxy请求中的参数- 环境变量(如果
useSystemProxy是真的) - Git配置(如果
useSystemProxy是真的)
如果 proxy 设置, useSystemProxy 将自动设置为false。
调试输出
当 debug: true 设置后,日志将以以下前缀输出到stderr:
[MCP-SERVER]:来自MCP服务器的日志[NODE-FETCH]:来自Node.js提取器的日志[BROWSER-FETCH]:来自浏览器提取器的日志[CLIENT]:来自客户端的日志[TOOLS]:工具实施日志[FETCHER]:来自主提取器界面的日志[CONTENT]:与内容处理相关的日志[CONTENT-PROCESSOR]:来自HTML内容处理器的日志[CONTENT-SIZE]:与内容大小管理相关的日志[CHUNK-MANAGER]:与内容分块操作相关的日志[ERROR-HANDLER]:与错误处理相关的日志[BROWSER-MANAGER]:来自浏览器实例管理器的日志[CONTENT-EXTRACTOR]:来自内容提取器的日志
许可证
麻省理工学院
______________________________________________________________________
由lmcc-dev更新
