Skip to main content
Glama
geojakes

device-controller-mcp

by geojakes

device-controller-mcp

An MCP (Model Context Protocol) server that lets Claude Desktop and Claude Code control your PC — take screenshots, click, type, manage windows, and more.

Features

  • Two scope modes — lock every action to a single app window (--app), or grant full-desktop access (--full).

  • Cross-platform — macOS and Windows, with a clean platform abstraction layer.

  • Screenshot capture (full screen or single window) returned as base64 PNG.

  • Mouse & keyboard — clicks, typing, key combos, scrolling.

  • Window management — list, focus, resize, minimize, maximize.

  • Clipboard read / write.

  • Shell commands — launch apps, run commands, check running processes.

Requirements

  • Python 3.10+

  • macOS or Windows

Installation

git clone https://github.com/geojakes/device-controller-mcp.git
cd device-controller-mcp
pip install -e .

Platform extras

macOS — install pyobjc for accurate window bounds (optional but recommended):

pip install pyobjc-framework-Quartz pyobjc-framework-AppKit

Windows — pywin32 is required:

pip install pywin32

Usage

Scoped to a single app

pc-control-mcp --app "Google Chrome"

All screenshots, clicks, and coordinates will be relative to Chrome's window. The server auto-focuses Chrome before every action.

Full desktop

pc-control-mcp --full

Screenshots capture the whole screen and coordinates are screen-absolute.

Registering with Claude Desktop

Add an entry to your claude_desktop_config.json.

Config file location:

OS

Path

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Full-desktop mode

{
  "mcpServers": {
    "pc-control": {
      "command": "pc-control-mcp",
      "args": ["--full"]
    }
  }
}

Scoped to one app

{
  "mcpServers": {
    "pc-control-chrome": {
      "command": "pc-control-mcp",
      "args": ["--app", "Google Chrome"]
    }
  }
}

Tip: If you installed inside a virtualenv, use the full path to the executable, e.g. "/path/to/venv/bin/pc-control-mcp".

Registering with Claude Code

claude mcp add pc-control -- pc-control-mcp --full

Or scoped:

claude mcp add pc-control-chrome -- pc-control-mcp --app "Google Chrome"

Tools reference

Tool

Description

screenshot

Capture screen or app window as base64 PNG. Optional sub-region crop.

mouse_click

Click at (x, y) — configurable button and click count.

mouse_move

Move cursor to (x, y) without clicking.

mouse_scroll

Scroll up/down at a position.

type_text

Type a string. Supports clipboard-paste mode for Unicode.

key_press

Press keys or combos (ctrl+c, cmd+shift+s, ...).

list_windows

List all visible windows with title, position, and size.

focus_window

Bring a window to the foreground.

resize_window

Move and resize a window.

minimize_window

Minimize a window.

maximize_window

Maximize a window to fill the screen.

clipboard_read

Read the system clipboard.

clipboard_write

Write text to the clipboard.

launch_app

Open an application by name.

run_command

Run a shell command and return stdout/stderr/exit code.

is_process_running

Check whether a named process is running.

macOS permissions

On macOS you need to grant Accessibility access to your terminal app (or to Claude Desktop) in System Settings > Privacy & Security > Accessibility. This is required for pyautogui to control the mouse and keyboard.

Project structure

device-controller-mcp/
├── pyproject.toml
├── requirements.txt
├── README.md
└── src/
    └── pc_control_mcp/
        ├── __init__.py
        ├── __main__.py            # CLI entry point (argparse)
        ├── server.py              # FastMCP server factory
        ├── scope.py               # Scope manager (coord translation + auto-focus)
        ├── platform_layer/
        │   ├── __init__.py        # Platform detection factory
        │   ├── base.py            # Abstract base class + WindowInfo
        │   ├── macos.py           # macOS: Quartz + AppleScript
        │   └── windows.py        # Windows: pywin32
        └── tools/
            ├── __init__.py
            ├── screenshot.py      # Screen / window capture
            ├── input_control.py   # Mouse & keyboard
            ├── window_mgmt.py     # Window management
            ├── clipboard.py       # Clipboard read/write
            └── shell.py           # Shell commands & app launcher

License

MIT

A
license - permissive license
-
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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/geojakes/device-controller-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server