Skip to main content
Glama
README.md
# computer-runtime

跨平台 GUI 自动化运行时 + MCP Server。用同一套统一 API 在 **macOS / Windows / Linux(X11)** 上完成桌面 GUI 元素的**读取、点击、输入、快捷键和截图**,并通过 Playwright + DOM/ARIA 提供浏览器高速结构化控制;桌面操作提供稳定 windowId、事件式 waitFor 与结果 verify。全部能力通过 **MCP(Model Context Protocol)** 对外暴露,可供任意 MCP 宿主(如 AI 助手)直接驱动。

```text
                 MCP Client / AI Host
                          │
                  ┌──────────────┐
                  │  MCP Server  │ 25 tools: computer.* + browser.*
                  └──────┬───────┘
          ┌──────────────┴──────────────┐
          ▼                             ▼
   computer.* (stdio JSON-RPC)     browser.* (in-process)
          ▼                             ▼
 Computer Runtime (Rust)         Browser Runtime (TS)
          │                        Playwright + DOM/ARIA + CDP
 ┌────────┼────────┐                     │
Win     macOS     Linux                ▼
UIA      AX      AT-SPI/XTest     Chromium/Chrome/Edge
```

核心设计原则:**语义动作优先于物理动作**(优先走系统无障碍 API 的语义操作,物理点击/键入只作兜底)、上层永不接触平台原生句柄、主同步路径禁止固定 sleep、测试不依赖 LLM 与公网。

---

## 一、环境要求

| 依赖 | 版本要求 | 用途 |
| --- | --- | --- |
| Rust (cargo) | stable | 编译桌面 Runtime |
| Node.js | 18+(20+ 推荐) | MCP Server / Browser Runtime / 测试 |
| npm | 9+ | TS 工作区构建 |
| Chrome / Edge(可选) | 本机已安装即可 | browser.* 自动探测,无需另装 Playwright 浏览器 |
| Xcode Command Line Tools(仅 macOS) | 与当前 macOS SDK 匹配 | 编译 ScreenCaptureKit 的 Objective-C/ARC 桥接层(`xcrun clang`) |

**系统权限(macOS 必须,首次运行时授权一次即可)**

在 系统设置 → 隐私与安全性 中,给你的终端 / MCP 宿主 App 开启:

- **辅助功能(Accessibility)** —— 读取窗口元素树、语义点击、窗口聚焦
- **屏幕与系统音频录制(Screen & System Audio Recording)** —— ScreenCaptureKit 全屏/指定窗口截图

截图状态可通过 `computer_capabilities` 或 Runtime CLI 的 `capabilities` 查看。macOS 会分别报告:

- `screen_capture.permission`:TCC 预检是否通过;
- `screen_capture.available`:真实小尺寸截图探测是否成功;
- `screen_capture.backend`:实际服务截图的 `screencapturekit`、`screencapture-cli` 或 `none`。

权限、后端缺失和后端执行失败分别返回 `SCREEN_CAPTURE_PERMISSION_DENIED`、
`SCREEN_CAPTURE_BACKEND_UNAVAILABLE` 和 `SCREEN_CAPTURE_BACKEND_FAILED`,不会再把所有失败都猜成权限问题。

**Linux 仅支持 X11 会话**(Wayland 显式返回 `UNSUPPORTED`);Windows 需要 Windows 10 1809+。

---

## 二、安装(构建)

```bash
git clone <repo-url> computer-use-mcp
cd computer-use-mcp

# 1. 桌面 Runtime(Rust)→ 产物 target/release/computer-runtime
cargo build --release -p computer-runtime-ipc

# 2. MCP Server + SDK + Browser Runtime(TypeScript 工作区)
npm install
npm run build
```

macOS 构建时,`runtime/platform/macos/build.rs` 会通过 `xcrun clang` 编译一个很小的
Objective-C/ARC 桥接层。它负责 ScreenCaptureKit completion block 的创建与生命周期,
因此需要已安装 Xcode Command Line Tools;不需要额外下载第三方原生依赖。

构建完成后的关键产物:

```
target/release/computer-runtime                    # 桌面 Runtime 二进制(含 CLI 与 stdio 服务)
packages/mcp-server/dist/index.js                  # MCP Server 入口(bin 名 computer-mcp)
```

