lowlevel-computer-use-mcp
Allows running AutoHotkey scripts and using ControlSend/ControlClick for reliable background window input.
Click on "Install 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., "@lowlevel-computer-use-mcptake a screenshot of my main monitor"
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.
lowlevel-computer-use-mcp
A low-level computer-use MCP server for Windows (most tools also work on macOS/Linux). It exposes raw desktop control to any MCP client β Claude Code, Codex, Claude Desktop, etc. β as a set of well-described tools:
π±οΈ Mouse β move, click, double/right/middle click, drag, scroll, cursor position
β¨οΈ Keyboard β type text, press hotkey combinations (Ctrl+C, Alt+Tab, β¦)
π₯οΈ Shell commands β run arbitrary system commands and capture output
πͺ Windows β list, move, resize, focus, minimize, maximize, restore, close, show/hide
βοΈ Processes β list running processes; kill by PID or name
πΈ Screenshots β all monitors, one monitor, a region, or one window via PrintWindow
βοΈ Cropping β crop any saved image to a sub-region
π₯ Screen recording β record a monitor or region to mp4 in the background
π― Background / unfocused targeting β drive a specific window via Win32 messages without focusing it
π«₯ Headless GUI β run real GUI apps on an off-screen desktop; show them only when a human login is needed
π‘οΈ Run-as-admin β per-command UAC elevation or whole-server elevation
π Auto-start on boot β register a logon scheduled task (optionally as admin)
π’ AutoHotkey add-in β run AHK scripts;
ControlSend/ControlClickfor rock-solid background inputπ§ Cross-platform β the same tools work natively on Linux (X11 via xdotool/wmctrl), with Xvfb virtual displays for headless-with-GUI
π Ephemeral WSL β on a Windows host, spin up a throwaway Linux distro on demand, run commands, tear it down
π§© GUI installer β one window that installs everything automatically
πΈ Cheap Version β a no-MCP command-line fallback that runs any tool directly from CLI args, for when MCP connections keep failing
β οΈ This server performs real, unsandboxed actions on the host machine β clicking, typing, killing processes and running shell/elevated commands with your user's privileges. Only register it in environments where that is acceptable.
Tools
Tool | Description |
| Primary screen resolution |
| Current mouse position |
| Move cursor to |
| Click; |
| Press-drag-release between two points |
| Scroll the wheel up/down |
| Type text; |
| Press a key / hotkey combo, e.g. |
| Run a shell command, capture output/exit code |
| List top-level windows (title, handle, geometry, state) |
| Info about the focused window |
| Move / resize a window |
| focus / minimize / maximize / restore / close |
| Bring a window forward (e.g. for login), then hide it again |
| Enumerate a window's child controls (class, text, rect, handle) |
| Set a control's text via WM_SETTEXT (reliable background text) |
| Post key presses to a window without focusing it |
| List processes; kill by PID or name |
| Monitor/region/single-window (PrintWindow) capture to PNG |
| Crop an existing image to a box |
| mp4 recording |
| Create an off-screen desktop |
| Launch a GUI app onto it |
| List windows on the off-screen desktop |
| Temporarily make it interactive (login), then hide |
| Release the off-screen desktop handle |
| Whether AutoHotkey is installed |
| Run an inline AutoHotkey script |
| AHK ControlSend to a background window/control |
| Whether the server is running elevated |
| Run a shell command elevated (UAC prompt) |
| Boot auto-start |
| Linux: X11 automation tooling availability |
| Linux: start an Xvfb headless display |
| Linux: launch a GUI app on the Xvfb display |
| Linux: windows on the Xvfb display |
| Linux: capture the whole Xvfb display |
| Linux: stop the Xvfb display |
| WSL availability + installed distros |
| Provision a throwaway WSL distro (Alpine by default) |
| Run a command inside a WSL distro |
| Manage throwaway distros |
Every tool returns a JSON string {"ok": true, ...} on success or
{"ok": false, "error": "..."} on failure.
Related MCP server: MCP Desktop Tools
Quick start (GUI installer β fully automatic)
The easiest path. It installs uv if missing, runs uv sync, and registers the
server with both Claude Code and Codex automatically on launch.
Clone the repo:
git clone https://github.com/codingmachineedge/lowlevel-computer-use-mcp.gitEnter it:
cd lowlevel-computer-use-mcpLaunch the installer (it auto-runs the full install):
uv run lowlevel-computer-use-mcp-installerThen restart Claude Code / Codex so they spawn the server.
Manual install
Install dependencies and start the stdio server:
uv run lowlevel-computer-use-mcpOr with pip β install in editable mode:
pip install -e .Then run it:
lowlevel-computer-use-mcpCaptures (screenshots, recordings) are written to
~/lowlevel-computer-use-captures by default. Override with the
LOWLEVEL_CU_CAPTURE_DIR environment variable.
Registering with clients
Replace the path below with wherever you cloned this repo.
Claude Code
Register at user scope (one line):
claude mcp add lowlevel-computer-use --scope user -- uv run --directory "C:\path\to\lowlevel-computer-use-mcp" lowlevel-computer-use-mcpOr add this to ~/.claude.json under mcpServers:
{
"mcpServers": {
"lowlevel-computer-use": {
"command": "uv",
"args": ["run", "--directory", "C:\\path\\to\\lowlevel-computer-use-mcp", "lowlevel-computer-use-mcp"]
}
}
}Codex (OpenAI Codex CLI)
Add this block to ~/.codex/config.toml:
[mcp_servers.lowlevel-computer-use]
command = "uv"
args = ["run", "--directory", "C:\\path\\to\\lowlevel-computer-use-mcp", "lowlevel-computer-use-mcp"]
startup_timeout_sec = 60YOLO mode (auto-approve, no permission prompts)
The GUI installer enables this by default. To do it manually for Claude Code, add a
wildcard allow rule for this server's tools to ~/.claude/settings.json:
{ "permissions": { "allow": ["mcp__lowlevel-computer-use__*"] } }For Codex, set the global approval policy in ~/.codex/config.toml:
approval_policy = "never"β οΈ YOLO means every tool runs without asking β including destructive ones (
kill_process,run_command,run_command_as_admin,wsl_destroy). Only enable it if you trust the agents driving this server.
Cheap Version (no-MCP fallback)
If MCP connections keep failing, you don't need MCP at all. The Cheap Version is a command-line fallback that runs the exact same tool functions in-process and prints the JSON result β no client, transport, or server connection involved.
List every available tool:
uv run lowlevel-computer-use-cheap --listTake a screenshot:
uv run lowlevel-computer-use-cheap screenshot --monitor 1Double-click at a point:
uv run lowlevel-computer-use-cheap mouse_click --x 960 --y 540 --clicks 2Press a hotkey (values are parsed as JSON, so lists work):
uv run lowlevel-computer-use-cheap press_keys --keys '["ctrl","s"]'Run a shell command:
uv run lowlevel-computer-use-cheap run_command --command "ipconfig /all"Pass a whole argument object as JSON:
uv run lowlevel-computer-use-cheap screenshot --json '{"window_title":"Notepad"}'The same thing is also available as a subcommand of the main entry point:
uv run lowlevel-computer-use-mcp cheap get_screen_sizeEvery parameter from the Tool Reference is accepted as --<param> <value>
(or via --json). Output is the identical {"ok": true, ...} JSON the MCP tools return.
Agent skill β every feature documented
A companion skill (skills/lowlevel-computer-use/) teaches agents the entire
toolset: a top-level SKILL.md plus reference/TOOLS.md (exhaustive per-tool
parameters), reference/WORKFLOWS.md (end-to-end recipes) and
reference/PLATFORMS.md (Windows/Linux specifics & gotchas). Install it for Claude
Code by copying it into your skills directory:
cp -r skills/lowlevel-computer-use ~/.claude/skills/The MCP server also ships condensed instructions inline, so any MCP client gets a full feature overview on connect.
Background / unfocused window targeting
mouse_click, type_text and screenshot accept hwnd or window_title. When
set, input is delivered to that exact window via Win32 messages without focusing
or foregrounding it, and screenshot uses PrintWindow so the window is captured
even if it's behind others, minimized, or on an off-screen desktop.
Typical flow:
Find the window:
list_windows { "title_filter": "Notepad" }Find the control to target:
list_child_windows { "window_title": "Notepad" }Set its text in the background (most reliable for edit controls):
win_set_control_text { "hwnd": 23924320, "text": "typed without focus" }Or click it in the background (x/y are client coords of the window):
mouse_click { "window_title": "Notepad", "x": 200, "y": 120 }See the result without bringing it forward:
screenshot { "window_title": "Notepad" }Caveat: message-based input is ignored by some apps (raw input / DirectInput / physical-key-state checks). For those, use the AutoHotkey
ahk_control_sendtool, or bring the window forward briefly.
Headless-but-with-GUI mode
Run a real GUI app on an off-screen Win32 desktop so it never touches your visible desktop, then automate and screenshot it via the background tools.
Create the off-screen desktop:
create_headless_desktop { "name": "work" }Launch an app onto it:
launch_on_headless_desktop { "name": "work", "command": "notepad.exe" }List its windows (to get handles):
list_headless_windows { "name": "work" }Capture a window on it (works even though it's off-screen):
screenshot { "hwnd": 2495156 }Showing it for an interactive login, then hiding again
Some steps (sign-in) need a human. Temporarily switch the live screen to the off-screen desktop:
show_headless_desktop { "name": "work" }β¦let the user log in, then switch back to the normal desktop:
hide_headless_desktop { "name": "work" }For an ordinary hidden window on the normal desktop, use show_window /
hide_window instead:
show_window { "window_title": "My App" }hide_window { "window_title": "My App" }AutoHotkey add-in
Optional but powerful. AHK's ControlSend/ControlClick drive background windows
very reliably, and run_ahk is a full scripting escape hatch.
Install AutoHotkey (one line):
winget install -e --id AutoHotkey.AutoHotkeyCheck the server can find it:
ahk_status {}Send text to a background window by HWND:
ahk_control_send { "text": "hello", "window": "ahk_id 0x1A2B3C" }Run an arbitrary AHK script (must call ExitApp):
run_ahk { "code": "ControlSendText \"hi\", , \"ahk_exe notepad.exe\"\nExitApp" }Point the server at a specific AHK exe by setting LOWLEVEL_CU_AHK to its path.
Macros β save repeated sequences as Skills
When you run a multi-step UI sequence the user is likely to repeat, don't leave
it as ad-hoc tool calls β capture it as a reusable macro Skill. The server tells
agents to do this automatically; see
macros/MACRO_SKILL_TEMPLATE.md for the template
and rules (resolve handles at run time, prefer background tools, parameterize the
variable parts, verify with a screenshot).
Linux (native X11)
The mouse, keyboard, screenshot, process, recording, window management and
background/unfocused targeting tools all work natively on Linux. Window control,
background input and per-window capture use X11 CLI tools; on Linux hwnd is an X11
window id.
Install the X11 helpers (Debian/Ubuntu):
sudo apt install xdotool wmctrl x11-utils imagemagick xvfbCheck what the server can see:
linux_status {}Background-type into a window without focusing it (X11):
type_text { "window_title": "Editor", "text": "typed in the background" }Caveat: X11 background typing uses
XSendEvent; most apps accept it, but a few (notablyxtermwith its defaultallowSendEvents: false) ignore synthetic events. For those, focus the window first or use a real X session.
Headless-with-GUI on Linux (Xvfb)
Start a virtual display:
create_virtual_display { "display": 99, "width": 1280, "height": 800 }Launch a GUI app onto it:
launch_on_virtual_display { "display": 99, "command": "xterm -e bash" }List its windows:
list_virtual_display_windows { "display": 99 }Drive a window on that display (note the display field routes input there):
type_text { "hwnd": 2097164, "display": 99, "text": "hello from headless" }Capture the whole virtual display:
screenshot_virtual_display { "display": 99 }Stop it when done:
stop_virtual_display { "display": 99 }Ephemeral WSL (Linux on a Windows host)
On Windows, spin up a throwaway Linux distro on demand to run Linux software, then tear it down. By default a tiny Alpine minirootfs is downloaded and imported in seconds β your existing distros are untouched.
Check WSL is available:
wsl_status {}Provision a throwaway distro (downloads latest Alpine minirootfs):
wsl_create_temp {}Run a command in it (use the name returned above):
wsl_run { "distro": "llcu-tmp-1782754365-53b8", "command": "apk add --no-cache curl && curl --version" }Tear it down (irreversible β deletes the distro):
wsl_destroy { "name": "llcu-tmp-1782754365-53b8" }You can also clone an existing distro instead of downloading:
wsl_create_temp { "clone_from": "Ubuntu-24.04" }Run-as-admin mode
Per-command elevation β call run_command_as_admin (UAC prompt unless already
elevated):
run_command_as_admin { "command": "net session" }Or run the whole server elevated (intended for HTTP mode):
uv run lowlevel-computer-use-mcp --http --adminCheck elevation:
is_admin {}Auto-start on boot
Register a logon Scheduled Task (admin + HTTP by default):
uv run lowlevel-computer-use-mcp install-startupInstall without admin privileges:
uv run lowlevel-computer-use-mcp install-startup --no-adminUse a custom port:
uv run lowlevel-computer-use-mcp install-startup --port 9000Check the task status:
uv run lowlevel-computer-use-mcp startup-statusRemove it:
uv run lowlevel-computer-use-mcp uninstall-startupOnce the boot service runs in HTTP mode, point a client at it as a remote MCP server:
claude mcp add --transport http lowlevel-computer-use-boot http://127.0.0.1:8765/mcpThe task uses an interactive logon trigger (not SYSTEM) so the desktop-automation tools keep access to your session.
Requirements
Python 3.10+
uv (recommended; the GUI installer can bootstrap it)
Windows: mouse/keyboard via
pyautogui; windows viapygetwindow; background input + capture + headless desktop viactypes/Win32 (winio.py); screenshots viamss; recording viaimageio+ bundled ffmpeg. Optional: AutoHotkey, WSL.Linux: mouse/keyboard via
pyautogui(X11); window mgmt, background input and per-window capture viaxdotool/wmctrl/x11-utils/ImageMagick (linuxio.py); headless-with-GUI viaXvfb; screenshots/recording viamss. Install the X11 helpers with your package manager (see the Linux section). X11 (or XWayland) session.
Safety notes
run_command,run_command_as_admin,kill_process,run_ahkandwindow_action(close)are marked destructive.pyautogui's fail-safe is disabled so automation isn't interrupted by the cursor reaching a screen corner; be deliberate with coordinates.The server has no authentication of its own β it trusts the MCP client that spawns it.
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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/codingmachineedge/lowlevel-computer-use-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server