节点赞助商

duanshiwen

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

  •  
  •   duanshiwen · 5 days ago · 444 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/月起。对个人开发者做个 demo 够了,但跑 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  
       5 days ago
    一个值得 star 的项目
    emberzhang
        2
    emberzhang  
       5 days ago
    不错,但你项目名写错了 search 写成了 seach
    duanshiwen
        3
    duanshiwen  
    OP
       5 days ago
    @emberzhang 那太丢人了,我去改掉
    gvax
        4
    gvax  
       3 days ago
    search 不是搜索意思么 seach 啥意思
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2717 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 15:32 · PVG 23:32 · LAX 08:32 · JFK 11:32
    ♥ Do have faith in what you're doing.