[开源] 各位大佬好,分享一个我最近折腾的项目。
起因是我在用 mrkrsl/web-search-mcp( TypeScript , 910 )的时候,发现几个不太够用的地方:没有 Google 和百度、CAPTCHA 直接挂掉、页面提取绑死在搜索流程里……改着改着发现改动量太大了,索性用 Python 从头重写了一遍。
GitHub: https://github.com/duanshiwen/seach-mcp-craft-agent
和原版的核心区别
| 原版 (TypeScript) | 改进版 (Python) | |
|---|---|---|
| 语言 | TypeScript + Javascript | Python 3.10+ |
| 搜索引擎 | Bing / Brave / DuckDuckGo | Google / Bing / 百度 / DuckDuckGo / Yahoo |
| CAPTCHA | 无处理 | 自动检测 + 弹窗等待手动验证 |
| 浏览器管理 | 共享实例 | 全局队列锁 + per-engine 独立 profile |
| 网页提取 | 绑在搜索流程里 | 独立 web_fetch 工具,auto/http/js 三种模式 |
| 百度 | 浏览器 + HTTP 双保险 | |
| 目标用户 | 本地 LLM ( LM Studio / LibreChat ) | 所有 MCP 客户端 |
为什么用 Python 重写?
原版的引擎层、浏览器生命周期、CAPTCHA 处理等核心模块都绑在 JS 生态里。我的改动涉及这些底层,与其在原版上打补丁,不如用 Python 重写httpx + selectolax 替代 Axios ,代码更简洁,后续加新引擎也方便。
两个核心改进
1. CAPTCHA 自动检测 + 手动验证
原版遇到 CAPTCHA 直接挂。我的版本用可见浏览器模式搜索,触发 CAPTCHA 时:
- 自动检测到验证码页面
- 用户在同一个浏览器窗口手动完成验证
- 程序每 2 秒轮询,验证通过后自动提取结果并关闭窗口
- 默认等待 300 秒超时,超时返回空结果并建议换引擎
每个引擎用独立的浏览器 profile ,不会污染你的日常 Chrome 。
2. 独立的 web_fetch 网页内容提取
原版的页面提取是绑在搜索流程里的,我把拆成了独立工具:
{ "url": "https://example.com/article", "render_mode": "auto", "extract_mode": "markdown" } auto模式先走轻量 HTTP ,检测到 JS-only 页面自动 fallback 到 Playwright- 自动去除广告、导航栏等干扰,提取正文
- 超时上限 12 分钟,SPA 页面也能搞定
搜索完直接用 web_fetch 抓全文,不用再接别的工具。
为什么不用 SerpAPI / Brave Search API ?
这是做这个项目之前我自己纠结过的问题,说说我的判断:
SerpAPI:免费版每月 100 次搜索,付费版 $50/月起。对个人开发者做个 emo 够了,但跑 Agent 工作流每天可能就要几百次搜索,一个月下来成本不低。
Brave Search API:$5/1000 次请求,每月送 $5 额度(≈ 1000 次免费)。价格比 SerpAPI 友好很多,但问题是它只能搜 Brave 的索引,结果质量和 Google 差距明显,尤其是中文内容。
Google Custom Search API:免费 100 次/天,超出 $5/1000 次。看似便宜,但 100 次/天对 Agent 来说杯水车薪,而且返回的结果不如直接浏览器搜索丰富。
我的选择:直接用浏览器搜索。
- 结果最全最实时,和你手动打开浏览器搜的一样
- 完全免费,没有调用限制
- 支持 5 个引擎,不是只搜一个索引
代价是需要 Playwright 和真实浏览器,比 API 调用重一些。但对 Agent 工作流来说,搜索质量比速度更重要你宁可多等 3 秒拿到准确结果,也不要秒回一个过时的摘要。
安装
git clone https://github.com/duanshiwen/seach-mcp-craft-agent.git cd seach-mcp-craft-agent uv sync # 或 pip install -e . playwright install chromium MCP 客户端配置:
{ "mcpServers": { "search-engine-mcp": { "command": "python", "args": ["-m", "src.server"], "cwd": "/path/to/seach-mcp-craft-agent" } } } 使用示例
{ "query": "Rust async best practices", "engine": "google", "max_results": 5 } 引擎选择建议:
- 快速查询 → DuckDuckGo (轻量 HTTP ,1-3s )
- 要最全结果 → Google (浏览器模式,3-10s )
- 中文内容 → Bing 或百度
项目结构
src/ ├── server.py # MCP 服务主入口 ├── engines/ │ ├── base.py # HTTP 引擎基类 │ ├── browser_base.py # 浏览器引擎基类( CAPTCHA 、队列锁、profile 隔离) │ ├── google.py │ ├── bing.py # 浏览器 + HTTP fallback │ ├── baidu.py # 浏览器 + HTTP fallback │ ├── duckduckgo.py │ └── yahoo.py ├── fetcher.py # web_fetch 实现 └── types.py / utils.py 加新引擎只需要继承对应基类、实现几个方法就行,README 里有详细说明。
碎碎念
做这个项目过程中的几个观察:
- JS 渲染是 2026 年搜索工具的门槛了。Google 的搜索结果甚至需要 JS 执行完才会出现,纯 HTTP 方案基本不可用
- 免费方案反而比付费 API 好用。直接浏览器搜结果最全最实时,API 受限太多
- 失败兜底比成功路径更重要。CAPTCHA 、超时、页面变化都是常态,双路渲染+队列管理这些"不性感"的设计才是稳定性的基石
- 感谢原作者 mrkrsl 的优秀工作
欢迎各位大佬试用提 PR ,有问题直接回复聊~
