lowlevel-computer-use-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LOWLEVEL_CU_AHK | No | Path to the AutoHotkey executable | |
| LOWLEVEL_CU_CAPTURE_DIR | No | Override the default capture directory (default: ~/lowlevel-computer-use-captures) |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_screen_sizeA | Return the primary screen resolution in pixels. Returns: str: JSON like {"ok": true, "width": 1920, "height": 1080}. |
| get_cursor_positionA | Return the current mouse cursor position in screen pixels. Returns: str: JSON like {"ok": true, "x": 100, "y": 200}. |
| mouse_moveA | Move the mouse cursor to an absolute screen coordinate. Args: params (MoveInput): x, y target and optional animation duration. Returns: str: JSON with the resulting cursor position. |
| mouse_clickA | Click a mouse button, optionally at a specific coordinate. Use clicks=2 for a double-click. If x/y are omitted the click happens at the current cursor position. BACKGROUND TARGETING: set Args: params (ClickInput): position, button, click count, interval, optional target. Returns: str: JSON describing the click that was performed. |
| mouse_dragA | Press a mouse button at a start point and release it at an end point. Args: params (DragInput): optional start, required end, button and duration. Returns: str: JSON describing the drag. |
| mouse_scrollA | Scroll the mouse wheel vertically. Args: params (ScrollInput): amount (positive up / negative down) and optional position. Returns: str: JSON confirming the scroll amount. |
| type_textA | Type a string of text into the currently focused window/control. BACKGROUND TARGETING: set Args: params (TypeInput): the text, optional per-key interval, optional target. Returns: str: JSON confirming how many characters were typed. |
| press_keysA | Press a keyboard combination (hotkey), e.g. Ctrl+C or Alt+Tab. A single-element list presses one key; multiple elements are pressed together. Args: params (HotkeyInput): list of pyautogui key names. Returns: str: JSON confirming the keys pressed. |
| run_commandB | Run a system/shell command and capture its stdout, stderr and exit code. This executes arbitrary commands on the host with the server's privileges. Args: params (RunCommandInput): command, shell flag, cwd and timeout. Returns: str: JSON like {"ok": true, "returncode": 0, "stdout": "...", "stderr": "...", "timed_out": false}. |
| list_windowsA | List top-level windows with their titles, handles, positions and sizes. Args: params (ListWindowsInput): optional title filter and empty-title toggle. Returns: str: JSON {"ok": true, "count": N, "windows": [{title, handle, left, top, width, height, is_minimized, is_maximized, is_active}, ...]}. |
| get_active_windowA | Return information about the currently focused (active) window. Returns: str: JSON with the active window's title, handle, position and size, or {"ok": true, "window": null} if none is active. |
| move_windowA | Move a window to a new top-left screen position. Identify the window by Args: params (MoveWindowInput): target window plus new x, y. Returns: str: JSON with the window's updated geometry, or an error if not found. |
| resize_windowB | Resize a window to a new width and height. Args: params (ResizeWindowInput): target window plus new width, height. Returns: str: JSON with the window's updated geometry, or an error if not found. |
| window_actionA | Focus, minimize, maximize, restore or close a window.
Args: params (WindowActionInput): target window plus the action to run. Returns: str: JSON confirming the action, or an error if the window was not found. |
| list_processesA | List running processes with pid, name, memory and CPU usage. Args: params (ListProcessesInput): optional name filter, sort key and limit. Returns: str: JSON {"ok": true, "count": N, "processes": [{pid, name, username, memory_mb, cpu_percent}, ...]}. |
| kill_processA | Kill a process by PID, or all processes matching an exact name. Provide either Args: params (KillProcessInput): pid or name, and force flag. Returns: str: JSON {"ok": true, "killed": [{pid, name}], "count": N}, or an error. |
| screenshotA | Capture a screenshot of a monitor (or a pixel region) and save it as PNG. BACKGROUND CAPTURE: set Args: params (ScreenshotInput): monitor index, optional region, output path, optional window target and client_only flag. Returns: str: JSON {"ok": true, "path": "...", "width": W, "height": H}. |
| crop_imageA | Crop an existing image file to a rectangular sub-region. Args: params (CropInput): source path, crop box (left/top/width/height), output path. Returns: str: JSON {"ok": true, "path": "...", "width": W, "height": H}. |
| start_screen_recordingA | Begin recording the screen to an mp4 file in a background thread. Only one recording can run at a time. Call Args: params (StartRecordingInput): fps, monitor, optional region and output path. Returns: str: JSON {"ok": true, "path": "...", "fps": N, "recording": true}. |
| stop_screen_recordingA | Stop the active screen recording and finalize the mp4 file. Returns: str: JSON {"ok": true, "path": "...", "frames": N, "duration_seconds": S}. |
| recording_statusA | Report whether a screen recording is currently active. Returns: str: JSON {"ok": true, "recording": bool, "path": str|null, "frames": N, "elapsed_seconds": S|null}. |
| list_child_windowsA | Enumerate the child controls of a window (class, text, client rect, handle). Useful for finding the exact control handle to target with background input - e.g. the 'Edit' control inside Notepad - and its position for background clicks. Args: params (WinTargetInput): the parent window by hwnd or title. Returns: str: JSON {"ok": true, "parent_hwnd": N, "count": N, "children": [ {handle, class, text, left, top, width, height, visible}, ...]}. Coordinates are relative to the parent window's top-left. |
| win_send_keysA | Post key presses to a specific window WITHOUT focusing it (Win32 messages). Args: params (WinSendKeysInput): target window plus key names. Returns: str: JSON confirming the keys posted to the resolved control. |
| win_set_control_textA | Set a control's text directly via WM_SETTEXT (reliable, no focus needed). Pass the control's Args: params (WinSetTextInput): target control by hwnd (preferred) or title, plus text. Returns: str: JSON {"ok": true, "target_hwnd": N, "text_len": N}. |
| create_headless_desktopA | Create an off-screen Win32 desktop for running GUI apps invisibly. Apps launched on this desktop have a real GUI (so they run and can be automated and captured via PrintWindow) but never appear on the visible desktop. This is the 'headless but with GUI' mode. Args: params (HeadlessDesktopInput): desktop name. Returns: str: JSON {"ok": true, "name": "...", "handle": N, "full": "WinSta0\..."}. |
| launch_on_headless_desktopA | Launch a GUI application on an off-screen desktop (creates it if needed). The process runs with a full GUI on the hidden desktop. Use list_headless_windows to find its windows, then drive them with background input and capture them with screenshot(hwnd=...). The visible desktop is never touched. Args: params (LaunchHeadlessInput): desktop name and command line. Returns: str: JSON {"ok": true, "desktop": "...", "pid": N, "command": "..."}. |
| list_headless_windowsA | List the top-level windows living on an off-screen desktop. Args: params (HeadlessDesktopInput): desktop name. Returns: str: JSON {"ok": true, "name": "...", "count": N, "windows": [ {handle, title, class, width, height}, ...]}. |
| close_headless_desktopA | Release this server's handle to an off-screen desktop. The desktop is fully freed by Windows once no process is still running on it, so close any apps you launched there first. Args: params (HeadlessDesktopInput): desktop name. Returns: str: JSON {"ok": true, "name": "...", "closed": bool}. |
| show_windowA | Make a hidden/minimized window visible and bring it to the foreground. Useful when an automated app on the normal desktop hits a step that needs the
human - typically an interactive LOGIN. Show it, let the user sign in, then call
Args: params (WinTargetInput): the window by hwnd or title. Returns: str: JSON {"ok": true, "hwnd": N, "visible": true}. |
| hide_windowA | Hide a window again after it was shown (e.g. once login is complete). Args: params (HideWindowInput): the window by hwnd or title, and a minimize flag. Returns: str: JSON {"ok": true, "hwnd": N, "visible": false}. |
| show_headless_desktopA | Temporarily switch the live screen to a headless desktop for human interaction. The entire off-screen desktop (and the apps running on it) becomes interactive
and visible, so a person can complete a LOGIN or any manual step. Call
Args: params (HeadlessDesktopInput): the off-screen desktop name. Returns: str: JSON {"ok": true, "name": "...", "visible": true, "note": "..."}. |
| hide_headless_desktopA | Switch the live screen back to the normal desktop after show_headless_desktop. Args: params (HeadlessDesktopInput): the off-screen desktop name (for symmetry). Returns: str: JSON {"ok": true, "restored": true}. |
| ahk_statusA | Report whether AutoHotkey is installed and where. Returns: str: JSON {"ok": true, "installed": bool, "path": "...", "version": "v2", ...}. |
| run_ahkA | Run an inline AutoHotkey script and capture its output. The script MUST terminate (call ExitApp, or be non-persistent) or it runs until the timeout. Emit output with FileAppend to the target "*" (stdout). AHK is ideal for reliable background input (ControlSend/ControlClick) and real hotkeys. Args: params (RunAhkInput): script source, optional args, timeout, optional exe path. Returns: str: JSON {"ok": bool, "returncode": int, "stdout": "...", "stderr": "...", "exe": "..."}. |
| ahk_control_sendA | Send text or keystrokes to a background window/control via AutoHotkey ControlSend. Works without focusing the window and is often more reliable than raw WM_CHAR for complex apps. Target a HWND with 'ahk_id '. Args: params (AhkControlSendInput): text, window/control targets, as_keys, timeout. Returns: str: JSON with the AHK run result. |
| linux_statusA | Report Linux X11 automation tooling availability (xdotool, wmctrl, Xvfb, …). Returns: str: JSON {"ok": true, "display": ":0", "session_type": "x11", "xdotool": bool, ...}. |
| create_virtual_displayA | Start an Xvfb virtual display — the Linux 'headless but with GUI' mode. GUI apps launched on it run with a real X server but no physical screen, so they can be automated (xdotool) and screenshotted (mss) without occupying the visible desktop. The Linux counterpart of the Windows headless desktop. Args: params (CreateVirtualDisplayInput): display number, width, height, depth. Returns: str: JSON {"ok": true, "display": ":99", "size": "1280x800x24", "pid": N}. |
| launch_on_virtual_displayA | Launch a GUI app on an Xvfb virtual display (creates it if needed). Args: params (LaunchVirtualInput): display number and command line. Returns: str: JSON {"ok": true, "display": ":99", "pid": N, "command": "..."}. |
| list_virtual_display_windowsB | List the windows present on an Xvfb virtual display. Args: params (VirtualDisplayInput): display number. Returns: str: JSON {"ok": true, "count": N, "windows": [...]}. |
| screenshot_virtual_displayB | Capture the whole Xvfb virtual display to a PNG. Args: params (ScreenshotVirtualInput): display number and output path. Returns: str: JSON {"ok": true, "path": "...", "width": W, "height": H}. |
| stop_virtual_displayA | Stop an Xvfb virtual display and terminate the apps launched on it. Args: params (VirtualDisplayInput): display number. Returns: str: JSON {"ok": true, "display": ":99", "stopped": true}. |
| wsl_statusA | Report whether WSL is available on this Windows host. Returns: str: JSON {"ok": true, "available": bool, "version": "...", ...}. |
| wsl_list_distrosA | List installed WSL distros with state, version and default flag. Returns: str: JSON {"ok": true, "count": N, "distros": [{name, state, version, default}, ...]}. |
| wsl_create_tempA | Provision a throwaway WSL distro on demand for running Linux software. By default downloads a tiny Alpine minirootfs (a few MB) and imports it, leaving existing distros untouched. Use wsl_run to run commands in it and wsl_destroy to tear it down. Alternatively clone_from an existing distro or import base_tar. Args: params (WslCreateInput): optional name, rootfs_url, clone_from, base_tar, timeout. Returns: str: JSON {"ok": true, "name": "...", "install_dir": "...", "source": "alpine"}. |
| wsl_runB | Run a shell command inside a WSL distro and capture stdout/stderr/exit code. Args: params (WslRunInput): distro, command, optional user, cwd and timeout. Returns: str: JSON {"ok": true, "distro": "...", "returncode": N, "stdout": "...", "stderr": "..."}. |
| wsl_list_tempA | List the throwaway distros this server session provisioned. Returns: str: JSON {"ok": true, "count": N, "distros": [{name, install_dir, source, created_at}, ...]}. |
| wsl_destroyA | Terminate and unregister a WSL distro, deleting its files (irreversible). Args: params (WslDestroyInput): distro name and whether to delete files. Returns: str: JSON {"ok": true, "name": "...", "destroyed": true}. |
| wsl_destroy_all_tempA | Tear down every throwaway distro provisioned in this session. Returns: str: JSON {"ok": true, "destroyed": [...], "count": N}. |
| is_adminA | Report whether this server process is running elevated (as Administrator). Returns: str: JSON {"ok": true, "is_admin": bool, "platform": "Windows"}. |
| run_command_as_adminA | Run a shell command with Administrator privileges. If the server is not already elevated this triggers a Windows UAC prompt that the user must approve. Output is captured and returned. This runs commands with full administrative rights - use with care. Args: params (RunAsAdminInput): the command line and a timeout. Returns: str: JSON {"ok": bool, "returncode": int, "output": "...", "elevated_prompt": bool}. |
| install_startupA | Install a scheduled task so this server starts automatically at user logon. By default the task runs with Administrator privileges (RunLevel Highest) and launches the server in HTTP mode so it is always available after boot. Registering the task requires elevation - a UAC prompt appears if the server is not already elevated. Args: params (InstallStartupInput): run_as_admin, http, host and port options. Returns: str: JSON {"ok": bool, "output": "...", "task_name": "...", "run_as_admin": bool}. |
| uninstall_startupA | Remove the boot-startup scheduled task (requires elevation; may prompt UAC). Returns: str: JSON {"ok": bool, "output": "...", "task_name": "..."}. |
| startup_statusA | Report whether the boot-startup scheduled task is installed and its state. Returns: str: JSON {"ok": bool, "installed": bool, "details": "...", "task_name": "..."}. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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