Skip to main content
Glama

computer-runtime

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

                 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:实际服务截图的 screencapturekitscreencapture-clinone

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

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


Related MCP server: Touchpoint

二、安装(构建)

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 等)中加入:

{
  "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"
      }
    }
  }
}

注意:argsCOMPUTER_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_observecomputer_register_visual_target)以及 query + expect 混合解析与点击后验证 (协议 0.4.0,见 docs/protocol-v3.mddocs/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:结构化优先、 Vision 仅作 fallback、computer_click 三种定位方式严格互斥。完整对话历史、历史 reasoning、 旧图片保留和逐轮动态工具集属于 Host/Agent Runtime;MCP Server 只负责压缩单次 Tool Result 与静态工具面,不能从宿主上下文中删除历史消息。

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

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

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 原生桥接层执行:

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

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

正常输出应类似:

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

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

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)

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();                                        // 回收子进程

四、快速自检

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

# 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 上使用。


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

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/              性能基准脚本与结果

Related MCP Connectors

Related MCP Servers