Skip to main content
Glama
Regigicas

win-computer-use

by Regigicas

win-computer-use

An MCP server that gives Claude Code computer use on Windows — screenshots, mouse, keyboard, window and display enumeration — which the CLI officially ships on macOS only:

createCliExecutor called on win32. Computer control is macOS-only.

It does not reimplement anything at a low level. It reuses the native binding that the Claude desktop app installs (@ant/claude-native), which loads fine in plain Node, and adds screen capture on top through GDI (the desktop app captures with Electron's desktopCapturer, which does not exist outside Electron).

WARNING

This gives a model unrestricted control of your desktop. Keystrokes and clicks go to whatever window currently has focus, and a screenshot captures the entire screen — password managers, private messages, anything else you have open.

The Claude desktop app has four safeguards this does not: a per-application allowlist, screenshot masking of everything outside it, an on-screen indicator while computer use is active, and a panic key. None of them exist here. Run it only on a machine and at a time where that is acceptable to you, and do not leave it enabled by default.

NOTE

Unofficial, unsupported, and not affiliated with Anthropic. It depends on internals of the desktop app: if the binding or the MSIX package layout changes, this breaks.

Requirements

  • Windows 10 or 11. Windows-only by construction; the server exits with an error elsewhere.

  • The Claude desktop app, installed (the MSIX package from the Microsoft Store or the official installer). It is where the native binding comes from — the app does not have to be running, it has to be installed.

  • Node.js 18+.

  • Windows PowerShell 5.1 (the built-in powershell.exe), used for screen capture.

No npm dependencies.

Related MCP server: windows-computer-use-mcp

Install

Clone it anywhere, then register it with the Claude Code CLI:

git clone https://github.com/Regigicas/win-computer-use.git
cd win-computer-use
claude mcp add win-computer-use --scope local -- node "$PWD\server.js"

Restart the session for the tools (mcp__win-computer-use__*) to appear. Check it with claude mcp list; remove it with claude mcp remove win-computer-use.

Use --scope local (this project only) rather than --scope user unless you really want every session on the machine to be able to drive your desktop.

For any other MCP client, the equivalent config entry is:

{
  "mcpServers": {
    "win-computer-use": {
      "command": "node",
      "args": ["C:\\path\\to\\win-computer-use\\server.js"]
    }
  }
}

Tools

Screen

screenshot, zoom, list_displays

Windows

list_windows, focus_window, frontmost_app, list_running_apps

Mouse

move_mouse, click, drag, scroll, cursor_position

Keyboard

type_text, key

Composite

batch

Coordinates are screen pixels (display origin + offset), never pixels of the returned image; every capture states the scale it used and how to convert. batch chains several actions and ends with a screenshot, so a click-type-check cycle costs one round-trip instead of three.

Limits and defaults

screenshot scale

Auto-fits the width to ~1400 px; override with scale (0.05–1)

zoom scale

1 (native pixels); values above 1 are not supported

JPEG quality

80

type_text

2000 characters per call, ~8 ms per character

batch

30 actions per call; wait takes 0–5000 ms

Capture timeout

15 s

Files

File

What it is

server.js

The MCP server (JSON-RPC over stdio, no dependencies).

capture.ps1

Persistent capture helper (PowerShell 5.1 + System.Drawing).

smoke.js

Test client: node smoke.js '[{"name":"screenshot"}]'.

How the binding is resolved

C:\Program Files\WindowsApps cannot be listed from an ordinary process, and the .node cannot be loaded in place (Acceso denegado / access denied) — but it can be read and copied. So the server:

  1. Resolves the registered package with Get-AppxPackage -Name Claude.

  2. Copies claude-native-binding.node into %LOCALAPPDATA%\win-computer-use\ and loads that copy, re-copying whenever the original's size or mtime changes.

Set CLAUDE_NATIVE_BINDING=<path> to skip all of that and load a specific file.

Nothing from the desktop app is redistributed by this repository. The binding is copied at runtime, on your machine, out of your own installation.

What it writes to disk

  • %LOCALAPPDATA%\win-computer-use\ — the copy of the native binding, plus a source.json stamp recording where it came from. Persistent; safe to delete, it is re-copied on the next run.

  • %TEMP%\win-computer-use\each screenshot is written here as a JPEG before being read back and sent, then deleted immediately. Deletion is best-effort: if the server is killed mid-capture, an image of your screen can be left behind in your temp directory.

Nothing is sent anywhere by this server itself; it only answers the MCP client that spawned it.

Things learned the hard way

  • typeText and typeTextPaced break on long strings when driven from outside the desktop app: the first characters land and the rest come out as the last character repeated, or nothing at all. That is why type_text sends one character per call. It costs about a second per 100 characters, but it is exact. Do not "optimise" it back.

  • Shortcuts mean whatever the target app makes them mean, in its own language. On a Spanish Windows, ctrl+a in Notepad is Abrir (open) and select-all is ctrl+e. The binding maps keys correctly; the app on the other end is what differs.

  • Key names are lowercase: ctrl, alt, shift, win, return, escape, tab, space, backspace, delete, arrows, home, end, pageup, pagedown, f1f12, and single characters. The internal enum names (Num1, …) throw. Chords go through keys([...]), which is the same API the desktop app uses for ctrl+v.

  • GDI capture looks correct in SDR; on an HDR display it can come out washed out. That is a CopyFromScreen limitation, not the state of your screen.

  • The GDI capture does not draw the mouse cursor.

Troubleshooting

the Claude desktop app does not appear to be installedGet-AppxPackage -Name Claude returned nothing. Install the desktop app, or point CLAUDE_NATIVE_BINDING at a copy of the binding.

binding not found at ... — the package layout changed. Look for claude-native-binding.node under the install location and set CLAUDE_NATIVE_BINDING.

Behaviour that does not match the installed versionGet-AppxPackage returns the registered package, which is not necessarily the newest one staged on disk. If the app has updated but the binding behaves like an older build, that mismatch is the first place to look.

capture helper could not startpowershell.exe could not be spawned: check that Windows PowerShell 5.1 is present and not blocked by policy.

Nothing happens in the target app — elevated windows (running as administrator) will not accept injected input from a non-elevated process, and the UAC prompt runs on an isolated desktop that cannot be automated at all. Fullscreen games generally reject the injection too.

Limitations and what is untested

See docs/limitations.md for what has actually been exercised and what has only been written.

License

MIT — see LICENSE.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Regigicas/win-computer-use'

If you have feedback or need assistance with the MCP directory API, please join our Discord server