给本地小模型,插上联网的翅膀。 🪽
跑在 Ollama / LM Studio 里的模型其实挺聪明,但它的世界停在了训练截止那一天: 问它今天的新闻,它一本正经地编;让它查最新文档,它给你三年前的 API。
web-mcp 是一个完全免费、无需任何 API key 的 MCP 服务。 装上它,你的模型立刻能实时搜索全网、抓取网页正文——不花一分钱,也不用注册任何账号。
Claude Code / Cursor / Codex / pi 等支持 MCP 的客户端,同样即插即用。
⭐ 如果它帮你省下了搜索 API 的钱,点个 Star 支持一下——这也是你以后找回这个项目最快的方式。
| 你的处境 | web-mcp 的答案 |
|---|---|
| 不想为搜索 API 付费 | 9 个免 key 引擎:百度 / Brave / Bing / DuckDuckGo / CSDN / GitHub / arXiv / Wikipedia / StackOverflow |
| 免费引擎老是被风控 | 四层保命:引擎自动冷却 → Tavily 免费额度兜底 → r.jina.ai 抓取兜底 → 浏览器渲染兜底 |
| 小模型等不起 | 时间盒竞速:结果够了立刻返回,绝不等最慢的引擎 |
| 搜到一堆内容农场 | 站点权重重排:官方文档加权,百家号降权,黑名单直接剔除 |
| 不知道模型联网时发生了什么 | web_log 工具:每次搜索/抓取走了哪条路径,一清二楚 |
git clone https://github.com/Chang-Tong/web-mcp.git
cd web-mcp
npm install
# 命令行先爽一把(不需要任何客户端)
node cli.mjs search "今天有什么 AI 新闻"
node cli.mjs fetch "https://example.com/article"本地模型玩家(Cherry Studio / Cline / Roo Code 等 + Ollama / LM Studio)——在客户端的 MCP 设置里添加:
{
"mcpServers": {
"web": {
"command": "node",
"args": ["/绝对路径/web-mcp/src/index.mjs"]
}
}
}Claude Code / Codex / pi(~/.claude/settings.json 或项目 .mcp.json):同上配置即可。
HTTP 模式(团队共享 / 远程部署):
node src/index.mjs --http 8787 # 启动
WEB_MCP_AUTH_TOKEN=your-secret node src/index.mjs --http 8787 # 带鉴权(公网推荐)
curl http://localhost:8787/health # 健康检查Cursor 远程接入:
{
"mcpServers": {
"web": {
"url": "http://localhost:8787/mcp",
"headers": {
"Accept": "application/json, text/event-stream",
"Authorization": "Bearer your-secret"
}
}
}
}免 key 引擎并行执行,结果按 URL 去重合并,每条带 engine 来源标签。
- 意图感知路由:按查询特征自动选引擎组合
| 意图 | 中文查询 | 英文查询 |
|---|---|---|
| code(api/报错/教程) | csdn + github + stackoverflow + brave + baidu | github + stackoverflow + brave + bing + ddg |
| academic(论文/研究) | baidu + arxiv + wikipedia + brave + csdn | arxiv + wikipedia + brave + bing + ddg |
| news(发布/最新) | baidu + brave + bing | brave + bing + ddg |
| general | baidu + csdn + wikipedia + brave + ddg | wikipedia + brave + baidu + bing + ddg |
- 风控自动冷却:引擎被限流后冷却 60s 不再调度(同一出口 IP 反复请求只会更糟);连续两次时间盒放弃同样进冷却;Tavily 免费配额耗尽自动冷却到下月 1 日
- Tavily 免费兜底:auto 模式下免 key 引擎全灭时,自动用 Tavily 免费额度(每月 1000 次)兜最后一次
- 时间盒竞速:默认 12 秒(
WEB_MCP_TIME_BOX可调)。结果达标立即取消其余引擎提前返回;到期未达标也返回已有结果 - 站点权重重排:github.com ×1.6、官方文档加权;百家号 ×0.55、内容农场降权;黑名单剔除。
SITE_WEIGHTS/SITE_BLOCKLIST可覆盖 - recency 时间过滤:
day/week/month/year透传各引擎原生参数
| 模式 | 说明 |
|---|---|
text(默认) |
粗提取为 markdown,保留链接格式 |
readable |
Mozilla Readability 提取正文,去导航/广告(适合文章页) |
json |
直接解析 JSON API(auto 模式检测到 JSON 自动走这里) |
附加能力:
- 反爬双兜底:目标站 403/5xx 或网络错误时,先走 r.jina.ai 免费代理(免 key),不行再浏览器渲染(知乎等反爬站实测可抓);返回结果标注走的哪条路径
- PDF / DOCX 自动解析(pdf-parse + mammoth,30MB 上限)
- GitHub 仓库页自动抓 README
- 自定义请求头(如带 Cookie 绕过登录墙)
- GBK / GB2312 / Big5 老站点编码自动识别
一步完成:搜索 → 并行抓 top 结果正文 → DeepSeek 生成带 [1][2] 引用标注的结构化中文摘要。查资料写报告场景省去多次 search+fetch 往返。无 DEEPSEEK_API_KEY 时退化为返回搜索+抓取结果。
LLM 把查询拆成多个角度(官方/技术细节/评测/最新动态…)的子查询并行搜索,分组返回。无 LLM 时用规则拆分。
搜索/抓取走了哪条路径,全量记录(JSONL 月度日志,写失败静默不影响主流程):
action=stats:各引擎成功率 / 冷却次数 / Tavily 兜底次数 / 抓取 direct·jina·browser·error 分布 / 日均请求量action=recent:最近日志明细
调参、排查风控、向别人证明"免费路线真的够用",都靠它。
全部可选。零配置即可用,按下表按需增强:
| 变量 | 默认 | 说明 |
|---|---|---|
SEARCH_ENGINE |
auto |
auto / 单引擎名 / serper / tavily / searxng |
SERPER_API_KEY |
— | Serper 的 Google 搜索 key(免费 2500 次/月),追求最稳定体验时配置 |
SERPER_GL / SERPER_HL |
cn / zh-cn |
Serper 搜索地区/语言 |
TAVILY_API_KEY |
— | Tavily key(免费 1000 次/月;auto 模式下兼作兜底引擎) |
SEARXNG_URL |
— | 自托管 SearXNG 实例地址(需开启 JSON 格式) |
DEEPSEEK_API_KEY |
自动读取 | search_summarize / deep_search 的 LLM(优先环境变量,其次 pi 的 ~/.pi/agent/auth.json) |
DEEPSEEK_BASE_URL |
https://api.deepseek.com |
可指向任意 OpenAI 兼容端点 |
DEEPSEEK_MODEL |
deepseek-chat |
LLM 模型名 |
SITE_WEIGHTS |
内置表 | JSON 域名→权重;SITE_WEIGHTS_MERGE=1 与内置合并 |
SITE_BLOCKLIST |
— | 逗号分隔的域名黑名单 |
WEB_MCP_TIME_BOX |
12000 |
搜索时间盒(ms):达标提前收 / 到期返回已有结果 |
WEB_MCP_ENABLE_BROWSER |
自动 | 0 禁用浏览器兜底;1 强制启用 |
WEB_MCP_BROWSER_PATH |
自动探测 | 浏览器路径(系统 Chrome/Edge、playwright 缓存自动探测) |
WEB_MCP_LOG_DIR |
./logs |
web_log 日志目录 |
WEB_MCP_AUTH_TOKEN |
— | HTTP 模式鉴权 |
WEB_MCP_DEBUG |
— | 1 输出每个引擎的执行日志(stderr) |
代理自动生效:http_proxy / https_proxy / no_proxy,无代理环境自动直连。
MCP 客户端(Claude Code / Cursor / Cherry Studio / Cline / pi / ...)
│ stdio 或 Streamable HTTP(stateful session,CORS + 可选 Bearer 鉴权)
▼
web-mcp(Node + @modelcontextprotocol/sdk)
├── web_search ── 意图路由 → 并行多引擎 → 冷却/兜底 → 权重重排
│ 免 key:baidu / brave / bing / duckduckgo / csdn / github / arxiv / wikipedia / stackoverflow
│ 可选:serper / tavily / searxng
├── fetch_page ── text / readable / json → 反爬则 r.jina.ai → 浏览器渲染
├── search_summarize / deep_search ── 搜索 + LLM 摘要
└── web_log ── JSONL 使用日志(stats / recent)
- 免费引擎在代理 IP 池下会被间歇风控(brave 429、baidu 验证页、ddg 202)。多引擎并行 + 冷却 + Tavily 兜底 + 浏览器兜底已把影响降到最低;要最稳定体验请配置
SERPER_API_KEY - 浏览器兜底需要本机有 Chrome/Edge/Chromium,首次启动约 3-10s
- search_summarize / deep_search 依赖
DEEPSEEK_API_KEY(默认自动读 pi 凭据)
node test-client.mjs "搜索词" # stdio 冒烟测试:搜索 + 抓取web-mcp 是个人维护的开源项目,你的 Star 是它活下去的燃料:
- 对你:Star 过的项目躺在你的 starred 列表里,下次配环境一秒找回;Releases 还能收到大版本更新提醒
- 对作者:每一个 Star 都在说"这个方向是对的",直接决定维护优先级
- 对社区:Star 数会让更多本地模型玩家发现它——免费联网这条路,走的人越多越好走
愿意更进一步?把它推荐给用 Ollama 的朋友,或在相关 awesome 列表里提一嘴,都是莫大的帮助。🙏
设计上吸收了多个主流开源 MCP 项目的优点,并针对免费搜索引擎的反爬做了大量实测验证:
| 借鉴项目 | 吸收的特性 |
|---|---|
| Aas-ee/open-webSearch | 多引擎并行编排、失败容忍、反爬关键词检测、CSDN 垂直引擎、GitHub README 抓取、代理支持 |
| zcaceres/fetch-mcp | 多格式抓取(text / readable / json)、自定义请求头 |
| nickclyde/duckduckgo-mcp-server | 搜索引擎限流保护、结构化结果输出 |
| ihor-sokoliuk/mcp-searxng | 可选 SearXNG 自托管引擎 |
| tavily-ai/tavily-mcp | 可选 Tavily API 引擎 |
欢迎 Issue 和 PR。代码风格保持简单,每个引擎的失败容忍逻辑建议附上实测场景说明。