mcpField
C
cdpm

cdpm

本地服务
github.com/IGELHARINE浏览器自动化31 周前更新

关于 cdpm

CDPM 是一款 MCP 服务,可让多个 Claude Code 会话和子 Agent 共用持久化的编号 Chrome 实例。它通过 CDP 驱动普通 Chrome,并提供按标签页排队和消息传递,支持并行浏览器任务。

主要功能

  1. 01多个会话共用编号 Chrome 实例
  2. 02每个实例保留独立持久配置
  3. 03通过 CDP 直接驱动 Chrome
  4. 04按标签页排队执行命令
  5. 05收发 Agent 消息
  6. 06处理浏览器对话框和权限提示

适用场景

  1. 01让多个 Agent 操作已登录的 Web 应用
  2. 02将浏览器调研任务分配到多个实例
  3. 03通过实例消息协调 Agent 的结果
  4. 04客户端关闭后继续保留浏览器会话

MCP 相关

CDPM 通过 MCP 服务提供浏览器实例控制和 Agent 协作工具,可注册到 Claude Code,也可配置给其他 MCP 客户端。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"igelharine-cdpm": {
"command": "npx",
"args": [
"-y",
"cdpm-mcp"
]
}
}
}
启动命令npx -y cdpm-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmcdpm-mcp0.1.9

工具

36

收录的工具列表 · 更新于 2 周前

参数类型必填说明
slotinteger否浏览器槽位 1-30。"3"、"slot 3"、"browser 3" → 3。如果用户提供的端口号类似 14052,则减去 14049。
agentstring否你的显示名称,会显示给其他 Agent。子 Agent 必须始终设置此项。默认值为 "claude-f5a6"。

详细介绍

CDPM

npm npm downloads License: MIT CDPM MCP server

한국어 README

CDPM:为 Claude Code Agent 提供带编号的 Chrome 槽位

CDPM 是一个 MCP 服务,可让最多 30 个 Chrome 实例(“槽位”)保持运行在固定调试端口上,并允许任意数量的 Claude Code 会话和子 Agent 按编号操控它们:“打开槽位 3”、“在槽位 1 登录,然后在槽位 2 填写表单”。每个槽位都是带有独立配置文件的普通 Chrome,因此登录状态会在不同运行之间保留,浏览器也和你手动使用的浏览器一样。

它源自同时运行多个 Claude Agent 来操作已登录的 Web 应用。在此过程中,难点并非点击按钮,而是让不同会话共享浏览器、保持浏览器运行,以及发现 Chrome 本身带来的阻碍。

演示

九个子 Agent 在槽位 11-19 上运行(无头模式)。槽位 11-18 各自读取一个 GitHub 仓库页面,并通过 slot_send 将数字发送到槽位 19;槽位 19 使用 slot_inbox 等待消息,编写对比表并打开表格。此视频通过 CDP 录制自一次实际运行:总耗时约 45 秒,每轮遍历九个槽位时各录制一帧。

九个槽位并行工作

