明确下载控制与最小上传的下一阶段范围,按官方 CDP 边界区分 browser-scoped downloads 与 page-scoped uploads。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
13 KiB
Browser MCP Phase 8 Design
Last Updated: 2026-04-19
Goal
在当前已完成并提交的 Browser MCP Phase 7 基线之上,为 CCS-managed ccs-browser MCP runtime 设计 Browser MCP Phase 8。
本阶段延续历史 roadmap 中 Phase 7 预留的 file-transfer / lifecycle completion 方向,但按当前官方 CDP 能力边界做最小修正:
- 下载控制:采用 session-local、browser-scoped 的下载策略与下载结果摘要
- 最小上传:采用 page-scoped 的 file input 设置能力
Phase 8 的目标是补齐“文件流转”这一类真实浏览器工作流缺口,让 browser MCP 不再只有页面交互与网络拦截,还能覆盖最常见的下载与表单文件上传场景。
Why Phase 8 Follows Phase 7
历史 spec 的主路线是:
- Phase 5:page/tab control
- Phase 6:network interception + mock responses
- Phase 7:file-transfer and lifecycle completion
- Phase 8+:recording / replay / higher-level orchestration
后来实际交付里,Phase 6 被拆成 6A / 6B,Phase 7 又继续完成了 richer request matching。因此当前 browser MCP 已经把 interception 线打磨到了一个较完整的最小闭环:
- page-bound interception rules
- session-local state
continue/fail/fulfill- richer request matching
- recent request summaries
下一阶段如果继续深挖 interception,会开始落入 request body matching、更复杂 boolean matcher groups、cross-page shared rules 这类更重的规则编排问题;而历史 roadmap 里原本预留的 file transfer 缺口仍未补上。
因此,Phase 8 应该回到原 roadmap,优先补:
- download handling
- minimal upload handling
这样既尊重了最初路线,也能让 browser MCP 覆盖更多真实 end-to-end workflow。
Scope Summary
In Scope
-
下载控制
- 为当前 attach session 设置下载策略:接受或拒绝下载
- 支持 session-local 下载目录配置
- 记录近期下载摘要
- 支持取消进行中的下载
- 继续兼容现有
browser_wait_for_event(kind=download)事件等待能力
-
最小上传
- 为
<input type="file">设置一个或多个本地文件 - 支持当前已有 selector 作用域能力:
nth、frameSelector、pierceShadow - 保持 selected page 解析语义
- 为
-
状态可见性
- 通过新的下载列表工具查看近期下载摘要与状态
- 返回清晰的 upload / download 结果摘要
Explicitly Out of Scope
- 原生系统文件选择器接管
- drag-and-drop 上传
- 下载文件内容读取、解析或回传
- 上传后自动点击 submit 或自动编排后续页面流程
- 跨 runtime 持久化下载策略或下载记录
- 基于 interception 的下载内容改写
- 录制 / 回放 / 宏编排
- request body matching
- 更复杂 boolean matcher groups
- 跨页共享 interception rules
CDP Constraint and Scope Correction
Phase 8 的关键设计修正来自当前官方 CDP 能力边界:
Uploads
上传侧可基于 DOM.setFileInputFiles 实现,因此天然适合继续沿用当前 browser MCP 的 page-scoped / selector-scoped 工具模型。
Downloads
下载侧主要依赖 Browser domain:
Browser.setDownloadBehaviorBrowser.cancelDownloadBrowser.downloadWillBeginBrowser.downloadProgress
这些接口更接近 browser-scoped / browser-context-scoped 能力,而不是某个 page target 独占的 page-bound 能力。因此 Phase 8 不应伪装成“每页独立下载开关”,而应明确采用:
- 下载控制:session-local, browser-scoped
- 上传控制:page-scoped
这是一个有意的混合作用域设计,但它与 CDP 现实能力一致,也避免了 misleading 的 page-local 承诺。
Architecture
Phase 8 继续沿用 lib/mcp/ccs-browser-server.cjs 的单 runtime 架构,不引入新的 browser runtime,也不重写 Phase 5 selected page 模型或 Phase 6-7 的 interception 架构。
本阶段分成两条并行但边界清晰的能力线:
- Download control line
- browser-scoped CDP Browser domain 控制
- session-local 下载策略与下载摘要
- File input upload line
- page-scoped selector 解析
- DOM file input 赋值
Design Principles
- 下载控制尊重 CDP Browser domain 的真实作用域,不伪造成 page-bound
- 上传继续复用已有 selector / frame / shadow 解析模型,不新建第二套选择器系统
- 继续保持 session-local state,不持久化到磁盘
- 继续保持最小增量策略,不把 download/upload 扩展成完整文件管理系统
- 不为了 Phase 8 重构现有 wait / event / interception 基础设施
Tool Surface
Phase 8 推荐新增三个工具。
1. browser_set_download_behavior
为当前 attach session 设置下载策略。
建议参数:
behavior: "accept" | "deny"downloadPath?: stringeventsEnabled?: boolean
行为:
behavior=accept时允许下载behavior=deny时拒绝下载downloadPath仅在 accept 时有效;如省略,则 runtime 选择 session-local 默认下载目录eventsEnabled默认开启,保证下载事件和结果摘要可见- 作用域为当前 attach session / browser context,而不是单个页面
返回字段建议最小包含:
scope: browserbehaviordownloadPatheventsEnabledstatus
2. browser_list_downloads
列出当前 MCP runtime 记录的近期下载摘要。
建议参数:
limit?: numberpageId?: string
行为:
- 默认返回最近下载摘要
- 可按触发下载时记录的
pageId过滤 - 不读取下载文件内容
- 只返回摘要和状态
返回字段建议最小包含:
downloadIdguidpageIdurlsuggestedFilenamestatussavedPathstartedAtfinishedAt
3. browser_cancel_download
取消进行中的下载。
建议参数:
downloadId?: stringguid?: string
行为:
- 按 runtime 记录的
downloadId或底层guid定位目标 - 调用 Browser domain cancel 能力
- 更新
recentDownloads中对应项状态
约束:
downloadId与guid至少提供一个- 两者同时提供时必须指向同一条下载记录,否则报错
4. browser_set_file_input
为 <input type="file"> 直接设置本地文件。
建议参数:
selector: stringfiles: string[]pageIndex?: numberpageId?: stringnth?: numberframeSelector?: stringpierceShadow?: boolean
行为:
- 解析目标页
- 解析 selector 作用域
- 定位目标节点
- 要求目标是
<input type="file"> - 将本地文件路径集合设置到该 input
- 返回设置结果摘要
返回字段建议最小包含:
pageIdpageIndexselectorfileCountstatus
State Model
Phase 8 继续使用 session-local in-memory state。
downloadBehaviorState
存储当前 attach session 的下载行为配置。
建议字段:
behaviordownloadPatheventsEnabledupdatedAt
关键约束:
- browser-scoped
- 不绑定 pageId
- runtime 重启后丢失
recentDownloads
记录近期下载摘要。
建议字段:
downloadIdguidpageIdurlsuggestedFilenamestatus: "started" | "inProgress" | "completed" | "canceled" | "denied" | "failed"savedPathreceivedBytestotalBytesstartedAtfinishedAt
关键约束:
- 固定上限,建议 100 条
- 只保留摘要,不读文件内容
- 通过
guid关联 Browser domain 下载事件
Existing selected page state
上传工具继续复用现有 selected page 模型:
- 显式
pageIndex优先 - 否则走 selected page
- stale selected page 时回退到第一可用页面
Data Flow
Download behavior update flow
browser_set_download_behavior校验参数- 若
behavior=accept且未提供downloadPath,计算 session-local 默认下载目录 - 调用
Browser.setDownloadBehavior - 更新
downloadBehaviorState - 返回当前配置摘要
Download observation flow
- runtime 接收
Browser.downloadWillBegin - 生成
downloadId - 写入
recentDownloads,状态为started - 记录触发时关联的
pageId(若能确定) - 若后续收到
Browser.downloadProgress:- 更新
receivedBytes/totalBytes - 当 state=
completed时写入finishedAt和可用savedPath - 当 state=
canceled时更新状态
- 更新
Download cancel flow
browser_cancel_download解析目标记录- 调用
Browser.cancelDownload - 更新
recentDownloads为canceled - 返回取消结果摘要
File input upload flow
browser_set_file_input解析目标页- 解析
selector/nth/frameSelector/pierceShadow - 定位 DOM 节点
- 校验目标是
<input type="file"> - 校验所有本地文件路径存在且为普通文件
- 调用
DOM.setFileInputFiles - 返回设置结果摘要
Error Handling and Boundary Rules
browser_set_download_behavior
behavior只能是accept或denybehavior=deny时不接受downloadPathdownloadPath不可写时报错- Browser domain 下载能力不可用时报错
browser_list_downloads
limit越界时回退到安全默认值pageId不存在时返回空列表,不报错
browser_cancel_download
downloadId与guid至少传一个- 指定下载不存在时报错
- 下载已完成时取消应报明确错误或返回 no-op 状态,但语义必须固定
browser_set_file_input
pageIndex与pageId不能同时传selector不能为空files必须是非空数组- 文件不存在时报错
- 文件路径不是普通文件时报错
- selector 无匹配时报错
- 多匹配但未提供
nth时应保持与当前 selector 工具一致的目标解析语义 - 命中的元素不是
<input type="file">时报错 - 跨域 iframe 不支持
- closed shadow root 不支持
Interaction with Existing Capabilities
With browser_wait_for_event
Phase 8 不替换 browser_wait_for_event(kind=download);它继续负责:
- 等待下载开始事件
- 作为轻量事件观察能力存在
Phase 8 新增的下载工具负责:
- 设置下载策略
- 查看下载摘要
- 取消下载
With selected page semantics
- 下载行为是 browser-scoped,不依赖 selected page
- 上传行为继续遵循 selected page 解析语义
- 这两者的作用域不同是有意设计,不属于不一致 bug
With interception state
- 下载工具不复用 interception rule 管理面
- 下载记录与 request summaries 是并行状态,不相互嵌套
- 不把 download handling 强行建模成 interception action
Testing Strategy
Phase 8 继续扩展:
tests/unit/hooks/ccs-browser-mcp-server.test.ts
并在 deterministic harness 上增加最小 download / upload 模拟能力。
Required download coverage
- 工具列表与 schema 暴露正确
browser_set_download_behavioraccept 成功browser_set_download_behaviordeny 成功behavior=deny+downloadPath报错- 下载开始后
browser_list_downloads能看到 started 摘要 - 下载完成后能看到 completed 状态与文件路径
- 下载取消后能看到 canceled 状态
browser_wait_for_event(kind=download)继续兼容limit和pageId过滤生效
Required upload coverage
- 单文件上传成功
- 多文件上传成功
- selector 无匹配失败
- 命中的不是 file input 失败
- 文件不存在失败
frameSelector作用域成功pierceShadow作用域成功- 省略
pageIndex/pageId时命中当前 selected page - 显式
pageIndex仍覆盖 selected page
Repository validation order
继续遵循该区域已稳定使用的验证顺序:
- focused browser MCP unit tests
bun run build:serverbun run formatbun run validatebun run validate:ci-parity
Documentation Impact
如果 Phase 8 实现落地,至少需要同步:
docs/browser-automation.md
需要新增:
- Phase 8 capability details
- 下载控制与上传示例
- browser-scoped downloads / page-scoped uploads 的作用域说明
- 新的 out-of-scope 边界说明
Worktree Requirement
后续实现不应继续直接在当前 Phase 7 worktree 上混写。
推荐隔离方式:
- 保留
feat/browser-mcp-hover-phase7作为已完成 checkpoint - 基于其已验证提交创建新的 Phase 8 worktree
- 在新 worktree 中完成 Phase 8 plan 与实现
Success Criteria
Phase 8 成功的标志是:
- 用户可以显式控制当前 attach session 的下载接受/拒绝行为
- 用户可以查看近期下载摘要并取消进行中的下载
- 用户可以向
<input type="file">设置本地文件 - 下载与上传能力都遵循清晰、真实的作用域语义
- 本期不引入 drag-and-drop、原生文件选择器接管、内容读取或 orchestration 复杂度
这使 Browser MCP 在当前阶段从“页面交互 + 网络拦截”扩展到“最小文件流转闭环”,为后续更高阶的录制、回放和 workflow orchestration 打下更完整的基础。