Chrome Relay 开源:让 Claude Code、Codex、Cursor 等 CLI 智能体复用日常 Chrome 登录态
Why your AI agents can't reach the tools you're signed in to, and how to fix it
作者开源 Chrome Relay,让 Claude Code、Codex、Cursor 和 Paseo 通过命令行驱动日常 Chrome 中的后台标签页,直接使用已登录的账号。
我通常会在 Mac 上同时运行很多编码代理。大多数不需要浏览器。当某个代理需要浏览器时,它往往会打断我正在做的事。
代理会在我打字时把标签页带到前台,或者 Chrome 会弹出“允许远程调试?”的提示。又或者代理会使用它自己的无头浏览器,而那里没有我的任何登录状态。它无法打开我们的管理控制台或预发布环境。任何需要 Google SSO 的东西都用不了,这就排除了我需要它检查的大部分内容。
我现在使用 Chrome Relay,让 Claude Code、Codex、Cursor 和 Paseo 从命令行驱动我日常使用的 Chrome 中的后台标签页,并使用我真实的登录状态。今天我将它开源。
我对代理的浏览器有四项要求。
它必须能通过 CLI 工作。我使用的每个代理都能运行 shell 命令;有些无法使用浏览器扩展或 MCP 服务器。
它必须使用我真实的 Chrome 配置文件,且已经登录。我不想复制配置文件,也不想再登录一个全新的浏览器。
它必须保持在后台。我在同一个 Chrome 中工作,所以窗口弹到前面或出现对话框都是一种打扰。焦点必须留在我放置的位置。
它必须快。如果检查一个页面要花 20 秒,代理就不会再检查了。
显而易见的选项都至少有一项要求不满足。
大多数浏览器工具会连接到 Chrome 的调试端口。这就会触发“允许远程调试?”的提示。
我本以为把我的 Chrome 配置文件复制到一个单独的浏览器中会可行。然而 Google 会话是绑定到设备的。把 cookie 复制到另一个浏览器后,Google 会认为它们无效。你想要的应用程序会处于登出状态。
我还尝试了 Playwright 扩展和单独的已登录浏览器。每种方案都满足了我部分需求,但没有一个满足全部四项要求。
Codex 和 Claude 自带的 Chrome 扩展使用一个小型扩展,借助 Chrome 的 chrome.debugger API。这种方法可行。它们的扩展只与自己的应用通信,所以我想把同样的东西暴露为标准 DevTools 端点,让任何 CLI 代理都能使用。
连接方式是这样的。
agent-browser (CLI) ──ws──▶ relay (127.0.0.1:9333) ──ws──▶ Chrome Relay extension ──chrome.debugger──▶ agent tab该扩展是 MV3 的,在每个 Chrome 配置文件中加载一次。它把每个代理标签页作为非活动标签页打开,放在一个折叠的“Agents”标签组中,并通过 chrome.debugger 运行 DevTools 命令。没有调试端口,Chrome 就不会询问“允许远程调试?”
中继是一个小型本地服务。它为每个代理提供自己的 DevTools 端点,并丢弃任何会唤起或聚焦浏览器的命令。代理只能看到它自己打开的标签页,因此我可以同时运行多个代理而不会互相干扰。
我使用 chrome-relay CLI 进行设置并获取某个配置文件的连接 URL。它还会运行诊断并读取审计记录。
代理使用 Vercel 的 agent-browser CLI,指向该中继。
agent-browser --cdp "$(chrome-relay url you@company.com)" open https://app.example.com/
agent-browser snapshot -i # the page's buttons, links and fields, each with a ref
agent-browser click @e5
agent-browser close电子邮件地址用于选择 Chrome 配置文件。大多数事情我用工作配置文件,当代理需要在控制台中检查某些内容时,我会使用管理员配置文件。
弹窗和“在新标签页中打开”链接会变成由同一代理拥有的隐藏标签页。OAuth 弹窗仍然可以向打开它们的页面回传信息。
Google 登录也需要一些处理。当网站通过 Google 跳转,且正确的账号已经登录时,扩展会自己点击该账号并点击“继续”。代理从不输入凭据。如果跳转过程中遇到密码、通行密钥或两步验证界面,它就会停止。代理会让我在自己的窗口中登录。
1Password 会导致一个不太明显的问题。只要页面上含有另一个扩展程序的 frame,包括登录表单上的 1Password 菜单,Chrome 就会把扩展程序的调试器从该页面移除。中继会等待扩展程序重新附加。代理的命令因此会稍微慢一点。
速度对我来说最重要。一条命令大约需要 0.15 秒;打开一个页面大约需要 0.6 秒。我的 Chrome 本来就开着,所以不需要启动浏览器。
我让代理访问一个我登录了所有账号的浏览器。我想知道什么能连上,以及代理进入后做了什么。
每个连接都必须通过两项检查。它需要由安装过程生成的、每台机器独有的密钥,且只有你能读取。发起连接的进程还必须是 Claude Code、Codex、Cursor 或 Paseo。中继会查找该进程,并检查这些应用在其子进程上设置的标记。网页即使持有密钥也会被拒绝。
只有你自己那份扩展程序副本才能以扩展程序身份连接。中继会检查它的来源,并确认发起连接的进程是 Chrome。
这些检查能挡住其他本地工具和网页,并防止意外。已经以你的身份运行的恶意软件可以读取密钥并伪造标记,所以这并不能构成针对它的边界。
代理工作时,Chrome 仍会显示“已开始调试此浏览器”的提示栏,和 Codex 的扩展程序一样。
代理的每个操作都会记入审计日志。它记录页面和点击,以及按键和代理自己的脚本。截图和登录点击也会被记录。输入的文本只存储长度;代理输入的内容永远不会进入日志文件。当代理说它检查了某项内容时,我可以查清楚它到底做了什么。
目前仅支持 macOS 和 Chrome。你需要 Node.js 20+ 和 agent-browser(npm i -g agent-browser)。安装大约需要两分钟。
git clone https://github.com/aindeev/agent-chrome-relay
cd agent-chrome-relay
bin/chrome-relay setup在代理应使用的每个 Chrome 配置文件中,打开 chrome://extensions,开启开发者模式,点击“加载已解压的扩展程序”,然后选择 extension 文件夹。运行 chrome-relay doctor 来检查一切。或者把网站上的安装提示粘贴给你的代理,让它带你完成所有这些步骤。
安装过程还会把一个 skill 链接到 Claude Code,这样每个仓库都知道如何使用它。对于 Codex 和 Cursor,在你的全局代理指令中添加一行,指向同一个 skill 文件。
在部署后的预发布页面上试试,或者让你的代理检查一个管理员设置。位于 SSO 后面的仪表盘也可以作为起点。让代理使用你的 Chrome,并在它检查时继续工作。回复告诉我你让它检查了什么,或者哪里出了问题。
仓库采用 MIT 许可:https://github.com/aindeev/agent-chrome-relay。网站是 https://agent-chrome-relay.aindeev.com。我也在 X 上:@AlexeyIndeev。
Alexey
没有帖子
来源:Hacker News · read.aindeev.com