有何不同

  • 共享的带编号浏览器。 槽位 N 在端口 14049 + N 上监听,并将配置文件保存在各自的文件夹中。会话不拥有浏览器,而是访问指定槽位。两个会话可以在同一槽位的不同标签页中工作:命令按标签页排队,因此两个 Agent 在同一标签页中输入时不会交错。集成测试覆盖了这一点;一项长时间测试中,三个会话在一个槽位上共享运行 600 轮,没有出现内存、标签页或锁文件持续增长的情况。
  • 通过 CDP 操作原生 Chrome。 不使用 Playwright 或 Puppeteer。点击和按键通过 Input.dispatch*Event 发送,因此页面会收到受信任的事件。Chrome 启动时不会带上 --enable-automation,所以 navigator.webdriver 保持为 false。CDPM 从不调用 Runtime.enable,它运行的所有页面读取脚本都位于页面不可见的隔离世界中;快照能够穿透 Shadow DOM。这消除了常见的自动化指纹。但这并不能绕过速率限制或 IP 信誉检查:九个槽位同时搜索 Google,仍然会遇到 CAPTCHA。
  • 应对常见故障。 槽位以分离模式启动,因此关闭 VS Code 或 Claude Code(即使强制终止整个进程树)也不会停止它们。重启后,CDPM 会重新连接到槽位端口上响应的 Chrome,并在操作任务栏图标之前重新检查其进程 ID。如果槽位运行期间 Chrome 自动更新(在 Windows 上,更新会替换 chrome.exe;旧版浏览器无法再启动渲染进程,新标签页会卡在空白页),CDPM 会使用新版本重启该槽位并重新打开其标签页。
  • Agent 可以协同工作。 slot_send / slot_inbox 可通过槽位和 Agent 名称发送消息。消息保存在磁盘上,因此 Chrome 重启后仍会保留;等待中的 Agent 会在消息到达时立即唤醒。
  • 页面不可见的浏览器 UI。 JavaScript 对话框会通过 browser_dialog 上报并处理。在 Windows 上,权限提示(“访问此设备上的其他应用和服务”、通知、位置)会通过 UI Automation 检测并使用 browser_permission 处理。Agent 操作触发的文件选择器会被拦截,而不会打开操作系统窗口;页面打开打印对话框时会立即上报(页面本身绝不会被修改)。

快速开始

npm install -g cdpm-mcp
cdpm install

重启 Claude Code 并请求一个槽位,例如:“打开带窗口的槽位 1 并访问 github.com。”

与其他浏览器 MCP 服务相比

CDPMPlaywright MCPChrome DevTools MCP
浏览器最多 30 个编号槽位,所有会话共享每个服务进程一个每个服务进程一个
多个会话共用一个浏览器是:按标签页排队,并发出所有权警告设计目标中不包含此功能设计目标中不包含此功能
多次运行之间保留登录状态是,每个槽位一个配置文件是,一个持久化配置文件(使用 --isolated 可创建新的配置文件)是,一个持久化配置文件(使用 --isolated 可创建新的配置文件)
驱动方式原始 CDPPlaywrightPuppeteer
Agent 之间的消息内置否否
每个槽位的任务栏图标Windows 任务栏、macOS Dock否否
其他浏览器仅 ChromeChromium、Firefox、WebKit仅 Chrome

另外两款也是不错的工具;如果你需要 Firefox 或 WebKit(Playwright),或者需要性能跟踪和 DevTools 面板(Chrome DevTools MCP),它们会是更好的选择。表中信息依据截至 2026 年 10 月的文档。

安全性

槽位端口仅侦听 127.0.0.1,但这台机器上的任何进程都能连接这些端口,并使用相应槽位已登录的会话执行操作。请将正在运行的槽位视作未锁定的浏览器:运行不可信的软件时,不要让敏感账户在槽位中保持登录状态。已关闭槽位的配置文件仍保存在磁盘上(cdpm purge N 可删除指定槽位的配置文件)。