> 仅运行测试时才需要:`cd apps/test-gui && npm install && npm run build`(Electron 测试 GUI)。

---

## 三、运行

本项目**没有常驻守护进程**:MCP 宿主负责拉起 MCP Server,Server 再按会话启动桌面 Runtime。你只需要配置一次 MCP,之后即插即用。

### 方式 1:接入 MCP 宿主(推荐)

在你的 MCP 宿主配置文件(如 `mcp.json` / `claude_desktop_config.json` 等)中加入:

```json
{
  "mcpServers": {
    "computer": {
      "command": "node",
      "args": ["/absolute/path/to/computer-use-mcp/packages/mcp-server/dist/index.js"],
      "env": {
        "COMPUTER_RUNTIME_BIN": "/absolute/path/to/computer-use-mcp/target/release/computer-runtime"
      }
    }
  }
}
```

> 注意:`args` 与 `COMPUTER_RUNTIME_BIN` 必须写成**绝对路径**(换成你自己的克隆目录)。

> macOS 建议把 release 二进制复制/安装到一个稳定路径,并让
> `COMPUTER_RUNTIME_BIN` 指向该路径。Cargo 会反复替换 `target/release` 下的构建产物,
> macOS TCC 可能继续关联旧的执行身份,表现为“预检允许,但 ScreenCaptureKit completion
> 超时”。稳定安装路径只需在系统设置中授权一次。

默认 `COMPUTER_TOOL_PROFILE=full` 时会得到 **25 个工具**:

| 分类 | 工具 |
| --- | --- |
| computer.*(桌面,14 个) | `computer_capabilities` `computer_windows` `computer_observe` `computer_click` `computer_type` `computer_key` `computer_screenshot` `computer_wait` `computer_verify` `computer_visual_observe` `computer_resolve` `computer_screenshot_image` `computer_capture_region` `computer_register_visual_target` |
| browser.*(浏览器,11 个) | `browser_launch` `browser_pages` `browser_observe` `browser_navigate` `browser_click` `browser_type` `browser_key` `browser_screenshot` `browser_evaluate` `browser_wait` `browser_verify` |

`computer_click` 还支持 `visual_N` 目标(来自 `computer_visual_observe` 或
`computer_register_visual_target`)以及 `query` + `expect` 混合解析与点击后验证
(协议 0.4.0,见 `docs/protocol-v3.md` 与 `docs/migration-0.3-to-0.4.md`)。

**截图不再返回大块 base64**(协议 0.4.0):`computer_screenshot` /
`browser_screenshot` 默认返回 <2KB 的 `capture_N` 元数据引用(CaptureReference),
像素只留在服务端(TTL 10min / LRU 64 条 / 128MB)。需要真正看图时走三条显式通道:
MCP resource `computer://capture/{id}`(Host 原生图片桥)、
`computer_screenshot_image`(危险的 raw escape hatch,默认禁用)、
`computer_capture_region`(高清 ROI 裁剪)。这防止了部分宿主把
`{type:"image"}` 结果 stringify 成文本、单张截图吃掉上百万 token 的事故。

**可选环境变量**(加在上面配置的 `env` 里):

