返回市场
多任务获取MCP服务器

多任务获取MCP服务器

作者:lmcc-dev13 星标更新:2025-08-28

项目介绍

技术文档摘要

mult-fetch-mcp-server

npm 版本 许可证: MIT Node.js 版本 TypeScript MCP SDK GitHub Stars GitHub Forks GitHub Issues GitHub Pull Requests npm 下载量 GitHub 最后一次提交 GitHub 贡献者 smithery 徽章 codecov CodeFactor

<!-- 未来可能添加的徽章: [![CodeFactor](https://www.codefactor.io/repository/github/lmcc-dev/mult-fetch-mcp-server/badge)](https://www.codefactor.io/repository/github/lmcc-dev/mult-fetch-mcp-server) [![可维护性](https://api.codeclimate.com/v1/badges/a99a88d28ad37a79dbf6/maintainability)](https://codeclimate.com/github/lmcc-dev/mult-fetch-mcp-server/maintainability) -->

此项目实现了符合MCP规范的客户端和服务器,用于AI助手与外部工具之间的通信。

英文 | 中文文档

项目结构

fetch-mcp/
├── src/                         # 源代码目录
│   ├── lib/                     # 库文件
│   │   ├── fetchers/            # 网页抓取实现
│   │   │   ├── browser/         # 基于浏览器的抓取
│   │   │   │   ├── BrowserFetcher.ts      # 浏览器抓取实现
│   │   │   │   ├── BrowserInstance.ts     # 浏览器实例管理
│   │   │   │   └── PageOperations.ts      # 页面交互操作
│   │   │   ├── node/            # 基于Node.js的抓取
│   │   │   └── common/          # 共享抓取工具
│   │   ├── utils/               # 工具模块
│   │   │   ├── ChunkManager.ts        # 内容分块
│   │   │   ├── ContentProcessor.ts    # HTML到文本转换
│   │   │   ├── ContentExtractor.ts    # 智能内容提取
│   │   │   ├── ContentSizeManager.ts  # 内容大小限制
│   │   │   └── ErrorHandler.ts        # 错误处理
│   │   ├── server/              # 服务器相关模块
│   │   │   ├── index.ts         # 服务器入口
│   │   │   ├── browser.ts       # 浏览器管理
│   │   │   ├── fetcher.ts       # 网页抓取逻辑
│   │   │   ├── tools.ts         # 工具注册和处理
│   │   │   ├── resources.ts     # 资源处理
│   │   │   ├── prompts.ts       # 提示模板
│   │   │   └── types.ts         # 服务器类型定义
│   │   ├── i18n/                # 国际化支持
│   │   └── types.ts             # 公共类型定义
│   ├── client.ts                # MCP客户端实现
│   └── mcp-server.ts            # MCP服务器主入口
├── index.ts                     # 服务器入口点
├── tests/                       # 测试文件
└── dist/                        # 编译文件

MCP 规范

模型上下文协议(MCP)定义了两种主要传输方法:

  1. 标准输入/输出(Stdio):客户端启动MCP服务器作为子进程,并通过标准输入(stdin)和标准输出(stdout)进行通信。
  2. 服务器发送事件(SSE):用于在客户端和服务器之间传递消息。

此项目实现了标准输入/输出(Stdio)传输方法。

功能

  • 基于官方MCP SDK的实现
  • 支持标准输入/输出(Stdio)传输
  • 多种网页抓取方法(HTML、JSON、文本、Markdown、纯文本转换)
  • 智能模式切换:自动在标准请求和浏览器模式之间切换
  • 内容大小管理:自动将大内容拆分为可管理的块,以解决AI模型上下文大小限制
  • 分块内容检索:能够请求大内容中的特定块,同时保持上下文连续性
  • 详细的调试日志输出到stderr
  • 双语国际化(英语和中文)
  • 模块化设计便于维护和扩展
  • 智能内容提取:基于Mozilla的Readability库,能够从网页中提取有意义的内容,过滤掉广告和导航元素
  • 元数据支持:能够提取网页元数据,如标题、作者、发布日期和站点信息
  • 智能内容检测:自动检测页面是否包含有意义的内容,过滤掉登录页面、错误页面和其他没有实质性内容的页面
  • 浏览器自动化增强:支持页面滚动、Cookie管理、选择器等待等高级浏览器交互

安装

通过Smithery安装

要通过Smithery自动安装Mult Fetch MCP Server:

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
  • Windows:%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"  // 设置语言为英语,选项:"zh" 或 "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"  // 设置语言为英语,选项:"zh" 或 "en"
      }
    }
  }
}

请将path-to/bin/node替换为您系统上Node.js可执行文件的路径,并将path-to/@lmcc-dev/mult-fetch-mcp-server替换为此项目的实际路径。

使用示例

以下是Claude桌面客户端中使用此工具的示例:

Claude桌面客户端示例

该图显示了Claude如何使用抓取工具来获取网页内容并根据您的指令进行处理。

使用

配置完成后,重启Claude桌面,您可以在对话中使用以下工具:

  • fetch_html:获取网页的HTML内容
  • fetch_json:获取JSON数据
  • fetch_txt:获取纯文本内容
  • fetch_markdown:获取Markdown格式的内容
  • fetch_plaintext:获取从HTML转换而来的纯文本内容(去除HTML标签)

构建

pnpm run build

运行服务器