详情

  • 纯 CDP。 不使用 Playwright、Puppeteer 或隐身补丁。通过调试端口连接普通 Chrome,并使用真实输入事件进行操作。
  • 编号槽位。 槽位 N 使用 CDP 端口 14049 + N(槽位 1 = 14050 … 槽位 30 = 14079),并拥有独立的配置文件夹。此范围避开了常见的默认端口 9222;如果其他程序占用了这些端口,可设置 CDPM_PORT_BASE 更改端口范围。不会管理此范围以外的端口。
  • 仅在需要时启动。 除 browser_launch 外,任何工具都不会启动已关闭的槽位。如果未指定编号,则使用编号最小的空闲槽位。
  • 槽位的生命周期独立于调用方。 关闭 CDPM、Claude Code 或 VS Code(即使它会终止整个进程树)也不会关闭槽位 Chrome。槽位仅会在执行 browser_close / cdpm close 或你自行关闭 Chrome 时结束。
  • 每个槽位对应一个任务栏按钮,按钮带有槽位颜色的浏览器窗口图标和槽位编号,并经过预先校正,确保图标在任务栏上显示清晰锐利(使用 GDI+ 和系统字体绘制,因此仓库中不包含字体文件)。窗口标题通过 Chrome 自带的窗口名称功能显示为“3번”(页面无法读取此名称)。
  • 专为多个 Agent 协同工作而打造。 每个工具都需要显式指定 slot,记录每个标签页的打开者和最近操作者;当你操作他人刚使用过的标签页时会发出警告(但不会阻止操作),并会串行执行同一标签页上的并发命令。
  • Agent 可以通过 slot_send / slot_inbox 互相沟通;未读消息也会显示在每条结果的开头。
  • 状态栏。 cdpm statusline 会以槽位颜色显示正在运行的槽位编号;每个槽位显示最近操作的标签页标题(不显示 Agent 名称;只有空白或新建标签页时才只显示编号):CDPM 1 NAVER 2 Daum。状态栏会适配终端宽度(来自 ccstatusline):先缩短标题,再仅显示编号,最后用 +N 表示其余槽位。暂停的槽位(slot_pause / cdpm pause)会以暗灰色而非槽位颜色显示编号。在没有运行槽位时,显示暗灰色的 CDPM -。如果你自行关闭槽位的 Chrome(在 Windows 上关闭最后一个窗口,在 macOS 上按 Cmd+Q),该槽位会立即移除;标题会实时读取。
  • 面向 AI 使用英语。 为节省令牌,服务端指令、工具描述和工具结果均使用英语;Claude 会收到使用用户所用语言作答的指示。CLI 输出为韩语。
  • 不干扰用户的电脑。 不会更改窗口、视口或缩放比例,也会拒绝可能弹出操作系统窗口的操作(见下文)。

支持 Windows 11 和 macOS。每个槽位都有独立图标:Windows 上显示在任务栏,macOS 上显示在 Dock(见下文“macOS”)。 Linux 支持为实验性功能:代码中已有相关路径(Chrome 查找、数据文件夹),但尚未在 Linux 机器上测试,也没有每个槽位对应的图标。

要求

  • Node.js 22+
  • Google Chrome(自动查找。Windows:注册表中的 App Paths,然后是标准安装文件夹。macOS:/Applications、~/Applications,然后是 Spotlight。Linux:/usr/bin/google-chrome、google-chrome-stable、/opt/google/chrome/chrome)

安装

有人请你安装此工具?(适用于 Claude / AI Agent) 按顺序执行以下步骤。

  1. 检查是否已安装 Node.js 22+ 和 Google Chrome。如果没有,请告知用户并停止。
  2. 运行 npm install -g cdpm-mcp@latest(即使已安装,也要运行此命令以更新)。
  3. 运行 cdpm install(如果找不到 cdpm:node "$(npm root -g)/cdpm-mcp/dist/cli.js" install)。此命令会向 Claude Code 注册 CDPM 并设置状态栏、规则、子 Agent 和权限;之前通过 git clone 注册的版本会切换到新位置。
  4. 不要启动任何 Chrome 槽位、提问或解释内部原理。成功后,只用用户所用的语言回复一行,示例:“CDPM installed. Restart Claude Code to use it.”(版本:cdpm --version)。如果某一步失败,只说明失败的步骤和原因。
npm install -g cdpm-mcp
cdpm install

cdpm install 会向 Claude Code 注册 CDPM,并一次性设置状态栏、并行工作规则、cdpm-browser 子 Agent 和权限允许列表。之后重启 Claude Code。

其他 MCP 客户端(Cursor、Claude Desktop 等)

cdpm install 只会注册到 Claude Code。对于其他客户端,请将其添加到 mcpServers 配置中(路径来自 npm root -g):

{
  "mcpServers": {
    "cdpm": {
      "command": "C:\\Program Files\\nodejs\\node.exe",
      "args": ["C:\\Users\\<you>\\AppData\\Roaming\\npm\\node_modules\\cdpm-mcp\\dist\\cli.js"]
    }
  }
}

