🚀 superFetch MCP Server
superFetch MCP Server是一个模型上下文协议(MCP)服务器,它可以抓取网页,使用Mozilla Readability提取可读内容,并返回对AI友好的JSONL或Markdown格式数据。
快速开始 | 如何选择工具 | 可用工具 | 资源 | 配置 | 安全 | 开发
已发布到 MCP Registry - 搜索 io.github.j0hanz/superfetch
⚠️ 重要提示
此服务器可以代表AI助手访问URL。内置的SSRF保护会阻止私有IP范围和云元数据端点,但在敏感环境中部署时仍需谨慎。
✨ 主要特性
| 特性 |
描述 |
| 智能提取 |
启用Mozilla Readability时,可去除广告、导航栏和样板内容 |
| JSONL + Markdown |
提供JSONL语义块或带前置元数据的简洁Markdown格式输出 |
| 结构化块 |
支持标题、段落、列表、代码、表格、图像、块引用等结构化内容 |
| 内置缓存 |
具有TTL、最大键数和资源订阅功能的内存缓存 |
| 弹性抓取 |
支持重定向处理,并通过指数退避和抖动机制进行重试 |
| 安全优先 |
提供URL验证、SSRF/DNS/IP黑名单、头部清理等安全功能 |
| HTTP模式 |
支持API密钥认证、会话管理、速率限制和CORS跨域资源共享 |
🚀 快速开始
将superFetch添加到您的MCP客户端配置中,无需安装。
Claude Desktop
在claude_desktop_config.json中添加以下内容:
{
"mcpServers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"]
}
}
}
VS Code
在工作区的.vscode/mcp.json中添加以下内容:
{
"servers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"]
}
}
}
自定义配置
通过在env属性中添加环境变量来配置SuperFetch的行为:
{
"servers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"],
"env": {
"CACHE_TTL": "7200",
"LOG_LEVEL": "debug",
"FETCH_TIMEOUT": "60000"
}
}
}
}
更多可用选项请参考配置部分。
Cursor
- 打开Cursor设置
- 转到 功能 > MCP服务器
- 点击 "+ 添加新的全局MCP服务器"
- 添加以下配置:
{
"mcpServers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"]
}
}
}
💡 使用建议
(Windows):如果遇到问题,请尝试使用:cmd /c "npx -y @j0hanz/superfetch@latest --stdio"
Codex IDE
在~/.codex/config.toml文件中添加以下内容:
基本配置:
[mcp_servers.superfetch]
command = "npx"
args = ["-y", "@j0hanz/superfetch@latest", "--stdio"]
带环境变量的配置:
[mcp_servers.superfetch]
command = "npx"
args = ["-y", "@j0hanz/superfetch@latest", "--stdio"]
env = { CACHE_TTL = "7200", LOG_LEVEL = "debug", FETCH_TIMEOUT = "60000" }
访问配置文件:点击齿轮图标 -> "Codex设置 > 打开config.toml"
文档:Codex MCP指南
Cline(VS Code扩展)
打开Cline MCP设置文件:
macOS:
code ~/Library/Application\ Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json
Windows:
code %APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json
添加以下配置:
{
"mcpServers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"],
"disabled": false,
"autoApprove": []
}
}
}
Windsurf
在./codeium/windsurf/model_config.json中添加以下内容:
{
"mcpServers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"]
}
}
}
Claude Desktop(配置文件位置)
macOS:
open -e "$HOME/Library/Application Support/Claude/claude_desktop_config.json"
code "$HOME/Library/Application Support/Claude/claude_desktop_config.json"
Windows:
code %APPDATA%\Claude\claude_desktop_config.json
📦 安装指南
全局安装
npm install -g @j0hanz/superfetch
superfetch --stdio
superfetch
从源代码安装
git clone https://github.com/j0hanz/super-fetch-mcp-server.git
cd super-fetch-mcp-server
npm install
npm run build
运行服务器
stdio模式(直接MCP集成)
node dist/index.js --stdio
HTTP模式(默认)
HTTP模式需要API_KEY,并且除非ALLOW_REMOTE=true,否则仅绑定到回环地址。
API_KEY=supersecret npx -y @j0hanz/superfetch@latest
Windows(PowerShell):
$env:API_KEY = "supersecret"
npx -y @j0hanz/superfetch@latest
端点(所有端点都需要Authorization: Bearer <API_KEY>或X-API-Key: <API_KEY>):
GET /health
POST /mcp
GET /mcp(SSE流)
DELETE /mcp
GET /mcp/downloads/:namespace/:hash
会话通过mcp-session-id头部进行管理(详见HTTP模式详情)。
💻 使用示例
基础用法
以下是使用fetch-url工具的示例:
{
"url": "https://example.com/article",
"title": "Example Article",
"contentBlocks": 42,
"fetchedAt": "2025-12-11T10:30:00.000Z",
"format": "jsonl",
"contentSize": 12345,
"cached": false,
"content": "{\"type\":\"metadata\",\"title\":\"Example Article\",\"url\":\"https://example.com/article\"}\n{\"type\":\"heading\",\"level\":1,\"text\":\"Introduction\"}"
}
高级用法
以下是使用fetch-markdown工具并包含文件信息的示例:
{
"url": "https://example.com/docs",
"title": "Documentation",
"fetchedAt": "2025-12-11T10:30:00.000Z",
"markdown": "---\ntitle: Documentation\nsource: \"https://example.com/docs\"\n---\n\n# Getting Started\n\nWelcome...",
"contentSize": 9876,
"cached": false,
"truncated": false,
"file": {
"downloadUrl": "/mcp/downloads/markdown/abc123def456",
"fileName": "documentation.md",
"expiresAt": "2025-12-11T11:30:00.000Z"
}
}
可用工具
工具响应说明
两个工具都会返回:
structuredContent,包含机器可读的字段
content块,其中包括:
- 一个
text块,包含structuredContent的JSON数据
- 一个
resource块,包含一个file:///... URI,指向完整内容(适合stdio模式)
- 当内容超过
MAX_INLINE_CONTENT_CHARS且缓存启用时,会有一个resource_link块
如果内容过大且缓存禁用,服务器会截断输出并追加...[truncated]。
fetch-url
抓取网页并将其转换为包含语义内容块的AI可读JSONL格式。您也可以通过format: "markdown"请求Markdown格式。
| 参数 |
类型 |
默认值 |
描述 |
url |
字符串 |
必需 |
要抓取的URL |
format |
"jsonl" | "markdown" |
"jsonl" |
输出格式 |
extractMainContent |
布尔值 |
true |
使用Readability提取主要内容 |
includeMetadata |
布尔值 |
true |
包含页面元数据 |
maxContentLength |
数字 |
- |
最大内容长度(字符数) |
customHeaders |
对象 |
- |
自定义HTTP头部(会进行清理) |
timeout |
数字 |
30000 |
请求超时时间(毫秒,范围1000 - 120000) |
retries |
数字 |
3 |
重试次数(范围1 - 10) |
fetch-markdown
抓取网页并将其转换为简洁的Markdown格式,可选择包含前置元数据。
| 参数 |
类型 |
默认值 |
描述 |
url |
字符串 |
必需 |
要抓取的URL |
extractMainContent |
布尔值 |
true |
仅提取主要内容 |
includeMetadata |
布尔值 |
true |
包含YAML前置元数据 |
maxContentLength |
数字 |
- |
最大内容长度(字符数) |
customHeaders |
对象 |
- |
自定义HTTP头部(会进行清理) |
timeout |
数字 |
30000 |
请求超时时间(毫秒,范围1000 - 120000) |
retries |
数字 |
3 |
重试次数(范围1 - 10) |
大内容处理
- 内联限制:
MAX_INLINE_CONTENT_CHARS(默认20000)。
- 如果内容超过限制且缓存启用,响应会包含
resourceUri和resource_link块。
- 如果缓存禁用,内容会被截断并追加
...[truncated]。
- 可以通过每个请求的
maxContentLength参数设置更低的限制。
资源
| URI |
描述 |
superfetch://health |
实时服务器健康和内存检查 |
superfetch://stats |
服务器统计信息和缓存指标 |
superfetch://cache/list |
列出缓存条目及其资源URI |
superfetch://cache/{namespace}/{urlHash} |
缓存内容条目(namespace:url,markdown) |
资源订阅会在缓存条目更新时通知客户端。
下载端点(HTTP模式)
在HTTP模式下运行时,可以直接下载缓存的内容。
端点
GET /mcp/downloads/:namespace/:hash
namespace:markdown 或 url
- 需要认证(
Authorization: Bearer <API_KEY> 或 X-API-Key: <API_KEY>)
响应头
| 头部 |
值 |
Content-Type |
text/markdown; charset=utf-8 或 application/x-ndjson; charset=utf-8 |
Content-Disposition |
attachment; filename="<name>" |
Cache-Control |
private, max-age=<CACHE_TTL> |
示例用法
curl -H "Authorization: Bearer $API_KEY" \
http://localhost:3000/mcp/downloads/markdown/abc123.def456 \
-o article.md
错误响应
| 状态 |
代码 |
描述 |
| 400 |
BAD_REQUEST |
无效的命名空间或哈希格式 |
| 404 |
NOT_FOUND |
内容未找到或已过期 |
| 503 |
SERVICE_UNAVAILABLE |
下载服务不可用 |
📚 详细文档
配置
通过在MCP客户端配置的env属性中添加环境变量来配置SuperFetch的行为。
| 类别 |
变量 |
默认值 |
有效值 |
描述 |
| 抓取设置 |
FETCH_TIMEOUT |
30000 |
5000 - 120000 |
请求超时时间(毫秒) |
| 抓取设置 |
USER_AGENT |
superFetch-MCP/1.0 |
任何有效的用户代理 |
自定义用户代理 |
| 缓存设置 |
CACHE_ENABLED |
true |
true / false |
启用响应缓存 |
| 缓存设置 |
CACHE_TTL |
3600 |
60 - 86400 |
缓存生命周期(秒) |
| 缓存设置 |
CACHE_MAX_KEYS |
100 |
10 - 1000 |
最大缓存条目数 |
| 输出设置 |
MAX_INLINE_CONTENT_CHARS |
20000 |
1000 - 200000 |
内联内容限制,超过此限制会生成resource_link |
| 日志设置 |
LOG_LEVEL |
info |
debug / info / warn / error |
日志详细程度 |
| 日志设置 |
ENABLE_LOGGING |
true |
true / false |
启用/禁用日志记录 |
| 提取设置 |
EXTRACT_MAIN_CONTENT |
true |
true / false |
使用Readability提取主要内容 |
| 提取设置 |
INCLUDE_METADATA |
true |
true / false |
包含元数据/前置元数据 |
| HTTP服务器设置 |
API_KEY |
- |
- |
HTTP模式必需 |
| HTTP服务器设置 |
HOST |
127.0.0.1 |
- |
HTTP服务器主机 |
| HTTP服务器设置 |
PORT |
3000 |
- |
HTTP服务器端口 |
| HTTP服务器设置 |
ALLOW_REMOTE |
false |
true / false |
允许绑定到非回环接口 |
| HTTP服务器设置 |
TRUST_PROXY |
false |
true / false |
信任代理头部以解析客户端IP |
| HTTP服务器设置 |
SESSION_TTL_MS |
1800000 |
- |
会话TTL(毫秒,30分钟) |
| HTTP服务器设置 |
SESSION_INIT_TIMEOUT_MS |
10000 |
- |
会话初始化允许的时间 |
| HTTP服务器设置 |
MAX_SESSIONS |
200 |
- |
最大活动会话数 |
| CORS设置 |
ALLOWED_ORIGINS |
[] |
逗号分隔的允许来源列表 |
允许的来源列表 |
| CORS设置 |
CORS_ALLOW_ALL |
false |
true / false |
允许所有来源(仅用于开发) |
| 速率限制 |
RATE_LIMIT_ENABLED |
true |
true / false |
启用/禁用HTTP速率限制 |
| 速率限制 |
RATE_LIMIT_MAX |
100 |
1 - 10000 |
每个IP在每个窗口内的最大请求数 |
| 速率限制 |
RATE_LIMIT_WINDOW_MS |
60000 |
1000 - 3600000 |
速率限制窗口(毫秒) |
| 速率限制 |
RATE_LIMIT_CLEANUP_MS |
60000 |
10000 - 3600000 |
限制器条目的清理间隔 |
配置预设
默认(推荐) - 无需配置
{
"servers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"]
}
}
}
调试模式 - 详细日志记录,无缓存
{
"servers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"],
"env": {
"LOG_LEVEL": "debug",
"CACHE_ENABLED": "false"
}
}
}
}
性能模式 - 积极缓存以提高速度
{
"servers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"],
"env": {
"CACHE_TTL": "7200",
"CACHE_MAX_KEYS": "500",
"LOG_LEVEL": "warn"
}
}
}
}
自定义用户代理 - 用于阻止机器人的网站
{
"servers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"],
"env": {
"USER_AGENT": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
}
}
}
慢速网络 / CI - 延长超时时间
{
"servers": {
"superFetch": {
"command": "npx",
"args": ["-y", "@j0hanz/superfetch@latest", "--stdio"],
"env": {
"FETCH_TIMEOUT": "60000",
"CACHE_ENABLED": "false",
"LOG_LEVEL": "warn"
}
}
}
}
HTTP模式详情
HTTP模式使用MCP可流式HTTP传输。工作流程如下:
- 发送
POST /mcp请求,包含initialize请求,且不包含mcp-session-id头部。
- 服务器在响应头中返回
mcp-session-id。
- 在后续的
POST /mcp、GET /mcp和DELETE /mcp请求中使用该头部。
如果达到MAX_SESSIONS,服务器会尽可能淘汰最旧的会话,否则返回503。
内容块类型
JSONL输出包含语义内容块:
| 类型 |
描述 |
metadata |
最小页面元数据(类型、标题、URL) |
heading |
标题(h1 - h6),带有级别指示符 |
paragraph |
文本段落 |
list |
有序/无序列表 |
code |
代码块,可选语言 |
table |
带有表头和行的表格 |
image |
带有src和alt文本的图像 |
blockquote |
块引用文本 |
🔧 技术细节
安全
SSRF保护
阻止的目标包括:
- 本地主机和回环地址
- 私有IP范围(
10.x.x.x、172.16 - 31.x.x、192.168.x.x)
- 云元数据端点(AWS、GCP、Azure)
- IPv6链路本地和唯一本地地址
- 内部后缀,如
.local和.internal
URL验证
- 仅允许
http和https URL
- URL中不允许嵌入凭据
- 最大URL长度:2048字符
头部清理
阻止的头部:host、authorization、cookie、x-forwarded-for、x-real-ip、proxy-authorization
速率限制
默认:每个IP 100请求/分钟(仅HTTP模式)。可通过RATE_LIMIT_MAX和RATE_LIMIT_WINDOW_MS进行配置。
开发
脚本
| 命令 |
描述 |
npm run dev |
开发服务器,支持热重载 |
npm run build |
编译TypeScript |
npm start |
生产服务器 |
npm run lint |
运行ESLint |
npm run type-check |
TypeScript类型检查 |
npm run format |
使用Prettier格式化代码 |
npm test |
运行Vitest测试 |
npm run test:coverage |
运行带覆盖率的测试 |
npm run bench |
运行最小性能基准测试 |
npm run release |
创建新版本 |
npm run knip |
查找未使用的导出/依赖项 |
npm run knip:fix |
自动修复未使用的代码 |
技术栈
| 类别 |
技术 |
| 运行时 |
Node.js >=20.12 |
| 语言 |
TypeScript 5.9 |
| MCP SDK |
@modelcontextprotocol/sdk ^1.25.1 |
| 内容提取 |
@mozilla/readability ^0.6.0 |
| HTML解析 |
Cheerio ^1.1.2, LinkeDOM ^0.18.12 |
| Markdown |
Turndown ^7.2.2 |
| HTTP |
Express ^5.2.1, undici ^6.22.0 |
| 验证 |
Zod ^3.24.1 |
📄 许可证
文档中未提及许可证相关信息。
贡献
- 分叉仓库
- 创建功能分支:
git checkout -b feature/amazing-feature
- 确保代码通过检查:
npm run lint
- 运行测试:
npm test
- 提交更改:
git commit -m 'Add amazing feature'
- 推送:
git push origin feature/amazing-feature
- 打开拉取请求
其他MCP服务器示例,请参考:github.com/modelcontextprotocol/servers