pnpm run server
# 或
node dist/index.js
# 如果是全局安装,可以直接运行
@lmcc-dev/mult-fetch-mcp-server
# 或使用npx
npx @lmcc-dev/mult-fetch-mcp-server

客户端演示工具

注意:以下客户端.js功能仅用于演示和测试目的。当与Claude或其他AI助手一起使用时,MCP服务器由AI驱动,自动管理分块过程。

命令行客户端

该项目包括一个用于测试和开发的命令行客户端:

pnpm run client <method> <params_json>
# 示例
pnpm run client fetch_html '{"url": "https://example.com", "debug": true}'

演示客户端分块控制参数

在使用命令行客户端进行测试时,您可以使用这些参数来演示内容分块能力:

  • --all-chunks:命令行标志,自动按顺序获取所有分块(仅用于演示目的)
  • --max-chunks:命令行标志,限制要获取的最大分块数(可选,默认为10)

实时输出演示

客户端.js演示工具提供实时输出能力:

node dist/src/client.js fetch_html '{"url":"https://example.com", "startCursor": 0, "contentSizeLimit": 500}' --all-chunks --debug

演示客户端将自动按顺序获取所有分块并立即显示,展示了如何实时处理大量内容。

运行测试

# 运行MCP功能测试
npm run test:mcp

# 运行mini4k.com网站测试
npm run test:mini4k

# 运行直接客户端调用测试
npm run test:direct

语言设置

此项目支持中文和英文双语国际化。您可以使用环境变量设置语言:

使用环境变量

设置MCP_LANG环境变量以控制语言:

# 设置为英语
export MCP_LANG=en
npm run server

# 设置为中文
export MCP_LANG=zh
npm run server

# Windows系统
set MCP_LANG=zh
npm run server

使用环境变量确保所有相关进程(包括MCP服务器)使用相同的语言设置。

默认语言

默认情况下,系统将按照以下优先级选择语言:

  1. MCP_LANG环境变量
  2. 操作系统语言(如果以“zh”开头,则使用中文)
  3. 英语(作为最终备选方案)

调试

此项目遵循MCP协议规范,默认情况下不会输出任何日志以避免干扰JSON-RPC通信。调试信息通过调用参数控制:

使用debug参数

在调用工具时设置debug: true参数:

{
  "url": "https://example.com",
  "debug": true
}

调试消息使用以下格式发送到标准错误流(stderr):

[MCP-SERVER] MCP服务器启动中...
[CLIENT] 正在抓取URL: https://example.com

调试日志文件

启用调试模式时,所有调试消息也会写入位于以下位置的日志文件:

~/.mult-fetch-mcp-server/debug.log

可以通过MCP资源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);

代理设置

此工具支持多种方法配置代理设置:

1. 使用proxy参数

最直接的方法是在请求参数中指定代理:

{
  "url": "https://example.com",
  "proxy": "http://your-proxy-server:port",
  "debug": true
}

2. 使用环境变量

工具会自动检测并使用来自标准环境变量的代理设置:

# 设置代理环境变量
export HTTP_PROXY=http://your-proxy-server:port
export HTTPS_PROXY=http://your-proxy-server:port

# 运行服务器
npm run server

3. 系统代理检测

工具尝试根据您的操作系统检测系统代理设置:

  • Windows:使用set命令从环境变量读取代理设置
  • macOS/Linux:使用env命令从环境变量读取代理设置

4. 代理故障排除

如果您遇到代理检测问题:

  1. 使用debug: true参数查看关于代理检测的详细日志
  2. 明确指定代理使用proxy参数
  3. 确保您的代理URL格式正确:http://host:porthttps://host:port
  4. 对于需要浏览器功能的网站,请设置useBrowser: true以使用浏览器模式

5. 浏览器模式和代理

使用浏览器模式(useBrowser: true)时,工具会:

  1. 首先尝试使用明确指定的代理(如果有)
  2. 然后尝试使用系统代理设置
  3. 最后,在未找到代理的情况下继续进行

浏览器模式特别适用于实施反爬虫措施或需要JavaScript执行的网站。

参数处理

此项目以如下方式处理参数:

  • debug:通过调用参数传递,每个请求都可以单独控制是否启用调试输出
  • 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';

// 获取当前文件的目录路径
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  // 传递所有环境变量,包括MCP_LANG
  }
});

// 创建客户端
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('抓取失败:', result.content[0].text);
} else {
  console.log('抓取成功!');
  console.log('内容预览:', result.content[0].text.substring(_0, 500));
}

支持的工具

  • fetch_html:获取网页的HTML内容
  • fetch_json:获取JSON数据
  • fetch_txt:获取纯文本内容
  • fetch_markdown:获取Markdown格式的内容
  • fetch_plaintext:获取从HTML转换而来的纯文本内容(去除HTML标签)

资源支持

服务器包括对resources/list和resources/read方法的支持,但目前实现中没有定义任何资源。资源系统旨在提供对项目文件和文档的访问,但此功能尚未完全实现。

资源使用示例

// 示例:列出可用资源
const resourcesResult = await client.listResources({});
console.log('可用资源:', resourcesResult);

// 注意:目前这将返回空列表的资源和resourceTemplates

支持的提示模板

服务器提供了以下提示模板:

  • fetch-website:获取网站内容,支持不同格式和浏览器模式
  • extract-content:从网站中提取特定内容,支持CSS选择器和数据类型指定
  • debug-fetch:调试网站抓取问题,分析可能原因并提供解决方案

提示模板使用

  1. 使用prompts/list获取可用提示模板列表