---
title: "MCP Fetch Server：让 AI 把网页抓成可读 Markdown"
wiki: mcp
category: "服务端开发"
slug: server-fetch
url: https://learnagent.wiki/mcp/cards/server-fetch
tags: ["MCP", "Fetch Server", "网页抓取", "Markdown", "Reference Server"]
last_updated: 2026-04-11
reading_time: 11
---

> Fetch Server 是 MCP 官方 reference servers 里很典型的一种“桥接型” Server。它做的事并不复杂，但非常实用：**把网页抓取能力封装成一个标准工具，让模型能拿到更适合阅读和总结的网页内容。**

# MCP Fetch Server：让 AI 把网页抓成可读 Markdown

## 基础概念

Fetch Server 是 MCP 官方 reference servers 里很典型的一种“桥接型” Server。它做的事并不复杂，但非常实用：**把网页抓取能力封装成一个标准工具，让模型能拿到更适合阅读和总结的网页内容。**

官方 README 对它的描述很直接：它能从互联网抓取 URL，并把 HTML 转成 **Markdown**，方便 LLM 消费。

这件事看起来像“发一个 HTTP 请求而已”，但真正关键的不是发请求，而是后面的三步：

1. 把网页拿回来
2. 转成模型更容易处理的 Markdown
3. 按长度截断，并允许通过 `start_index` 分块继续往后读

如果没有这层 Server，很多客户端只能：

- 直接把整页 HTML 塞给模型
- 或者让模型自己在原始网页文本里硬啃

效果会差很多。

### 核心要素

| 要素 | 作用 |
|------|------|
| **抓取能力** | 通过 `fetch` 工具读取互联网网页内容 |
| **Markdown 转换** | 默认把 HTML 转换成更适合模型处理的 Markdown |
| **分块读取** | 通过 `max_length` + `start_index` 支持分页式阅读长网页 |
| **提示词入口** | 官方除了 Tool，还提供了一个同名 Prompt |
| **安全边界** | README 明确提醒它可能访问本地 / 内网 IP，有安全风险，不能无脑开给所有环境 |

### 它解决的不是“联网”，而是“可读联网”

```mermaid
graph LR
    A["原始网页 HTML"] --> B["Fetch Server 抓取"]
    B --> C["转换为 Markdown"]
    C --> D["按长度截断"]
    D --> E["模型分块阅读和总结"]
```

### 为什么 `start_index` 很重要

```mermaid
graph TD
    A["页面太长，一次返回不完"] --> B["先取 0~max_length"]
    B --> C{"还没找到目标信息？"}
    C -->|"是"| D["把 start_index 往后挪"]
    D --> E["继续抓下一段"]
    C -->|"否"| F["停止，开始总结或抽取"]
```

官方 README 明确写了：**`fetch` 工具会截断响应，但你可以用 `start_index` 指定从哪一段开始提取内容。** 这等于给长网页做了原生“翻页”能力。

## 基础用法

### 最小启动方式

官方推荐的最简单用法是 `uvx`：

```bash
uvx mcp-server-fetch
```

如果你更习惯 `pip`，也可以：

```bash
pip install mcp-server-fetch
python -m mcp_server_fetch
```

README 还提到一个可选项：**如果本机装了 Node.js，Fetch Server 会用一个更健壮的 HTML simplifier。**

### 在 Claude Desktop 中挂载

官方给出的配置很简单：

```json
{
  "mcpServers": {
    "fetch": {
      "command": "uvx",
      "args": ["mcp-server-fetch"]
    }
  }
}
```

### 在 VS Code 中挂载

README 给的 `mcp.json` 结构是：

```json
{
  "mcp": {
    "servers": {
      "fetch": {
        "command": "uvx",
        "args": ["mcp-server-fetch"]
      }
    }
  }
}
```

这里有个细节需要记：**当你用 `.vscode/mcp.json` 时，README 特别提醒要带上 `mcp` 这一层 key。**

### 真实调用长什么样

最常用的就是 `fetch` 这个工具。一个典型调用参数如下：

```json
{
  "url": "https://modelcontextprotocol.io/examples",
  "max_length": 5000,
  "start_index": 0,
  "raw": false
}
```

这些参数的含义，README 说得很清楚：

- `url`：要抓的 URL
- `max_length`：最多返回多少字符，默认 `5000`
- `start_index`：从第几个字符开始读，默认 `0`
- `raw`：是否跳过 Markdown 转换，直接拿原始内容

### 长网页怎么读

```text
你：帮我看看这篇长文后半部分有没有讲到 OAuth。
客户端：
1. 先调用 fetch(url, max_length=5000, start_index=0)
2. 如果前半段没看到 OAuth
3. 再调用 fetch(url, max_length=5000, start_index=5000)
4. 直到找到目标信息或读完整页
```

这就是 Fetch Server 最实用的地方之一：**它天然支持分块递进式阅读网页。**

### `raw` 模式什么时候有用

默认情况下，把 HTML 转成 Markdown 对模型最友好。但某些场景下，你可能反而想保留更原始的内容，例如：

- 调试网页抓取结果
- 比较 Markdown 转换前后差异
- 某些结构化 HTML 信息在转换后丢失

这时可以把：

```json
{
  "raw": true
}
```

打开。

## 同类工具对比

如果目标都是“让 AI 读网页”，常见方式至少有三类：

