Umbriel

io.github.ObscuritySRL由 GitHub 帳號 ObscuritySRL 發布v1.14.0更新於 Nov 3, 2026

See and drive a whole Windows machine from Bun — apps, input, screen, OCR, registry, OS — via MCP.

概覽

AI 產生的概覽

僅限 Windows 的 MCP 伺服器,讓助理透過 Bun 檢視並操作桌面應用程式、視窗、輸入、螢幕/OCR 與系統設定。

可以做什麼
  • 檢視並操作應用程式視窗:讀取 UI Automation 樹狀結構,依名稱、角色或 automationId 定位控制項,並執行叫用、輸入、捲動或切換。
  • 擷取並分析螢幕:取得視窗即時像素、全螢幕擷取,對畫布與遊戲使用範本比對與文字辨識。
  • 管理視窗與輸入:依控制代碼附加視窗,移動、置頂或調整大小,使用語意、訊息投遞或合成輸入,並讀寫剪貼簿。
  • 直接操作作業系統:處理程序、服務、排程工作、登錄檔、防火牆規則、網路介面卡、電源、磁碟區、環境變數、事件記錄與顯示模式。
  • 啟用完整設定時,還可啟動程式,並在沙箱根目錄內讀取、寫入、複製、移動或刪除檔案。
適用情境
適合需要助理操作沒有 API 的 Windows 桌面程式,例如舊式 Win32、WPF、WinUI、Electron 或 Java 應用程式,也適合需要檢視與修改服務、登錄檔、處理程序等機器層級設定時使用。對於偏好快取視窗文字快照而非反覆截圖的代理流程尤其合適。
執行需求
在 Windows 10 或 11 上本機執行,需要 Bun 1.1 或更新版本,透過 bunx umbriel 以 stdio 啟動;不需帳號或 API 金鑰。行為由環境變數控制:UMBRIEL_PROFILE(readonly、預設的 safe 或 full)、UMBRIEL_ALLOW、UMBRIEL_DENY、UMBRIEL_OS、UMBRIEL_FS_ROOT、UMBRIEL_CURSOR、UMBRIEL_AUDIT、UMBRIEL_TRACE、UMBRIEL_REDACT 與 UMBRIEL_FFI_TRACE。僅限桌面端。
安裝前請注意
full 設定與 UMBRIEL_OS 會開放啟動程式、結束處理程序、控制服務、寫入登錄檔、變更顯示模式以及刪除檔案的工具;除非確有需要,應維持預設的 safe 或 readonly 設定。合成輸入與真實點擊需要桌面處於解鎖狀態,除非將 UMBRIEL_CURSOR 設為 never,否則可能退回真實硬體游標並移動滑鼠。剪貼簿、環境變數與登錄檔讀取可能暴露機密;預設開啟遮蔽,可用 UMBRIEL_REDACT 關閉。稽核與追蹤日誌會寫入磁碟。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Umbriel,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

[Umbriel]

Umbriel · A set of hands for your AI agent — and Playwright for the Windows desktop

Drive any Windows app through five layers — fall back to OCR and pixel-matching when there's no other way in, see and manage windows even when they're hidden, use cursor-free semantic or posted input where Windows permits it, target controls by name and role, and reach past the GUI to drive the OS itself: processes, services, the registry, scheduled tasks, the firewall, network, power, displays, disks, environment, and the event log. Built for ChatGPT/Codex, Claude, and any AI agent that speaks MCP.

[npm] [license] [platform] [runtime] [deps]

What is it?

