ray040237 发表于 2026-9-12 16:07:07

魔改脚本猫(支持mcp暴露浏览器操作功能)



**为 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
```

---

ray040237 发表于 2026-9-12 16:12:50

Vibe coding 了一下,给哥哥开发提供一点小想法,哈哈哈。在脚本猫里面用 Agent 时遇到一个痛点——无法基于工作区进行管理。比如通过网页填充的场景要维护一个代码库,或者基于某个网站的操作要维护一个 Skill,只能写到内置工作区里,操作起来还是不够方便。最近摸索了一下,觉得可以把脚本猫做成 MCP 或 CLI 工具 + Skill 的形式,这样 Agent 的选择就多样起来了。脚本猫作为工具,相比其他浏览器操作工具,最大的优势在于可以基于操作直接生成脚本复用,这一点就比其他工具领先了一大截。

潘钜森 发表于 2026-9-12 16:39:03

ggnb!

jksf_7605 发表于 2026-9-14 09:38:37

新来的请多关照

王一之 发表于 2026-9-14 10:35:54

ggnb啊

我也是想做可以控制网页的,不过可能会独立另外一个扩展,脚本猫内置的AI系统也想独立出去

ray040237 发表于 2026-9-16 00:39:53

王一之 发表于 2026-9-14 10:35
ggnb啊

我也是想做可以控制网页的,不过可能会独立另外一个扩展,脚本猫内置的AI系统也想独立出去 ...

好啊好啊,期待新作品

王一之 发表于 3 天前

我在开坑做这个东西了

https://github.com/scriptscat/sctl
页: [1]
查看完整版本: 魔改脚本猫(支持mcp暴露浏览器操作功能)