Skip to main content
Glama
wasd9191

multi-search-mcp

by wasd9191

aggregate-search-mcp

aggregate-search-mcp – 一个轻量级、无需 API 密钥的 MCP 服务器,为 LM Studio 等客户端提供百度、必应、搜狗三引擎聚合搜索能力。内置缓存、反爬策略和结果去重排序,同时支持直接抓取任意 URL 的正文内容,并提供搜索引擎结果页截图功能,方便保存页面快照。

✨ 特性

  • 🔍 多引擎聚合 – 同时抓取百度、必应(Bing)、搜狗,合并结果,按相关性和时效性排序

  • 🚫 无需任何 API Key – 模拟真实浏览器请求,直接抓取公开搜索结果

  • 📄 正文抓取 – 自动抓取搜索结果页面的正文内容,为模型提供丰富上下文

  • 🌐 直接 URL 抓取 – 提供 fetch_url 工具,可单独抓取任意网页的正文

  • 🖼️ 搜索结果页截图 – 提供 search_page_screenshot 工具,截取百度/必应/搜狗的结果页面,并保存为本地 JPEG 文件,返回文件路径和 URL,方便模型引用或用户查看

  • 🧩 动态渲染降级 – 当静态抓取失败时,自动启用 Puppeteer 无头浏览器,大幅提升成功率

  • 双重缓存 – 搜索结果缓存(3分钟)+ 正文缓存(30分钟),减少重复请求

  • 🛡️ 反爬策略 – User-Agent 轮换 + 随机请求延迟 + 并发限流 + 重试退避

  • 💾 极低资源占用 – 仅依赖 Node.js 运行时,内存常驻约 30–50 MB(Puppeteer 按需启动)

  • 🔧 灵活可调 – 可配置缓存时间、最大结果数、超时、抓取引擎、截图保存目录等参数

  • 🧩 适配 LM Studio – 完美兼容 MCP 协议,即插即用

  • 📂 自适应路径 – 日志和截图目录基于 index.js 所在位置动态生成,无硬编码,项目可任意移动

Related MCP server: evo-scry

🚀 快速开始

1. 克隆并安装依赖

git clone https://github.com/你的用户名/aggregate-search-mcp.git
cd aggregate-search-mcp
npm install

注意:安装过程中会下载 Chromium(约 150MB),首次安装稍慢,但会极大提升动态页面的抓取成功率。

2. 配置 LM Studio

在 LM Studio 的 MCP 设置中编辑 mcp.json(通常位于 ~/.lmstudio/mcp.json 或设置界面内),添加:

{
  "mcpServers": {
    "multi-search": {
      "command": "node",
      "args": ["/你的绝对路径/aggregate-search-mcp/index.js"],
      "env": {}
    }
  }
}

保存并重启 LM Studio 的 MCP 服务。

3. 在对话中使用

加载任意支持工具调用的模型(如 Qwen、DeepSeek 等),输入:

搜索今天的科技新闻

模型将自动调用 search 工具,返回来自多个引擎的综合结果,并附带正文摘要。

你也可以直接让模型抓取特定网页:

抓取 https://www.baidu.com

模型会调用 fetch_url 工具,返回该页面的正文内容。

或者,让模型截取搜索结果页:

帮我截取百度搜索“广东东莞天气”的结果页面

模型会调用 search_page_screenshot,将截图保存到本地并返回文件路径。


🔧 工作原理

搜索流程

  1. 查询输入 – 用户或模型发起搜索请求

  2. 缓存检查 – 若相同查询在 TTL 内,直接返回缓存结果

  3. 并行抓取 – 同时向百度、必应、搜狗发起 HTTP 请求(模拟浏览器),并限制并发数

  4. 解析与提取 – 使用 cheerio 解析 HTML,提取标题、链接、摘要

  5. 去重与排序 – 按链接去重,根据关键词命中次数 + 来源权重 + 时效性(提取日期)排序

  6. 正文抓取 – 对前 maxResults 条结果进行正文抓取(Axios + Puppeteer 降级)

  7. 返回结果 – 将包含正文摘要的结构化结果返回给客户端

URL 直接抓取

  1. 调用 fetch_url 工具,传入 URL

  2. 先尝试 Axios 静态抓取 → 若失败或内容过短,自动降级为 Puppeteer 无头浏览器

  3. 提取页面正文(使用 Readability 或常见容器选择器)

  4. 返回截断后的正文内容

