前言¶
DeepSeek Harness (DSH) 允许在 profile 中添加 MCP 客户端实例以调用浏览器能力。在多会话或多 profile 场景下,直接启动多个浏览器实例通常会导致端口冲突、内存占用过高以及进程间的互相干扰。dsh-browser-slotpool 插件通过引入“槽位池”机制,将并发浏览器会话的数量显式化并加以隔离,解决上述冲突问题。
这是什么¶
这是一个为 DSH 提供的 patch 层 bundle。它本质上是一个浏览器启动器,封装了 @playwright/mcp 的 stdio 通信。插件维护一个固定数量的 CDP 端口池,每个 DSH mcp-client 实例独占一个槽位,确保会话之间互不破坏。插件本身没有 TypeScript 源码和构建步骤,安装后即开箱即用。
核心功能¶
该插件主要提供以下能力:
* 槽位池管理:维护一组固定的 CDP 端口(默认 9222, 9223),先到先得,满员时拒绝新连接。
* 原子加锁与自愈:使用 fs.openSync 的独占标志实现原子加锁。通过检查持有者的 PID 活性,自动回收异常退出的进程锁,避免“槽全忙”的死锁状态。
* 幂等就绪探测:在启动 Chrome 前先探测端口是否已开启,避免重复启动;不主动杀死其他槽位的浏览器。
* 所有权隔离:严格限制每个 mcp-client 会话只能操作分配给它的槽位,不代理、不窃取。
* 全委托:将 stdio 通信完全委托给 @playwright/mcp,并将诊断日志输出到 stderr 以保证 MCP 协议通道的畅通。
安装与配置¶
安装插件需要从 GitHub 仓库添加依赖到当前 DSH profile。
- 在 DSH 的 checkout 目录(与 GUI 所在 profile 一致)执行:
pnpm dsh plugin --profile web add github:bluechips-zhao/dsh-browser-slotpool
- 安装完成后,重启目标 profile 以加载依赖。
关键配置步骤¶
由于 !!js 在 DSH 中求值时没有模块作用域,启动器路径必须通过环境变量显式指定。
- 找到插件安装后的启动器路径:
<DSH_HOME>/profiles/<name>/node_modules/@deepseek-ai/dsh-browser-slotpool/bin/browser-slotpool.mjs
- 将该绝对路径设置到环境变量
DSH_BROWSER_LAUNCHER(临时或写入启动脚本):
$env:DSH_BROWSER_LAUNCHER = "<DSH_HOME>/profiles/<name>/node_modules/@deepseek-ai/dsh-browser-slotpool/bin/browser-slotpool.mjs"
可选环境变量¶
启动器会读取以下环境变量来控制行为:
| 变量名 | 默认值 | 说明 |
|---|---|---|
DSH_BROWSER_PORTS |
9222,9223 |
槽位池包含的 CDP 端口列表,逗号分隔。 |
DSH_BROWSER_BASE_DIR |
LOCALAPPDATA/mcp-shared-browsers |
共享浏览器数据目录和锁文件的根路径。 |
DSH_PLAYWRIGHT_MCP_ENTRY |
(空) | @playwright/mcp 的 cli.js 绝对路径。设置后可直接调用 node,避免 npx 网络开销。 |
DSH_PLAYWRIGHT_MCP_CMD |
npx |
调用 Playwright MCP 的命令(仅在 entry 未设置时使用)。 |
CHROME_PATH |
(系统探测) | Chrome/Chromium 可执行文件的绝对路径。 |
使用示例¶
在 profile 的配置中添加 @deepseek-ai/dsh-mcp-client 实例:
- 在配置文件中添加该实例。
- 设置
command指向bin/browser-slotpool.mjs,设置args为空数组。 - 确保
DSH_BROWSER_LAUNCHER环境变量已正确指向上述启动器路径。
完成配置后,浏览器工具会以 mcp__browser__<rawName> 的形式出现在模型可用工具列表中。
本地验证¶
运行仓库自带的冒烟测试脚本来验证全链路:
node test/mcp-client-smoke.mjs
该脚本会启动本地服务器、创建槽位、连接 Playwright MCP 并执行截图操作,确认渲染真实页面。
适用场景与注意¶
- 适用场景:需要在一个 DSH profile 中同时运行多个浏览器实例,且希望严格隔离资源和端口的场景。
- 运行前提:
- 需要本地安装 Chrome/Chromium 浏览器。
- 需要依赖 DSH 自带的
@deepseek-ai/dsh-mcp-client。 - 需要依赖
@playwright/mcp(若未设置DSH_PLAYWRIGHT_MCP_ENTRY,首次调用需联网拉取)。
- 注意事项:
- 这是一个纯
.mjs文件,无 TypeScript 源码,修改需直接编辑源文件。 - 若修改仓库命名空间,需同步更新
dsh plugin add中的 GitHub 地址。 - 外网访问能力取决于部署环境(若使用
npx调用 Playwright MCP)。
- 这是一个纯
结尾¶
dsh-browser-slotpool 通过显式的槽位管理和 PID 活性检查,为 DSH 提供了一个健壮的并发浏览器解决方案。它解决了多实例环境下的资源竞争问题,适合需要稳定多会话协作的开发者使用。
更多详情及源码,请访问:GitHub 仓库