在 macOS 上:"command": "/opt/homebrew/opt/node/bin/node"、"args": ["/opt/homebrew/lib/node_modules/cdpm-mcp/dist/cli.js"]。

  • 所有客户端使用的工具都相同。
  • CDPM 会根据所连接客户端的名称选择指令:只有 claude-code 会收到 Claude Code 专用指南(使用 Agent 工具生成子 Agent、cdpm-browser)。其他客户端会收到通用规则:如果客户端支持,就为每个槽位分配独立的子 Agent;否则,为每个槽位使用不同的 agent 名称。
  • 自动设置(状态栏、CLAUDE.md 规则、cdpm-browser、权限)会修改 ~/.claude,因此只有 Claude Code 连接时才会运行。从其他客户端启动 CDPM 不会触碰 Claude Code 的设置。
从克隆版本运行(开发)
git clone https://github.com/IGELHARINE/CDPM.git
cd CDPM
npm install
node dist/cli.js install
更新
npm install -g cdpm-mcp@latest

然后重启 Claude Code。从克隆版本更新:git fetch origin && git reset --hard origin/main 和 npm install。MCP 注册和状态栏设置会保持不变。使用 node dist/cli.js --version 检查版本;更改记录见 CHANGELOG.md。

或者直接询问 Claude:“update CDPM”。

自动执行的操作

MCP 服务首次启动时,CDPM 会自动完成以下设置,无需额外步骤(原始文件会备份为 .before-cdpm):

  • 在 Claude Code 的状态栏中显示槽位(每 3 秒重绘一次)
  • 在用户的 CLAUDE.md 中添加一条规则:当多个槽位执行不同任务时,并行使用一个子 Agent 处理每个槽位,并让每个子 Agent 编写输出的相应部分(Claude 遵循用户指令的可靠性高于 MCP 指引)
  • 在 ~/.claude/agents/ 中创建一个仅供 CDPM 使用的子 Agent cdpm-browser:只提供 CDPM 工具和文件写入功能,不加载 CLAUDE.md,因此启动更快(在 3 个槽位的并行任务中测得:中位数从 28.7 秒降至 20.6 秒,使用量减少约 37%);使用与主 Agent 相同的模型和推理力度。它使用 CDPM 注册时所用的名称。
  • 将 CDPM 工具(mcp__cdpm)添加到 Claude Code 的权限允许列表(settings.json 中的 permissions.allow),避免自动模式的分类器在任务中途阻止输入和填写。这样,Claude 执行 CDPM 输入和点击操作(发送邮件、发帖)时就无需每次都询问。
  • 子 Agent 一次最多运行 20 个,因此超过 20 个槽位时,Claude 会收到分批启动子 Agent 的指示(通过 CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS 调高上限)。

使用 cdpm unsetup 撤销设置;使用 CDPM_NO_AUTO_SETUP=1 可完全跳过自动设置。更新改变自动设置后,这些设置会逐项重新运行一次:仍然存在的项目会更新,你删除的项目(包括使用 cdpm unsetup 删除的项目)不会恢复。使用 cdpm setup 可重新添加所有项目。

仅设置状态栏

cdpm install(以及服务首次启动时)已经会启用状态栏。若只需重新设置状态栏:运行 cdpm statusline-setup。如果没有状态栏,它会在 Claude 的设置中添加一个;如果使用 ccstatusline,它会添加一个小组件;如果使用其他状态栏,则不会进行更改,并会打印需要追加的命令。原始文件会备份为 .before-cdpm。

工作方式

每个结果都以一个标头开头:槽位的标签页(> = 当前操作的标签页,·앞 = 窗口中位于前面的标签页)、警告和新消息(标记为已读)。

**标签页规则:**只有一个标签页 → 使用该标签页;使用 Agent 最近使用(或新打开)的标签页 → 使用该标签页;首次使用 → 查看工具使用最前面的标签页,操作工具必须指定 tab。标签页编号按首次出现顺序排列;只要标签页仍存在,诸如 t7 这样的 ID 就不会改变。