| 维度 | Fetch Server | 浏览器自动化 Server（如 Puppeteer / Playwright） | 通用 HTTP 工具 |
|------|--------------|--------------------------------------------------|----------------|
| 主要目标 | 把网页内容抓成适合模型阅读的文本 | 操作浏览器、点击、登录、截图、执行页面交互 | 发请求拿原始响应 |
| 对静态页面效果 | **很好** | 可以，但通常太重 | 一般 |
| 对动态交互页面效果 | 一般 | **更强** | 较弱 |
| 输出适合模型阅读吗 | 是，默认转 Markdown | 不一定，要自己再抽内容 | 不一定，常常是原始 HTML / JSON |
| 成本 | 低 | 高 | 低 |

核心区别：

- **Fetch Server**：最适合“我要让模型读网页内容”。
- **浏览器自动化 Server**：最适合“我要让模型操作网页”。
- **通用 HTTP 工具**：最适合“我要拿响应本身”，不一定适合直接喂模型。

## 常见误区

| 误区 | 准确理解 |
|------|----------|
| 以为 Fetch Server 就是一个普通 HTTP 客户端 | 不只是。它的重点是网页抓取 + Markdown 转换 + 分块阅读 |
| 以为它适合所有网站 | 不一定。对重交互、强登录、复杂前端渲染页面，浏览器自动化工具更合适 |
| 以为一次 `fetch` 就该读完整篇超长文章 | 不对。README 明确设计了 `start_index` 给你分块往后读 |
| 以为默认一定拿到原始 HTML | 不是。默认会尽量转成更适合模型的 Markdown |
| 以为它天然很安全 | 不是。官方 README 直接警告它可能访问本地 / 内网 IP，这本身就是风险点 |
| 以为 robots.txt 行为一成不变 | 不是。官方 README 说明默认会区分“模型触发的工具请求”和“用户触发的 prompt 请求” |

## 优劣势分析

| 优势 | 劣势 |
|------|------|
| **非常适合模型阅读网页**：Markdown 输出比原始 HTML 友好得多 | **不是浏览器自动化替代品**：不能指望它解决复杂交互问题 |
| **分块策略简单有效**：`start_index` 很适合长文阅读 | **存在网络安全风险**：官方 README 明确提醒本地 / 内网访问问题 |
| **上手成本低**：`uvx mcp-server-fetch` 即可 | **结果质量受网页结构影响**：有些页面转 Markdown 后仍不够干净 |
| **配置项实用**：robots.txt、user-agent、proxy 都可调 | **对动态渲染网站支持有限**：不是所有页面都能抓出好内容 |
| **跨客户端复用强**：Claude、VS Code、Inspector 都能接 | **不同环境字符编码坑仍存在**：README 还专门提到 Windows 的 `PYTHONIOENCODING` 问题 |

## 思考题

<details>
<summary>初级：为什么 Fetch Server 默认把网页转成 Markdown，而不是直接把 HTML 原样丢给模型？</summary>

**参考答案：**

因为模型真正关心的是“网页表达了什么内容”，而不是浏览器排版和 DOM 细节本身。

原始 HTML 往往包含大量对阅读无用的信息，比如样式、脚本、嵌套结构、无意义标签。Markdown 虽然不是完美格式，但通常能把正文、标题、列表、链接这些核心信息保留下来，同时把噪音压下去。

这会直接提升模型读网页、总结网页和抽取网页信息的效果。

</details>

<details>
<summary>中级：什么时候你应该继续用 Fetch Server，什么时候该切去浏览器自动化类 Server？</summary>

**参考答案：**

如果你的目标是：

- 读文档
- 读博客
- 看产品页
- 抽取静态网页信息

那 Fetch Server 往往就够了，而且更轻、更快。

但如果你需要：

- 登录
- 点按钮
- 展开折叠菜单
- 等页面异步渲染
- 填表单

那 Fetch Server 通常不够，应该切去 Playwright / Puppeteer 这类浏览器自动化 Server。

简单说：

- **读网页**：优先 Fetch
- **操作网页**：优先浏览器自动化

</details>

<details>
<summary>进阶：为什么官方会特别强调 Fetch Server 可能访问本地 / 内网 IP，这个风险实际意味着什么？</summary>

**参考答案：**

因为一旦一个“会抓 URL”的工具没有边界，它就不只是在访问公开互联网，而可能变成内网探测入口。

例如，模型如果被提示去抓：

- `http://127.0.0.1/...`
- `http://192.168.x.x/...`
- 某个公司内网地址

就可能把本来不该暴露的内部服务内容带出来。这类风险和 SSRF 很接近。

所以官方 README 才会把这件事单独标成 caution。真正安全的做法，通常要在宿主环境、网络策略或工具层再加额外限制，而不是只看它“能不能用”。

</details>

## 参考资料

1. 官方 Fetch reference server README：<https://github.com/modelcontextprotocol/servers/tree/main/src/fetch>（查询日期 2026-04-11）
2. 官方 Reference Servers 仓库：<https://github.com/modelcontextprotocol/servers>（查询日期 2026-04-11）
3. MCP 官方示例服务器目录：<https://modelcontextprotocol.io/examples>（查询日期 2026-04-11）
4. MCP Inspector 官方文档：<https://modelcontextprotocol.io/docs/tools/inspector>（查询日期 2026-04-11）

---
*Source: https://learnagent.wiki/mcp/cards/server-fetch*
*Markdown mirror of https://learnagent.wiki, served as text/markdown for LLM ingestion.*