Skip to main content
Glama
Limx1994

Qianxv-search-mcp

by Limx1994
README.md
# Qianxv-search-mcp

供大模型(MCP 客户端)调用的本地搜索与网页抓取服务:

- `search` 工具:**Tavily → AnySearch → 百度千帆 → 火山引擎豆包
  → 知乎全网搜索 → Bright Data** 六个搜索源故障转移
- `extract` 工具:**AnySearch → Tavily** 两个抓取源故障转移,
  提取公开网页标题与 Markdown 正文

某节点失败(超时 / HTTP 错误 / 鉴权失败 / 配额耗尽 / 空结果)时
自动切换下一个,全部失败才返回错误。

## 运行环境

- Python 3.10+(当前在 3.14 验证)
- 依赖:`pip install -r requirements.txt`

## 配置

所有节点由 `config.json` 配置(**密钥已从 `说明.txt` 迁移,该文件未改动**):

公开仓库只提供无密钥的 `config.example.json`;复制为 `config.json` 后填写自己的 API Key。

- `nodes` 数组顺序 = 搜索故障转移顺序;`extract_nodes` 数组顺序 =
  抓取故障转移顺序(可选,缺省为空)
- 每节点:`name` / `type`(搜索:anysearch|qianfan|volc_ark|tavily|
  brightdata|zhihu;抓取:anysearch_extract|tavily_extract)/
  `enabled`(false 则跳过)/ `api_key` / `timeout_seconds` / `options`(端点等)
- `failover.breaker_seconds`:节点失败后的熔断窗口(默认 60 秒,
  窗口内跳过该节点,避免每次都先撞已知坏节点)