搜索结果页截图

  1. 调用 search_page_screenshot 工具,传入关键词、引擎和是否全屏

  2. 使用 Puppeteer 打开对应搜索引擎的结果页(模拟真实浏览器)

  3. 等待页面加载完成,截取视图或完整页面

  4. 将截图保存为 JPEG 文件到项目根目录的 screenshots/ 文件夹

  5. 返回图片的 Base64(可渲染)和文件路径(file:// 和相对路径)


🧩 可用工具

  • 描述:多引擎搜索(聚合百度、必应、搜狗),返回结果标题、链接、摘要及正文。

  • 参数

    • query (string, 必需) – 搜索关键词

    • max_results (number, 可选) – 返回结果数(1-10,默认5)

  • 描述:技术类搜索,适合编程、漏洞、技术标准等问题。

  • 参数:同 search

fetch_url

  • 描述:直接抓取指定 URL 的正文内容(支持动态渲染降级)。

  • 参数

    • url (string, 必需) – 完整的网页地址(包含协议)

    • max_length (number, 可选) – 返回内容最大长度(默认500)

search_page_screenshot (🆕)

  • 描述:截取搜索引擎结果页面的截图,保存到本地并返回路径。

  • 参数

    • query (string, 必需) – 搜索关键词

    • engine (string, 可选) – 搜索引擎:baidu | bing | sogou,默认 baidu

    • full_page (boolean, 可选) – 是否截取完整页面(含滚动区域),默认 false

  • 返回:包含 Base64 图片和文本说明,文本中包含保存的绝对路径、file:// URL 和相对路径(可用于 Markdown 图片引用)。


⚙️ 配置说明

所有配置集中在 CONFIG 对象中(位于 index.js 顶部),可按需调整。所有路径均基于 index.js 所在目录动态生成,无需硬编码。

配置项

说明

默认值

cacheTTL

搜索结果缓存时间(毫秒)

3 * 60 * 1000

contentCacheTTL

正文缓存时间(毫秒)

30 * 60 * 1000

maxResults

默认返回结果数

5

requestTimeout

搜索请求超时(毫秒)

15000

maxRetries

抓取失败重试次数

2

maxContentLength

正文最大返回字符数

500

fetchTimeout

正文抓取超时(毫秒)

10000

usePuppeteerFallback

是否启用 Puppeteer 降级

true

proxy

代理地址(可选)

''

maxEngineParallel

同时并发引擎数

2

maxFetchParallel

同时并发正文抓取数

5

logDir

错误日志目录(基于 __dirname

./logs

delayMin / delayMax

请求前随机延迟范围(毫秒)

300 / 1500

screenshotTimeout

截图超时(毫秒)

30000

screenshotQuality

截图 JPEG 质量

80

screenshotSaveDir

截图保存目录(基于 __dirname

./screenshots


📁 文件与目录

项目运行后会在项目根目录(即 index.js 所在目录)下自动创建:

  • logs/ – 错误日志文件(仅记录 ERROR/WARN 级别)

  • screenshots/ – 截图保存目录(由 search_page_screenshot 生成)

日志文件命名:error-YYYY-MM-DD.log,按天滚动。

所有目录创建使用 fs.mkdirSync(..., { recursive: true }),无需手动干预。


⚠️ 注意事项

  • 反爬风险 – 频繁请求可能触发搜索引擎的验证码,建议合理控制调用频率。代码内置了随机延迟和并发限制,但仍需注意。

  • 页面结构变化 – 若百度/Bing/搜狗修改 HTML 布局,可能导致解析失效。届时需更新对应的 cheerio 选择器(见 fetchBaidu, fetchBing, fetchSogou 函数)。

  • 网络环境 – 确保服务器可正常访问上述搜索引擎(国内网络需能直连百度、搜狗,必应可能需代理)。

  • Puppeteer 资源 – 首次启动时会下载 Chromium,之后按需启动无头浏览器,会占用额外内存(约 100-200 MB),但仅在 Axios 抓取失败或截图时触发。

  • 权限要求 – 如果通过 systemd 等自启动服务运行,请确保运行用户对项目目录有写权限(以便创建 logs/screenshots/)。


🤝 致谢与参考

本项目在设计和实现上,参考了 MCP 社区中许多优秀的开源项目,主要灵感来源如下:

📚 百度搜索 MCP 服务器

🔍 多引擎搜索 MCP 服务器

🧩 MCP SDK 与示例

💡 其他灵感来源


📌 开发者说明

  • 本 MCP 服务器的编译与开发过程中,得到了 DeepSeek 的辅助,但经过本人实际测试可正常运行。

  • 所有配置和代码均由 DeepSeek 协助完成,若在使用中发现缺陷,欢迎提交 Issue 或 Pull Request。

  • 如果您不信任此项目能力,可以选择不克隆使用,感谢您抽空阅读本 README。


📝 更新日志

2026-08-01

  • ✅ 修复必应国内版解析问题(支持 cn.bing.com 的 HTML 结构)

  • ✅ 修复截图功能中 fullPage 变量未传递导致的错误

  • ✅ 新增 search_page_screenshot 工具,支持搜索结果页截图并保存到本地

  • 路径自适应:日志和截图目录基于 index.js 所在目录动态生成,无硬编码

  • ✅ 增强稳定性:增加随机延迟、并发控制、重试机制、优雅关闭


最后,感谢您下载并使用本项目! 🎉

如果您觉得有用,欢迎 Star ⭐ 支持,让更多人受益。

A
license - permissive license
-
quality - not tested
A
maintenance

Maintenance

Maintainers
2dResponse time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    -
    quality
    D
    maintenance
    MCP server for internet search via direct Google and DuckDuckGo HTML scraping with AI-powered result normalization and optional summarization, requiring no API keys for search.
    MIT
  • A
    license
    -
    quality
    C
    maintenance
    An MCP server that aggregates web search results from multiple engines and optionally renders pages to Markdown, providing a unified search interface.
    10
    3
    ISC

View all related MCP servers

Related MCP Connectors

  • MCP server for Google search results via SERP API

  • Serper MCP — wraps the Serper Google Search API (serper.dev)

  • Multi-engine search for AI agents. Trust scoring, local corpus, MCP-native. Self-hostable, BYOK.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/wasd9191/aggregate-search-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server