HTML转Markdown转换器

gofetch是一款专为LLM编码助手设计的服务器,能够将HTML转换为干净的Markdown,并提供结构化元数据和智能截断功能。

  • by arawak
  • Go
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 arawak/mcp-fetch-go

使用说明

gofetch

一个模型上下文协议(MCP)服务器,它获取URL并将HTML转换为干净的Markdown。专为基于LLM的编码助手而设计。

为什么是gofetch?

与通用的web抓取器不同,gofetch知道LLM最适合:

  • 清除Markdown --不是原始HTML或单词包装文本
  • 结构化元数据 --截断状态、重定向后的最终URL、内容类型
  • 智能截断 --段落边界,而不是句子中间的删减
  • 清除分页 --下一个字节位置,继续通知

目标

  1. 提取内容,而不是噪音 --自动删除导航、侧边栏、页脚和UI元素
  2. 提供结构化输出 --返回Markdown+JSON元数据以供编程使用
  3. 处理真实世界的场景 --检测重定向、阻止尝试、不支持的内容类型
  4. 针对LLM环境进行优化 --在段落边界处智能截断以保持可读性
  5. 启用分页 --支持字节范围获取,并为连续的多页文档提供清晰的指示符

比较:gofetch与pyfetch

特性 gofetch pyfetch
Markdown质量 优秀 仅限纯文本
降噪 同类最佳 基本
重定向检测 显示最终URL 静默
元数据 完整JSON 无
截断 段落感知 任意字节边界
分页通知 清除([Continued from byte X]) 无
站点兼容性 高(适用于大多数开发站点) 低(被许多站点阻止)
robots.txt 忽略 尊重

判决: gofetch是专为LLM编码工作流而构建的;pyfetch是一个道德通用的刮刀。

安装

源自

git clone https://github.com/arawak/mcp-fetch-go.git
cd mcp-fetch-go
go build -o gofetch ./cmd/mcp-fetch-go

使用Go安装

go install github.com/arawak/mcp-fetch-go/cmd/mcp-fetch-go@latest

用法

MCP配置

添加到您的MCP客户端配置(Claude Desktop、Cursor、Windsurf等):

{
  "mcpServers": {
    "fetch": {
      "command": "gofetch"
    }
  }
}

工具: fetch

获取URL并将其内容作为Markdown(或原始文本)返回。

参数:

参数 类型 默认值 说明
url 字符串 必需的 要获取的URL
maxBytes int 30000 返回的最大字节数
startBytes int 0 要跳过的字节数(用于分页)
raw bool false 返回未经Markdown转换的原始内容
timeout int 30 超时(秒)

例子:

{
  "url": "https://go.dev/doc/effective_go",
  "maxBytes": 5000
}

答复:

该工具返回两个内容块:

  1. Markdown内容 --转换后的内容(或原始内容,如果 raw: true)
  2. 元数据JSON --关于获取的信息:
{
  "url": "https://go.dev/doc/effective_go",
  "statusCode": 200,
  "contentType": "text/html",
  "contentBytes": 45123,
  "returnedBytes": 5000,
  "truncated": true,
  "nextStartBytes": 5000,
  "fetchedAt": "2026-02-21T10:30:00Z"
}

重定向处理

当URL重定向时,gofetch会在内容前添加一条通知:

[Note: Redirected to https://final-url.example.com/path]

...content...

这允许LLM知道内容的实际来源。

分页

对于大型文档,请使用 startBytes 继续阅读:

// First request
{"url": "https://example.com/large-doc", "maxBytes": 10000}

// Response includes: "nextStartBytes": 10000
// Continue from where you left off:
{"url": "https://example.com/large-doc", "maxBytes": 10000, "startBytes": 10000}

截断的内容包括一条通知:

...content...

---
[Truncated: 10000 of 50000 bytes. Use startBytes=10000 to continue.]

内容处理

gofetch通过多阶段管道从HTML中提取干净的内容:

  1. 查找主要内容 --寻找 <main> 或 <article> 要素先行;回退到完整文档
  2. 条形结构噪声 --删除 <nav>, <footer>, <aside>, <header>, <form>, <script>, <style>, <iframe>, <svg>
  3. 条形ARIA噪声 --删除元素 role="navigation", role="banner", role="contentinfo", role="button"等等。
  4. 按类别分组 --删除类包含以下内容的元素: sidebar, breadcrumb, cookie, advertisement, navbar, toc
  5. 剥去UI铬 --删除按钮、图像和元素 aria-hidden="true"
  6. 清洁web组件 --解开未知的自定义元素,删除已知的噪声组件(GitHub的 tool-tip, action-menu, copy-button;Reddit的 faceplate-*, shreddit-*)
  7. 转换为Markdown --用途 html到markdown 带有CommonMark输出

支持的内容类型

  • text/html --转换为Markdown
  • application/xhtml+xml --转换为Markdown
  • text/plain --按原样返回
  • text/markdown --按原样返回

其他内容类型返回错误。使用 raw: true 绕过内容类型检查并返回原始字节。

安全配置

环境变量

变量 默认值 描述
MCP_FETCH_ALLOWED_DOMAINS (空) 逗号分隔的域列表。空=全部允许
MCP_FETCH_ALLOW_PRIVATE false 允许私有/环回IP(SSRF保护)
MCP_FETCH_MAX_REDIRECTS 5 要遵循的最大重定向数

SSRF保护

默认情况下,服务器会阻止以下请求:

  • 私有IP地址(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)
  • 环回地址(127.0.0.0/8, ::1)
  • 链接本地地址(169.254.0.0/16, fe80::/10)

允许私有IP(用于开发或内部网络):

MCP_FETCH_ALLOW_PRIVATE=true gofetch

要限制到特定域,请执行以下操作:

MCP_FETCH_ALLOWED_DOMAINS=example.com,docs.example.com gofetch

建筑

# Using Make (recommended)
make build    # Build binary to bin/gofetch
make test     # Run tests with coverage
make install  # Install to $GOPATH/bin

# Or directly with Go
go build -o gofetch ./cmd/mcp-fetch-go

# Static binary for containers
CGO_ENABLED=0 go build -ldflags="-s -w" -o gofetch ./cmd/mcp-fetch-go

测试

# Run all tests with race detection and coverage
make test

# Or directly with Go
go test -race -cover ./...

# Run integration tests only
go test ./tests/... -v

许可证

MIT许可证——见 许可证 了解详情。