Bundle
dsh-chrome-devtools
DeepSeek Harness profile bundle: Chrome DevTools MCP integration — drives one real Chrome browser through chrome-devtools-mcp via @deepseek-ai/dsh-mcp-client
- Source
- yuzi-ska
- stars
- 3 stars
- License
- MIT
- Updated
- Updated 6 days ago
Readme
# dsh-chrome-devtools — DeepSeek Harness × Chrome DevTools 集成
[English](README.en.md) | 中文
让 DeepSeek Harness 的 Agent 通过 [chrome-devtools-mcp](https://github.com/ChromeDevTools/chrome-devtools-mcp)
驱动一个真实 Chrome 浏览器:导航、点击、输入、截图、DOM 快照、控制台、网络请求、性能轨迹、Cookie。
**唯一安装方式:官方 `dsh plugin` 一键安装**(GitHub 源,无需克隆本仓库)。
本仓库根目录就是官方 bundle 插件包(`package.json` 声明 `dsh.bundle`,
`cordis.patch.yml` 是补丁层):MCP 服务器行由插件自带,安装后**开箱即用**,
不需要安装任何附加组件、不需要自己配置 MCP。
## 特性
- **一键安装**:`dsh plugin add github:...` 一条命令,自动进入 profile 补丁层栈,零手工配置
- **npx 开箱即用**:服务器经 `npx -y chrome-devtools-mcp@latest` 首次自动下载
(与 Claude Code / Claude Desktop / Cursor 的 chrome-devtools-mcp 用法一致),
之后命中 npx 缓存秒级启动——不需要全局安装、不需要任何前置步骤
- **全局可用**:宿主重启后,所有会话(含子 agent)都能用 `mcp__chrome-devtools__*` 工具
- **真实浏览器**:有头或无头 Chrome、多标签、Cookie、网络拦截、性能轨迹,一应俱全
- **自动重连**:服务器崩溃由 `dsh-mcp-client` 指数退避重启,失败预算防无限重启
- **跨平台**:Windows / macOS / Linux;仓库自带零依赖安装脚本(纯 Node 标准库)
## 环境要求
| 依赖 | 说明 |
|---|---|
| DeepSeek Harness | 随官方发布,自带 `@deepseek-ai/dsh-mcp-client` 桥接插件 |
| Node.js ≥ 20 | `npx` 在 PATH 上(Node 自带) |
| pnpm | `dsh plugin` 的底层包管理器(`npm i -g pnpm` 或 `corepack enable`) |
| Chrome / Chromium / Edge | 本机安装;可在插件 `args` 用 `--channel` 指定 |
## 安装
```bash
dsh plugin --profile web add github:yuzi-ska/DSH-Chrome-devtools
```
(非 web 界面可把 `web` 换成你的 profile 名,如 `tui` / `headless`。)
安装后**重启宿主**(`dsh web` / 你的启动方式)。重启后所有会话都会出现
`mcp__chrome-devtools__navigate_page`、`take_snapshot`、`take_screenshot`、
`list_console_messages`、`get_network_request`、`performance_start_trace`
等工具(以服务器实际声明为准),无需任何额外配置。
首次使用会经 npx 下载服务器(约 30-60 秒)+ 启动 Chrome;之后常驻、秒级启动。
卸载:
```bash
dsh plugin --profile web remove dsh-chrome-devtools
```
### 仓库一键脚本(开发/本机场景)
```bash
git clone https://github.com/yuzi-ska/DSH-Chrome-devtools.git
cd DSH-Chrome-devtools
node scripts/install.mjs # 安装到 web profile(本地 link,改代码重启即生效)
node scripts/install.mjs --check # 环境自检(只读)
node scripts/install.mjs --uninstall
```
```
node scripts/install.mjs [options]
--check 环境自检:node/pnpm/dsh/浏览器/DSH_HOME,不写任何文件
--uninstall 卸载(dsh plugin remove)
--profile <name> 目标 profile(默认 web)
--dsh-home <path> 覆盖 DSH_HOME(默认 $DSH_HOME 或 ~/.dsh)
--harness <path> harness 仓库/安装路径(dsh 不在 PATH 时用 node 直接跑 CLI)
--plugin-spec <s> 插件源(默认本仓库根目录;可填 npm 包名、git 源或本地路径)
--package-name <n> 卸载时按此包名移除(默认 dsh-chrome-devtools)
```
## 架构
```
Harness(profile 组装)
│
│ bundle 插件补丁层(本仓库 cordis.patch.yml)
▼
@deepseek-ai/dsh-mcp-client 行(stdio,随 Harness 发布,配置由插件内置)
│
▼
chrome-devtools-mcp 服务器(npx -y chrome-devtools-mcp@latest,宿主进程 spawn,首次自动下载,之后缓存命中)
│
│ Chrome DevTools Protocol
▼
一个共享的 Chrome 实例(自动启动本机已安装的 Chrome/Chromium/Edge)
```
- 每个 MCP 工具以 `mcp__chrome-devtools__<tool>` 名称注册进 `ctx.tools`,模型当作原生工具调用。
- 一个 profile 只挂载一份常驻服务器:所有会话共享同一个浏览器。
- 服务器崩溃由 `dsh-mcp-client` 的 supervisor 以指数退避自动重连;连续失败 10 次后工具注销(重启宿主恢复)。
- 单次工具调用最长 120 秒(可配置)。
## 工具能力
以服务器实际声明为准(当前版本 28 个工具):
| 族 | 工具(mcp__chrome-devtools__ 前缀) |
|---|---|
| 页面 | navigate_page / new_page / close_page / select_page / list_pages / resize_page |
| 快照 | take_snapshot(DOM/无障碍树)/ take_screenshot(截图) |
| 交互 | click / fill / fill_form / type_text / press_key / hover / drag |
| 脚本 | evaluate_script(页面内执行 JS,返回 JSON) |
| 模拟 | emulate(视口/网络/UA/地理/色域) |
| 控制台 | list_console_messages / get_console_message |
| 网络 | list_network_requests / get_network_request(含请求/响应体) |
| 性能 | performance_start_trace / performance_stop_trace / performance_analyze_insight |
| 审计 | lighthouse_audit |
| 其他 | handle_dialog / upload_file / wait_for |
## 配置参考
默认配置已开箱即用;以下为可选项(改 `cordis.patch.yml` 后需重启宿主)。
### mcp 行(插件内置)
```yaml
- id: mcp-chrome-devtools
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: chrome-devtools # 工具命名空间:mcp__chrome-devtools__*
transport: stdio
command: npx
args: ['-y', 'chrome-devtools-mcp@latest']
toolCallTimeoutMs: 120000
failOnStartupError: false
```
| 字段 | 默认 | 说明 |
|---|---|---|
| `serverName` | chrome-devtools | `[A-Za-z0-9_-]{1,32}`,进程内所有 mcp-client 实例唯一 |
| `command` / `args` | npx -y ... | stdio 启动命令;与 Claude Code 生态一致;Windows 下 `npx` 由 SDK 的 cross-spawn 正确解析 |
| `toolCallTimeoutMs` | 120000 | 单次工具调用超时;页面加载/轨迹录制建议放宽 |
| `failOnStartupError` | false | true 时首连失败直接拒绝所在组装;false 时记日志并按退避重连 |
| `env` / `cwd` | 空 | 附加环境变量 / 工作目录(默认继承宿主) |
| `reconnect.*` | 见文档 | 重连预算:initialDelayMs 500 / maxDelayMs 30000 / maxAttempts 10 |
### chrome-devtools-mcp 服务器选项(放进 `args`)
| 选项 | 作用 |
|---|---|
| `--headless` | 无头模式,不弹窗口 |
| `--channel <name>` | 选择浏览器:`chrome`(默认)/ `stable` / `beta` / `dev` / `canary` / `msedge` / 可执行文件路径 |
| `--browserUrl <url>` | 附加到已在调试端口运行的 Chrome(如 `http://localhost:9222`) |
| `--isolated` | 每个服务器进程使用全新隔离的 Chrome profile |
| `--viewport <WxH>` | 固定窗口/视口尺寸,如 `1280x720` |
| `--proxy-server <url>` | 为浏览器设置代理 |
| `--user-data-dir <path>` | 自定义 Chrome 用户数据目录 |
| `--keepAlive` | 所有 MCP 连接关闭后保持服务器存活(默认开启) |
完整清单以官方 [docs/cli.md](https://github.com/ChromeDevTools/chrome-devtools-mcp/blob/main/docs/cli.md) 为准。
## 共享语义
- 工具注册在 host 组装:profile 下每个 agent(含子 agent)都可见。
- 所有会话共享一个浏览器与服务器进程,会话之间的浏览器状态(标签、Cookie、控制台缓冲)互相可见。
- 需要隔离的浏览器场景:修改 `serverName` 与 `args`(如 `--isolated` 或单独 `--user-data-dir`)另装实例。
## 安全说明
- 浏览器能力与 shell 访问同级信任:可读写 Cookie、发任意请求、访问内网。只给可信会话使用。
- 页面内容(DOM 快照、控制台、响应体)会进入模型上下文与会话日志,注意敏感页面。
- 全局模式下每个请求都会携带该组工具的 schema(token 成本)。
- `failOnStartupError: false` 下,服务器持续崩溃会消耗重连预算后注销工具——这是
刻意的失败可见性,不会无限重启。
## 故障排查
| 现象 | 处理 |
|---|---|
| 首次调用较慢(30-60s+) | npx 首次下载 + Chrome 首次启动,一次性成本;之后命中缓存、常驻 |
| 无浏览器工具出现 | 看宿主日志的 `mcp-client(chrome-devtools)` 行:reconnecting(warn)、recovered(info)、disabled-loss(error) |
| 安装后工具没出现 | bundle 插件在启动时加载,**必须重启宿主**;profile 补丁层的配置热重载对新增行不生效 |
| Chrome 未安装/找不到 | 在 `args` 加 `--channel`(如 `msedge`),或确认默认 Chrome 存在 |
| npx 无法下载 | 检查 npm registry 网络;可固定版本 `args: ['-y', 'chrome-devtools-mcp@<固定版本>']` 减少漂移 |
| 想附加已开的 Chrome | Chrome 以 `--remote-debugging-port=9222` 启动后,`args` 加 `--browserUrl http://localhost:9222` |
| `dsh plugin` 报 pnpm 缺失 | 安装 pnpm(`npm i -g pnpm` 或 `corepack enable`) |
| 工具调用超时 | 单次 120s;网络差或页面卡死时提高 `toolCallTimeoutMs` |
| 从本地 link 切换 GitHub 源报 EPERM | Windows junction 无法被 pnpm rename 覆盖:先 `dsh plugin remove`,再 add 新源 |
## 开发与迭代
```bash
git clone https://github.com/yuzi-ska/DSH-Chrome-devtools.git
cd DSH-Chrome-devtools
# 本地 link 安装(改 cordis.patch.yml 后重启即生效;无需每次推送)
node scripts/install.mjs --harness <harness仓库路径>
# 无重启验证组装树(boot-free)
node <harness>/apps/cli/lib/bin.js --profile web --dump-config | grep -A8 mcp-chrome-devtools
```
- 推送后远程安装:`dsh plugin --profile web add github:yuzi-ska/DSH-Chrome-devtools`。
- 内部开发文档 `docs/development.md` 不上传远程(.gitignore 排除)。
## 参考
- [ChromeDevTools/chrome-devtools-mcp](https://github.com/ChromeDevTools/chrome-devtools-mcp)(服务器;工具清单与 CLI 选项以其 README / docs/cli.md 为准)
- [deepseek-ai/deepseek-harness — packages/mcp/mcp-client](https://github.com/deepseek-ai/deepseek-harness/tree/main/packages/mcp/mcp-client)(Harness 侧 MCP 客户端桥接插件)
- [deepseek-ai/deepseek-harness — packages/bundle](https://github.com/deepseek-ai/deepseek-harness/tree/main/packages/bundle)(bundle 插件机制)
- [deepseek-ai/deepseek-harness — apps/cli/src/plugin.ts](https://github.com/deepseek-ai/deepseek-harness/blob/main/apps/cli/src/plugin.ts)(`dsh plugin` 命令实现)
Install
dsh plugin --profile web add github:yuzi-ska/DSH-Chrome-devtools
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-chrome-devtools from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.