**共享一个槽位:**多个 Agent(即使处于不同的 Claude 会话中)也可以同时在一个槽位中工作,各自使用自己的标签页。命令按标签页排队,因此 Agent A 可以在标签页 1 中输入,同时 Agent B 在标签页 2 中点击;只有同一标签页上的命令需要相互等待,即使跨 Claude 会话也是如此(通过每标签页锁文件实现),因此两个会话在同一标签页中输入时绝不会交错;持锁进程死亡后,锁会立即释放;锁持有超过 2 分钟时,系统会报告而不是继续等待。启动和关闭槽位也会获取每槽位锁,因此两个会话同时启动同一个槽位时,只会启动一次 Chrome(另一个会话会连接到已启动的实例)。一个槽位对应一个 Chrome 配置文件,因此在某个标签页中登录的网站,在新标签页中也会保持登录状态(按标签页进行身份验证的网站除外)。browser_tab_new 会在后台打开标签页,因此不会改变用户的视图或其他 Agent 的标签页,打开者也会继续使用自己的标签页。每个会话都有自己的名称(claude-a3f1,子 Agent 使用各自的名称);标头会显示每个标签页的打开者和最近使用者,如果操作的是其他人刚用过的标签页,系统会报告,但不会阻止操作。一个 Agent 驱动一个槽位:一分钟内操作第二个槽位会被拒绝,并建议为其启动子 Agent(进行比较时使用 multiSlot: true);始终允许读取其他槽位。请按编号引用槽位(“slot 3”);像“browser B”这样的名称会让 Claude 进行猜测。

后台标签页无需切换即可读取、操作和截取:在操作隐藏标签页时,CDPM 会短暂启用 Emulation.setFocusEmulationEnabled,让 Chrome 渲染该标签页,然后将其关闭。用户的视图不会改变,但在这段时间内,页面会认为该标签页处于焦点状态(document.hasFocus() 等),因此网站可能会察觉。

长页面:browser_snapshot 会返回第 1 页(约 12k 个字符),并显示“1/8 · next: page=2”。后续页面会包含其祖先上下文;各页面中的 ref 保持不变。find 会忽略空白字符匹配行,并显示祖先节点及后续两行;ref 会显示一个子树。browser_text 更适合简短地读取内容。导航之前,同一元素始终保持相同的 ref;新 ref 在不同标签页间对每个 Agent 都是唯一的,因此其他标签页中的 ref 或旧页面中的 ref 一律会被拒绝。

工具

所有工具都接受 slot(1–30)和 agent(显示名称)。操作工具还接受 tab、summary 和 read:read: "text" | "snapshot" | "changes" 会将操作后的页面附加到同一结果中(无需单独调用读取工具)。changes 只显示自该 Agent 上次对该页面进行快照以来新增或移除的行——这是查看点击操作效果的最快方式。