Umbriel drives the Windows desktop the way a person would — through whatever channel actually works for the app in front of it:

  1. Pixels & OCR — when an app exposes no tree at all (canvas, custom-draw, games), fall back to full-screen capture, template matching, and text recognition.
  2. Semantic control — read the UI Automation tree an app exposes and target controls by name and role, not coordinates. Survives the DPI, layout, and theme changes that shatter pixel scripts.
  3. Sight & window control — capture the live pixels of any window (even fully GPU-composited or occluded), inspect raw HWND hierarchies, and move, raise, or size windows.
  4. Input routing — semantic UIA and posted-message input for background-capable controls, with a verified SendInput fallback only when an HWND-less editor or real pointer gesture actually needs the foreground.
  5. Drive the OS, not just GUIs — when the task is the machine, act on it directly: read and write the registry (values and keys), list / kill / suspend / reprioritize processes, query / start / stop / configure services, create / delete / enumerate scheduled tasks, read the firewall rules, enumerate network adapters and live connections, drive session power (lock / restart / sleep / hibernate), list volumes and free space, get and set environment variables, read the event log, and read or change the display mode — all native, no PowerShell or shelling out.

Underneath it's a few kilobytes of TypeScript on Bun's built-in FFI — no Appium server, no .NET, no node-gyp, no prebuilt binaries.

Install

bash
bun add umbriel

That's the entire install story. No build step, nothing to compile.

Built for AI agents

This is what Umbriel is for. Register the published server with Codex (ChatGPT desktop, CLI, and the IDE share this configuration):

bash
codex mcp add umbriel -- bunx umbriel

Or register it with Claude:

bash
claude mcp add umbriel -- bunx umbriel

Any MCP-speaking agent can then ground itself in the accessibility tree in ~15 ms per step and use semantic, posted-message, synthetic-input, or pixel fallback as the target requires. Most classic controls remain driveable backgrounded; a no-own-HWND Chromium/WPF/WinUI editor needs a brief unlocked foreground lease for real input. Umbriel verifies that destination before injecting, can verify the resulting editor state, and restores the previous foreground window by default.

A screenshot agent burns image tokens on every step — then burns them again to screenshot its own result, because it can't read state out of pixels. Umbriel maps the whole window to plain text you cache once and reuse across steps, and reads results straight back from that map. Same grounding Microsoft's UFO2 and the OSWorld-Human benchmark recommend (structure first, vision second) — without the bill.

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

⚡ Maps a window in ~13 ms · tokens are text you cache once and reuse, not an image re-bought every step · up to ~2000× faster grounding than a 3–26 s screenshot pipeline

Per agent stepScreenshot agentUmbriel
Tokens1.5–2.7k image — then re-shot to self-check~3k text — cached & reused across steps
Grounding time3–26 s~13 ms
Reads state back?no — must take another screenshotyes — straight from the snapshot

Umbriel figures measured on Windows 11, Bun 1.4 (14.3 ms · ~3k tokens on Calculator; single property read ~58 µs) — reproduce with bun run example/benchmark.ts. Screenshot-pipeline figures are published third-party results (OSWorld-Human; computer-use image-token costs).

The MCP server exposes 99 snapshot-first tools (76 under the default safe profile; 41 under readonly; the 23 os/fs tools need full or UMBRIEL_OS=1) behind a deployer policy you control:

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

