Model-agnostic computer-use MCP: screenshot, safety-gated actions, Windows UIA targeting.
Model-agnostic “computer-use” MCP server exposed over the Model Context Protocol (MCP). It provides tools for screenshot capture and safety-gated actions, with Windows GUI targeting via UIA. Distributed as an npm package and described as a launcher for the open-compute MCP server.
🛠️ Key Features
Screenshot functionality
Safety-gated actions
Windows UIA (UI Automation) targeting
Model-agnostic computer-use tooling
🚀 Use Cases
Automating GUI tasks on Windows with MCP clients
Building AI toolchains that require screenshot-based context
Running computer-use workflows with gated action execution
⚡ Developer Benefits
Integrates with MCP (model context protocol)
Packaged for Node.js via npm (npm-package, nodejs)
Reusable for AI tools using GUI automation
⚠️ Limitations
Windows UIA targeting implies platform dependency (Windows-focused)
Functionality described as gated, which may restrict action execution flow
npm launcher for the open-compute MCP server —
model-agnostic computer-use tools exposed over the Model Context Protocol (MCP).
IMPORTANT
Local stdio only. Real capture and input require an interactive Windows
desktop session on the MCP client's own host. This launcher is not Glama-hostable;
a hosted "Deploy Server" flow cannot access your desktop.
Install it in a local MCP client instead.
AI Assistant / Agent Integration: This repository contains an llms.txt file providing structured, machine-readable specifications of tools, safety modes (OC_SAFETY_MODE), and client configuration examples for RAG crawlers and autonomous agent frameworks.
The MCP client is the reasoner (no API key, model-agnostic): it calls capture
to see the screen, then acts with do / click_name / invoke. This is the keyless
Mode-A loop of open-compute, but as native tool-calls.
1. Architecture
graph TD
A["AI Reasoner<br/>(Claude / Antigravity / Cursor)"] -- "MCP stdio (JSON-RPC)" --> B["npx open-compute-mcp<br/>(Node.js Launcher)"]
B -- "Spawns via uvx" --> C["open-compute Python Engine<br/>(GitHub @ main)"]
C -- "Screenshots / WGC" --> D["Windows Display"]
C -- "UIA / Mouse / Keys" --> E["Windows Desktop Apps"]
C -- "Glowing Border & Cursor" --> F["Signal Overlay UI"]
subgraph Safety Gate
C -. "OC_SAFETY_MODE<br/>(confirm / read_only / allow_all)" .-> C
C -. "OC_DENY<br/>(hard action blacklist)" .-> C
end
This package is a thin launcher. It contains no server logic — it spawns the
Python open-compute server (pulled from GitHub) and pipes MCP stdio through.
Real screen capture and input require the interactive Windows desktop session.
Fail-closed Action Execution: Coordinates consume one observation and exact window binding; UIA names resolve exact-first; text is segmented with focus checks and character-count postconditions.
Leased Signal Overlay & Abort Control: The glowing border/cursor signal has owner/session metadata, a bounded TTL, turn-end cleanup, and immediate human abort.
Python 3.10+ and uv on the host. The default
launch uses uvx to fetch open-compute (with the mcp extra) from GitHub on
first run — the mcp extra tracks the GitHub repo, so this works regardless of
PyPI release timing.
Windows for real capture/input (mss + UIA). Other platforms import the tools
but cannot drive a desktop.
All coordinates are normalized 0..1 relative to the virtual desktop. Tool
descriptions are localized in six languages (de/en/es/ja/ru/zh) via OC_LANGUAGE.
do also accepts the hold primitivesmouse_down / mouse_up / key_down /
key_up for press-and-hold sequences (rubber-band selection, modifier-held
clicking, game input); anything still held is released when the server stops.
capture(window=...) falls back to Windows.Graphics.Capture when a plain grab of
a hardware-composited window (Roblox Studio, Blender, a GPU-accelerated browser)
comes back all-black — install the wgc extra for that.
5. Configuration (Environment Variables)
Variable
Effect
OPEN_COMPUTE_PYTHON
Path to a python.exe; the launcher runs -m open_compute.mcp_server with it (use this if you installed open-compute into a specific environment).
OPEN_COMPUTE_MCP_CMD
Full command override (whitespace-split), e.g. python -m open_compute.mcp_server.
OPEN_COMPUTE_GIT_REF
Git ref (branch/tag/sha) to pin for the uvx launch (default: the repo's default branch).
OPEN_COMPUTE_EXTRAS
Extras for the default uvx launch (default mcp,local,uia).
OC_LANGUAGE
Language of the tool descriptions: de/en/es/ja/ru/zh.
Signal JSON containing pre_action_grace_color, pre_action_grace_label, and per-mode colors.
Capture size — why this launcher halves it by default
A vision model is billed per pixel, and every frame stays in the conversation, so a
full-HD grab is charged again on each following request. The cost of a session therefore
grows with the square of the number of screenshots, not linearly.
Because open-compute's coordinates are normalized 0..1, shrinking the image costs
nothing in click accuracy — do works in fractions of the image either way. Only
legibility drops, and at 0.5 buttons and field borders stay clearly identifiable; small
body text is what gets hard to read.
Setting
1920×1080 grab
Cost
OC_CAPTURE_SCALE=1.0
full resolution
~1600 tokens
OC_CAPTURE_SCALE=0.5(this launcher's default)
960×540
~690 tokens
OC_CAPTURE_MAX_DIM=768
768×432
~440 tokens
The Python library itself defaults to full resolution — its callers are not necessarily
paying per pixel. Only this launcher, which exists to serve agents, opts into the smaller
frame and prints a one-line notice when it does.
What saves more than any scale factor: prefer tree where
the accessibility model carries the content — note that in browsers it usually exposes only
the browser chrome, not the page; and use capture(window=…) rather than the full desktop.
Coordinate actions deliberately follow observe → one action → automatic refresh;
do not batch multiple coordinate steps against one stale frame.
6. Safe Interaction & Signal Lifecycle
The v0.8 Python engine enforces observe → one action → automatic refresh. Keep
the full descriptor or window_token from list_windows, then pass it as
expected_window together with the latest observation_id from capture or
tree. click_name/invoke require that issued window too. Reuse, changed
state, focus mismatch, covered windows, and ambiguous UIA targets are rejected
before input. type returns requested/sent character
counts and complete/partial status without echoing the text. Signals have a
hard TTL and are removed at action turn end unless keep_signal=true.
An explicit signal_show starts the engine's configured pre-action grace
period. The static grace color is distinct from the mode color and the visible
text counts down Start in N Sekunden once per second. At zero, both phase and
color switch once to active. signal_status exposes the same phase, remaining
seconds, current color, and screenreader label. Duration, grace color, and text
template come from OC_SIGNAL_GRACE_SECONDS / OC_SIGNAL_CONFIG; 0 skips the
countdown. The design uses no flashing, pulsing, or motion animation.
sequenceDiagram
autonumber
actor Reasoner as AI Reasoner (Claude / AGY)
participant Launcher as Node.js Launcher (open-compute-mcp)
participant Engine as Python Engine (open-compute)
participant UI as Windows Desktop / UIA
actor Operator as Human Operator
Note over Reasoner,Operator: Phase 1: Visual Perception & State Inspection
Reasoner->>Launcher: capture(window?) / tree()
Launcher->>Engine: Forward stdio JSON-RPC
Engine->>UI: Grab Screen (mss/WGC) or Read UIA Tree
UI-->>Engine: Frame Image / Semantic Element Tree
Engine-->>Launcher: Observation ID + normalized response/image
Launcher-->>Reasoner: State-bound visual observation
Note over Reasoner,Operator: Phase 2: Signal Overlay Activation
Reasoner->>Launcher: signal_show(mode="control")
Launcher->>Engine: Invoke Signal Overlay
Engine->>UI: Render static grace color + Start in N seconds
UI-->>Operator: Text countdown + accessible window name
Engine->>UI: At zero, switch once to the mode color
Note over Reasoner,Operator: Phase 3: Action Request & Safety Gate
Reasoner->>Launcher: do(one action, window token, observation_id) / click_name(target)
Launcher->>Engine: Process Action Payload
alt OC_SAFETY_MODE == "confirm" (Default)
Engine-->>Launcher: Status "needs_confirmation" (Report Only)
Launcher-->>Reasoner: Human confirmation needed
else OC_SAFETY_MODE == "allow_all" (Isolated VM)
Engine->>UI: Execute Mouse/Keyboard / Hold Primitives
UI-->>Engine: Action Completed
Engine-->>Launcher: Post-observation + window/modal/text postconditions
Launcher-->>Reasoner: Action completed - old observation invalid
end
Note over Reasoner,Operator: Phase 4: Emergency Abort or Completion
opt Operator Triggers Emergency Abort
Operator->>Engine: Hotkey Pressed (Abort Signal)
Engine->>UI: Auto-release all held keys/mouse buttons
Engine-->>Reasoner: signal_abort message returned
end
Engine->>UI: Remove overlay on turn end/error/abort (unless keep_signal=true)
7. Target Personas & Discoverability
open-compute-mcp is architected for four technical personas across autonomous AI operations, system engineering, accessibility assurance, and multimodal human-in-the-loop workflows:
Target Persona
Core Operational Needs
Pain Points Solved
Target Discovery Terms
Autonomous AI Agents & Swarms(Claude Code, Antigravity, Cursor, Windsurf)
9. 10-Dimension Comparative Matrix vs. Alternatives
open-compute-mcp delivers a model-agnostic, safety-bounded bridge between LLM reasoners and the Windows desktop environment. The following matrix illustrates how open-compute-mcp compares with alternative desktop interaction patterns across 10 operational dimensions:
All screen capture, mouse/keyboard automation, and signal overlays execute strictly locally over stdio JSON-RPC; 0 telemetry, 0 external analytics, 0 network transmissions.
INV-GATE-02
Fail-Closed Safety Ceiling
OC_SAFETY_MODE (default: confirm) acts as a hard operator ceiling; per-call parameters can only tighten the policy (confirm/read_only), never loosen it without environment restart in an isolated VM (allow_all).
INV-OBS-03
One-Shot Observation Lifespan
Every capture and tree call generates an ephemeral observation_id; coordinates consume exactly one observation and are invalidated immediately, preventing stale click execution.
INV-WIN-04
Strict Window Binding
Coordinate actions require verified window_token / window descriptor from list_windows; focus mismatch, covered/occluded windows, or ambiguous targets fail closed before input.
INV-SIG-05
Leased Signal Overlay & Immediate Abort
Visual signal overlay (signal_show) operates with owner/session lease, bounded TTL (default 120s), turn-end cleanup, and immediate emergency human abort via hotkey.
INV-UIA-06
Exact-First Semantic Resolution
click_name and invoke resolve exact semantic UIA matches first before fuzzy matching, returning scores and alternatives for transparency.
INV-PROC-07
Unprivileged RunAsInvoker Mode
Operates strictly with standard user privileges (RunAsInvoker); never requires or requests administrative elevation.
INV-CROSS-08
Multi-OS Stdio Protocol Parity
Strict Model Context Protocol (MCP) JSON-RPC adherence tested across Ubuntu, Windows, and macOS on Node.js 18.x, 20.x, 22.x, and 24.x.
INV-SYNC-09
Multi-Agent Lock & Conflict Discipline
Defensive file system ignore patterns and fail-closed lock checks prevent concurrent workspace pollution and protect cloud synchronization integrity.
INV-SLA-10
48h Security Response & 5-Day Triage SLA
Documented commitment to acknowledge vulnerability disclosures within 48 hours and deliver preliminary triage within 5 business days.
11. ellmos-ai Ecosystem & Sibling Matrix
This MCP server is part of the ellmos-ai ecosystem — AI infrastructure, MCP servers, and intelligent tools.
Computer-use is powerful. OC_SAFETY_MODE is an operator ceiling (confirm
default · read_only · allow_all); a per-call mode can only tighten it, never
loosen it. Because MCP stdio has no server→client confirm callback, confirm /
read_onlyreport an action without performing it. For interactive use, run in
an isolated VM/session, set OC_SAFETY_MODE=allow_all, and let your client's
tool-approval dialog be the human-in-the-loop. OC_DENY (comma-separated action
types) is a hard deny list. Treat on-screen content as untrusted (prompt-injection
risk).
Troubleshooting: do/click_name only ever return needs_confirmation and never
act. That is the confirm ceiling working as designed under stdio MCP. Fix for
interactive use: set "env": {"OC_SAFETY_MODE": "allow_all"} in the server
registration and let the client's tool-approval dialog gate each action (do not
auto-allow do/click_name/invoke there). The env change only takes effect when
the server process (re)starts — an already-connected client keeps the old ceiling
until it reconnects.
13. Level 1 SBOM Transparency & Invariant Matrix
open-compute-mcp maintains a transparent Level 1 Software Bill of Materials (SBOM) ensuring comprehensive supply-chain hygiene and zero-copyleft isolation. Full details are documented in THIRD_PARTY_LICENSES.md and THIRD_PARTY_LICENSES.txt.
Single-use ephemeral observation tokens invalidated after 1 action
INV-WIN-04
Strict Window Binding
Python backend via stdio
Required window token verification before action execution
INV-SIG-05
Leased Signal Overlay & Abort
Python backend via stdio
Leased visual indicator with emergency hotkey abort
INV-UIA-06
Exact-First Semantic Resolution
Python backend via stdio
Exact element name match prioritized over fuzzy match
INV-PROC-07
Unprivileged RunAsInvoker Mode
package.json, launcher
Operates strictly with standard user privileges; 0 admin elevation
INV-CROSS-08
Multi-OS Stdio Protocol Parity
test/, CI matrix
Tested across Ubuntu, Windows, and macOS on Node 18, 20, 22, 24
INV-SYNC-09
Multi-Agent Lock & Conflict Discipline
.gitignore, tests
Rejection of cloud locks, sync conflicts, temporary tokens
INV-SLA-10
48h Security Response & 5-Day Triage SLA
SECURITY.md
Binding 48h acknowledgement and 5-day triage commitment
Non-Elevation Certification (RunAsInvoker)
The launcher and spawned processes are certified to run entirely under standard user permissions (RunAsInvoker). They never request or require administrator or UAC elevation.
Zero-Copyleft Isolation Guarantee
No GPL, AGPL, LGPL, or other copyleft-licensed dependencies are included or linked. All code is distributed under permissive MIT and BSD licenses.
14. Testing & Verification Suite
The repository features a comprehensive automated test suite validating contract invariants, manifest parity, and repository hygiene:
bash
# Run all automated tests
npm test# Run repository hygiene and secret leakage checks
npm run test:hygiene
# Verify packaging integrity
npm pack --dry-run
All pull requests and commits are verified through GitHub Actions CI (.github/workflows/ci.yml) with automated matrix builds on Ubuntu, Windows, and macOS across Node.js 18.x, 20.x, 22.x, and 24.x.
15. Registry Manifests & Schema Parity
open-compute-mcp adheres to multi-registry standard specifications:
The software is provided free of charge as an open-source courtesy gift (Gefälligkeit / Schenkung gem. § 516 BGB). In accordance with § 521 BGB, liability is strictly limited to intentional misconduct (Vorsatz) and gross negligence (grobe Fahrlässigkeit).
48h Security Response & 5-Day Triage SLA
The ellmos-ai / open-bricks team provides a binding commitment to acknowledge all security disclosures within 48 hours and deliver preliminary triage within 5 business days. Reports should be submitted to security@ellmos.ai, support@lukasgeiger.com, or security@open-bricks.org in accordance with SECURITY.md.