工具功能
browser_status实时查看槽位、标签页、打开者、最近操作、摘要和对话框
browser_launch启动槽位——仅在用户提出要求时启动;未指定 slot 时使用编号最低的空闲槽位;slots(列表)或 count 可一次启动多个,按编号从低到高启动;url / urls 可立即打开起始页。使用窗口还是无头模式由用户选择:如果用户没有说明,Claude 会先询问(未设置 headless 时,不会启动已关闭的槽位)。headless: true 仅添加 --headless。proxy / proxies(仅在用户要求使用代理时):host:port、http://user:pass@host:port、socks5://...、host:port:user:pass。未设置时,完全不会添加代理标志。带用户名和密码的代理会通过每个槽位对应的本地小型中继添加凭据,并随对应的 Chrome 一同退出
browser_close正常关闭(保留配置文件)
browser_tabs / browser_tab_new / browser_tab_close / browser_tab_select列出 / 在后台打开(返回 ID)/ 关闭 / 切换到前台(仅在用户需要时)
browser_snapshot获取带引用标记的无障碍文本;可指定 page、find、ref
browser_text获取可读文本(优先读取主体 / 文章,或指定一个 ref),支持分页
browser_screenshot将可见区域保存为 PNG,也包括后台标签页;不支持整页截图
browser_navigate / browser_back等待页面加载;对于响应缓慢的服务,会报告“仍在加载”,而不是报错
browser_click执行真实鼠标点击;报告遮挡元素、新标签页和表单验证失败
browser_type逐字符发送真实键盘事件(clear、submit、fast);验证输入值;如果值不一致(网站拒绝或重新格式化了输入),则不会在 submit 时按 Enter;日期 / 时间输入会在格式验证后设置
browser_fill按顺序填写同一页面上的多个输入框,然后可选择提交(“Enter”或按钮 ref);遇到首次失败、页面变化、对话框或输入值与键入内容不一致的字段时停止(此时不会提交任何内容)
browser_dialog接受或关闭已打开的 alert / confirm / prompt / beforeunload(prompt 使用 text)。由 Claude 根据消息决定
browser_permission按确切的按钮名称列出或响应 Chrome 权限弹窗(“网站想要访问此设备上的其他应用和服务”、通知、位置等)。适用于 Windows 和窗口化槽位
browser_forward / browser_reload前进 / 重新加载(使用 Chrome 自带的重新加载功能,支持 ignore_cache)
browser_hover将真实鼠标悬停在元素上(仅悬停时显示的菜单)
browser_drag执行真实鼠标拖动:拖放、滑块、重新排序。可拖至 to(ref)、to_text(文本)或 dx / dy。无需 OS 拖动即可处理 HTML5 拖动;draggable 元素会获得 ref
browser_download_wait等待下载完成并返回保存的文件路径(保留 Chrome 的下载文件夹设置)
browser_pdf将页面保存为 PDF(默认保存到 Downloads 文件夹,文件名取自标题)
browser_upload上传文件:通过 ref 上传到文件输入框,或在点击“附加”按钮后上传(不带 ref 时由 CDPM 拦截 OS 文件对话框,因此对话框不会显示)
browser_select<select>:聚焦并使用按键操作(Windows 上使用方向键,macOS 上使用选项前缀;发送可信事件,不弹出菜单)
browser_press_keyEnter、Tab、Control+A(macOS 上为 Meta+A)等(不支持剪贴板按键)
browser_scroll滚动到指定 ref,或精确滚动 dy 像素(报告位置 A → B)
browser_wait等待正文或标题中出现文本 / gone(文本消失)/ url 变化 / enabled(按钮或输入框不再处于禁用状态)/ response(URL 匹配的网络响应完成;返回响应正文,例如 SPA 列表背后的 JSON——点击期间到达的响应也会被捕获;不会额外发送任何内容)/ network_idle / 指定秒数
browser_eval在隔离环境中运行 JavaScript(可访问 DOM,但无法访问页面全局变量)
browser_network / browser_network_detail查看请求(最近 500 条,30 分钟内)/ 请求头、POST 数据和正文
browser_block在标签页上阻止 / 取消阻止 URL 模式,包括跨站 iframe(无论已打开还是之后创建,都会在首次请求前被阻止);仅在会话存续期间生效;其他 Agent 可见
slot_send / slot_inbox向 Agent 发送消息(使用接收方的槽位编号,可跨槽位工作)/ 接收消息(wait 会在消息到达后约 0.1 秒内返回,最长等待 600 秒)。消息也会立即中断 browser_wait
slot_pause / slot_resume按用户要求暂停槽位(“停止槽位 3”):立即拒绝所有操作,正在运行的操作会在下一个键盘或鼠标事件前停止,等待也会返回。仍可读取屏幕。恢复时会向 Agent 发送消息,唤醒它们重新读取页面并继续操作。适用于每个 Claude 会话
子 Agent 会共享其父 Agent 的 MCP 进程 — 请为每个子 Agent 分配独立的 agent 名称。当多个槽位分配了不同任务(“打开 3 个:Naver、Daum、Google News”)时,Claude 默认会并行运行它们,每个槽位对应一个子 Agent,而不是依次运行。

状态行

