网页获取转换服务

web-fetch-mcp 是一个独立的 HTTP 模型上下文协议服务器,用于获取网页并将其转换为清理后的 Markdown 和结构化元数据,适用于 MCP 兼容客户端。

  • by alanbanks229
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 alanbanks229/custom-web-fetch-mcp

使用说明

web获取mcp

web-fetch-mcp 是一个独立的HTTP模型上下文协议服务器,它获取网页并将清理后的markdown和结构化元数据返回给MCP兼容的客户端。

它的作用

  • 显示一个MCP工具: web_fetch
  • 获取 http:// 和 https:// 基于流式HTTP的URL
  • 将HTML/XHTML转换为干净的markdown
  • 传递纯文本并将JSON/XML封装在围栏代码块中
  • 自动分块超大的降价响应和报告分页元数据
  • 支持基于选择器的提取和链接/图像输出控制
  • 添加SSRF保护、重定向验证、超时限制、大小限制、可选的API-key身份验证和持续速率限制

需求

  • Node.js 24.x 或更高版本
  • npm 11.x 或更高版本

快速入门

安装依赖项并复制示例环境文件:

npm install
cp .env.example .env

在本地启动服务器:

npm run dev

验证运行状况终结点:

curl http://localhost:3000/health

呼叫 web_fetch 直接:

curl -X POST http://localhost:3000/mcp \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "web_fetch",
      "arguments": {
        "url": "https://example.com"
      }
    },
    "id": 1
  }'

仅打印markdown块:

curl -sS -X POST http://localhost:3000/mcp \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "web_fetch",
      "arguments": {
        "url": "https://example.com"
      }
    },
    "id": 2
  }' | jq -r '.result.content[0].text'

工具合同

web_fetch

  • 输入:
{
  "url": "https://...",
  "chunk": 0,
  "chunkSize": 15000,
  "selector": "#main-content",
  "extractMain": true,
  "includeLinks": true,
  "includeImages": false,
  "timeoutMs": 5000
}
  • 输出:
    • content[0].text:已清除请求块的markdown
    • structuredContent.metadata:最终URL、内容类型、HTTP状态、字节数、标记大小和估计令牌
    • structuredContent.pagination:当转换后的markdown跨越多个块时显示
  • 当前行为:仅返回原始提取的内容;它没有总结

配置

运行时配置存在 .env支持的变量记录在 .env.example.

脚本

npm run dev
npm run build
npm start
npm test

文档

备注

  • 服务器仅支持HTTP。如果需要HTTPS,请使用反向代理。
  • MCP POST端点预期 Accept: application/json, text/event-stream.
  • 集成测试打开本地HTTP侦听器。在受限沙盒中,它们可能需要提升权限。