DeskPilot
DeskPilot lets an MCP agent inspect and control a Windows desktop using text-first UI automation, real mouse/keyboard input, and managed display/window/app workflows.
Inspect screens, current control mode, and pick/switch the controlled display.
Take compact text snapshots of windows, full web pages, screens, taskbar, or OCR text, with filtering and node limits.
Find elements by visible text and/or role, falling back to OCR.
Execute batched actions: click, double-click, right-click, hover, type, key combos, scroll, drag, wait, sleep, focus, and launch; returns screen changes.
Launch apps, URLs, URIs, files/folders, or a dedicated DeskPilot browser profile.
Manage windows: list, focus, minimize, maximize, restore, close, or move to the controlled screen.
Read/write clipboard text.
List, run, record, save, inspect, and delete parameterized routines.
Capture screenshots as a last resort, cropped to an element/region or annotated with refs.
Mark tasks done and hide the agent overlay/control UI.
Sensitive actions can require user approval per the README, with audit logging and privacy redaction.
Enables precise web control in Brave by reading pages through the DevTools protocol, including off-screen elements, while clicks and typing use the real mouse and keyboard.
DeskPilot
A low-token Windows computer-use MCP server. Let Claude, Codex, Cursor, Copilot or any other MCP agent use your real Windows PC the way you do: desktop apps, File Explorer, Settings, and websites in your own browser. You watch everything it does and can stop it at any moment.
Platform note: DeskPilot controls a Windows desktop and has been tested on Windows 11 only. Windows 10 will probably work but is untested.
The server installs and starts on Linux and macOS, so MCP registries can check it there. But it can't control anything on those systems: every tool replies that DeskPilot only runs on Windows. It's built on Windows UI Automation, Win32 input and Windows OCR, which those systems don't have.
Listed on Glama, the MCP server directory.
Screenshots
Related MCP server: Chrome DevTools MCP
Why DeskPilot
Most computer-use tools send a screenshot to the model on every step, which is slow and costs a lot of tokens. DeskPilot reads the screen as text:
e12 button "Install"
b31 link "Create app"
e40 edit "Search" ="hello"The agent clicks by reference (e12) or by visible text ("Install"). After each batch of actions it gets back only what changed. Screenshots are a last resort.
Features
π₯οΈ Pick a display. With more than one monitor, you choose which one the agent may see and control. It can't touch the others. You can also allow all screens.
π±οΈ One cursor. The agent drives your real mouse pointer, so there is no second, fake cursor. A small "Claude" tag follows the pointer while the agent acts.
π² Clear on-screen status. A thin black-and-white border marks the controlled screen (dashed when paused), with a status chip and click ripples.
ποΈ Control panel. A floating panel shows the current step, recent activity and token use, with Pause / Take over / Stop buttons. When you have a second monitor, it sits there so it never covers the agent's work.
βΉοΈ Always interruptible. Ctrl+Alt+Esc pauses or resumes at any time. If you move the mouse while the agent is moving it, the agent pauses.
π» Gets out of your way. When a task finishes, the border, tag and panel disappear.
π Precise web control. In Chrome, Edge or Brave, pages are read through the DevTools protocol (
b12 button "Create app"), including off-screen elements. Clicks and typing still use the real mouse and keyboard.π Routines. Record a task once, add
{{placeholders}}, and replay it with one call.π Ask-first permissions. Deleting, paying, sending, installing, signing out, closing windows, typing into password fields and opening terminals all show an Allow once / Allow for session / Deny dialog. An unanswered dialog is denied after 60 s. Everything is logged to
~/.deskpilot/audit.jsonl.π Privacy.
API keys, tokens, card numbers and IBANs are redacted before the model sees them.
Password fields show as
***.Password-manager and security windows are never read, captured or clicked.
Requirements
Windows 11 (tested), 64-bit. Not Linux or macOS (see the platform note above).
uv, which installs Python 3.11+ for you
An MCP-capable AI client (see Connect your AI tool)
Install
Easiest: let Claude install it for you
Open Claude Code (the terminal app, the Code tab in the Claude desktop app, or the VS Code extension; it works with a Pro plan). Paste this prompt:
Install the DeskPilot MCP server on this Windows PC from https://github.com/iamtahiralvi/DeskPilot
1. If `uv` is not installed, install it:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
2. Install DeskPilot:
uv tool install --python 3.13 git+https://github.com/iamtahiralvi/DeskPilot
3. Register it with Claude Code for all projects:
claude mcp add deskpilot --scope user -- "%USERPROFILE%\.local\bin\deskpilot.exe" serve
(expand %USERPROFILE% to the real path)
4. Install the skill: download
https://raw.githubusercontent.com/iamtahiralvi/DeskPilot/main/skills/deskpilot/SKILL.md
to %USERPROFILE%\.claude\skills\deskpilot\SKILL.md
5. If the Claude desktop app is installed (%APPDATA%\Claude\claude_desktop_config.json exists), also add
"deskpilot": { "command": "<full path to deskpilot.exe>", "args": ["serve"] } under "mcpServers",
keeping every existing entry.
6. Run `deskpilot doctor` and show me the output.
Then tell me to restart Claude (or run /mcp) so the new tools load.Claude runs the commands and asks your permission for each one. When it's done, restart Claude. Then try something like "Open Notepad and type hello". The screen picker appears the first time.
Claude Desktop's chat on its own can't run install commands, so do the install from Claude Code, as above. After that, the DeskPilot tools also work in Claude Desktop chats (step 5).
Option A: installer script
git clone https://github.com/iamtahiralvi/DeskPilot.git
cd DeskPilot
powershell -ExecutionPolicy Bypass -File install.ps1The script:
installs
uvif it's missinginstalls the
deskpilotcommandcreates the default permission rules
registers DeskPilot with Claude Code
installs the Claude Code skill
prints config snippets for other tools
Option B: install with uv yourself
uv tool install --python 3.13 git+https://github.com/iamtahiralvi/DeskPilotThis puts deskpilot.exe in %USERPROFILE%\.local\bin. Run uv tool update-shell once if that folder isn't on your PATH.
Then check that it works:
deskpilot doctor # lists your screens and checks Windows OCROption C: run without installing (uvx)
You can use uvx --from git+https://github.com/iamtahiralvi/DeskPilot deskpilot serve as the command in any client below. The first start is slower because uv builds it.
Connect your AI tool
DeskPilot is a standard stdio MCP server. In every client, the command is deskpilot with the argument serve.
Tip: Desktop apps such as Claude Desktop and Cursor sometimes don't see your
PATH. If the server doesn't start, use the full path instead:C:\Users\<you>\.local\bin\deskpilot.exe(in JSON:C:\\Users\\<you>\\.local\\bin\\deskpilot.exe).
Claude Code
claude mcp add deskpilot --scope user -- deskpilot serveOptional: install the bundled skill, which teaches Claude the cheapest way to use the tools.
mkdir "$env:USERPROFILE\.claude\skills\deskpilot" -Force
copy skills\deskpilot\SKILL.md "$env:USERPROFILE\.claude\skills\deskpilot\"Restart Claude Code, or run /mcp to reconnect.
Claude Desktop
Edit %APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"deskpilot": { "command": "deskpilot", "args": ["serve"] }
}
}Restart Claude Desktop.
OpenAI Codex CLI
codex mcp add deskpilot -- deskpilot serveOr add it to ~/.codex/config.toml:
[mcp_servers.deskpilot]
command = "deskpilot"
args = ["serve"]
startup_timeout_sec = 30
tool_timeout_sec = 300Cursor
Add it to %USERPROFILE%\.cursor\mcp.json (global) or .cursor/mcp.json (one project):
{
"mcpServers": {
"deskpilot": { "command": "deskpilot", "args": ["serve"] }
}
}VS Code (GitHub Copilot agent mode)
code --add-mcp '{\"name\":\"deskpilot\",\"command\":\"deskpilot\",\"args\":[\"serve\"]}'Or create .vscode/mcp.json in your workspace:
{
"servers": {
"deskpilot": { "type": "stdio", "command": "deskpilot", "args": ["serve"] }
}
}Windsurf
Edit %USERPROFILE%\.codeium\windsurf\mcp_config.json:
{
"mcpServers": {
"deskpilot": { "command": "deskpilot", "args": ["serve"] }
}
}Gemini CLI
gemini mcp add deskpilot deskpilot serveOr add the same mcpServers block to %USERPROFILE%\.gemini\settings.json.
Any other MCP client
Use a stdio server with command deskpilot and args ["serve"]. Allow a generous tool timeout (about 300 s), because permission dialogs wait for you.
First run: choose your display
The first time the agent uses DeskPilot, a screen picker opens:
Pick the monitor the agent may control: Screen 1, Screen 2, β¦ or All screens.
Pick a permission mode:
Normal asks only before risky actions.
Strict asks before every batch of actions.
Tick Remember my choice to skip the picker next time.
With two or more displays, a good setup is to give the agent one screen and keep working on the other. The control panel then appears on your screen, not the agent's.
To change the screen later:
run
deskpilot pick, orask the agent to call
screen_info(op="pick").
Using it
Just ask your agent, for example:
Open the Microsoft Store and show me the About page of WhatsApp.
In File Explorer, create a folder called "Invoices 2026" on my Desktop.
Go to my dashboard in Chrome and download last month's report.
While it works:
You want to⦠| Do this |
Pause / resume | Ctrl+Alt+Esc, or Pause on the panel |
Do something yourself | Take over, then Give back |
End the task | Stop (click Unlock later to allow it again) |
Approve a risky step | Allow once / Allow for session in the dialog |
Browser setup (optional, for precise web control)
Use either or both:
Your everyday Chrome or Edge.
Open
chrome://inspect/#remote-debuggingand turn remote debugging on.The first time the agent reads a page in each session, the browser asks "Allow remote debugging?". You click Allow; the agent is never allowed to click it.
To turn this off, set
use_my_browser: falsein the policy file.The DeskPilot browser. Ask the agent to open
agent browser https://example.com. This uses a separate Chrome profile. Sign in once and it stays signed in.
Without either, pages are still readable through Windows UI Automation, but less precisely.
Tools
10 tools, about 1.6k tokens of definitions:
Tool | What it does |
| Screens, the controlled screen, mode. |
| Text list of elements with refs. Scopes: |
| Find elements by text or role, across the web page, the accessibility tree and OCR |
| A batch of steps (click, dblclick, rclick, hover, type, key, scroll, drag, wait, sleep, focus, launch). Returns a diff |
| Open an app, URL, URI, file or folder, or |
| list, focus, minimize, maximize, restore, close, move_here |
| Get or set clipboard text |
| list, run, start, save, show or delete saved routines |
| Last-resort image: crop to a ref or a region, or draw ref marks |
| Task finished: hides the border, tag and panel |
Configuration
Rules live in ~/.deskpilot/policy.yaml. deskpilot policy prints its path. Edit the file, then restart your agent.
Key | Meaning |
| Click targets that need your OK (delete, pay, send, installβ¦) |
| Click targets that are always refused |
| Key combos that need your OK ( |
| Programs that need your OK (terminals, regeditβ¦) |
| Ask before these actions |
| Auto-deny an unanswered dialog after this long (default 60) |
| Windows that are never read, captured or clicked |
| Redact keys, tokens and card numbers from what the model sees |
| Also read your everyday Chrome or Edge (needs remote debugging) |
| Hide the overlay when the agent goes quiet (default 30, |
Other files in ~/.deskpilot/:
session.json: the chosen screen and moderoutines/*.json: saved routinesaudit.jsonl: the action log
CLI
deskpilot serve run the MCP server over stdio (your AI client runs this)
deskpilot pick choose the screen and permission mode
deskpilot policy create or print the path of the rules file
deskpilot doctor list screens and check that OCR worksSafety
DeskPilot controls your real mouse and keyboard. Before you let an agent run unattended:
Give it a screen with nothing sensitive open, or use Strict mode.
Keep the ask-first rules on, and add your own words to
ask_click_words_extra.Remember that Ctrl+Alt+Esc always pauses it.
AI agents make mistakes. You are responsible for what you let them do on your computer.
Development
git clone https://github.com/iamtahiralvi/DeskPilot.git
cd DeskPilot
uv sync
uv run --group dev pytest
uv run deskpilot doctorThe Dockerfile exists only so MCP registries such as Glama can build the server and check that it starts and lists its tools. Inside a Linux container, DeskPilot can't control a desktop.
After you change the code, reinstall the global command (--reinstall makes uv rebuild instead of reusing a cached build):
uv tool install --force --reinstall --python 3.13 .Built with:
the official MCP Python SDK
the raw UI Automation COM API, with cache requests so a whole window is read in one call
the Chrome DevTools Protocol
mssandPillowpywin32Windows OCR through
winrtcustomtkinterfor the picker, dialogs and control panel
Issues and pull requests are welcome.
License
MIT. Free to use, change and share for any purpose, including commercial use.
Available Tools
10 toolsactA
Run steps in order with the real mouse/keyboard, then return what changed on screen. Target = ref "e12", visible text "Sign in", or [x,y] pixels of the last screenshot. Steps: {"click":T} {"dblclick":T} {"rclick":T} {"hover":T} {"type":"text","into":T?,"clear":bool?,"enter":bool?} {"key":"ctrl+l"|"enter"|"win+e"...,"repeat":n?} {"key_down":"shift"} {"key_up":"shift"} {"scroll":"down|up|left|right","amount":5,"at":T?} {"drag":T,"to":T} {"wait":"text","timeout":10,"gone":bool?} {"sleep":1} {"focus":"w3|title"} {"launch":"app|url"}. Sensitive steps may ask the user first.
Inputs: steps (required), observe.
clipboardB
Read or write clipboard text (cheaper than selecting/copying on screen).
Inputs: op, text.
doneA
Call once the task is complete (or you are stopping): hides the agent cursor, screen border and control panel so the user gets their screen back. summary = one short line of what you did.
Inputs: summary.
findA
Find elements by visible text and/or role (button, link, edit, item, tab, checkbox, menuitem...). Falls back to OCR. Cheaper than a full snapshot.
Inputs: role, text, limit.
launchA
Open an app by name ("Notepad", "Microsoft Store", "chrome"), a URL, a URI (ms-settings:, ms-windows-store:) or a file/folder path. "agent browser " opens the DeskPilot Chrome profile (precise web control). The window is moved to your screen. Returns a snapshot.
Inputs: target (required).
routineB
Saved, replayable tasks (cheapest way to repeat work). list; run(name, params) replays steps with {{param}} filled in; start = begin recording your act/launch steps, then save(name, description); or save(name, steps=[...]) directly. Use {{param}} in step text for values that change.
Inputs: op, name, steps, params, +1 more.
screen_infoB
Screens, which one you control, mode, top window. op='pick' reopens the user's screen picker; op='switch' + screen ('1','2','all') asks the user to change the controlled screen.
Inputs: op, screen.
screenshotA
Last resort image of your screen (costs many tokens). ref=crop around an element (cheap, sharp); region=[x,y,w,h] in previous screenshot pixels; marks=draw refs from the last snapshot.
Inputs: ref, marks, region, screen, +1 more.
snapshotA
Compact list of visible elements with refs, e.g. e12 button "Install". scope: window=top window on
your screen (default; web pages show only what's in view), page=whole web page incl. off-screen,
screen=all windows there, taskbar, ocr=read text by OCR (apps without accessibility).
filter=only lines containing this text.
Inputs: scope, filter, max_nodes.
windowC
Manage windows. target = window ref (w3) or title/app text; default = top window on your screen. move_here brings a window from another screen onto yours.
Inputs: op, target.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogβ¦
TDQS
Scored across 10 tools
Each tool targets a fairly distinct capability (inspect, find, act, clipboard, launch, window management, record/replay, screenshot), and descriptions carefully rank cost so agents know when to use find vs snapshot vs screenshot. However, snapshot's filter parameter largely duplicates find, and act's built-in launch/focus/scroll steps overlap with the launch and window tools, creating minor boundary confusion.
All names are short lowercase tokens, but the set mixes nouns (clipboard, window, routine, screenshot) with verbs (find, act, launch, done), and screen_info is the lone snake_case outlier. Readable, but no predictable verb_noun convention to generalize from.
Ten tools is well-scoped for a desktop-control agent: one tool per major capability tier (observe, find, act, transport utilities, automation, cleanup) with no filler tools. Nothing looks padded or missing at the count level.
The surface covers the full perceive-act loop: screen/window enumeration, element discovery, input execution, launching, clipboard, replayable routines, and a proper teardown via done. Minor gaps exist β window management only explicitly advertises move/target (no clear close/minimize/resize), and there's no way to read a titled window's text without OCR or snapshotting.
Maintenance
Related MCP Connectors
Connect ChatGPT, Claude, Cursor or VS Code to your Windows PC: files, terminal, browser, apps.
Shared memory MCP server for Claude Code, Codex, Gemini CLI and Cursor. Cited, editable.
Hosted Web Crawler MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Hosted X (Twitter) MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceA lightweight server that enables AI agents to interact with the Windows operating system, allowing for file navigation, application control, UI interaction, and QA testing through various tools.11,480MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI coding assistants to control and inspect a live Chrome browser through Chrome DevTools. Provides browser automation, performance analysis, debugging capabilities, and network request monitoring.1,859,617 npm55,025Apache 2.0
- AlicenseAqualityAmaintenanceWindows desktop automation MCP server β screenshot, mouse, keyboard & UI Automation. Lets LLM agents see and control your Windows desktop directly.30486 npm25MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that gives any AI assistant eyes and hands on your desktop β screenshots, clicking, typing, OCR, window management, accessibility-tree queries, workflow recording.5Apache 2.0