cdpm statusline 大约在 0.1 秒内退出(读取本地注册表,并快速检查每个活动槽位端口上的标签页);安装程序会让 Claude Code 每 3 秒重绘状态行。运行 cdpm install 即可启用;如需重新设置,请运行 cdpm statusline-setup。手动配置方法:对于 ccstatusline,添加一个 Custom Command 小组件,并填入 "C:\Program Files\nodejs\node.exe" "C:\path\to\CDPM\dist\cli.js" statusline(保留颜色)。否则,将 statusLine.command 指向同一命令。

CLI

cdpm                               run the MCP server (stdio)
cdpm install                       register with Claude Code and run the automatic setup (once after installing)
cdpm setup                         add the status line, CLAUDE.md rule, cdpm-browser subagent and permission allow list, including ones you removed (also done automatically on first server start)
cdpm unsetup                       remove what CDPM added
cdpm --version                     print the version
cdpm launch [slot...]              start slots (ascending order; no number = lowest free)
cdpm launch --headless [slot...]   start without a window
cdpm close <slot...> | --all       close gracefully
cdpm pause <slot...> | --all       pause: stop all agent actions on the slot immediately
cdpm resume <slot...> | --all      resume: wake the waiting agents
cdpm purge <slot>                  delete a closed slot's profile
cdpm status | statusline
cdpm statusline-setup              turn on the slot display in Claude Code's status line (backs up settings)

数据存储在 Windows 的 %LOCALAPPDATA%\cdpm\、macOS 的 ~/Library/Application Support/cdpm/ 和 Linux 的 ~/.cdpm/ 中(可通过 CDPM_HOME 覆盖):registry.json、messages\<slot>.jsonl(超过 1000 行后保留最后 500 行)以及 messages\<slot>.cursors.json(每个 Agent 的读取位置,保留最新 200 条)、locks\(每个标签页和槽位的锁文件,确保 Claude 会话不会同时控制同一标签页,也不会同时启动或关闭同一槽位;操作结束后移除,每分钟清理一次已退出进程遗留的锁文件)、profiles\<slot>\、icons\、auto-setup.json(记录运行过的设置版本以及 CDPM 添加的项目,以免恢复已移除的项目),以及可选的 config.json(chromePath、extraArgs)。

macOS

  • 启动、控制、网络工具、Agent 消息传递和状态行的工作方式与 Windows 相同。
  • 每个槽位的 Dock 图标都会设为与 Windows 上相同的、带槽位颜色和编号的图标,这是通过 Chrome 自带的 CDP 命令 Browser.setDockTile 实现的(无需复制应用或重新签名)。如果 Chrome 在 CDPM 之外重启,图标会恢复为普通 Chrome 图标;下次 CDPM 启动或连接时会重新设置。此代码仅在 macOS 上运行。
  • 按照 Mac 的惯例,关闭槽位窗口(红色按钮、Cmd+W)会保留槽位;状态行会继续显示最近使用的标签页标题。按 Cmd+Q 退出 Chrome 会结束该槽位并将其移除。(在 Windows 上,关闭最后一个窗口会结束槽位。)
  • macOS 上的 Chrome 不会仅凭按键事件执行编辑快捷键,因此 Meta+A(全选)、Meta+Z(撤销)、Meta+←/→、Option+←/→ 等操作还会发送与按键事件对应的 Chrome 编辑命令 — 效果与用户按下相应按键相同。
  • 在 <select> 中按方向键会打开 macOS 弹出菜单,因此 browser_select 会改为输入选项文本的开头。如果较早的选项具有相同前缀,它会直接设置值并说明这一点。