| 变量 | 作用 |
| --- | --- |
| `COMPUTER_RUNTIME_ARGS=--mock` | 使用内置 Mock 平台——无需真实 GUI 与系统权限,用于验证整条链路 |
| `COMPUTER_BROWSER_HEADED=1` | browser.* 用有头浏览器(默认无头) |
| `COMPUTER_ENABLE_EVALUATE=0` | 关闭 `browser_evaluate`(安全收紧) |
| `COMPUTER_VISION_ENABLED=1` | 开启视觉 grounding(**默认关闭**;`computer_visual_observe`/`computer_resolve` 视觉回退需要) |
| `COMPUTER_VISION_PROVIDER=mock\|remote\|openai-compatible` | 视觉 provider(默认 mock,纯本地);`openai-compatible` 调用多模态 `/chat/completions` |
| `COMPUTER_VISION_REMOTE_UPLOAD=1` | 所有远程 provider 的第二道开关:不设置则绝不会向外部端点上传截图 |
| `COMPUTER_VISION_BASE_URL` / `COMPUTER_VISION_MODEL` / `COMPUTER_VISION_API_KEY` | `openai-compatible` 的 API 根地址、模型和可选密钥 |
| `COMPUTER_VISION_MAX_RETRIES` / `COMPUTER_VISION_MAX_IMAGE_BYTES` | Managed Vision 的重试上限(默认 1)和图像上限(默认 8MiB) |
| `COMPUTER_TOOL_PROFILE=desktop-core\|desktop-vision\|browser\|full\|debug` | 静态工具面;默认 `full` 兼容旧 Host,日常建议按场景缩到 9–13 个工具 |
| `COMPUTER_CONTEXT_METRICS=1` | 把 schema 字符数、Tool Result 字节数、元素数和视觉尝试写到 stderr;不会回传给模型 |
| `COMPUTER_SCREENSHOT_MODE=reference\|image\|auto` | 截图返回语义,默认 `reference`(如上);`image` 恢复 0.3 的原始图片行为 |
| `COMPUTER_LEGACY_SCREENSHOT=1` | 短期过渡:同 `image`,带弃用警告 |
| `COMPUTER_ALLOW_RAW_IMAGE_CONTENT=1` | 显式允许 `computer_screenshot_image` 返回 ImageContent;仅用于确认不会把图片 stringify 进历史记录的 Host,默认禁用 |
| `COMPUTER_CAPTURE_TTL_MS` | capture 字节 TTL(默认 600000,即 10 分钟) |
| `COMPUTER_CAPTURE_MAX_EDGE` | 预览图最长边(默认 1568,视觉模型友好) |

模型调度规则见仓库内的
[`computer-mcp-execution` Skill](skills/computer-mcp-execution/SKILL.md):结构化优先、
Vision 仅作 fallback、`computer_click` 三种定位方式严格互斥。完整对话历史、历史 reasoning、
旧图片保留和逐轮动态工具集属于 Host/Agent Runtime;MCP Server 只负责压缩单次 Tool Result
与静态工具面,不能从宿主上下文中删除历史消息。

### 方式 2:CLI 直接调试(不经过 MCP)

桌面 Runtime 自带 CLI,适合手动验证权限与能力:

```bash
target/release/computer-runtime capabilities        # 查看当前平台能力与权限状态
target/release/computer-runtime windows             # 枚举窗口(稳定 windowId)
target/release/computer-runtime observe             # 观察活动窗口元素树
target/release/computer-runtime screenshot out.png  # 全屏截图
target/release/computer-runtime click 655,544       # 物理点击(自动激活窗口)
target/release/computer-runtime key cmd+a           # 快捷键(cmd+a / enter / esc 等)
target/release/computer-runtime --mock observe      # Mock 平台,无需 GUI/权限
```

### macOS 截图后端与排障

macOS 14+ 默认使用 ScreenCaptureKit。SCK 的完整异步管线由 Clang/ARC 原生桥接层执行:

```text
getShareableContent → 选择 SCDisplay / SCWindow
                    → 构建 SCContentFilter / SCStreamConfiguration
                    → SCScreenshotManager → retained CGImageRef → Rust RGBA
```

桥接层不会在 `getShareableContent` completion handler 内等待嵌套截图 completion,
避免占住 ScreenCaptureKit 的内部串行队列。每次原生请求有 10 秒上限;失败时自动尝试系统
`/usr/sbin/screencapture`,并在日志和 capability 的 `backend` 中诚实显示 fallback。

正常输出应类似:

```json
{
  "screen_capture": {
    "permission": true,
    "available": true,
    "backend": "screencapturekit"
  }
}
```

如果 `permission` 为 `true`,但 backend 变成 `screencapture-cli`,请先确认启动 Runtime
的终端或 MCP 宿主已经获得“屏幕与系统音频录制”权限。若问题只发生在反复覆盖的
`target/release/computer-runtime`,把二进制复制到稳定安装路径后重新授权该宿主:

```bash
cargo build --release -p computer-runtime-ipc
cp target/release/computer-runtime /absolute/stable/path/computer-runtime
/absolute/stable/path/computer-runtime capabilities
/absolute/stable/path/computer-runtime screenshot /tmp/computer-runtime-check.png
```

