Peekaboo 项目地址
Peekaboo 是支撑 OpenClaw 在幕后操作 macOS 的核心技术。它巧妙地整合了 macOS 的屏幕捕获能力、Accessibility (AX) 自动化框架,并可选择性地引入视觉模型分析,最终将“看见屏幕并对 UI 执行动作”这一复杂流程封装成便捷的 CLI 与 MCP (Model Context Protocol) 工具链。

为了深入理解其工作原理,下面我们将从系统分层与关键机制的角度对其进行拆解。
1. 总体架构:三条核心管线构成
Peekaboo 在 README 中清晰地阐述了其核心能力:屏幕捕获(包括整个屏幕、特定窗口、菜单栏区域)、AI 分析以及完整的 GUI 自动化(点击、输入、滚动、快捷键、菜单操作等)。
你可以将其理解为由三条核心管线组合而成:
-
Capture 管线(像素层)
- 将目标区域(屏幕、窗口、菜单栏)捕获为图片,并支持 Retina 2x 等高分辨率捕获。
- 这需要系统级的 Screen Recording 权限(即屏幕录制授权)。
-
Perception 管线(语义层,可选)
- 将捕获到的图片交由视觉模型进行处理,实现视觉问答(VQA)、图像描述、OCR 文字识别等功能。模型选择灵活,可以是 OpenAI、Claude、Gemini 等云端服务,也可以是本地部署的 Ollama。
- MCP 协议中的
image、analyze、list 等工具(tool)正是将这些能力进行了“协议化”封装。
-
Actuation 管线(交互层)
- 利用 macOS 的 Accessibility 框架,通过
AXUIElement 来查找界面控件、读取其属性,并执行按下(press)、设置值(setValue)、滚动(scroll)等一系列动作。
- 这部分的核心功能被抽离成一个独立的库:AXorcist,Peekaboo 直接依赖它来实现底层的自动化交互。
2. 代码分层:Swift 模块的组织方式
查看 Package.swift 文件可以让我们清晰地了解 Peekaboo 的 Swift 包结构,这是理解其“设计原理”的关键,因为它揭示了各功能模块的边界与职责:
- PeekabooFoundation:基础类型与工具函数,属于更底层的“基础设施”。
- PeekabooProtocols:协议与结构化数据定义,类似于“跨模块契约”,配合严格的并发与主线程隔离规则。
- PeekabooAutomationKit:自动化能力聚合层。它将 Foundation、Protocols、AXorcist 以及相关算法组装成一个“可直接使用的自动化工具箱”。
- PeekabooBridge:桥接层,负责将内部的核心能力对接到 CLI、MCP 等外部调用接口。
如果你想阅读源码,建议优先沿着 AutomationKit → Bridge → Apps/CLI 命令 这条链路进行,这能帮助你最快地建立起对项目的心智模型。
3. AX 自动化的“原理”:AXorcist 的重要性
Peekaboo 不仅仅是简单的“截图+坐标点击”,它更侧重于 “结构化的 UI 自动化”:首先将 UI 元素树(按钮、文本框、菜单等)结构化的方式解析出来,然后再基于元素的 ID 或属性进行精确定位与操作。
AXorcist 的 README 将其设计阐述得非常清楚:
- Element 是对
AXUIElement 的 Swift 封装,支持读取属性、获取父子元素、执行动作(action)、设置值等。
- Query/Command 架构:所有操作都采用“命令包 + 响应”的形式进行,支持批量操作(batch)。
- 匹配策略:提供精确匹配(exact)、包含(contains)、正则表达式(regex)、前缀(prefix)、后缀(suffix)、包含任意(containsAny)等多种策略,支持模糊和灵活的定位方式。
- JSON/CLI 输入输出:天然适合被自动化智能体(agent)或外部脚本驱动。Peekaboo 的
see、click、type 等命令本质上就是将这一能力产品化。
这也解释了 Peekaboo 的一个关键使用体验:你可以先使用 see 命令获取一个包含结构化元素的界面快照(snapshot),然后再使用 click --on “Reload this page” 这种基于语义查找控件并点击的方式,而非仅仅依赖不稳定的屏幕坐标。这种对 源码分析 和结构化数据的重视,是许多优秀开源项目的共同特点。
4. “跨 Space 聚焦窗口”:一个专门解决的工程难题
真正让 macOS 自动化变得棘手的,往往不是点击操作本身,而是以下这些环境因素:
- 目标窗口可能不在当前的 Space(虚拟桌面)中。
- 窗口可能不是最前端的(not frontmost)或没有获得焦点(not focused)。
- 即使你获得了窗口的 ID(CGWindowID),也需要在 AX 层将其正确映射到对应的
AXUIElement。
Peekaboo 在文档 docs/focus-impl.md 中直接给出了架构图,说明它将“聚焦窗口”视为一个独立的基础设施问题来解决:
CLI 命令 (click/type/menu/scroll…)
→ ensureWindowFocus() (智能聚焦,支持 Space 切换)
→ Window resolution (CGWindowID → AXUIElement → focus actions)
→ Space 管理 (使用 CGSSpace/CGSManagedDisplay… 等私有 API 进行切换/移动)
文档中还明确提到了 CGWindowID、CGSSpaceID 等概念,以及通过 CGSManagedDisplaySetCurrentSpace、CGSAddWindowsToSpaces 等底层 API 进行 Space 切换和窗口移动。这意味着 Peekaboo 的“可靠点击”不是一条简单的直线,而是遵循如下流程:
解析窗口身份 → 确保窗口在当前 Space → 将其置前并聚焦 → 最后才执行 AX 动作
这也是它比许多“简单封装 AX API 的小工具”更具工程化价值的地方:它系统性地处理并收敛了 Space 和焦点这些导致自动化不稳定的核心因素。
5. MCP/Node 层的作用:为什么需要 peekaboo-mcp.js
Peekaboo 的核心能力由 Swift 编写的二进制程序提供。但为了在 MCP 生态(如 Claude Desktop、Cursor 等)中更好地分发和运行,它额外提供了一个 Node.js 包作为入口。
peekaboo-mcp.js 的作用非常直接:启动(spawn)Swift 二进制程序来运行 peekaboo mcp serve 命令。如果进程意外崩溃,它会采用指数退避策略进行重启,并处理一些诸如可执行文件权限之类的常见问题。
因此,你可以将 MCP 层理解为:
- 协议/分发/运行时外壳:由 Node.js 环境担当。
- 真正的执行核心:是背后的 Swift CLI/server,所有底层自动化能力都封装在 Swift 模块中。这种 脚本驱动 的分层架构在 DevOps 工具中十分常见。
6. 权限模型:为何需要双重授权
Peekaboo 明确声明其运行需要两项系统权限:
- Screen Recording:用于截屏和抓取窗口内容。
- Accessibility:用于读取 UI 元素树并执行点击、输入等交互操作。
这是由 macOS 的安全沙盒模型决定的:“看到屏幕像素” 和 “操控用户界面” 被视为两套不同且高度敏感的系统能力,因此操作系统要求分别对其进行授权。理解这一点对于在 macOS 上进行任何形式的桌面自动化开发都至关重要。
如果你对这类深入技术原理的拆解感兴趣,欢迎来 云栈社区 与更多开发者交流探讨。