Handy
Provides native Linux desktop control and screen capture on X11 and Wayland, including window focus, clipboard access, and input automation.
Provides native macOS screen capture, window management, clipboard access, and CoreGraphics-based mouse/keyboard control, including Retina coordinate mapping.
Supports Wayland desktops through backends for screen capture, input automation, and clipboard access.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Handy click the Save button in my open window and screenshot the result"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
handy
Real-time native mouse, keyboard, window, clipboard, and coordinate-mapped screen control for LLMs and agents.
Handy lets LLMs see your computer screen (or a single desktop window) in real-time with dual-contrast mapped (x, y) coordinate rulers, active window telemetry, pixel hex under the cursor, and sub-2ms frame-to-frame visual diffs — and control the mouse, keyboard, clipboard, and desktop windows natively with chained multi-step actions (focus_window -> click -> paste -> wait_for_settled in a single call). It installs cleanly on any PC with zero C++ addon compilation (node-gyp free) and ships prepackaged as a stdio MCP server and agent plugin with operational skills, a local SSE-powered live web Control Panel (handy ui), a physical (0, 0) corner-slam failsafe, and an instant on/off permission toggle.
Highlights
Set-of-Mark Vision + Click-by-Mark (
handy_seemarks: true): Instead of guessing pixel coordinates from a screenshot, Handy detects and numbers the interactive elements on screen —control(buttons, fields, checkboxes),text,icon, andregion— and outlines each with a small numbered badge. Every pointer step (move,click,double_click,triple_click,right_click,drag,scroll) then accepts{ "mark": 5 }in place of{ "x": …, "y": … }, and the text chain DSL understandsclick mark 5/click #5. Marks survive layout shift and HiDPI scaling because they resolve to the element's own centre at execution time, and they work identically in the CLI (handy see --marks) and the Control Panel, where clicking an element on the screenshot inserts its mark reference instead of brittle coordinates.Human-Like Pointer Motion (
motion: "human"): Pointer steps can travel along a Fitts's-law-paced Bézier arc rather than a teleporting straight line, with the duration derived automatically from travel distance and target size when omitted. Useful where synthetic instant motion is filtered or where a visible cursor path helps a human follow along.motion: "linear"and"ease"are also available.Chained Real-Time Controls (
handy_act): Execute up to 100 sequential steps (focus_window,move,click,double_click,triple_click,right_click,drag,scroll,paste,type,key,mouse_down/up,key_down/up,wait,wait_for_change,wait_for_settled,wait_for_color,screenshot) in one atomic call, supporting globalscreen,normalized(0..1000), andwindow-relative coordinates, plusscreenshotAfter: truewith numbered amber action-trail markers (#1,#2, drag vectors).Coordinate-Mapped Vision + Window Zoom + Smart Diffing (
handy_see): Renders exact OS screen coordinate rulers (dual-contrast so lines are legible on both#000dark and#ffflight apps),(x, y)intersection pills, and a high-contrastMOUSE (x,y)reticle — pluspixelUnderMouse(#rrggbb),activeWindow,screenDiff(changedPercent,changedBounds), andhighlightDiff: true(CHANGEDoutline). Supportswindoworregionzoom at 1:1 resolution while preserving global screen coordinates. Downscales with area-average box filtering (so 1px text survives instead of being sampled away) and encodes with per-row filter selection, producing captures that are ~26% smaller and noticeably sharper than nearest-neighbour bilinear output.Window & Clipboard Awareness (
handy_windows,handy_clipboard): Inspect open desktop windows with{ x, y, width, height }bounds, bring target apps to the foreground cleanly, and paste multi-line Unicode text instantaneously while preserving the user's prior clipboard.Instant On/Off Toggle +
(0, 0)Failsafe + Live SSE UI: Toggle LLM access live at any time via CLI (handy off/handy on/handy toggle), plugin slash commands (/handy:off//handy:on//handy:toggle//handy:status//handy:doctor//handy:windows),--view-onlymode,--ttltimers, or the loopback web Control Panel (handy uiwith live Server-Sent Events push) — or slam your physical mouse to the top-left(0, 0)corner to abort an active chain immediately.Works on Any PC Out of the Box:
Windows 10/11: Persistent Win32
SendInput(KEYEVENTF_UNICODE,MOUSEEVENTF_VIRTUALDESK),EnumWindows/SetForegroundWindow, MTA-safe Win32OpenClipboard, and GDICopyFromScreenwith Per-Monitor V2 DPI awareness andGetDpiForMonitorscale telemetry.macOS (Apple Silicon & Intel): Persistent CoreGraphics
CGEvent+NSWorkspace+NSPasteboard+ in-memoryCGWindowListCreateImagePNG capture (withscreencapturefallback) and Retina2xlogical-point mapping.Linux (X11 & Wayland): Pure native X11 wire-protocol client (
XTEST+GetImage+BIG-REQUESTS+RANDR+ EWMH_NET_CLIENT_LIST/_NET_ACTIVE_WINDOW, zero external packages required) plus Wayland/CLI support (grim,maim,ydotool,wtype,xdotool,wl-clipboard,xclip,xsel).Virtual Desktop (
HANDY_BACKEND=virtual): Built-in1280x800multi-window interactive desktop workbench for headless CI and safe agent sandboxing.
Related MCP server: Open Computer Use
Install on Any PC
Requires Node.js 20+.
1. One-Command Auto-Setup (Claude Desktop, Cursor, Windsurf, Claude Code)
npx -y @miisodev/handy installPreview changes first with --dry-run, target a single host (handy install cursor), or remove cleanly (handy uninstall). Backups (*.handy.bak) are created automatically before modifying existing config files.
2. Prepackaged Plugin (Claude Code / Agent Marketplaces)
Installs the stdio MCP server, the handy operational skill (skills/handy/SKILL.md), and the /handy:on, /handy:off, /handy:toggle, /handy:status, /handy:doctor, and /handy:windows commands together:
claude plugin marketplace add miisodev/handy
claude plugin install handy3. Global CLI + Live Control Panel
npm install -g @miisodev/handy
handy doctor
handy ui # Launch local Control Panel at http://127.0.0.1:77884. Manual Stdio MCP Configuration
{
"mcpServers": {
"handy": {
"command": "npx",
"args": ["-y", "@miisodev/handy", "mcp"]
}
}
}Permission Controls & Human Failsafe
Handy stores its permission toggle at ~/.handy/permissions.json (0600) and checks it synchronously before every handy_see screen capture, handy_windows/handy_clipboard call, and before every individual step of a handy_act chain.
handy off # Immediately block all LLM screen viewing & input control
handy on # Enable full screen vision & mouse/keyboard control
handy toggle # Flip between ON and OFF
handy on --view-only # Allow screen viewing (handy_see), block mouse & keyboard
handy on --ttl 30m # Auto-disable after 30 minutes
handy ui # Open live browser switchboard + coordinate inspector
handy status # Check current toggle state, backend, windows & displaysPhysical Failsafe: Slamming your mouse cursor into the top-left
(0, 0)corner aborts any in-flight chain and releases held keys/buttons immediately.Prompt-Injection Guard: When turned OFF by the user, an MCP client cannot re-enable Handy on its own, while calling
handy_permission({ "action": "off" })is always permitted as a one-way stop switch.
MCP Tools
Tool | Description |
| Capture the live screen, a single |
| Execute single or chained native mouse, keyboard, paste, window-focus, and smart visual-wait ( |
| List visible desktop windows ( |
| Read or write plain-text system clipboard directly. |
| Inspect live permission toggle state ( |
| Query permission status or immediately turn Handy |
Example: Chained Window Focus + Instant Paste + Smart Visual Settle (handy_act)
{
"actions": [
{ "type": "focus_window", "title": "Workbench" },
{ "type": "click", "x": 250, "y": 172 },
{ "type": "paste", "text": "Sam — ready for review 🚀", "submit": true },
{ "type": "wait_for_settled", "quietMs": 200 }
],
"screenshotAfter": true
}Example: See the Screen as Numbered Elements, Then Click One (marks)
Two calls, no coordinate arithmetic. Ask for a marked capture, pick the element you want by index, and act on it:
// handy_see
{ "marks": true, "maxMarks": 30 }// handy_act — mark 13 was the "Submit" button in the capture above
{
"actions": [
{ "type": "click", "mark": 5 },
{ "type": "paste", "text": "Sam — ready for review 🚀" },
{ "type": "click", "mark": 13 },
{ "type": "wait_for_settled", "quietMs": 200 }
],
"verifyChange": true
}handy_see returns each element's index, kind, bounds, centerX/centerY, and a score, and the marks stay valid for subsequent handy_act calls until the next marked capture. In the CLI, where every command is a separate process, a mark reference detects elements from the live screen on demand instead — detection is deterministic for an unchanged screen, so see --marks and a later act agree on the numbering. To guarantee the indices cannot drift (if the screen may change between commands), do both in one chain: handy act '[{"type":"screenshot","marks":true},{"type":"click","mark":5}]'. verifyChange: true adds a before/after frame diff so the receipt reports whether the screen actually changed — a cheap post-condition check that catches clicks which landed but did nothing.
The equivalent chain-DSL form works everywhere a chain is accepted:
handy see --marks --out marked.png
handy act 'click mark 5 -> paste "Sam" -> click mark 13 -> wait_for_settled'Standalone CLI Usage
# Capture coordinate-mapped screen image — or zoom into a single window
handy see --out screen.png
handy see --window "Scratchpad" --highlight-diff --out scratchpad.png
# Detect & number interactive UI elements, printing each mark's centre, bounds, and score
handy see --marks --out marked.png
handy see --marks --max-marks 20 --json
# Inspect & focus desktop windows
handy windows
handy focus "Visual Studio Code"
# Read or write system clipboard
handy clipboard get
handy clipboard set "Copied from terminal"
# Execute a chained control sequence using human shorthand or JSON
handy act 'focus "Scratchpad" -> click 800 420 -> paste "Hello 🌍" -> wait_for_settled' --screenshot-after after.png
# Click a detected element by mark instead of by coordinate
handy act 'click mark 5 -> type "Sam" -> click #13' --jsonLicense
MIT © Kevin Miiso Novo
Available Tools
6 toolshandy_actControl Mouse & Keyboard (Single or Chained)ADestructive
Execute native mouse, keyboard, clipboard-paste, window-focus, and smart visual-wait controls in real-time. Supports chaining multiple steps sequentially in one call — e.g. [{ "type": "focus_window", "title": "Code" }, { "type": "click", "x": 420, "y": 260 }, { "type": "paste", "text": "Hello!" }, { "type": "wait_for_settled" }]. Steps support coordinateSpace: "screen" | "normalized" | "window", and any pointer step accepts mark: N to target a detected UI element from the last handy_see({ marks: true }) instead of raw x/y. Set screenshotAfter: true to receive an updated coordinate-mapped screenshot with numbered action-trail markers, or verifyChange: true for a cheap did-anything-happen diff.
Inputs: actions (required), grid, marks, display, +10 more.
handy_clipboardRead or Write System ClipboardAIdempotent
Read current plain-text clipboard contents (action: 'read', works in full and view_only modes) or write Unicode text directly to the system clipboard (action: 'write', requires full control mode).
Inputs: action (required), text.
handy_permissionHandy Permission Control (On/Off Toggle)AIdempotent
Inspect or turn OFF Handy computer control permissions. Turning Handy OFF (action: 'off') immediately disables screen capture and mouse/keyboard control and releases any held inputs. When disabled by the user, re-enabling requires running handy on (or /handy:on) unless HANDY_ALLOW_MCP_ENABLE=true.
Inputs: action (required), mode.
handy_seeSee Computer Screen (Mapped Coordinates + Window Zoom + Diff)ARead-onlyIdempotent
Capture the computer screen (or a single desktop window via window) in real-time with mapped (x, y) coordinate rulers, dual-contrast grid labels, live mouse reticle, hex color under cursor, active window info, and visual diff since the previous capture (changedPercent, changedBounds). Use region or window to zoom into dense UI areas at 1:1 resolution while preserving global screen coordinates, and set highlightDiff: true to outline changed pixels. Set marks: true to run Set-of-Mark UI element detection: Handy outlines and numbers every detected button, field, icon, text line, and panel, and returns their exact bounds and click centres in elements — then act on one with { "type": "click", "mark": 3 } instead of estimating coordinates.
Inputs: grid, marks, region, window, +8 more.
handy_statusCheck Handy Status & Permission ToggleARead-onlyIdempotent
Check whether Handy permission is currently ON or OFF, which native OS backend is active, connected monitor dimensions, active window, and current mouse position (when enabled).
Inputs: no named parameters.
handy_windowsList or Focus Desktop WindowsAIdempotent
List visible desktop windows with their titles, owning apps, screen bounds { x, y, width, height }, and focused state (action: 'list'), or bring a specific window to the foreground (action: 'focus').
Inputs: action (required), id, app, title.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Each tool maps to a distinct capability (observe, act, enumerate windows, clipboard, status, permissions), and descriptions give clear guidance on when to use handy_see vs handy_act. There is minor overlap: window focusing exists both in handy_act as a step type and as handy_windows 'focus', and paste in handy_act overlaps with handy_clipboard write, while handy_status vs handy_permission both report permission state.
All six tools share a consistent 'handy_' prefix with snake_case suffixes. The suffixes mix verbs (see, act) with nouns (windows, clipboard, permission, status), which is a small deviation but still predictable and readable as a toolset.
Six tools is tightly scoped for a computer-control server: observe, act, windows, clipboard, status, and permissions. Each one earns its place and there is no redundant filler.
Coverage spans the core loop of screenshot -> act -> verify, plus window enumeration, clipboard I/O, and permission control. Gaps remain for window management (move/resize/close), multi-monitor enumeration, and richer clipboard formats, but agents can work around these.
Maintenance
Related MCP Connectors
Real desktops for AI agents, on machines you choose: screenshot, type, click, hire more agents.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Connect AI assistants to your approved computer for files, commands, browser and desktop tasks.
500+ typed UI atoms an agent composes into real rendered interfaces. Free, no API key.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceLets AI agents see and control desktop applications through the accessibility layer, enabling clicking, typing, scrolling, dragging, and window/app management across macOS, Windows, and Linux entirely on the local machine.20MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to observe and control the user's live desktop by listing apps, reading accessibility trees, and performing clicks, typing, scrolling, dragging, and other input actions with per-action approvals and local audit archives.1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to autonomously control Windows 11 and 10 desktops via sub-10ms screen capture, native UI Automation element inspection, and zero-lag keyboard and mouse input. Combines a visual plane with a semantic plane and stall detection so agents can operate real applications reliably without vision-only guessing.262 npm151 PyPI7MIT
- AlicenseNot gradedqualityCmaintenanceEnables an AI assistant to see and control your local desktop on Windows and Linux by capturing screenshots, clicking, scrolling, pressing hotkeys, typing text, and reading or writing the clipboard. Actions can be batched into a single call that ends with a fresh screenshot.MIT