*为 ScriptCat 的「外部接入(External Access)」体系新增了 `browser.` 浏览器操作能力**——让获得授权的外部程序(AI 客户端 / MCP / CLI)可以操作浏览器标签页、页面交互、Cookie 与站点数据;同时在 sctl 中把这套能力通过 MCP 与 CLI 暴露出来,并配套了独立的权限开关与文档。
一、ScriptCat(扩展端)
1. 外部接入新增 browser.* 浏览器操作能力(3c3434da)
在 External Access 的桥接协议里加入了 *15 个 `browser.` action**,调用方(经外部接入连接的 AI 客户端)可以:
| 能力分组 |
方法 |
效果 |
| 标签页 |
browser.tabs.list |
列出标签页 |
| 标签页 |
browser.tabs.open |
打开 / 导航到 URL |
| 标签页 |
browser.tabs.close |
关闭标签页 |
| 标签页 |
browser.tabs.activate |
切换 / 聚焦标签页 |
| 页面 |
browser.page.read |
读取页面可见内容(HTML→带选择器标注的可读文本,按内容预算裁剪) |
| 页面 |
browser.page.screenshot |
截图(返回 JPEG/PNG data URL) |
| 页面 |
browser.page.click |
点击元素(CDP 可信事件) |
| 页面 |
browser.page.fill |
填充表单 |
| 页面 |
browser.page.scroll |
滚动(上/下/顶/底) |
| 页面 |
browser.page.wait |
等待元素出现 |
| Cookie |
browser.cookies.list |
列出 Cookie 元数据(永不返回值) |
| Cookie |
browser.cookies.delete |
删除指定 Cookie |
| 站点数据 |
browser.bookmarks.list |
列出书签 |
| 站点数据 |
browser.history.list |
列出历史 |
| 站点数据 |
browser.downloads.list |
列出下载 |
关键实现要点:
- 读直通、写走审批:读类动作(list/read/screenshot)直接放行;写类动作(open/close/activate/click/fill/delete cookie)经
ExternalAccessApprovalService 批准后,由同一执行器落地。
- 安全边界:页面类操作复用内部 agent 的
AgentDomService(chrome:// 等内部页走 assertDomUrlAllowed 黑名单拦截,命中即返回明确的 INVALID_REQUEST);标签页级的 list/close/activate 不接触页面内容,不走该守卫。
- 协议与校验:新增
protocol.generated.ts / validators.generated.ts / protocol-wire.ts,bridge 校验器与 browser.ts 执行器复用同一套 RPC 方法定义。
- manifest 新增
bookmarks / history 权限。
- 确认页改进:浏览器写操作在确认页展示明文参数;操作被作废(请求方取消 / 超时 / TTL)后自动翻到「已过期」状态,避免用户在僵尸确认页上点出
operation already cancelled。
- offscreen 修复:①业务方法按生成的
RPC_METHODS 放行(此前 browser.* 被静默丢弃);②SW 唤醒重发 connect 时复用健康连接,修复每 60 秒闪断;③参数 schema 不合法回 INVALID_REQUEST 而非误关整条连接。
- 全语言文案同步(de/en/ja/ko/pt/ru/tr/vi/zh-CN/zh-TW)。
主要改动文件:
src/app/service/service_worker/external_access/{browser.ts,bridge.ts,approval.ts,types.ts}、
src/app/service/agent/service_worker/dom.ts、src/app/repo/external_access.ts、
src/pages/external_access_confirm/App.tsx、src/pages/install/useInstallData.ts、
src/manifest.json、src/pkg/config/config.ts、各 src/locales/*/external_access.json 及测试。
2. 权限策略拆分出独立的「浏览器操作」开关(56a92d5f)
把"浏览器操作"从原有的「脚本写操作」权限中拆成独立策略,三者并列、互不影响:
| 策略项(SystemConfig) |
默认值 |
控制范围 |
external_access_write_policy |
需审批 |
脚本写操作 |
external_access_browser_policy |
需审批 |
浏览器操作(新增) |
external_access_source_read_policy |
需审批 |
源码读取 |
- 浏览器写操作(开关 / 切换标签页、页面点击与填充、删除 Cookie)改为走
external_access_browser_policy——允许脚本变更,不再等于允许 AI 操纵浏览器会话。
- 设置页「外部接入」卡片新增第三行策略分段控件(含「直接允许」的琥珀色警示);外部接入弹窗的默认权限清单同步补充浏览器操作条目。
bridge.ts 增加两策略互相独立的分流契约测试;设置页新增浏览器策略行测试。
二、sctl(桥接 / MCP / CLI 端)
3. 通过 MCP + CLI 暴露 browser.* 工具(05ad6cf)
把 ScriptCat 端的同一套 15 个 browser.* 方法,在 sctl 中落地为可被发现、带 schema 的工具:
- 协议:
internal/pkg/protocol/protocol.json 新增 15 个 browser.* 方法,含 scope、读/写效果与审批语义;重新生成 Go / TS 绑定(protocol.generated.go / protocol.generated.ts / validators.generated.ts)。
- MCP 服务:
internal/client/mcpserver/tools.go 为全部 browser 工具定义 MCP tool(Cookie 仅元数据、永不暴露值;截图返回 JPEG/PNG data URL)。
- CLI:
internal/cli/browser.go(+704 行)新增 tabs / page / cookies / records 四个命令组,例如:
sctl tabs list|open|close|activate
sctl page read|screenshot|click|fill|scroll|wait
sctl cookies list|delete
sctl records bookmarks|history|downloads
- 守护进程:记录扩展连接关闭的 code / reason,便于诊断。
- 文档:
docs/protocol.md 方法表、README.md 与 docs/README_zh-CN.md 命令表。
4. 补全部署 / CLI 文档与 agent skill(13e330d)
docs/deploy.md:把构建产物(release 或自编译单文件)跑成常驻守护进程——PATH 配置、单一数据目录规则、各 OS 守护示例、升级流程、MCP/CLI/skill 消费方接线。
docs/cli.md:完整命令参考——全局 flag、输出格式、退出码、写操作的阻塞语义、逐命令示例(已对 sctl --help 与 cli.go 退出常量核验)。
skills/scriptcat/SKILL.md:随包分发的 agent skill,教 AI 编码智能体如何驱动这些命令;由 deploy.md 给出安装指引,索引与两份 README 互相交叉链接。
精确提交清单
scriptcat(upstream/main..feature/mcp):
56a92d5f ✨ 外部接入权限策略拆分出独立的「浏览器操作」开关
3c3434da ✨ 外部接入新增 browser.* 浏览器操作能力(标签页/页面交互/站点数据)
sctl(upstream/main..feature/mcp):
13e330d docs: add deploy.md, cli.md and the shipped scriptcat agent skill
05ad6cf feat: expose browser.* tools (tabs/page/cookies/records) over MCP and CLI