前言¶
在 DeepSeek Harness(DSH)里,模型通过原生 web_search 工具发起联网检索。默认路径走内置 DeepSeek 搜索 provider,provider 和结果格式由框架固定,想换成 Tavily、Brave、Exa 等第三方搜索服务,通常要改组合配置或单独挂 MCP 工具,和 web_search 入口也容易重复。
dsh-search-mcp 的做法是:保留模型侧 web_search 的名称与展示,把实际搜索请求全部转给可配置的搜索类 MCP 服务器,并在启用时关闭内置 DeepSeek 搜索 provider。下面介绍它的定位、安装步骤和配置方式。
这是什么¶
dsh-search-mcp 是维护者 gxpppp 发布的 DSH 独立插件,归类为联网工具。插件注册稳定 provider id search-mcp,通过 cordis.patch.yml 覆盖 Web profile 的搜索组合:将 web.searchProvider 指向 search-mcp,禁用 web-search-deepseek,并保持 tool-web 启用。
当前兼容基线为 DeepSeek Harness 0.1.0-rc.7,需要 Node.js 20 或更高版本。许可证为 MIT。
核心功能¶
模型侧继续使用原生 web_search 工具,调用方式与结果展示不变;搜索请求不再走内置 DeepSeek 搜索,而是交给已配置的 MCP 服务器。
支持的 provider 类型包括:
- Tavily
- Brave
- Exa
- Perplexity
- DuckDuckGo
- 自定义 HTTP(Streamable HTTP)或 stdio MCP
配置入口在 Web 设置页:设置 → 插件 → 插件配置 → 搜索 MCP。可在此维护服务器列表、切换默认 provider、填写凭据、调整全局或单服务器结果数与超时。设置保存后对下一次搜索立即生效;安装、升级或卸载浏览器 bundle 后需重启 DSH Web 并刷新页面。卸载插件后 bundle 覆盖层移除,DSH 内置搜索组合恢复。
web_fetch 不在本插件范围内,bundle 中保持关闭(tool-web.config.fetch: false)。
工作方式¶
插件通过四项组合覆盖完成切换:
- insert:
- id: search-mcp
- id: web
config:
searchProvider: search-mcp
- id: web-search-deepseek
disabled: true
- id: tool-web
disabled: false
config:
fetch: false
searchTimeoutMs: 60000
searchMaxResults: 50
tool-web.searchMaxResults 提高到 50,是为了避免模型侧工具先把 provider 返回结果截断;实际返回数量仍由 Search MCP 的全局或单服务器 maxResults 控制。
Host 侧通过 ctx.web.registerSearchProvider() 注册 search-mcp;每次搜索使用 @modelcontextprotocol/sdk 新建 MCP 连接,在 finally 中关闭。结果经归一化处理:递归收集带 HTTP(S) url 的对象,提取常见 title、snippet、date 字段并按 URL 去重。
安装与启用¶
1. 获取插件并安装依赖¶
git clone https://github.com/gxpppp/dsh-search-mcp.git
cd dsh-search-mcp
npm install
2. 链接到 Web profile¶
dsh plugin --profile web add link:<dsh-search-mcp 的绝对路径>
link: 会让后续源码更新直接作用于 profile,无需重复安装插件。
如果 profile 中已单独配置了 Tavily MCP(例如存在 mcp-tavily 行),建议先从 $DSH_HOME/profiles/web/cordis.patch.yml 删除该行,避免同时出现 mcp__tavily__* 工具和 web_search provider 两套入口。
3. 配置凭据¶
推荐在 $DSH_HOME/.credentials.yaml 中保存凭据:
TAVILY_API_KEY: <your-key>
默认 bundle 已使用 apiKeyEnv: TAVILY_API_KEY 引用它。也可在设置卡片的 API 密钥框中输入新值;RC7 客户端会将其写入 DSH credentials domain,并自动把服务器配置改为稳定的 apiKeyEnv 引用。密钥不会通过 settings 读取接口返回。
4. 启动或重启 Web¶
dsh web
刷新浏览器后,打开 设置 → 插件 → 插件配置 → 搜索 MCP 完成服务器配置。
设置页配置¶
卡片默认收起,展开后可配置以下全局选项:
| 字段 | 说明 |
|---|---|
defaultServer |
默认服务器 id;留空时使用第一行 |
maxResults |
全局结果数上限,默认 8,可选 1–50 |
searchTimeoutMs |
MCP 搜索超时,默认 30000 ms;界面以秒显示 |
每个 servers 条目支持 id、kind、transport(http 或 stdio)、url、command / args、apiKey、apiKeyEnv、authStyle、authParam、toolName、maxResults 等字段。常用 provider 可通过快捷按钮添加,默认 endpoint、鉴权位置和工具名会自动补全。
Provider 预设¶
| kind | 默认连接 | 鉴权 | 默认工具 | 结果数参数 |
|---|---|---|---|---|
tavily |
https://mcp.tavily.com/mcp/ |
query tavilyApiKey |
tavily_search |
max_results |
brave |
https://mcp.brave.com/mcp/ |
query braveApiKey |
brave_web_search |
count |
exa |
https://mcp.exa.ai/mcp |
header x-api-key |
web_search_exa |
numResults |
perplexity |
https://mcp.perplexity.ai/mcp/ |
query pplx_api_key |
pplx_search |
max_results |
duckduckgo |
npx -y duckduckgo-mcp-server |
无需 key | ddg_web_search |
无 |
custom |
用户配置 | 用户配置 | 用户配置 | 无 |
验证组合是否生效¶
可用以下命令检查 Web profile 的最终组合:
dsh --profile web --dump-config |
Select-String -Pattern "searchProvider|search-mcp|web-search-deepseek|searchMaxResults"
预期结果:
web.searchProvider: search-mcpweb-search-deepseek.disabled: truetool-web.disabled: falsetool-web.searchMaxResults: 50
插件仓库内也可运行 npm test、npm run check 做自动检查。
适用场景与注意¶
适合需要在 DSH Web 环境中统一 web_search 入口、并按需切换 Tavily / Brave / Exa / Perplexity / DuckDuckGo 或自定义 MCP 搜索后端的开发者。DuckDuckGo 预设无需 API key,其余多数 provider 需要有效凭据。
几点注意:
- 插件以当前 DSH 进程权限运行,安装前应检查源码与 MIT 许可证,确认 endpoint 和凭据管理方式符合你的环境要求。
- 不要只禁用
search-mcp插件行:bundle 同时覆盖了web、web-search-deepseek和tool-web,完整卸载才会恢复内置搜索组合。 servers为空时会出现configured web provider "search-mcp" is registered but unavailable;未配置密钥时对应 provider 会报has no API key。- 若设置页没有 Search MCP 卡片,确认插件 client 模块已加载,重启 DSH Web 后强制刷新页面。
卸载¶
dsh plugin --profile web remove dsh-search-mcp
随后可按需删除 $DSH_HOME/settings.yaml 中的 search-mcp: 用户覆盖;如需恢复独立 Tavily MCP 工具,重新添加原来的 mcp-tavily 行;最后重启 DSH Web 并刷新页面。
结尾¶
dsh-search-mcp 在不改动模型侧 web_search 接口的前提下,把 DSH 内置网页搜索替换为可配置的搜索 MCP 后端,适合需要自选搜索 provider 并在 Web 设置页集中维护的场景。