项目简介

MCP Fetch Server 是一个基于 Go 语言开发的 MCP 服务器,它提供 URL 内容抓取功能,并针对 AI 模型进行了优化。该服务器能够从指定的 URL 获取网页内容,自动提取正文,去除广告、导航等无关元素,并将其转换为 token 效率更高的 Markdown 格式。这可以显著减少 LLM 处理上下文时的 token 消耗,同时保留关键信息。

主要功能点

  • MCP 协议兼容: 遵循 Model Context Protocol (MCP) 规范,通过 JSON-RPC 接口提供工具执行能力。
  • URL 内容抓取: 能够抓取指定 URL 的网页内容,并自动进行格式转换。
  • Token 效率优化: 仅提取网页主要内容,去除冗余信息,减少 AI 模型的 token 使用量。
  • Markdown 格式转换: 将 HTML 内容转换为 Markdown 格式,提高可读性和 token 效率。
  • 增强内容可读性: 使用 go-readability 库,保留标题和重要内容,去除干扰元素。
  • 智能内容处理: 在转换后的内容中包含标题和作者信息,并在转换失败时提供回退处理。
  • 内容类型检测: 根据 Content-Type 头部信息返回适当的内容。
  • 内容控制: 支持内容长度限制、偏移量和原始内容检索。

安装步骤

推荐使用 Docker:

  1. 拉取 Docker 镜像:

    docker pull cnosuke/mcp-fetch:latest
  2. 运行 Docker 容器:

    docker run -i --rm cnosuke/mcp-fetch:latest

本地 Go 二进制文件运行 (适用于开发):

  1. 安装 Go 环境: 确保已安装 Go 1.24 或更高版本。

  2. 构建服务器:

    make bin/mcp-fetch
  3. 运行服务器:

    ./bin/mcp-fetch server --config=config.yml

服务器配置

MCP 客户端 (例如 Claude Desktop) 需要配置 MCP 服务器的启动命令才能连接到 MCP Fetch Server。配置信息通常在客户端的配置文件中 (例如 'claude_desktop_config.json')。

使用 Docker 镜像的配置:

{
  "mcpServers": {
    "fetch": {  // 服务器名称,客户端配置中用于标识该服务器
      "command": "docker",  // 启动服务器的命令,这里使用 docker
      "args": ["run", "-i", "--rm", "cnosuke/mcp-fetch:latest"] // 命令参数,运行 docker 镜像
    }
  }
}

使用 Go 二进制文件的配置:

{
  "mcpServers": {
    "fetch": {  // 服务器名称,客户端配置中用于标识该服务器
      "command": "./bin/mcp-fetch", // 启动服务器的命令,指向编译后的二进制文件
      "args": ["server"], // 命令参数,运行 server 子命令
      "env": { // 环境变量配置(可选,根据需要配置)
        "LOG_PATH": "mcp-fetch.log", // 日志文件路径
        "DEBUG": "false", // 是否开启debug模式
        "FETCH_TIMEOUT": "10", // 请求超时时间 (秒)
        "FETCH_USER_AGENT": "mcp-fetch/1.0", // 自定义 User-Agent
        "FETCH_MAX_URLS": "20", // 每次请求最多处理的 URL 数量
        "FETCH_MAX_WORKERS": "20", // 并发处理 URL 的 worker 数量
        "FETCH_DEFAULT_MAX_LENGTH": "5000" // 默认内容最大长度
      }
    }
  }
}

基本使用方法

MCP 客户端通过发送 JSON-RPC 请求与 MCP Fetch Server 交互,以执行 'fetch' 和 'fetch_multiple' 工具。

'fetch' 工具 (抓取单个 URL):

{
  "jsonrpc": "2.0",
  "method": "MCP.Tool.CallTool",
  "params": {
    "tool_name": "fetch",
    "arguments": {
      "url": "https://example.com", // 必填,要抓取的 URL
      "max_length": 1000, // 可选,返回内容的最大字符数,默认 5000
      "start_index": 500, // 可选,内容起始字符索引,默认 0
      "raw": false // 可选,是否获取原始内容 (不进行 Markdown 转换),默认 false
    }
  },
  "id": "1"
}

'fetch_multiple' 工具 (批量抓取 URL):

{
  "jsonrpc": "2.0",
  "method": "MCP.Tool.CallTool",
  "params": {
    "tool_name": "fetch_multiple",
    "arguments": {
      "urls": [ // 必填,要抓取的 URL 列表
        "https://1.example.com",
        "https://2.example.net",
        "https://3.example.org"
      ],
      "max_length": 9000, // 可选,所有 URL 返回内容总字符数限制,默认 5000
      "raw": false // 可选,是否获取原始内容 (不进行 Markdown 转换),默认 false
    }
  },
  "id": "2"
}

注意: 'max_length' 参数用于限制返回内容的长度,以节省 token 消耗。对于 'fetch_multiple' 工具,'max_length' 是所有 URL 内容的总长度限制,服务器会根据 URL 数量和内容长度智能分配。

信息

分类

网页与API