给大家分享一个,我用 Python 重写的一个完全免费的 5 引擎搜索 MCP - V2EX

节点赞助商

duanshiwen

给大家分享一个,我用 Python 重写的一个完全免费的 5 引擎搜索 MCP

  •  
  •   duanshiwen 3 days ago 421 views

    [开源] 各位大佬好,分享一个我最近折腾的项目。

    起因是我在用 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 里有详细说明。

    碎碎念

    做这个项目过程中的几个观察:

    1. JS 渲染是 2026 年搜索工具的门槛了。Google 的搜索结果甚至需要 JS 执行完才会出现,纯 HTTP 方案基本不可用
    2. 免费方案反而比付费 API 好用。直接浏览器搜结果最全最实时,API 受限太多
    3. 失败兜底比成功路径更重要。CAPTCHA 、超时、页面变化都是常态,双路渲染+队列管理这些"不性感"的设计才是稳定性的基石
    4. 感谢原作者 mrkrsl 的优秀工作

    欢迎各位大佬试用提 PR ,有问题直接回复聊~

    4 replies    2026-06-03 10:07:07 +08:00
    gezimonkey
        1
    gezimonkey  
       3 days ago
    一个值得 star 的项目
    emberzhang
        2
    emberzhang  
       3 days ago
    不错,但你项目名写错了 search 写成了 seach
    duanshiwen
        3
    duanshiwen  
    OP
       3 days ago
    @emberzhang 那太丢人了,我去改掉
    gvax
        4
    gvax  
       2 days ago
    search 不是搜索意思么 seach 啥意思
    About     Help     Advertise     Blog     API     FAQ     Solana     5752 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 47ms UTC 02:27 PVG 10:27 LAX 19:27 JFK 22:27
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86