mcpField
U
umbriel

umbriel

本地服务
github.com/ObscuritySRL开发工具311 周前更新

关于 umbriel

umbriel 是面向 AI Agent 和开发者的 Windows 桌面自动化库及 MCP 服务,结合语义化界面控制、OCR、像素操作、窗口管理和系统操作,并基于 Bun 运行。

主要功能

  1. 01按名称和角色定位控件
  2. 02检查界面树和窗口
  3. 03通过 OCR 与像素交互
  4. 04键盘、剪贴板与输入路由
  5. 05原生管理 Windows 进程与系统

适用场景

  1. 01为 AI Agent 自动操作 Windows 应用
  2. 02用语义选择器测试桌面界面
  3. 03通过工具管理操作系统

MCP 相关

MCP 服务向 MCP 客户端提供桌面观察、交互和操作系统工具。可通过 readonly、safe 或 full 配置限制访问范围。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"obscuritysrl-umbriel": {
"command": "npx",
"args": [
"-y",
"umbriel"
],
"env": {
"UMBRIEL_PROFILE": "<UMBRIEL_PROFILE>",
"UMBRIEL_OS": "<UMBRIEL_OS>",
"UMBRIEL_ALLOW": "<UMBRIEL_ALLOW>",
"UMBRIEL_DENY": "<UMBRIEL_DENY>",
"UMBRIEL_CURSOR": "<UMBRIEL_CURSOR>",
"UMBRIEL_FS_ROOT": "<UMBRIEL_FS_ROOT>",
"UMBRIEL_TRACE": "<UMBRIEL_TRACE>",
"UMBRIEL_FFI_TRACE": "<UMBRIEL_FFI_TRACE>",
"UMBRIEL_AUDIT": "<UMBRIEL_AUDIT>",
"UMBRIEL_REDACT": "<UMBRIEL_REDACT>"
}
}
}
}
启动命令npx -y umbriel
需要配置的环境变量
UMBRIEL_PROFILECapability profile: 'readonly' (inspect/read only), 'safe' (read + input + window — default), or 'full' (also os + fs tools).
UMBRIEL_OSSet to '1' to allow the 'os' tools (launch_app/run_program/open_path, kill_process, manage_process, control_service, set_env, registry_get/registry_list/registry_set) AND the 'fs' tools (read_file/write_file/list_dir/stat_path/make_dir/copy_file/move_file/delete_file) regardless of profile.
UMBRIEL_ALLOWComma-separated tool names or categories to additionally allow on top of the profile.
UMBRIEL_DENYComma-separated tool names or categories to deny, overriding the profile and UMBRIEL_ALLOW.
UMBRIEL_CURSORSet to 'never' to forbid the real-cursor fallback entirely (strictly cursor-free). By default clicks/drags are cursor-free but fall back to the real hardware cursor when no cursor-free path exists.
UMBRIEL_FS_ROOTSandbox root directory that the fs-category file tools (read_file/write_file/list_dir/stat_path/make_dir/copy_file/move_file/delete_file) are confined to when fs tools are enabled; open_path's path argument is honored too.
UMBRIEL_TRACEFile path to journal every mutating tool call as JSON Lines (tool, category, masked args, ok, observation); secret-bearing args and values are redacted. Unset = no trace.
UMBRIEL_FFI_TRACEFile path to a flush-before-call diagnostic journal of every COM vcall (slot, this-pointer, arg count). Each line is written and flushed to the OS BEFORE the native call, so after an uncatchable crash the last line names the faulting call. Has per-call overhead; unset = off. For debugging native faults only.
UMBRIEL_AUDITControls the default-on stderr audit of mutating tool calls. 'off' is the explicit opt-out (reported at startup); 'verbose' also audits reads.
UMBRIEL_REDACTCredential masking (default on). 'off' opts out; a regex value overrides the built-in secret shapes masked in clipboard/env/registry reads and the trace journal.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmumbriel1.14.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Umbriel

Umbriel · 为你的 AI Agent 配备一双手——以及用于 Windows 桌面的 Playwright