不要通过长期降低 Rust release 优化级别规避该问题;当前实现使用默认 opt3,并已在同一
release 执行实体上完成全屏截图 200/200、指定窗口截图 200/200 的零 fallback 验收。

### 方式 3:SDK 编程调用(TypeScript)

```ts
import { RuntimeClient } from "computer-runtime-client-sdk";

const client = new RuntimeClient({
  binaryPath: "/absolute/path/to/computer-use-mcp/target/release/computer-runtime",
});
const wins = await client.listWindows();
const obs = await client.observe({ window: wins[0].id });   // 定向观察,不抢焦点
await client.click({ elementId: "ui_5" });                  // 语义点击
await client.stop();                                        // 回收子进程
```

---

## 四、快速自检

配置完成后,按顺序跑一遍即可确认链路健康:

```bash
# 1. 权限与能力(macOS 上应看到 screen_capture.backend = "screencapturekit")
target/release/computer-runtime capabilities

# 2. 无 GUI 依赖的 Mock 链路
target/release/computer-runtime --mock observe

# 3.(可选)跑自动化测试验证完整安装
cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings
node tests/integration/run.mjs --mock   # Mock 桌面集成
node tests/integration/run.mjs          # 真机桌面集成(自动拉起测试 GUI)
node tests/browser/run.mjs              # 浏览器 Fast Path 集成(本地测试站点)
```

---

## 五、平台支持状态

| 能力 | macOS | Windows | Linux X11 | Browser |
| --- | --- | --- | --- | --- |
| 窗口枚举 + 稳定 windowId | ✅ 已验证 | ✅* | ✅* | page_N ✅ |
| observe(windowId) 定向观察 | ✅ 已验证 | ✅* | ✅* | ✅ |
| 窗口激活(autoActivate) | ✅ 已验证 | ✅* | ✅* | n/a |
| 语义动作(AX / UIA / AT-SPI / locator) | ✅ 已验证 | ✅* | ✅* | ✅ |
| 物理输入(CGEvent / SendInput / XTest) | ✅ 已验证 | ✅* | ✅*(ASCII) | ✅ |
| 截图(全屏 / 指定窗口) | ✅ 已验证 | ✅* | 仅全屏 | ✅ |
| waitFor / verify | ✅ 已验证 | ✅ | ✅ | ✅ 事件驱动 |

\* 代码完成并在对应平台目标上通过编译 + 单测(CI 三平台覆盖),真机 GUI 集成验收待对应平台环境。当前版本推荐在 **macOS** 上使用。

---

**测试与基准(面向贡献者)**

```bash
cargo test --workspace                  # Rust 单元测试 + Mock 全流程
npm run test:unit                       # TS 单元测试
node tests/integration/mcp_verify.mjs   # MCP 20 工具面端到端
node tests/soak.mjs                     # 稳定性压测(mock 1000 轮 / --real 300 轮)
node benchmarks/bench.mjs               # 性能基准(截图/observe p50/p95/max)
node benchmarks/bench.mjs --browser     # 浏览器链路基准
```

---

## 六、目录结构

```
runtime/core             平台无关核心(Window Registry、Element Registry、wait/verify、事件抽象、Mock)
runtime/platform/macos   AX + CGEvent + CGWindowList + ScreenCaptureKit(Clang/ARC bridge)
runtime/platform/windows UIA COM + Win32 + SendInput + GDI
runtime/platform/linux   AT-SPI (D-Bus) + x11rb + XTest + XGetImage
runtime/ipc              computer-runtime 二进制(stdio JSON-RPC + CLI)
packages/protocol        冻结协议类型(v0.2.0)
packages/client-sdk      类型化客户端(参数校验 + 生命周期管理)
packages/browser-runtime 浏览器运行时(playwright-core,自动探测本机浏览器)
packages/mcp-server      MCP Server(20 tools)
apps/test-gui            Electron 测试 GUI(双窗口 / 延迟状态 / disabled 控件)
apps/test-web            本地测试站点(login/search/modal/tabs/dynamic/navigation)
tests/                   桌面集成 + 浏览器集成 + MCP E2E + soak
benchmarks/              性能基准脚本与结果
```