mcpField
C
computer-automation

computer-automation

github.com/web-infra-devAgent 工作流3183.3k 次安装11 周前更新
代码仓库

关于 computer-automation

通过 Midscene 命令行自动操作 macOS、Windows 和 Linux 桌面界面的技能。它支持本地显示器和通过 RDP 连接的远程 Windows 桌面,并以截图引导自然语言操作和断言。

主要功能

  1. 01自然语言桌面操作
  2. 02截图捕获与断言
  3. 03选择本地显示器
  4. 04通过 RDP 操作远程 Windows
  5. 05使用参考图像定位

适用场景

  1. 01自动执行多步骤桌面界面任务
  2. 02在桌面 QA 中检查可见结果
  3. 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确认已加载。

详细介绍

桌面计算机自动化

关键规则——违反规则会导致工作流中断:

  1. 绝不要在后台运行 midscene 命令。 每条命令都必须同步运行,以便你读取其输出(尤其是屏幕截图)后再决定下一步操作。后台执行会破坏“截图—分析—操作”循环。
  2. 一次只能运行一条 midscene 命令。 等待上一条命令完成并读取屏幕截图,然后再决定下一步操作。绝不要串联运行多条命令。
  3. 为每条命令预留足够的完成时间。 Midscene 命令涉及 AI 推理和屏幕交互,耗时可能比典型的 shell 命令更长。通常一条命令需要约 1 分钟;复杂的 act 命令可能需要更久。
  4. 结束前务必汇报任务结果。 自动化任务完成后,你必须主动向用户总结结果,包括找到的关键数据、完成的操作、拍摄的屏幕截图,以及任何相关发现。最后一个自动化步骤完成后,绝不要不作说明就结束;用户期望在一次交互中获得完整答复。
  5. 只最小化窗口,除非用户明确要求,否则绝不要关闭窗口。 需要让窗口消失或不再碍事时,应将其最小化,而不是关闭。除非用户明确要求,否则不要关闭任何应用或窗口。

使用 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 命令在多次调用之间是无状态的,请遵循以下模式:

  1. 连接以建立会话
  2. 健康检查 — 查看 connect 命令的输出。如果 connect 已执行健康检查(屏幕截图和鼠标移动测试),则无需额外检查。如果 connect 未执行健康检查,请手动检查:截取屏幕截图并确认成功,然后将鼠标移动到随机位置(act --prompt "move the mouse to a random position"),并确认成功。如果任一步骤失败,请停止并排查问题,然后再继续。只有两项检查都成功且没有错误后,才能继续下一步。
  3. 启动目标应用并截取屏幕截图以查看当前状态,确保应用已启动并显示在屏幕上。
  4. 执行操作 — 使用 act 执行所需操作或由目标驱动的指令;需要验证操作后的屏幕状态时,使用 assert。
  5. 完成后断开连接
  6. 报告结果 — 总结已完成的工作,展示任务期间发现的关键信息和提取的数据,并列出所有生成的文件(屏幕截图、日志等)及其路径

最佳实践

  1. 始终先运行健康检查:连接后,查看 connect 命令的输出。如果 connect 已执行健康检查(截图和鼠标移动测试),则无需额外检查。如果没有,请手动检查:截取屏幕截图,并将鼠标移至随机位置。两项操作都必须成功(无错误)后,才能继续执行其他操作。这样可以尽早发现环境问题。
  2. 使用此技能前,先将目标应用置于前台:为提高效率,请先通过其他方式将应用置于前台(例如,在 macOS 上使用 open -a <AppName>,在 Windows 上使用 start <AppName>),然后再调用任何 midscene 命令。接着截取屏幕截图,确认应用确实处于前台。只有在通过视觉确认后,才能使用此技能进行 UI 自动化。避免通过 midscene 使用 Spotlight、“开始”菜单搜索或其他启动器方式——这些方式会涉及临时 UI、多个 AI 推理步骤,且速度明显较慢。
  3. 明确描述 UI 元素:不要使用含糊的描述,请提供清晰、具体的细节。例如,说“Safari 窗口左上角的黄色最小化按钮”,而不是“按钮”。
  4. 尽可能描述位置:通过描述元素的位置来帮助定位(例如,“菜单栏右上角的图标”、“左侧边栏中的第三项”)。
  5. 切勿在后台运行:每条 midscene 命令都必须同步运行——后台执行会破坏“截图-分析-操作”循环。
  6. 检查是否有多个显示器:如果启动应用后无法在截图中看到它,应用窗口可能打开在另一台显示器上。使用 list_displays 检查可用的显示器。你有两个选择:将应用窗口移至当前显示器,或使用 connect --displayId <id> 切换到应用所在的显示器。
  7. 将相关操作合并到一条 act 命令中:在同一应用中连续操作时,请将它们合并为一个 act 提示词,而不是拆分成多条命令。例如,“搜索 X,点击第一个结果,然后向下滚动查看更多详情”应作为一次 act 调用,而不是三次。这能减少往返次数,避免不必要的截图-分析循环,并显著提升速度。
  8. 运行前设置 PATH(macOS):在 macOS 上,如果 PATH 不完整,某些命令(例如 system_profiler)可能无法找到。在运行任何 midscene 命令之前,请确保 PATH 包含标准系统目录:
    export PATH="/usr/sbin:/usr/bin:/bin:/sbin:$PATH"
    
    这样可以避免因缺少系统实用程序而导致截图失败。
  9. 使用 assert 进行验证:如果目标是确认屏幕状态为真,请使用 assert --prompt "...",而不是 act 提示词。断言应可观察且具体,例如“保存对话框已打开”或“导出完成消息可见”。
  10. 完成后始终报告结果:完成自动化任务后,必须主动向用户呈现结果,无需等待用户询问。内容包括:(1)回答用户的原始问题或说明所请求任务的结果;(2)执行过程中提取或观察到的关键数据;(3)截图及其他生成文件的路径;(4)对所执行步骤的简要总结。最后一条自动化命令执行完毕后,不要默默结束——用户期望在一次交互中获得完整结果。
  11. 提供参考图像时,优先使用 tap --locate:如果用户分享了截图、图标或徽标,并希望定位完全相同的视觉目标,请使用包含多模态 locate JSON 对象(例如 { "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:拒绝辅助功能权限

你的终端应用没有辅助功能访问权限:

  1. 打开 系统设置 > 隐私与安全性 > 辅助功能
  2. 添加你的终端应用并启用它
  3. 授予权限后,重新启动终端应用
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 禁止在会话锁定时捕获屏幕内容,因此无法在应用层面绕过。

建议的修复方法: 使用屏幕保护程序,而不是锁定屏幕。屏幕保护程序会使用户会话保持活动且未锁定,从而允许正常截取屏幕。

  1. 打开 系统设置 > 锁定屏幕
  2. 将“启动屏幕保护程序或关闭显示器后要求输入密码”的延迟设得更长(或在自动化期间关闭此选项)
  3. 可选:在 系统设置 > 屏幕保护程序 中配置屏幕保护程序,以便显示器在闲置后仍会变暗但不会锁定
AI 无法找到元素
  1. 截取屏幕截图,确认元素确实可见
  2. 使用更具体的描述(包括颜色、位置和周围文字)
  3. 确保元素没有被其他窗口遮挡
@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。

评论

支持 Markdown