通过五层方式操控任意 Windows 应用——无计可施时回退到 OCR 和像素匹配;即使窗口处于隐藏状态,也能查看和管理它们;在 Windows 允许的情况下,使用无需光标的语义输入或消息投递输入;按名称和角色定位控件;还可以越过 GUI,直接操控操作系统本身:进程、服务、注册表、计划任务、防火墙、网络、电源、显示器、磁盘、环境变量和事件日志。专为 ChatGPT/Codex、Claude 以及任何支持 MCP 的 AI Agent 打造。

npm license platform runtime deps

这是什么?

Umbriel 会像人一样操控 Windows 桌面——根据当前应用的实际情况,使用真正有效的方式:

  1. 像素与 OCR——当应用完全不提供控件树时(画布、自定义绘制界面、游戏),回退到全屏捕获、模板匹配和文本识别。
  2. 语义控件——读取应用提供的 UI Automation 树,按名称和角色定位控件,而不是依赖坐标。即使 DPI、布局和主题发生变化,也能继续工作,不会像像素脚本那样失效。
  3. 查看与窗口控制——捕获任意窗口的实时像素(即使窗口完全由 GPU 合成或被遮挡),检查原始 HWND 层级,并移动、置顶或调整窗口大小。
  4. 输入路由——对支持后台操作的控件使用语义 UIA 和消息投递输入;只有当无 HWND 的编辑器或真实指针手势确实需要前台操作时,才回退到经验证的 SendInput。
  5. 操控操作系统,而不仅是 GUI——当任务就是操作系统本身时,直接对其进行操作:读取和写入注册表(包括值和项),列出 / 终止 / 挂起 / 调整优先级进程,查询 / 启动 / 停止 / 配置服务,创建 / 删除 / 枚举计划任务,读取防火墙规则,枚举网络适配器和实时连接,控制会话电源(锁定 / 重启 / 睡眠 / 休眠),列出卷和可用空间,获取和设置环境变量,读取事件日志,以及读取或更改显示模式——全部使用原生功能,无需 PowerShell 或调用 shell。

底层只需几 KB 的 TypeScript,运行于 Bun 内置的 FFI 之上——无需 Appium 服务、.NET、node-gyp 或预编译二进制文件。

安装

bun add umbriel

安装就这么简单。无需构建,也无需编译任何内容。

专为 AI Agent 打造

Umbriel 的用途就在于此。将已发布的服务注册到 Codex(ChatGPT 桌面应用、CLI 和 IDE 共用此配置):

codex mcp add umbriel -- bunx umbriel

也可以将其注册到 Claude:

claude mcp add umbriel -- bunx umbriel

之后,任何支持 MCP 的 Agent 都能以每步约 15 ms 的速度根据无障碍树确定操作目标,并根据目标需要使用语义操作、发送消息、合成输入或像素回退方式。大多数经典控件在窗口处于后台时仍可操作;没有自身 HWND 的 Chromium/WPF/WinUI 编辑器则需要短暂解锁前台租约,才能接收真实输入。Umbriel 会在注入前验证目标窗口,可以验证操作后的编辑器状态,并默认恢复之前的前台窗口。

截图 Agent 每一步都要消耗图像令牌——然后还要再消耗一次,对自己的操作结果截图,因为它无法从像素中读取状态。Umbriel 会将整个窗口映射为纯文本,只需缓存一次,就能在后续步骤中重复使用,并直接从该映射中读取结果。微软的 UFO2 和 OSWorld-Human 基准测试所建议的 grounding 方式也是如此(结构优先,视觉其次)——而且不用付出高昂成本。

umbriel.tree(app, { agentProfile: true });
// → one cached round-trip → { role, name, automationId, bounds, children }

⚡ 约 13 ms 即可映射一个窗口 · 令牌是缓存一次即可重复使用的文本,而不是每一步都要重新购买的图像 · grounding 速度最高可比 3–26 s 的截图流程快约 2000 倍

