关于 superfetch
superfetch 被标注为抓取网页内容的 MCP 服务,但所附 README 描述的是将网页转换为 Markdown 的 Fetch URL MCP Server。README 说明了 URL 解析、后台任务以及 stdio 或可选 HTTP 传输。
主要功能
- 01将网页转换为 Markdown
- 02将代码托管链接解析为原始内容
- 03将耗时抓取作为后台任务运行
- 04支持 stdio 和 HTTP 传输
- 05提供使用说明资源和帮助提示词
适用场景
- 01为大模型上下文整理文档或文章
- 02从支持的站点抓取仓库文件或 Gist
- 03通过任务进度获取大型或缓慢页面
MCP 相关
所附 README 描述了 `fetch-url` 工具,可抓取 URL 并返回 Markdown 和元数据。它还提供使用说明资源、帮助提示词及可选的后台任务支持。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Fetch URL MCP 服务
一个用于抓取网页并将其转换为简洁易读 Markdown 的 MCP 服务。
概述
此服务接收 URL,抓取页面并去除所有不需要的内容——导航栏、侧边栏、横幅和脚本,只保留 Markdown 格式的主要内容。它非常适合将网页内容提供给大模型,让模型获取页面的精华内容,不受杂项干扰。它还能识别 GitHub、GitLab、Bitbucket 和 Gist URL,并将其改写为直接抓取原始内容。
默认情况下,服务通过 stdio 运行。如果需要带身份验证、速率限制、TLS 和会话支持的标准 HTTP 端点,请传入 --http。
主要功能
- HTML 转 Markdown — 将任何公开网页转换为简洁易读的 Markdown,并提供
title、url、contentSize和truncated等元数据。 - 智能 URL 处理 — 识别 GitHub、GitLab、Bitbucket 和 Gist 页面 URL,并在抓取前将其改写为原始内容端点。
- 任务模式 — 大型或加载缓慢的页面可以作为异步 MCP 任务运行,并提供进度更新,避免阻塞。在 HTTP 模式下,任务绑定到经过身份验证的调用方,而非单个 MCP 会话,因此同一经过身份验证的主体重新连接后可以恢复任务。轮询任务状态会返回任务摘要;数值进度则通过
notifications/progress在带外提供。 - 自描述 — 提供
internal://instructions资源和get-help提示词,帮助客户端了解如何使用。 - HTTP 模式 — 可选通过 Streamable HTTP 提供服务,支持主机/来源验证、Bearer 或 OAuth 身份验证、速率限制、运行状况检查和 TLS。
Web 客户端
如果你想在不配置 MCP 的情况下使用此服务,可以使用基于浏览器的客户端。
要求
- Node.js >= 24
- Docker(可选)— 仅在你想运行容器镜像时需要
快速开始
将以下内容添加到 MCP 客户端配置中:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}
客户端配置
在 VS Code 中安装
[](https://insiders.vscode.dev/redirect/mcp/install?name=fetch-url&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40j0hanz%2Ffetch-url-mcp%40latest%22%5D%7D)添加到 .vscode/mcp.json:
{
"servers": {
"fetch-url-mcp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}
或通过 CLI 安装:
code --add-mcp '{"name":"fetch-url-mcp","command":"npx","args":["-y","@j0hanz/fetch-url-mcp@latest"]}'
有关详细信息,请参阅 VS Code MCP 文档。
在 VS Code Insiders 中安装
添加到 .vscode/mcp.json:
{
"servers": {
"fetch-url-mcp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}
或通过 CLI 安装:
code-insiders --add-mcp '{"name":"fetch-url-mcp","command":"npx","args":["-y","@j0hanz/fetch-url-mcp@latest"]}'
有关详细信息,请参阅 VS Code Insiders MCP 文档。
在 Cursor 中安装
添加到 ~/.cursor/mcp.json:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}
有关详细信息,请参阅 Cursor MCP 文档。
在 Visual Studio 中安装
如需在解决方案范围内进行设置,请将以下内容添加到解决方案根目录下的 .mcp.json:
{
"servers": {
"fetch-url-mcp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}
有关详细信息,请参阅 Visual Studio MCP 文档。
在 Goose 中安装
在 macOS/Linux 上添加到 ~/.config/goose/config.yaml,或在 Windows 上添加到 %APPDATA%\Block\goose\config\config.yaml:
extensions:
fetch-url-mcp:
name: fetch-url-mcp
cmd: npx
args: ['-y', '@j0hanz/fetch-url-mcp@latest']
enabled: true
type: stdio
timeout: 300
有关详细信息,请参阅 Goose 扩展文档。
在 LM Studio 中安装
在 macOS/Linux 上添加到 ~/.lmstudio/mcp.json,或在 Windows 上添加到 %USERPROFILE%/.lmstudio/mcp.json:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}
有关详细信息,请参阅 LM Studio MCP 文档。
在 Claude Desktop 中安装
添加到 claude_desktop_config.json:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}
有关详细信息,请参阅 Claude Desktop MCP 文档。
在 Claude Code 中安装
使用 CLI:
claude mcp add fetch-url-mcp -- npx -y @j0hanz/fetch-url-mcp@latest
对于项目范围的配置,Claude Code 会写入 .mcp.json,内容如下:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"],
"env": {}
}
}
}
有关详细信息,请参阅 Claude Code MCP 文档。
在 Windsurf 中安装
添加到 ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}
有关详细信息,请参阅 Windsurf MCP 文档。
在 Amp 中安装
在 macOS/Linux 上添加到 ~/.config/amp/settings.json,在 Windows 上添加到 %USERPROFILE%\.config\amp\settings.json,或添加到 .amp/settings.json 以进行工作区范围的配置:
{
"amp.mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}
或通过 CLI 安装:
amp mcp add fetch-url-mcp -- npx -y @j0hanz/fetch-url-mcp@latest
有关详细信息,请参阅 Amp 文档。
在 Cline 中安装
打开 MCP Servers 面板,选择 `Configure MCP Servers`,然后将以下内容添加到 `cline_mcp_settings.json`:{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}
更多信息请参阅 Cline MCP 文档。
在 Codex CLI 中安装
使用 CLI:
codex mcp add fetch-url-mcp -- npx -y @j0hanz/fetch-url-mcp@latest
或者将以下内容添加到 ~/.codex/config.toml 或项目级 .codex/config.toml:
[mcp_servers.fetch-url-mcp]
command = "npx"
args = ["-y", "@j0hanz/fetch-url-mcp@latest"]
更多信息请参阅 Codex MCP 文档。
在 GitHub Copilot 中安装
添加到 .vscode/mcp.json:
{
"servers": {
"fetch-url-mcp": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}
更多信息请参阅 GitHub Copilot MCP 文档。
在 Warp 中安装
在 Warp 中打开 Personal > MCP Servers,选择 + Add,然后使用以下内容添加 CLI 服务:
command:npxargs:["-y", "@j0hanz/fetch-url-mcp@latest"]
或者在使用 Warp 的多服务导入流程时粘贴以下 JSON 片段:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}
更多信息请参阅 Warp MCP 文档。
在 Kiro 中安装
使用 Kiro 的 MCP Servers 面板或 Add to Kiro 安装流程。Kiro 将工作区级 MCP 配置保存在 .kiro/settings/mcp.json 中,将用户级配置保存在 ~/.kiro/settings/mcp.json 中。
此服务使用以下配置:
command:npxargs:["-y", "@j0hanz/fetch-url-mcp@latest"]
更多信息请参阅 Kiro MCP 文档。
在 Gemini CLI 中安装
添加到 ~/.gemini/settings.json:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}
更多信息请参阅 Gemini CLI MCP 文档。
在 Zed 中安装
添加到 ~/.config/zed/settings.json:
{
"context_servers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"],
"env": {}
}
}
}
更多信息请参阅 Zed MCP 文档。
在 Augment 中安装
使用 Augment Settings 面板,手动添加服务或选择 Import from JSON:
{
"mcpServers": {
"fetch-url-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/fetch-url-mcp@latest"]
}
}
}
更多信息请参阅 Augment MCP 文档。
在 Roo Code 中安装
使用 Roo Code 的 MCP Servers 界面或市场流程。
此服务使用以下配置:
command:npxargs:["-y", "@j0hanz/fetch-url-mcp@latest"]
更多信息请参阅 Roo Code 文档。
在 Kilo Code 中安装
使用 Kilo Code 的 MCP Servers 界面或市场流程。
此服务使用以下配置:
command:npxargs:["-y", "@j0hanz/fetch-url-mcp@latest"]
更多信息请参阅 Kilo Code 文档。
使用场景
- 面向大模型的文档 — 将文档页面、博客文章或参考资料获取为 Markdown,并直接传入上下文窗口。
- 仓库内容 — 提供 GitHub、GitLab 或 Bitbucket URL,即可解析到原始内容端点。Gist 同样适用。
- 加载缓慢或体积较大的页面 — 任务模式可在后台运行大型抓取任务,同时向客户端发送单调递增的进度更新;
tasks/get则会提供最新的任务摘要字段,例如statusMessage、createdAt、lastUpdatedAt、ttl和pollInterval。
架构
[MCP Client]
├─ stdio -> `src/index.ts` -> `startStdioServer()` -> `createMcpServer()`
└─ HTTP (`--http`) -> `src/index.ts` -> `startHttpServer()` -> HTTP dispatcher
├─ `GET /health`
├─ `GET /.well-known/oauth-protected-resource`
├─ `GET /.well-known/oauth-protected-resource/mcp`
└─ `POST|GET|DELETE /mcp`
`createMcpServer()`
├─ registers tool: `fetch-url`
├─ registers prompt: `get-help`
├─ registers resources:
│ - `internal://instructions`
├─ enables capabilities: logging, resources, prompts, tasks
└─ installs task handlers, log-level handling, and shutdown cleanup
`fetch-url` execution
├─ validate input with `fetchUrlInputSchema`
├─ normalize URL and block local/private targets unless allowed
├─ rewrite supported code-host URLs to raw endpoints when possible
├─ fetch content via the shared pipeline
├─ transform HTML into Markdown in the transform worker path
└─ validate `structuredContent` with `fetchUrlOutputSchema`
请求生命周期
[Client] -- initialize {protocolVersion, capabilities} --> [Server]
[Server] -- {protocolVersion, capabilities, serverInfo} --> [Client]
[Client] -- notifications/initialized --> [Server]
[Client] -- tools/call {name, arguments} --> [Server]
[Server] -- {content: [{type, text}], structuredContent?, isError?} --> [Client]
MCP 接口
工具
fetch-url
接受一个 URL 并返回 Markdown。只读,不执行 JavaScript。支持作为后台 MCP 任务运行,以处理较大或加载较慢的页面。在任务模式下,tasks/get 和 tasks/list 会提供任务摘要,其中包括 status、statusMessage、createdAt、lastUpdatedAt、ttl 和 pollInterval;数值进度仍通过 notifications/progress 单独发送。
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
url | string | 是 | 目标 URL。最多 2048 个字符。 |
默认情况下,返回文本内容。如果输出验证通过,响应还会包含带类型字段的 structuredContent:url、resolvedUrl、finalUrl、title、metadata、markdown、fetchedAt、contentSize 和 truncated。truncated 的值为 true 表示内容已达到服务端大小限制。
若要启用进度更新,请在工具调用中加入 _meta.progressToken。该令牌可以是字符串或数字;在获取内容期间,服务端可能会发送单调递增的 notifications/progress 更新。
若要以任务模式运行该工具,请加入 params.task = { ttl?: <ms> }。tasks/result 会等待任务达到终止状态,然后返回已存储的输出,或针对已取消或失败任务返回终止错误负载。任务摘要和最终结果都包含 _meta["io.modelcontextprotocol/related-task"] = { "taskId": "<server-task-id>" }。
{
"method": "tools/call",
"params": {
"name": "fetch-url",
"arguments": {
"url": "https://example.com/docs"
},
"task": {
"ttl": 300000,
"pollInterval": 1000
},
"_meta": {
"progressToken": 7
}
}
}
1. [Client] -- tools/call {name: "fetch-url", arguments} --> [Server]
2. [Server] -- dispatch("fetch-url") --> [src/tools/fetch-url.ts]
3. [Handler] -- validate(fetchUrlInputSchema) --> normalize / fetch / transform
4. [Handler] -- validate(fetchUrlOutputSchema) --> assemble content + structuredContent
5. [Server] -- result or tool error --> [Client]
资源
| 资源 | URI | MIME 类型 | 描述 |
|---|---|---|---|
fetch-url-mcp-instructions | internal://instructions | text/markdown | 使用 Fetch URL MCP 服务的指南。 |
提示词
| 提示词 | 参数 | 描述 |
|---|---|---|
get-help | topic? | 返回 Fetch URL 服务的说明:工作流、任务模式和错误处理。可选值:capabilities、workflows、constraints、errors。 |
MCP 功能
| 功能 | 状态 | 说明 |
|---|---|---|
| completions | 已确认 | 在 createServerCapabilities() 中声明。 |
| logging | 已确认 | 在 createServerCapabilities() 中声明。 |
| resources | 已确认 | 服务启动时注册静态指令资源。未声明订阅和列表变更支持。 |
| prompts | 已确认 | 服务启动时注册 get-help。 |
| tasks | 已确认 | 在 createServerCapabilities() 中声明,并由已注册的任务处理程序和可选的工具任务支持。 |
| progress notifications | 已确认 | 通过 _meta.progressToken 启用。工具执行会在抓取和转换阶段报告单调递增的 notifications/progress 更新。 |
| task status updates | 已确认 | 任务状态变更且 TASKS_STATUS_NOTIFICATIONS=true 时,会发出 notifications/tasks/status。 |
工具注释
| 注释 | 值 |
|---|---|
readOnlyHint | true |
destructiveHint | false |
idempotentHint | true |
openWorldHint | true |
结构化输出
该工具声明了 outputSchema,并在验证通过时于响应中包含 structuredContent。支持结构化输出的客户端可直接获取类型化数据;其他客户端则使用文本回退内容。
配置
所有配置都通过环境变量完成。对于基本的 stdio 用法,无需设置任何内容。
HTTP 服务
| 变量 | 默认值 | 说明 |
|---|---|---|
HOST | 127.0.0.1 | 绑定地址。绑定到非环回地址时,还必须设置 ALLOW_REMOTE=true。 |
PORT | 3000 | --http 的监听端口。 |
ALLOW_REMOTE | false | 绑定到非环回接口时必须启用。 |
ALLOWED_HOSTS | empty | 额外允许的 Host 和 Origin 值。 |
SERVER_MAX_CONNECTIONS | 0 | 可选的连接数上限。 |
SERVER_TRUST_PROXY | false | 信任 X-Forwarded-For / Forwarded,以解析客户端 IP。 |
SERVER_HEADERS_TIMEOUT_MS | unset | 可选的 Node 服务调优项。 |
SERVER_REQUEST_TIMEOUT_MS | unset | 可选的 Node 服务调优项。 |
SERVER_KEEP_ALIVE_TIMEOUT_MS | unset | 可选的 keep-alive 调优项。 |
SERVER_KEEP_ALIVE_TIMEOUT_BUFFER_MS | unset | 可选的 keep-alive 调优缓冲时间。 |
SERVER_MAX_HEADERS_COUNT | unset | 可选的标头数量限制。 |
SERVER_BLOCK_PRIVATE_CONNECTIONS | false | 未信任代理时,启用入站专用网络防护。 |
身份验证与 OAuth
| 变量 | 默认值 | 说明 |
|---|---|---|
ACCESS_TOKENS | 未设置 | 以逗号或空格分隔的静态 Bearer 令牌。 |
API_KEY | 未设置 | 用于标头身份验证的备用静态令牌来源。 |
OAUTH_ISSUER_URL | 未设置 | 与其他 OAuth URL 一起设置时启用 OAuth 模式。 |
OAUTH_AUTHORIZATION_URL | 未设置 | 可选的显式授权端点。 |
OAUTH_TOKEN_URL | 未设置 | 可选的显式令牌端点。 |
OAUTH_REVOCATION_URL | 未设置 | 可选的 OAuth 撤销端点。 |
OAUTH_REGISTRATION_URL | 未设置 | 可选的 OAuth 动态客户端注册端点。 |
OAUTH_INTROSPECTION_URL | 未设置 | OAuth 令牌内省所必需。 |
OAUTH_REQUIRED_SCOPES | 空 | 身份验证后强制要求的作用域。 |
OAUTH_CLIENT_ID | 未设置 | 可选的内省客户端 ID。 |
OAUTH_CLIENT_SECRET | 未设置 | 可选的内省客户端密钥。 |
TLS
| 变量 | 默认值 | 说明 |
|---|---|---|
SERVER_TLS_KEY_FILE | 未设置 | 与 SERVER_TLS_CERT_FILE 一起设置时启用 HTTPS。 |
SERVER_TLS_CERT_FILE | 未设置 | TLS 证书路径。 |
SERVER_TLS_CA_FILE | 未设置 | 可选的自定义 CA 证书包。 |
获取
| 变量 | 默认值 | 说明 |
|---|---|---|
ALLOW_LOCAL_FETCH | false | 允许将环回地址和专用网络设为获取目标。 |
FETCH_TIMEOUT_MS | 15000 | 网络获取超时时间,单位为毫秒。 |
USER_AGENT | fetch-url-mcp/<version> | 覆盖出站 User-Agent 字符串。 |
工具输出
| 变量 | 默认值 | 说明 |
|---|---|---|
MAX_INLINE_CONTENT_CHARS | 0 | 0 表示不设置显式的内联内容截断限制。 |
任务
| 变量 | 默认值 | 说明 |
|---|---|---|
TASKS_MAX_TOTAL | 5000 | 保留任务的总容量,包括过期前已完成或已取消的任务。 |
TASKS_MAX_PER_OWNER | 1000 | 每个所有者保留任务的数量上限,最高不超过总上限。 |
TASKS_STATUS_NOTIFICATIONS | false | 启用任务状态通知。 |
TASKS_REQUIRE_INTERCEPTION | true | 要求拦截支持任务的工具执行。 |
转换工作线程
| 变量 | 默认值 | 说明 |
|---|---|---|
TRANSFORM_CANCEL_ACK_TIMEOUT_MS | 200 | 取消确认超时。 |
TRANSFORM_WORKER_MODE | threads | 工作线程执行模式。 |
TRANSFORM_WORKER_MAX_OLD_GENERATION_MB | unset | 可选的工作线程内存限制。 |
TRANSFORM_WORKER_MAX_YOUNG_GENERATION_MB | unset | 可选的工作线程内存限制。 |
TRANSFORM_WORKER_CODE_RANGE_MB | unset | 可选的工作线程内存限制。 |
TRANSFORM_WORKER_STACK_MB | unset | 可选的工作线程堆栈大小。 |
内容清理
| 变量 | 默认值 | 说明 |
|---|---|---|
FETCH_URL_MCP_EXTRA_NOISE_TOKENS | empty | 额外的噪声移除词元。 |
FETCH_URL_MCP_EXTRA_NOISE_SELECTORS | empty | 用于移除噪声的额外 DOM 选择器。 |
FETCH_URL_MCP_LOCALE | system default | 用于提取启发式规则的区域设置覆盖值。 |
MARKDOWN_HEADING_KEYWORDS | built-in list | 覆盖清理时使用的标题关键词。 |
日志记录
| 变量 | 默认值 | 说明 |
|---|---|---|
LOG_LEVEL | info | debug、info、warn 或 error。 |
LOG_FORMAT | text | 设置为 json 以输出结构化日志。 |
HTTP 端点
| 方法 | 路径 | 身份验证 | 用途 |
|---|---|---|---|
GET | /health | 否,远程服务上使用 ?verbose=1 时除外 | 基本运行状况响应,可选包含诊断信息。 |
GET | /.well-known/oauth-protected-resource | 否 | OAuth 受保护资源元数据。 |
GET | /.well-known/oauth-protected-resource/mcp | 否 | MCP 端点的 OAuth 受保护资源元数据。 |
POST | /mcp | 是 | 会话初始化和 JSON-RPC 请求。 |
GET | /mcp | 是 | 绑定会话的服务端到客户端流处理。 |
DELETE | /mcp | 是 | 会话关闭。 |
安全
| 控制项 | 状态 | 说明 |
|---|---|---|
| 主机和来源验证 | 已实现 | HTTP 请求会被拒绝,除非 Host 和 Origin 与根据 loopback、配置的主机和 ALLOWED_HOSTS 构建的允许列表匹配。 |
| 身份验证 | 已实现 | HTTP 模式支持本地静态 bearer token 或 OAuth token introspection;远程绑定需要 OAuth。 |
| 协议版本检查 | 已实现 | 与会话绑定的 MCP HTTP 请求会验证 MCP-Protocol-Version,并将其固定为协商后的会话版本。 |
| 速率限制 | 已实现 | 请求在路由分发前会经过 HTTP 速率限制器。在受信任的反向代理后启用 SERVER_TRUST_PROXY=true,以便限制针对转发的客户端 IP(而非代理节点)生效。 |
| 出站 SSRF 防护 | 已实现 | 本地/私有 IP、元数据端点以及 .local/.internal 主机会被阻止,除非设置了 ALLOW_LOCAL_FETCH=true。 |
| TLS | 可选 | 配置了 TLS 密钥和证书文件后,即会启用 HTTPS。 |
| Stdio 日志安全 | 已实现 | 服务日志会写入 stderr,而非 stdout,以保持 stdio MCP 流量不受干扰。 |
开发
必备命令
| 命令 | 说明 |
|---|---|
npm run build | 清理、编译 TypeScript、复制资源。 |
npm run dev | 以监视模式编译 TypeScript。 |
npm run dev:run | 使用 --watch 和 .env 支持运行服务。 |
npm start | 启动编译后的服务。 |
npm test | 运行完整测试套件。 |
npm run lint | 使用 ESLint 检查代码。 |
npm run lint:fix | 自动修复代码检查问题。 |
npm run type-check | 对源代码和测试进行类型检查。 |
npm run format | 使用 Prettier 格式化代码。 |
npm run inspector | 构建并启动 MCP Inspector。 |
所有 npm 脚本
| Script | Command | | ------------------------ | ------------------------------------------------------------------------------------------------------------------- | | `clean` | `node scripts/tasks.mjs clean` | | `build` | `node scripts/tasks.mjs build` | | `copy:assets` | `node scripts/tasks.mjs copy:assets` | | `prepare` | `npm run build` | | `dev` | `tsc --watch --preserveWatchOutput` | | `dev:run` | `node --env-file=.env --watch dist/index.js` | | `start` | `node dist/index.js` | | `format` | `prettier --write .` | | `type-check` | `node scripts/tasks.mjs type-check` | | `type-check:src` | `node node_modules/typescript/bin/tsc -p tsconfig.json --noEmit` | | `type-check:tests` | `node node_modules/typescript/bin/tsc -p tsconfig.test.json --noEmit` | | `type-check:diagnostics` | `tsc --noEmit --extendedDiagnostics` | | `type-check:trace` | `node -e "require('fs').rmSync('.ts-trace',{recursive:true,force:true})" && tsc --noEmit --generateTrace .ts-trace` | | `lint` | `eslint .` | | `lint:tests` | `eslint src/__tests__` | | `lint:fix` | `eslint . --fix` | | `test` | `node scripts/tasks.mjs test` | | `test:fast` | `node --test --import tsx/esm src/__tests__/**/*.test.ts node-tests/**/*.test.ts` | | `test:coverage` | `node scripts/tasks.mjs test --coverage` | | `knip` | `knip` | | `knip:fix` | `knip --fix` | | `inspector` | `npm run build && npx -y @modelcontextprotocol/inspector node dist/index.js --stdio` | | `prepublishOnly` | `npm run lint && npm run type-check && npm run build` |构建与发布
npm run prepublishOnly会运行 lint、类型检查和构建,作为发布的统一门禁。- CI 工作流位于
.github/workflows/。 - 包含用于容器化运行的
Dockerfile和docker-compose.yml。 - 已发布到 npm,包名为
@j0hanz/fetch-url-mcp。
故障排查
| 症状 | 可能原因 | 解决方法 |
|---|---|---|
| 服务器输出与 stdio 上的 MCP 通信混杂 | 日志写入了 stdout | 确保所有日志都写入 stderr;服务器默认如此。 |
HTTP 模式返回 403 | 主机/来源不匹配 | 将域名添加到 ALLOWED_HOSTS,或检查环回绑定。 |
| HTTP 模式下,代理发出的每个请求都触发速率限制 | 未启用 SERVER_TRUST_PROXY | 当服务器位于受信任的反向代理之后时,启用 SERVER_TRUST_PROXY=true。 |
HTTP 模式返回 401 | 缺少或无效的令牌 | 设置 ACCESS_TOKENS,或为远程绑定配置 OAuth 环境变量。 |
| Fetch 返回私有 IP 错误 | SSRF 防护拦截了目标 | 如果目标有意设为本地地址,请设置 ALLOW_LOCAL_FETCH=true。 |
响应中出现 truncated: true | 内容超出内联限制 | 增大 MAX_INLINE_CONTENT_CHARS,或接受截断的输出。 |
| 转换超时或工作线程崩溃 | HTML 过大或过于复杂 | 调整 TRANSFORM_WORKER_MAX_OLD_GENERATION_MB,或增大 FETCH_TIMEOUT_MS。 |
| 客户端配置不生效 | 客户端配置格式错误 | 查看上方对应的 <details> 区块——不同客户端的配置键各不相同。 |
致谢
| 依赖项 | 注册表 |
|---|---|
| @modelcontextprotocol/server | npm |
| @modelcontextprotocol/node | npm |
| @mozilla/readability | npm |
| linkedom | npm |
| node-html-markdown | npm |
| undici | npm |
| zod | npm |
贡献与许可证
欢迎提交拉取请求。提交前请确保以下检查均已通过:
npm run lint和npm run type-checknpm testnpm run format
许可证
MIT 许可证。详情请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。