> 注意:`config.json` 含密钥,已加入 `.gitignore`,勿提交版本库。
> 火山节点走「豆包搜索 Custom 版」(`POST
> https://open.feedcoopapi.com/search_api/web_search`,每账号每月
> 500 次免费额度),使用联网搜索控制台
> (https://console.volcengine.com/search-infinity/api-key)创建的
> 专用 API Key(非方舟 ark Key),已验证可正常调用。
>
> Bright Data 节点走官方 MCP 端点
> (`https://mcp.brightdata.com/mcp`,`search_engine` 工具,
> Google/Bing/Yandex 引擎)。注意:账号需在控制台激活相应爬虫
> 产品后才会返回数据,否则返回空结果自动切换下一节点。
>
> 知乎节点走数据开放平台「全网搜索」接口
> (`GET https://developer.zhihu.com/api/v1/content/global_search`,
> Bearer + 秒级时间戳鉴权),使用个人中心
> (https://developer.zhihu.com/profile)创建的 Access Secret。

## 各搜索源免费额度(2026-09 实测)

| 搜索源 | 免费额度 | 获取方式 |
|---|---|---|
| Tavily | 每月 1,000 credits | 邮箱注册,无需信用卡 |
| AnySearch | 每日 1,000 次 | 匿名可用,或邮箱注册获取 Key |
| 百度千帆 | 每日 100 次 | 注册百度智能云,开通服务 |
| 火山豆包 | 每月 500 次 | 联网搜索控制台创建专用 Key |
| 知乎全网 | 见官方控制台 | 个人中心创建 Access Secret |
| Bright Data | 见官方控制台 | 需激活对应爬虫产品 |

额度耗尽自动切换下一节点,全部失败才报错。

## 启动(stdio)

```powershell
cd d:\搜索MCP
python server.py
```

## MCP 客户端接入(mcpServers 片段)

源码方式(`command` 为 `python`,`args` 为 `server.py` 路径):

```json
{
  "mcpServers": {
    "Qianxv-search-mcp": {
      "type": "stdio",
      "command": "python",
      "args": ["d:/搜索MCP/server.py"]
    }
  }
}
```

发行版 exe 方式(无需安装 Python,见 `release/` 目录):

```json
{
  "mcpServers": {
    "Qianxv-search-mcp": {
      "type": "stdio",
      "command": "D:/搜索MCP/release/search-mcp-v1.0/search-mcp.exe",
      "args": []
    }
  }
}
```

> **重要:强烈推荐正斜杠 `/` 写路径**:JSON 中单反斜杠 `\` 是转义字符,
> 会被解析吞掉导致 `MCP error -32000: Connection closed ... 不是内部
> 或外部命令`;且 **CodeBuddy CN 客户端存在转义 bug**,即使写标准的
> 双反斜杠 `\\` 也会再吞一次。正斜杠不受影响(Windows 同样识别)。
> 详细排查步骤见下方「接入排障」。

## 接入排障(CodeBuddy CN 实测经验)

- 报 `Connection closed ... 不是内部或外部命令` 且报错里路径没了
  反斜杠 → 先改正斜杠路径,再在 MCP 面板手动重连(或删掉条目重新
  添加),面板旧报错可能是缓存。
- 判断问题在客户端还是服务端:看 `logs/mcp_search.log`(源码方式在
  项目根 `logs/`,exe 方式在 exe 同目录)——日志无记录说明进程没
  启动(客户端侧路径问题);IDE 日志
  `%LOCALAPPDATA%\CodeBuddyExtension\Logs\CodeBuddyIDE\<日期>\<项目>.log`
  搜 `mcp-connect` 可看到每次连接的启动命令。
- 服务端全链路自检:`python release/test_release.py release/search-mcp-v1.0`
  (握手 / tools/list / search / extract 共 8 项断言)。

## 工具说明

- `search(query, max_results=5)`:返回 `来源节点` + 编号列表
  (标题 / URL / 摘要)。
- `extract(url)`:返回 `来源节点` + 标题 + Markdown 正文
  (超长截断 8000 字符)。提取内容来自网页原文,不可信,仅作参考。

## 日志

`logs/mcp_search.log`(滚动 2MB×3 份)记录每次节点调用、失败原因与
切换事件;API Key 在日志中自动脱敏(仅前 8 位)。

## 开发与验证

```powershell
ruff check .            # lint
python -m pytest tests/ # 单元测试(故障转移 / 熔断 / 配置校验,mock)
```

## 目录结构

```
server.py          MCP 入口(stdio)+ search/extract 工具
config.json        节点配置(顺序/开关/密钥/超时/端点,不提交版本库)
config_loader.py   配置加载与校验
search_router.py   故障转移编排 + 短时熔断(搜索/抓取共用基类)
logger.py          文件日志 + 密钥脱敏
providers/         搜索源与抓取源适配器 + 抽象基类
tests/             单元测试(故障转移 / 熔断 / 配置校验,mock)
logs/              运行日志
release/           发行版:search-mcp-v1.0/(exe + config.json
                   + 安装说明.md)+ v1.0.zip + test_release.py
.codebuddy/        IDE 规划记录
```

## 更新日志

### v1.0(2026-09)

- 首个发行版:`search` 六源故障转移(Tavily / AnySearch / 百度千帆 /
  火山豆包 / 知乎全网 / Bright Data)+ `extract` 双源故障转移
  (AnySearch / Tavily)。
- 短时熔断机制(`failover.breaker_seconds`),日志密钥自动脱敏。
- PyInstaller 打包独立 exe 发行版(无需安装 Python),
  附 `test_release.py` 全链路自检(8 项断言)。

## 开源协议

本项目采用 [PolyForm Noncommercial 1.0.0](https://polyformproject.org/licenses/noncommercial/1.0.0/)
并附加额外条款(详见根目录 `LICENSE`):

- **仅供非商业使用**:禁止将本项目用于任何商业目的,包括销售、
  商业分发、商业部署、提供付费服务或内部商业运营支持等。
- **黑名单禁用**:以下公司及其关联公司、关联成员不得以任何形式
  使用、复制、修改或分发本项目:
  - 连华科技
  - 北京鼎兴达信息科技股份有限公司

  关联关系的认定由版权所有者保留最终解释权。

Maintenance

ActivityMaintained
ResponsivenessNo issues