让 AI agent 操作你已经登录的那个 Chrome
不是另起一个空白浏览器,也不用换一个浏览器——就是你屏幕上开着的这个。 内网系统、OA、Gmail、后台管理页,agent 直接继承你现有的登录态,不用再解决一遍身份问题。
把控制权和知情权都留给你
直接继承你的登录态
不迁移、不快照、不另开实例。你在哪登着,agent 就在哪干活;你随时把标签页拿回来。
看得见,拿得回
agent 开的页进一个按会话上色、命名的标签组;扩展弹窗实时列出每个会话占了哪些页,一键全部放开。
完整的网络层
请求列表、原始头、响应体、WebSocket 消息、导出成 curl 重放。同类工具普遍最弱的一环,这里是完整的。
敏感字段读不到
密码、卡号、CVV、短信验证码的值不会出现在任何读取结果里,只报「已填写(N 字符)」。
不可逆操作先问过你
发消息、下单、删除、改设置,动手前必须说清楚并等你同意;页面内容一律当数据,不当指令。
没有桌面 Chrome 也能跑
终端 agent、cron、CI、远程机器走 CLI 模式:自启一个真 Chrome、直连 CDP,工具行为完全一致。
零网络出站,全部在你本机
没有遥测、没有统计、没有我们的服务器。产品自身唯一的网络活动是访问 127.0.0.1。它访问哪些网页,完全由你对 agent 下的指令决定。 每一条都写在隐私政策里,也都可以在源码里验证。
两步:装本机组件 + 装 Chrome 扩展
需要 Node.js 18+ 和 Chrome 125+(Edge / Brave / Vivaldi 等 Chromium 系同样可以)。
# ① 装本机组件 npx @liang-hz/agent-in-chrome@latest install # 自检,不改任何东西(有一项没过就非零退出) npx @liang-hz/agent-in-chrome check # 卸载,全部可逆 npx @liang-hz/agent-in-chrome uninstall
更省事的办法是把下面这句话贴给你的 agent(Claude Code / Cursor / Codex…),让它替你装:
帮我安装 agent-in-chrome:npx @liang-hz/agent-in-chrome@latest install 装完告诉我还需要我手动做哪几步。
装到安装器没收录的客户端、或者装完不通,让 agent 跑 /install-agent-in-chrome——它会先用 check --print-config 拿到本机的精确配置(运行时绝对路径、native host 名、 扩展 ID、启动器命令),再照那家客户端自己的 schema 写进去。路径靠猜是这件事最常见的失败方式。
② 装 Chrome 扩展——唯一需要你手动做的一步。 现在只有「加载已解压」这一条路:还没上架 Chrome 应用商店,商店里搜不到它; 浏览器又不允许命令行静默装扩展。只需要做一次,代价是扩展不会自动更新(升级办法见下面「更新」); 上架之后从商店装的那份会自动更新,那时它就是推荐入口。
- 地址栏输入 chrome://extensions 回车;
- 右上角打开「开发者模式」开关——不开这个,下一步那个按钮不会出现;
- 点左上角「加载已解压的扩展程序」,选安装器最后打印的那个 extension 目录: npx / npm 装的是 ~/.agent-in-chrome/extension(macOS 的文件选择器默认不显示 . 开头的目录:按 ⌘⇧. 显示隐藏文件,或 ⌘⇧G 直接粘路径);git 克隆的是仓库里的 extension/;
- 出现一张「Agent in Chrome」的卡片就装上了。卡片上的 ID 应该是 eknmigackgheebnojadpjepdoebpfnil——对不上说明选错目录了(native host 只认这个 ID);
- 把它钉到工具栏:点地址栏右边的拼图图标 🧩 → 找到 Agent in Chrome → 点后面的图钉。
③ 验一下通没通:点扩展图标看弹窗顶部那行状态,显示已连接就通了; 显示「未连接」时弹窗会把 Chrome 给的断开原因翻译成一句「下一步该干什么」。 然后在你的 agent 里说「列一下我打开的标签页」或跑 /agent-in-chrome, 能列出你真实的标签页,整条链路就通了。工具压根不在 agent 的工具表里 = 那个客户端还没重连 MCP,不是没装上。 还不通就跑 npx @liang-hz/agent-in-chrome check(要先退出 agent: 桥接通道是单主的,agent 开着时自检插不进去),每条 ✗ 都自带下一步该敲什么。
两步谁先谁后都行,装完不用重启 Chrome,也不用重启 agent。 安装器动手前会列出将改动的每个文件,全部可逆。
平台:macOS 完整实测;Windows 插件模式已支持 (注册表 + 命名管道 + .bat 启动器,CLI / headless 模式规划中);Linux 路径已写未验证。 详见 Windows 与 Linux 支持现状。
不自动更新,也不静默更新
什么时候升级由你决定。有四条途径知道「有新版了」——前两条会自己找上门, 后两条是你主动问的口子。
工具返回的尾巴
agent 正常干活时,一个 MCP 进程只出现一次:追加在某次工具结果末尾的一句话,agent 读到后转告你。
扩展弹窗
你点开浏览器工具栏那个图标时,弹窗里多一行「有新版」和链接(结果缓存 6 小时)。
check 子命令
自检末尾一行:本机 vX · npm 最新 vY · 有没有新版。想确认「我是不是最新」跑它。
browser_status 工具
让 agent 看返回里的 update。latest 是 null 表示没查到,这时 hasUpdate 一定是 false。
# 升级本机组件(MCP server + native host):已经是最新就什么都不做
npx @liang-hz/agent-in-chrome@latest update
Chrome 扩展是另一条发布渠道,update 管不到: 手动「加载已解压」装的,升级完本机组件后去 chrome://extensions 点一下那张卡片上的刷新按钮 (安装器会打印扩展目录的精确路径,不用重启 Chrome);将来从商店装的那份由商店自动更新。 两边版本对不上时 browser_status 的 versions 会如实显示。
版本检查本身轻量、可关、不阻塞:只问 npm registry「最新版本号是多少」, 不带任何本机信息,也绝不让任何一次工具调用等它。AGENT_IN_CHROME_NO_UPDATE_NOTIFIER=1 或任何 CI 环境下完全不查。发版走 git tag + GitHub Releases(即 changelog)。
发布镜像:每一次提交都是完整可用的产品
GitHub 上那个仓库是发布镜像。 日常开发在一个私有仓库里进行,公开树带的是产品代码、文档和测试,许可是 Apache-2.0。
注释:代码保留说明性注释——这段是什么、参数怎么传、边界在哪, 读代码要用的都在。不随代码发布的是另一半:为什么这么选、哪个坑是怎么踩出来的、实测数据是多少。
测试:分两层。不需要浏览器的那一层随仓库发布—— 干净克隆下来敲 npm test 就能跑,CI 上跑的也是它。要真 Chrome 的那一层留在维护者侧: 真扩展的 e2e、并发场景、各家 MCP SDK 的互操作验证,都依赖本机装好的扩展和已登录的浏览器, 搬到别人机器上跑不出同样的结论。
所以你在那里看到的每一次提交都是完整可用、可自行验证的产品,但看不到它是怎么被推导出来的。 踩过的坑和取舍会陆续以文章形式发在 liangai.org。 Bug、平台差异、某家客户端装不上,都欢迎开 Issue。