Lets Claude drive your REAL mouse, keyboard & screen β works in your own logged-in apps.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
An MCP server that lets Claude operate your real computer the way a human does β moving the actual mouse, clicking, typing, and reading the actual screen.
Unlike OpenAI Operator, browser-use, or Playwright agents (which spin up a separate, isolated, logged-out Chrome), this drives the physical OS cursor and keyboard. So it works in your own Chrome with your own logged-in sessions β and in every other app β because it's just a human at the keyboard, as far as any website can tell.
Status: LIVE and battle-tested. Registered with Claude Code as the user-scope MCP
realhands (tool mcp__realhands__computer) and βConnected since 2026-06-02.
On 2026-06-09 it drove the user's real, logged-in Chrome through a complete Google
Play Console deployment (app upload, release notes, submission) end-to-end.
The server is registered as
realhandsrather thancomputer-usebecause the name "computer-use" is reserved in Claude Code.
Claude (Desktop or Code) is the agent loop. You type a task; Claude calls the single
computer tool in a see β think β act cycle:
See β
screenshotreturns the real screen (downscaled to ~1280px for grounding accuracy) β Think β Claude picks the next action + pixel coordinates β Act β the server moves the real mouse / types on the real keyboard β a fresh screenshot comes back automatically after every action, and it repeats.
Two Windows-specific details make clicks land accurately (src/screen.py):
SetProcessDpiAwareness(2) is set at import time so screenshot
pixels == pyautogui cursor coordinates even under display scaling (125% / 150% / β¦).COMPUTER_USE_MAX_DIM on the longest side before sending; incoming click coordinates
are scaled back up to real pixels. The scale factor is a pure function of monitor
geometry + MAX_DIM, so mapping never depends on which screenshot ran last.
Coordinates are clamped inside the target monitor so a stray click can't fly off-screen.
Each axis is rounded down to a whole 28px vision patch, so the two axes can scale very
slightly differently (<2.2%); to_real() maps each with its own factor and stays exact.Multi-monitor: every call takes an optional monitor index (1 = primary, 2.. =
others, 0 = the whole virtual desktop). action="monitors" enumerates the setup.
Origins may be negative for screens left/above the primary β to_real() handles the
offset. Use the same monitor for a click as for the screenshot you're clicking on.
Stack: Python 3.10/3.11 Β· mcp (FastMCP, stdio) Β· pyautogui Β· mss Β· pillow Β·
pynput Β· keyboard Β· pyperclip Β· python-dotenv β plus pygetwindow and pywin32
for activate_window.
computer toolA single tool with an action parameter:
| Action | What it does |
|---|---|
screenshot | Capture the screen (always start a task with this) |
cursor_position | Report the real mouse position |
monitors | List detected monitors (for multi-screen setups) |
mouse_move | Glide the cursor to coordinate |
left_click / right_click / middle_click / double_click / triple_click | Click at coordinate (or current position) |
left_click_drag | Drag from text="x1,y1" to coordinate=[x2,y2] |
left_mouse_down / left_mouse_up | Press / release the left button |
scroll | Scroll at coordinate (scroll_direction + scroll_amount notches) |
type | Type text (clipboard-paste path for long/Unicode/multiline) |
key | Press a key or chord β "Return", "ctrl+s", "alt+Tab" |
hold_key | Hold keys for duration seconds |
activate_window | Bring an app to the front by title substring (beats Windows' foreground-lock; far more reliable than clicking the taskbar) |
wait | Sleep duration seconds, then screenshot |
stop | Stand down: close the STOP overlay + release the panic hotkey (call as the final action) |
Coordinates are in the pixel space of the most recent screenshot; its size is reported with every capture. After every non-screenshot action the tool waits ~0.4s for the UI to settle and returns a fresh screenshot.
Screenshots dominate the cost of driving a desktop, and not just once: every image
stays in the conversation and is re-sent as history on each later turn. Claude bills
vision in 28Γ28 patches β tokens = βw/28β Γ βh/28β β so this server does four things
to keep the bill down.
Batch steps. Pass steps (a list of action dicts) instead of one call per action
and the whole run shares one screenshot at the end:
That is 1 125 visual tokens instead of 5 625, and one round trip instead of five β the
larger saving, since each avoided turn also avoids re-sending the entire transcript.
A failing step stops the run, reports which step failed, and still returns the screen.
Add "screenshot": false to skip the trailing image too.
Patch-aligned downscaling. A dimension that isn't a multiple of 28 pays for a partial patch row/column carrying almost no pixels. From a 1920Γ1080 primary the default 1260Γ700 is exactly 45Γ25 patches = 1 125 tokens, versus 1 196 for 1280Γ720 β 6% off for 1.5% fewer pixels.
Unchanged-screen suppression. If under CHANGE_THRESHOLD of pixels moved since the
last image sent, the reply is a line of text instead of a screenshot. A real desktop
never produces two byte-identical frames (clock, caret, hover states), so this is a
threshold, not an equality check. After MAX_SKIPS suppressions in a row it force-sends
one, so the model can't fly blind if it lost the earlier image to context compaction.
Right-sized images. COMPUTER_USE_MAX_DIM trades grounding accuracy against cost β
from a 1920Γ1080 primary: 1792 β 2 304 tokens, 1260 β 1 125 (default), 1036 β 777,
896 β 576. Keep the long edge β€ 2576 px: an image returned inside a tool_result is
rejected rather than downscaled when it exceeds the model's limit.
COMPUTER_USE_IMAGE_FORMATis not a token lever β Claude bills by pixel dimensions, so a JPEG and a PNG of the same screenshot cost exactly the same. JPEG only cuts payload bytes (~977 KB β ~141 KB here), which helps latency at some risk to small-text legibility.
This is fully autonomous: it does not ask before each action. Three independent
kill switches (src/safety.py):
FailSafeException and the action aborts instantly.os._exit(1)).Lazy arm / stand-down: the overlay and the global panic hotkey are armed lazily on
the first action of a task, not at server startup β idle sessions show nothing and
grab no hotkeys. They stand down when the agent calls action="stop" at the end of a
task, and re-arm automatically on the next action. (The STOP overlay is a single
persistent window that is hidden when dormant, never destroyed β recreating it was a
crash hazard.) An optional idle auto-stand-down is available via
COMPUTER_USE_IDLE_STOP but is disabled by default: an agent's thinking time
between tool calls easily exceeds any short idle window, so a non-zero value would stand
the agent down mid-task.
Pacing also helps you stay in control: every action is followed by a configurable pause
(COMPUTER_USE_PAUSE) and the cursor glides rather than teleports
(COMPUTER_USE_MOVE_DURATION), so you can watch and interrupt.
Don't leave it unsupervised on anything that can spend money, send messages, or delete data.
Requires Python 3.10 or 3.11 (3.13+ untested; avoid the 3.14 beta).
uvx (always the latest version)Nothing to install up front, and you get every release automatically β uvx
resolves the newest published version each time the server starts, so a restart of your
MCP client is the whole upgrade process. Requires uv.
Drop the @latest (uvx realhands) if you would rather let uv reuse whatever version
it already has cached.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/realhands-real-desktop-computer-use)<a href="https://allmcps.com/mcp/realhands-real-desktop-computer-use"><img src="https://allmcps.com/api/badge/realhands-real-desktop-computer-use?style=directory" alt="Realhands β Real Desktop Computer Use on AllMCPs" /></a>