gofetch
一个模型上下文协议(MCP)服务器,它获取URL并将HTML转换为干净的Markdown。专为基于LLM的编码助手而设计。
为什么是gofetch?
与通用的web抓取器不同,gofetch知道LLM最适合:
- 清除Markdown --不是原始HTML或单词包装文本
- 结构化元数据 --截断状态、重定向后的最终URL、内容类型
- 智能截断 --段落边界,而不是句子中间的删减
- 清除分页 --下一个字节位置,继续通知
目标
- 提取内容,而不是噪音 --自动删除导航、侧边栏、页脚和UI元素
- 提供结构化输出 --返回Markdown+JSON元数据以供编程使用
- 处理真实世界的场景 --检测重定向、阻止尝试、不支持的内容类型
- 针对LLM环境进行优化 --在段落边界处智能截断以保持可读性
- 启用分页 --支持字节范围获取,并为连续的多页文档提供清晰的指示符
比较: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
}答复:
该工具返回两个内容块:
- Markdown内容 --转换后的内容(或原始内容,如果
raw: true) - 元数据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中提取干净的内容:
- 查找主要内容 --寻找 `
或
` 要素先行;回退到完整文档
- 条形结构噪声 --删除 `
,,,,,,,,` - 条形ARIA噪声 --删除元素
role="navigation",role="banner",role="contentinfo",role="button"等等。 - 按类别分组 --删除类包含以下内容的元素:
sidebar,breadcrumb,cookie,advertisement,navbar,toc - 剥去UI铬 --删除按钮、图像和元素
aria-hidden="true" - 清洁web组件 --解开未知的自定义元素,删除已知的噪声组件(GitHub的
tool-tip,action-menu,copy-button;Reddit的faceplate-*,shreddit-*) - 转换为Markdown --用途 html到markdown 带有CommonMark输出
支持的内容类型
text/html--转换为Markdownapplication/xhtml+xml--转换为Markdowntext/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许可证——见 许可证 了解详情。