desktop_snapshot returns a ref-keyed view — Button "Five" [ref=e49#3] — and every action replies with the smallest faithful update: a compact delta when little changed, a pruned snapshot when more did. The model re-grounds without drowning in tokens.

For chronological chats and logs, desktop_snapshot { root: "Messages in general", tail: 20, maxDepth: 2 } returns only the newest direct children. This avoids paying for hundreds of old loaded rows before reaching the messages that need a response.

When the window handle is already known, the same scope can be applied on the first call: attach { hWnd: "0x123", root: "Messages in general", tail: 20, maxDepth: 2 }. Use maxDepth/maxNodes without root to bound any other large initial tree.

For controlled web editors such as Discord's Slate composer, use the MCP type tool with method: "paste", verify: true, and submit: true (plus clear: true only after confirming an existing draft may be replaced). UIA set_value can mutate the exposed DOM value without updating the application's internal editor model, so it is not a reliable background-send path. An ambiguous submission is reported as unverified; never retry it blindly.

Use it from your code

Umbriel is also a first-class library for E2E tests and desktop automation — find by name → wait → act → assert, just like getByRole on the web:

ts
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
ts
// 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"

Why Umbriel?

The Windows desktop-automation corner of npm is a minefield of native-addon build failures, paywalls, and abandoned daemons. There has been no zero-install, typed, in-process Windows-automation client for Node or Bun — until this.

Because Umbriel is plain TypeScript over Bun's own FFI, it:

  • Can't be paywalled — there's no compiled binary to gate behind a subscription registry.
  • Has no build step — no ABI matrix, no MSVC or Python toolchain, no node-gyp.
  • Talks to Windows in-process — no 127.0.0.1:4723 round-trip, no Appium daemon, no Developer Mode, no WinAppDriver.
How the alternatives compare (npm weekly downloads, week of 2026-06-05)
ToolWeekly dlThe catch
FlaUI / pywinauto / AutoItn/aA whole foreign runtime (.NET / Python / bespoke EXE) to install and ship.
@bright-fish/node-ui-automation33The only real npm UIA wrapper — dead since 2022.
@nut-tree-fork/nut-js32,360Fork of a now-paywalled original. Pixel/image-match only — no semantic model.
appium-windows-driver30,749Needs an Appium server plus a separate WinAppDriver.exe Microsoft hasn't maintained in years.
robotjs / @jitsi/robotjs11,375 / 15,333node-gyp C++ compile — the #1 documented install failure. Blind pixels + keystrokes, no element model.
uiohook-napi21,965Healthy, but global hooks run on a foreign thread and can segfault.

Highlights

CapabilityWhat it does
🌐Chromium & ElectronDrive the in-page DOM of Chrome, Edge, and Electron apps (Discord, Slack, Spotify, VS Code) as real elements — same API as native controls.
🛠️Drive the OS, not just GUIsRegistry (read + typed write + key create/delete), processes (info / kill / suspend / reprioritize), services (+ config), scheduled tasks (+ create / delete), firewall rules, network adapters & connections, session power, volumes & free space, env vars, event log, displays (read + set mode) — all native, no PowerShell.
📋ClipboardLarge-text paste with no per-keystroke corruption, plus copy-and-read from any app.
🌑Drive in the darkinvoke / scroll / setValue / toggle move no cursor — they work on hidden, minimized, occluded, or locked windows.
🖼️Pixel & OCR fallbackCoordinate clicks, full-screen capture, template matching, and text recognition for canvases and games.
🔎Reads everythingMSAA trees, bounding boxes, data-grid cells, enabled/checked state, native HWND hierarchies, text, and values.
🌍Real Unicode inputJapanese, Korean, accented Latin, and emoji round-trip through three input paths — proven by a regression test.
👁️See the unseenCapture the live pixels of a GPU-composited or occluded window via Windows.Graphics.Capture.
🎯Semantic targetingFind controls by automationId, name, or role — exact matches filtered inside the target app for speed.
🧩Works across the stackElectron/Chromium, Java, Qt, WPF, Win32, WinForms, WinUI/UWP — each pinned by its own regression test.
⏳waitForPlaywright-style auto-retry for flaky native UIs, with timeouts that quote the nearest candidates and your selector.

Requirements

  • Semantic first, pixels where there's no structure — custom-draw, games, and WebGL surfaces fall back to the built-in pixel + OCR layer; everything with a tree gets exact semantic targeting.
  • Synthetic typing and real clicks need an unlocked desktop — invoke, reads, and setValue work even on a locked session, so prefer them.
  • Minimized driving is for classic Win32 windows — invoke / setValue / toggle keep working on a minimized or fully backgrounded classic Win32/HWND window, but a UWP/WinUI store app suspends its UI thread and accessibility tree when minimized (the tree reads empty and posted actions don't land until it's restored), so restore it first.
  • Windows 10 or 11, Bun ≥ 1.1 — Windows-only and Bun-only, the owned trade-off for zero dependencies and in-process speed.

Going deeper

The complete API surface lives in AI.md — written so thoroughly that an agent (or a developer) never needs to read the source. Runnable demos are in example/.


MIT Licensed · Built on bun:ffi with zero native dependencies

來源:README.md,提交 752d5f2

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v1.14.0最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分