CDPM 不做/拒绝做的事

  • 不更改用户代理或指纹,不模拟设备或修补 Chrome,也不更改页面脚本。
  • 你自己点击的内容会照常打开。只有在 Agent 操作运行期间,CDPM 才会阻止操作系统窗口出现:
    • 无论文件选择器是通过何种方式打开的(点击、在文件输入框上按 Enter、提交表单),都会被拦截,并提示使用 browser_upload。
    • window.print() 会打开打印预览,并且在关闭预览前,标签页将无法响应输入。CDPM 不会覆盖页面的 print(页面可能会察觉到),也不会关闭预览。如果操作期间打开了打印预览,该操作会立即返回提示;只要预览仍处于打开状态,标头就会指出对应的标签页,以便 Agent 告知用户。出现打印预览时,browser_wait 会停止。PDF 请使用 browser_pdf。
    • 不会点击日期、时间和颜色输入框(点击会打开选择器);browser_type 会设置其值(颜色使用 #ff0000)。
    • 通过 CDP 发送的 Ctrl+S/Ctrl+O/Ctrl+P 等浏览器快捷键不会触发 Chrome 的保存、打开或打印窗口。
  • 已知限制:如果某个按钮的 JavaScript 会跳转到外部程序协议(例如 mailto:),CDPM 无法提前拦截(链接可以);Agent 无法填写 HTTP 身份验证提示框。
  • 启动标志仅限 --remote-debugging-port、--user-data-dir、--no-first-run、--no-default-browser-check、--window-name(根据请求,也可使用 --headless;仅当用户要求使用代理时,才会使用 --proxy-server 和 --force-webrtc-ip-handling-policy=disable_non_proxied_udp;无头 Chrome 仍会报告为 HeadlessChrome)。
  • 绝不更改窗口大小、位置或状态,也不更改视口或缩放;如果点击导致页面进入全屏,会立即退出全屏。
  • 不使用 Runtime.enable;辅助脚本会在隔离世界中运行。
  • 如果某个槽位运行期间 Chrome 自行更新(Windows 会替换 chrome.exe),旧版浏览器将无法再启动渲染进程,因此新标签页会卡在空白状态。CDPM 会比较运行版本与已安装版本(连接时,以及每 10 秒仅根据文件信息检查一次 chrome.exe 文件是否发生变化时),并将该槽位重启到新版本,按顺序重新打开其中的标签页(保留登录状态;代理槽位只会报告)。
  • Chrome 权限气泡属于浏览器 UI,因此不会出现在快照或屏幕截图中,页面工具也无法点击它们;页面会一直等待这些气泡处理完毕。在 Windows 上,CDPM 会检测此类气泡(槽位的 Chrome 所拥有的小窗口,标题中包含某个标签页的主机名;因此翻译或密码气泡会被忽略,Chrome 使用何种语言也不影响检测),在结果标头中发出警告,在气泡出现时立即停止 browser_wait,并允许 Claude 使用 browser_permission 按下按钮(通过 UI Automation;即使窗口最小化或被遮挡也有效)。如果用户没有要求允许访问摄像头、麦克风或位置,Claude 会先征求用户同意。
  • 对话框(alert/confirm/prompt/beforeunload)只会报告,绝不会自动处理。Claude 会读取消息,并自行通过 browser_dialog 处理(接受或取消);仅当对话框要确认用户未要求且不可撤销的操作(例如付款、删除)时,才会询问用户。
  • 拒绝处理:点击、导航、启动页和新标签页中的 mailto:/tel:/应用协议链接及地址(这些操作会启动其他程序);点击 <select>(会弹出菜单);Ctrl+C/X/V/Shift+Insert(会访问用户剪贴板)。通过导航触发的下载会报告文件名。

验证

62 个单元测试和 42 个集成测试(npm test、npm run test:integration,在测试端口 29222+ 上运行真实 Chrome)。长时间运行的检查(npm run test:long,约 20 分钟):在一个会替换 DOM 的 SPA 上运行 4,000 轮,每轮使用一个新的 Agent 名称,CDPM 服务的堆保持在固定范围内(26–39 MB,无上升趋势),页面保持在 1,421 个 DOM 节点 / 0.8 MB JS 堆;3 个会话共享一个槽位,各运行 600 轮(共打开和关闭 1,800 个标签页,槽位重启 3 次),每个会话的堆稳定在约 20 MB,且没有遗留锁文件或标签页。一次包含 15 个子 Agent、30 个槽位的并发运行确认,所有 30 个窗口的位置 / 大小 / 状态,以及所有 52 个标签页的视口(innerWidth×innerHeight)和缩放比例均未改变。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。