每个 Agent 步骤截图 AgentUmbriel
令牌1.5–2.7k 图像令牌——然后重新截图自检约 3k 文本令牌——缓存后可在多个步骤中重复使用
grounding 时间3–26 s约 13 ms
能否读取状态?不能——必须再截一张图能——直接从快照中读取

Umbriel 数据在 Windows 11、Bun 1.4 上测得(计算器上为 14.3 ms · 约 3k 令牌;单次属性读取约 58 µs)——可通过 bun run example/benchmark.ts 复现。截图流程数据来自已发布的第三方结果(OSWorld-Human;计算机使用场景的图像令牌成本)。

MCP 服务提供 99 个快照优先工具(默认 safe 配置文件下为 76 个;readonly 下为 41 个;23 个 os/fs 工具需要 full 或 UMBRIEL_OS=1),并受你控制的部署策略约束:

UMBRIEL_PROFILE=readonly   # observe only
UMBRIEL_PROFILE=safe       # default — observe + cursor-free control + window management
UMBRIEL_PROFILE=full       # everything, including launch/run/file tools

desktop_snapshot 会返回以 ref 为键的视图——Button "Five" [ref=e49#3]——每次操作都会返回最精简但忠实的更新:变化较少时返回紧凑增量,变化较多时返回精简后的快照。模型可以重新确定操作目标,而不会被令牌淹没。

对于按时间顺序排列的聊天记录和日志,desktop_snapshot { root: "Messages in general", tail: 20, maxDepth: 2 } 只会返回最新的直接子项。这样在到达需要回复的消息之前,就不必为数百条已加载的旧记录付费。

如果已知窗口句柄,可以在首次调用时应用相同的范围:attach { hWnd: "0x123", root: "Messages in general", tail: 20, maxDepth: 2 }。若要限制其他大型初始树的范围,可在不指定 root 时使用 maxDepth/maxNodes。

对于 Discord 的 Slate 撰写框等受控 Web 编辑器,请使用 MCP type 工具并设置 method: "paste"、verify: true 和 submit: true(仅在确认可以替换现有草稿后再添加 clear: true)。UIA set_value 可能会修改已公开的 DOM 值,却不更新应用程序内部的编辑器模型,因此不能作为可靠的后台发送方式。提交结果不明确时会报告为未验证;切勿盲目重试。

在代码中使用

Umbriel 也是一款一等公民库,可用于 E2E 测试和桌面自动化——按名称查找 → 等待 → 操作 → 断言,就像在 Web 上使用 getByRole 一样:

import { ControlType, umbriel } from 'umbriel';

const app  = await umbriel.launch(['notepad.exe'], { className: 'Notepad' });
const edit = await app.waitFor({ controlType: ControlType.Document });

edit.focus().type('nothing native compiles, and it just works');
console.log(edit.text()); // → nothing native compiles, and it just works
// Drive Calculator to 5 + 3 = 8 — by name, not pixels:
const calc = await umbriel.launch(['cmd', '/c', 'start', 'calc'], { title: 'Calculator' });

for (const name of ['Five', 'Plus', 'Three', 'Equals'])
  calc.find({ controlType: ControlType.Button, name })?.invoke();

console.log(calc.find({ automationId: 'CalculatorResults' })?.name); // → "Display is 8"

为什么选择 Umbriel?

npm 中用于 Windows 桌面自动化的领域遍布原生插件构建失败、付费墙和弃置的守护进程。此前,Node 或 Bun 一直没有免安装、带类型、进程内运行的 Windows 自动化客户端——直到现在。

由于 Umbriel 是基于 Bun 自带 FFI 的纯 TypeScript,因此它:

  • 无法设置付费墙——没有可通过订阅注册表设限的已编译二进制文件。
  • 无需构建步骤——没有 ABI 矩阵、无需 MSVC 或 Python 工具链,也无需 node-gyp。
  • 在进程内与 Windows 通信——无需通过 127.0.0.1:4723 往返,无需 Appium 守护进程、开发人员模式或 WinAppDriver。
各替代方案对比(npm 每周下载量,2026-06-05 当周)
工具每周下载量注意事项
FlaUI / pywinauto / AutoIt不适用必须安装并随产品分发一整套外部运行时(.NET / Python / 专用 EXE)。
@bright-fish/node-ui-automation33唯一真正的 npm UIA 封装库——自 2022 年起已停止维护。
@nut-tree-fork/nut-js32,360已设置付费墙的原项目的分支。仅支持像素/图像匹配——没有语义模型。
appium-windows-driver30,749需要 Appium 服务,还需要单独的 WinAppDriver.exe,而 Microsoft 多年来一直没有维护它。
robotjs / @jitsi/robotjs11,375 / 15,333需要通过 node-gyp 编译 C++——有记录以来最常见的安装失败原因。只能盲目操作像素和按键,没有元素模型。
uiohook-napi21,965维护状态良好,但全局钩子运行在外部线程上,可能导致段错误。

亮点

能力功能说明
🌐Chromium 和 Electron将 Chrome、Edge 和 Electron 应用(Discord、Slack、Spotify、VS Code)页面中的 DOM 作为真实元素进行操作——与原生控件使用相同的 API。
🛠️操作整个操作系统,而不只是 GUI注册表(读取、带类型写入、创建/删除项)、进程(查看信息/终止/挂起/调整优先级)、服务(及配置)、计划任务(及创建/删除)、防火墙规则、网络适配器和连接、会话电源、卷和可用空间、环境变量、事件日志、显示器(读取和设置模式)——全部使用原生方式,无需 PowerShell。
📋剪贴板粘贴大段文本,不会因逐键输入而损坏;也可以从任意应用复制并读取内容。
🌑在后台操作invoke / scroll / setValue / toggle 不会移动光标——可操作隐藏、最小化、被遮挡或锁定的窗口。
🖼️像素和 OCR 备用方案支持坐标点击、全屏捕获、模板匹配和文本识别,可用于画布和游戏。
🔎读取所有内容支持 MSAA 树、边界框、数据网格单元格、启用/选中状态、原生 HWND 层级结构、文本和值。
🌍真正的 Unicode 输入日语、韩语、带变音符号的拉丁文字和表情符号均可通过三种输入方式完整传输——已有回归测试验证。
👁️洞察不可见内容通过 Windows.Graphics.Capture 捕获经 GPU 合成或被遮挡窗口的实时像素。
🎯语义定位按 automationId、名称或角色查找控件——在目标应用内筛选精确匹配项,提高速度。
🧩覆盖整个技术栈Electron/Chromium、Java、Qt、WPF、Win32、WinForms、WinUI/UWP——每种技术都有各自的回归测试作为保障。
⏳waitFor为不稳定的原生 UI 提供 Playwright 风格的自动重试;超时时会列出最接近的候选项和你的选择器。

要求

  • 优先使用语义定位,只有没有结构时才使用像素——自定义绘制界面、游戏和 WebGL 表面会回退到内置的像素 + OCR 层;所有具有树结构的界面都可进行精确的语义定位。
  • 模拟输入和真实点击需要解锁的桌面——invoke、读取和 setValue 即使在锁定会话中也能工作,因此优先使用它们。
  • 最小化状态下的操作适用于经典 Win32 窗口——invoke / setValue / toggle 在经典 Win32/HWND 窗口最小化或完全置于后台时仍可工作,但 UWP/WinUI 商店应用最小化时会挂起其 UI 线程和辅助功能树(树读取结果为空,已发送的操作也不会生效,直到应用恢复),因此请先恢复应用。
  • Windows 10 或 11、Bun ≥ 1.1——仅支持 Windows 和 Bun,这是实现零依赖与进程内高速运行所付出的代价。

深入了解

完整的 API 位于 AI.md 中——内容详尽,确保 Agent(或开发者)无需阅读源码。可运行的演示位于 example/。


MIT 许可 · 基于 bun:ffi 构建,零原生依赖

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。