关于 computer-automation
通过 Midscene 命令行自动操作 macOS、Windows 和 Linux 桌面界面的技能。它支持本地显示器和通过 RDP 连接的远程 Windows 桌面,并以截图引导自然语言操作和断言。
主要功能
- 01自然语言桌面操作
- 02截图捕获与断言
- 03选择本地显示器
- 04通过 RDP 操作远程 Windows
- 05使用参考图像定位
适用场景
- 01自动执行多步骤桌面界面任务
- 02在桌面 QA 中检查可见结果
- 03操作远程 Windows 桌面
MCP 相关
该技能说明,每条 `@midscene/computer@1` 命令都直接映射到 MCP 工具;Agent 根据截图选择操作。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ web-infra-dev/ midscene-skills --skill desktop-computer-automation安装后在 Claude Code 中输入/desktop-computer-automation确认已加载。
详细介绍
桌面计算机自动化
关键规则——违反规则会导致工作流中断:
- 绝不要在后台运行 midscene 命令。 每条命令都必须同步运行,以便你读取其输出(尤其是屏幕截图)后再决定下一步操作。后台执行会破坏“截图—分析—操作”循环。
- 一次只能运行一条 midscene 命令。 等待上一条命令完成并读取屏幕截图,然后再决定下一步操作。绝不要串联运行多条命令。
- 为每条命令预留足够的完成时间。 Midscene 命令涉及 AI 推理和屏幕交互,耗时可能比典型的 shell 命令更长。通常一条命令需要约 1 分钟;复杂的
act命令可能需要更久。- 结束前务必汇报任务结果。 自动化任务完成后,你必须主动向用户总结结果,包括找到的关键数据、完成的操作、拍摄的屏幕截图,以及任何相关发现。最后一个自动化步骤完成后,绝不要不作说明就结束;用户期望在一次交互中获得完整答复。
- 只最小化窗口,除非用户明确要求,否则绝不要关闭窗口。 需要让窗口消失或不再碍事时,应将其最小化,而不是关闭。除非用户明确要求,否则不要关闭任何应用或窗口。
使用 npx -y @midscene/computer@1 控制桌面(macOS、Windows、Linux)。每条 CLI 命令都直接对应一个 MCP 工具——你(AI Agent)是负责根据屏幕截图决定采取哪些操作的“大脑”。
act 可以做什么
在桌面端的一次 act 调用中,Midscene 可以移动鼠标、单击、双击、右键单击、拖动项目、输入或清除文本、滚动、按下单个按键或键盘快捷键,还可以在选定显示器上对任何可见内容执行多步交互。
前置条件
Midscene 需要具备强大视觉定位能力的模型。必须配置以下环境变量——可以将其设为系统环境变量,也可以放在当前工作目录下的 .env 文件中(Midscene 会自动加载 .env):
MIDSCENE_MODEL_API_KEY="your-api-key"
MIDSCENE_MODEL_NAME="model-name"
MIDSCENE_MODEL_BASE_URL="https://..."
MIDSCENE_MODEL_FAMILY="family-identifier"
示例:Gemini(Gemini-3-Flash)
MIDSCENE_MODEL_API_KEY="your-google-api-key"
MIDSCENE_MODEL_NAME="gemini-3-flash"
MIDSCENE_MODEL_BASE_URL="https://generativelanguage.googleapis.com/v1beta/openai/"
MIDSCENE_MODEL_FAMILY="gemini"
示例:Qwen 3.5
MIDSCENE_MODEL_API_KEY="your-aliyun-api-key"
MIDSCENE_MODEL_NAME="qwen3.5-plus"
MIDSCENE_MODEL_BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1"
MIDSCENE_MODEL_FAMILY="qwen3.5"
MIDSCENE_MODEL_REASONING_ENABLED="false"
# If using OpenRouter, set:
# MIDSCENE_MODEL_API_KEY="your-openrouter-api-key"
# MIDSCENE_MODEL_NAME="qwen/qwen3.5-plus"
# MIDSCENE_MODEL_BASE_URL="https://openrouter.ai/api/v1"
示例:Doubao Seed 2.0 Lite
MIDSCENE_MODEL_API_KEY="your-doubao-api-key"
MIDSCENE_MODEL_NAME="doubao-seed-2-0-lite"
MIDSCENE_MODEL_BASE_URL="https://ark.cn-beijing.volces.com/api/v3"
MIDSCENE_MODEL_FAMILY="doubao-seed"
常用模型:Doubao Seed 2.0 Lite、Qwen 3.5、Zhipu GLM-4.6V、Gemini-3-Pro、Gemini-3-Flash。
如果尚未配置模型,请让用户进行设置。支持的提供商请参阅模型配置。
命令
连接到桌面
npx -y @midscene/computer@1 connect
npx -y @midscene/computer@1 connect --displayId <id>
通过 RDP 连接
使用 RDP 模式操作远程 Windows 桌面,而不是本地机器。提供 --host 会将 connect 切换为 RDP 模式,并通过 @midscene/computer 附带的 RDP 辅助二进制文件路由所有后续命令(act、tap、take_screenshot、assert、disconnect)。不会触碰本地鼠标或键盘。
最简示例:
npx -y @midscene/computer@1 connect \
--host rdp.example.com \
--username Administrator \
--password "$RDP_PASSWORD"
connect 的所有 RDP 选项(设置 --host 时会启用 RDP 模式;其他标志均为可选):
--host <fqdn-or-ip>— RDP 主机。进入 RDP 模式时必填。--port <number>— RDP 端口(默认值为3389)。--username <user>— RDP 用户帐户。--password <secret>— RDP 密码。建议从环境变量、密钥管理器或交互式提示中读取;切勿将其粘贴到共享的记录中。--domain <domain>— Active Directory / NTLM 域。--security-protocol <auto|tls|nla|rdp>— 安全协议协商。默认值为auto。--ignore-certificate— 跳过 TLS 证书验证。仅用于使用自签名证书的可信开发主机。--admin-session— 连接到管理员/控制台会话(等同于mstsc /admin)。--desktop-width <px>和--desktop-height <px>— 请求特定的远程桌面分辨率。实际尺寸取决于 RDP 服务协商返回的结果;例如,向固定使用1280x720的主机请求1024x768,最终仍会得到1280x720。连接后,使用listdisplays --host ... --username ... --password ...确认协商后的尺寸。
RDP 模式专属说明:
- 在 RDP 模式下,
--displayId和--headless会被忽略。已连接的 RDP 会话始终只显示一个虚拟显示器,其尺寸取决于服务协商结果。 - 有两个显示器列表命令,行为各不相同,请选择正确的命令:
list_displays(带下划线,平台工具)— 仅枚举本地物理显示器。不接受 RDP 标志。在 RDP 连接后毫无用处。listdisplays(不带下划线,操作工具)— 接受与connect/take_screenshot/等相同的 RDP 标志。在 RDP 模式下,它会返回协商后的虚拟显示器,例如[{ "id": "...", "name": "RDP 10.70.86.26:3389 (1280x720)", "primary": true }]。使用此命令确认实际分辨率。
- RDP 传输使用随
@midscene/computer一同提供的原生辅助程序二进制文件。如果出现RDP helper binary not found错误,说明安装包中缺少可选的bin/<platform>/rdp-helper,请重新安装该包或解压新的 tarball。 - 将 RDP 凭据视为密钥:不要将包含
--password的.env文件提交到仓库;建议在当前 shell 中使用export RDP_PASSWORD=...,并通过--password "$RDP_PASSWORD"引用。 - 延迟预期:每次 CLI 调用都会启动一个全新的 Node 进程,因此每条命令都会重新建立 RDP 会话。大致预留:
connect/take_screenshot/keyboardpress/scroll:约 5 秒(Node 启动 + RDP TLS+NLA 握手 + 首帧)。act/assert/tap --locate:约 5 秒 + AI 推理 + 任何计划中的子操作;典型交互端到端预计需要 8–20 秒。- RDP 握手本身约需 700 毫秒;CLI 的运行方式决定了其余冷启动开销无法避免。
- 连接失败诊断:
connect失败时,stderr 的第一行是可操作的错误信息(例如connect_failed: Failed to connect to RDP server: ERRCONNECT_LOGON_FAILURE: Logon failed.)。后续堆栈跟踪只是诊断噪声 — 读取第一行,然后检查凭据/网络。常见的ERRCONNECT_*原因:LOGON_FAILURE— 用户名/密码/域错误。CONNECT_TRANSPORT_FAILED— 主机无法访问或 RDP 端口被阻止。使用nc -zv <host> 3389验证。TLS_CONNECT_FAILED— TLS 握手被拒绝。对于使用自签名证书的开发主机,可尝试--ignore-certificate;也可指定--security-protocol nla。
connect --host ... 成功后,其余工作流(act、tap --locate、assert、take_screenshot、listdisplays、report-tool、disconnect)与本地模式相同 — 只需记得在后续每条命令中都传入相同的 --host/--username/--password/--ignore-certificate 标志,因为每次 CLI 调用都是无状态的,并会重新连接。
列出显示器
npx -y @midscene/computer@1 list_displays
截取屏幕截图
npx -y @midscene/computer@1 take_screenshot
截取屏幕截图后,请读取保存的图像文件,了解当前屏幕状态,再决定下一步操作。
执行操作
使用 act 与计算机交互并获取结果。它会在内部自主处理所有 UI 交互,包括点击、输入、滚动、等待和导航,因此应将复杂的高层任务作为整体交给它,而不是拆分成多个小步骤。请用自然语言描述你要做什么以及期望达到的效果:
# specific instructions
npx -y @midscene/computer@1 act --prompt "type hello world in the search field and press Enter"
npx -y @midscene/computer@1 act --prompt "drag the file icon to the Trash"
# or target-driven instructions
npx -y @midscene/computer@1 act --prompt "search for the weather in Shanghai using the Chrome browser, tell me the result"
断言当前屏幕状态
使用 assert 验证当前屏幕是否符合自然语言条件。它不会执行 UI 操作,只会检查可见的屏幕状态,并且仅在断言为真时通过。可用于验证、QA 检查以及在 act 执行后验证最终状态。
npx -y @midscene/computer@1 assert --prompt "there is a login button visible"
npx -y @midscene/computer@1 assert --prompt "the active window shows a saved confirmation message"
npx -y @midscene/computer@1 assert --displayId 1 --prompt "the file picker is open"
默认情况下,断言失败时会抛出 AI 生成的原因。传入 --message 可改为抛出自定义错误消息,这有助于在 QA 和 CI 日志中显示预期结果。
npx -y @midscene/computer@1 assert \
--prompt "the export completed dialog is visible" \
--message "the export should finish after clicking Save"
当断言需要与参考图像(图标、徽标、屏幕截图)进行比较时,传入 --image 指定 URL/路径,并传入 --image-name 指定其显示名称。每个 --image 都可以是 http(s) 链接、data: URI 或本地文件路径。需要附加多张图像时,按相同顺序重复这两个标志。模型无法直接访问 URL 时,添加 --convertHttpImage2Base64 true。需要 @midscene/[email protected]+。
npx -y @midscene/computer@1 assert \
--prompt "the active window matches the supplied reference screenshot" \
--image "https://example.com/reference.png" \
--image-name "reference" \
--convertHttpImage2Base64 true
# or with a local file
npx -y @midscene/computer@1 assert \
--prompt "the visible icon matches the supplied logo" \
--image "./fixtures/logo.png" \
--image-name "logo"
# multiple reference images — pair --image and --image-name by order
npx -y @midscene/computer@1 assert \
--prompt "the active window matches both the icon and the logo" \
--image "./fixtures/icon.png" --image-name "icon" \
--image "./fixtures/logo.png" --image-name "logo"
使用参考图像精确定位目标
当用户提供屏幕截图、图标、徽标或参考图像并要求精确匹配视觉效果时,优先使用 tap --locate,而不是通用的 act --prompt。以 JSON 格式传入 --locate。prompt 用于描述目标,images 用于提供带名称的参考图像;当图像 URL 可能无法被模型直接访问时,convertHttpImage2Base64: true 会很有用。
npx -y @midscene/computer@1 tap --locate '{
"prompt": "tap the area contains the image",
"images": [
{
"name": "target image",
"url": "https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png"
}
],
"convertHttpImage2Base64": true
}'
相同的 locate JSON 结构也适用于其他接受 locate 参数的命令。
断开连接
npx -y @midscene/computer@1 disconnect
使用报告文件
建议先使用生成的 HTML 报告供人工阅读。报告包含逐步执行详情和每项操作的回放视频,能让人更轻松地了解发生了什么并排查问题。
如果其他技能或工具需要使用报告,先通过同一平台 CLI 包中的 report-tool 转换报告。基于 LLM 的工作流优先使用 Markdown。需要以编程方式处理报告时,使用 JSON。
npx -y @midscene/computer@1 report-tool --action to-markdown --htmlPath ./midscene_run/report/.../index.html --outputDir ./output-markdown
npx -y @midscene/computer@1 report-tool --action split --htmlPath ./midscene_run/report/.../index.html --outputDir ./output-data
工作流模式
由于 CLI 命令在多次调用之间是无状态的,请遵循以下模式:
- 连接以建立会话
- 健康检查 — 查看
connect命令的输出。如果connect已执行健康检查(屏幕截图和鼠标移动测试),则无需额外检查。如果connect未执行健康检查,请手动检查:截取屏幕截图并确认成功,然后将鼠标移动到随机位置(act --prompt "move the mouse to a random position"),并确认成功。如果任一步骤失败,请停止并排查问题,然后再继续。只有两项检查都成功且没有错误后,才能继续下一步。 - 启动目标应用并截取屏幕截图以查看当前状态,确保应用已启动并显示在屏幕上。
- 执行操作 — 使用
act执行所需操作或由目标驱动的指令;需要验证操作后的屏幕状态时,使用assert。 - 完成后断开连接
- 报告结果 — 总结已完成的工作,展示任务期间发现的关键信息和提取的数据,并列出所有生成的文件(屏幕截图、日志等)及其路径
最佳实践
- 始终先运行健康检查:连接后,查看
connect命令的输出。如果connect已执行健康检查(截图和鼠标移动测试),则无需额外检查。如果没有,请手动检查:截取屏幕截图,并将鼠标移至随机位置。两项操作都必须成功(无错误)后,才能继续执行其他操作。这样可以尽早发现环境问题。 - 使用此技能前,先将目标应用置于前台:为提高效率,请先通过其他方式将应用置于前台(例如,在 macOS 上使用
open -a <AppName>,在 Windows 上使用start <AppName>),然后再调用任何 midscene 命令。接着截取屏幕截图,确认应用确实处于前台。只有在通过视觉确认后,才能使用此技能进行 UI 自动化。避免通过 midscene 使用 Spotlight、“开始”菜单搜索或其他启动器方式——这些方式会涉及临时 UI、多个 AI 推理步骤,且速度明显较慢。 - 明确描述 UI 元素:不要使用含糊的描述,请提供清晰、具体的细节。例如,说“
Safari窗口左上角的黄色最小化按钮”,而不是“按钮”。 - 尽可能描述位置:通过描述元素的位置来帮助定位(例如,“菜单栏右上角的图标”、“左侧边栏中的第三项”)。
- 切勿在后台运行:每条 midscene 命令都必须同步运行——后台执行会破坏“截图-分析-操作”循环。
- 检查是否有多个显示器:如果启动应用后无法在截图中看到它,应用窗口可能打开在另一台显示器上。使用
list_displays检查可用的显示器。你有两个选择:将应用窗口移至当前显示器,或使用connect --displayId <id>切换到应用所在的显示器。 - 将相关操作合并到一条
act命令中:在同一应用中连续操作时,请将它们合并为一个act提示词,而不是拆分成多条命令。例如,“搜索 X,点击第一个结果,然后向下滚动查看更多详情”应作为一次act调用,而不是三次。这能减少往返次数,避免不必要的截图-分析循环,并显著提升速度。 - 运行前设置
PATH(macOS):在 macOS 上,如果PATH不完整,某些命令(例如system_profiler)可能无法找到。在运行任何 midscene 命令之前,请确保PATH包含标准系统目录:
这样可以避免因缺少系统实用程序而导致截图失败。export PATH="/usr/sbin:/usr/bin:/bin:/sbin:$PATH" - 使用
assert进行验证:如果目标是确认屏幕状态为真,请使用assert --prompt "...",而不是act提示词。断言应可观察且具体,例如“保存对话框已打开”或“导出完成消息可见”。 - 完成后始终报告结果:完成自动化任务后,必须主动向用户呈现结果,无需等待用户询问。内容包括:(1)回答用户的原始问题或说明所请求任务的结果;(2)执行过程中提取或观察到的关键数据;(3)截图及其他生成文件的路径;(4)对所执行步骤的简要总结。最后一条自动化命令执行完毕后,不要默默结束——用户期望在一次交互中获得完整结果。
- 提供参考图像时,优先使用
tap --locate:如果用户分享了截图、图标或徽标,并希望定位完全相同的视觉目标,请使用包含多模态locateJSON 对象(例如{ "prompt": "...", "images": [...] })的tap --locate,而不要只依赖act --prompt。
示例——上下文菜单交互:
npx -y @midscene/computer@1 act --prompt "right-click the file icon and select Delete from the context menu"
npx -y @midscene/computer@1 take_screenshot
示例——下拉菜单:
npx -y @midscene/computer@1 act --prompt "open the File menu and click New Window"
npx -y @midscene/computer@1 take_screenshot
提高精度(Deep Locate / Deep Think)
当 Midscene 难以完成任务时,可使用两个可选的全局标志。可将它们放在命令中的任意位置(子命令之前或之后);设置后,相关操作会默认使用它们,因此无需为每次调用单独传入参数。
--deep-locate— 额外进行一轮视觉推理,以精准定位目标元素。当操作与错误位置交互(位置漂移/偏移)时使用。它适用于所有需要定位元素的操作,包括tap --locate,以及act内部进行的定位。--deep-think— 使用更深入的推理来规划act(提供更丰富的上下文并拆分子目标)。用于复杂的多步骤act指令;它只影响规划。
这两个标志都会牺牲少许速度来换取更好的结果,也可以同时使用。
# more accurate element location (helps act's internal locating too)
npx -y @midscene/computer@1 act --deep-locate --prompt "click the tiny red close button in the top-left of the window"
# deeper planning for a complex, multi-step act
npx -y @midscene/computer@1 act --deep-think --prompt "open the Export dialog, choose PDF, and save it to the Desktop"
# combine both
npx -y @midscene/computer@1 act --deep-locate --deep-think --prompt "open Preferences and switch to the Advanced tab"
故障排查
macOS:拒绝辅助功能权限
你的终端应用没有辅助功能访问权限:
- 打开 系统设置 > 隐私与安全性 > 辅助功能
- 添加你的终端应用并启用它
- 授予权限后,重新启动终端应用
macOS:未找到 Xcode 命令行工具
xcode-select --install
未设置 API 密钥
检查 .env 文件是否包含 MIDSCENE_MODEL_API_KEY=<your-key>。
macOS:因未找到 system_profiler 而导致截图失败
如果 take_screenshot 失败并显示类似 system_profiler: command not found 的错误,则 PATH 环境变量可能不完整。运行以下命令进行修复:
export PATH="/usr/sbin:/usr/bin:/bin:/sbin:$PATH"
然后重试截图命令。
macOS:截图返回黑屏
如果 take_screenshot 返回完全黑色的图像,Mac 可能处于锁定状态(例如屏幕停留在登录/锁定窗口)。这是系统级限制——macOS 禁止在会话锁定时捕获屏幕内容,因此无法在应用层面绕过。
建议的修复方法: 使用屏幕保护程序,而不是锁定屏幕。屏幕保护程序会使用户会话保持活动且未锁定,从而允许正常截取屏幕。
- 打开 系统设置 > 锁定屏幕
- 将“启动屏幕保护程序或关闭显示器后要求输入密码”的延迟设得更长(或在自动化期间关闭此选项)
- 可选:在 系统设置 > 屏幕保护程序 中配置屏幕保护程序,以便显示器在闲置后仍会变暗但不会锁定
AI 无法找到元素
- 截取屏幕截图,确认元素确实可见
- 使用更具体的描述(包括颜色、位置和周围文字)
- 确保元素没有被其他窗口遮挡
@midscene/* 依赖版本过旧
- 检查本地版本:
npm ls @midscene/computer @midscene/core @midscene/shared(或pnpm why @midscene/computer)。 - 检查最新版本:
npm view @midscene/computer version、npm view @midscene/core version、npm view @midscene/shared version。 - 升级依赖:
npm i @midscene/computer@latest @midscene/core@latest @midscene/shared@latest。