Skip to main content

Windows Remote MCP Server - control Windows desktops via MCP protocol

Project description

winremote-mcp

CI PyPI Python

A Windows Remote MCP Server — control Windows desktops via the Model Context Protocol.

Built with FastMCP. Runs on the Windows machine you want to control.

Features

  • Desktop Control — screenshot (JPEG compressed, multi-monitor), click, type, scroll, keyboard shortcuts
  • Window Management — focus, minimize-all, launch/resize apps
  • Remote Management — PowerShell shell (with cwd), clipboard, processes, system info, notifications
  • File Operations — read, write, list, search, binary transfer (base64)
  • Registry Tools — read/write Windows Registry values
  • Service Management — list, start, stop Windows services
  • Scheduled Tasks — list, create, delete scheduled tasks
  • Network Tools — ping, port check, network connections
  • Event Log — read Windows Event Log with level filtering
  • API Key Auth — optional --auth-key / WINREMOTE_AUTH_KEY for Bearer token authentication
  • Health EndpointGET /health returns {"status":"ok","version":"0.3.0"} (always public)
  • OCR — extract text from screen regions (pytesseract or Windows built-in)
  • Screen Recording — capture animated GIF of screen activity
  • Annotated Snapshot — screenshot with numbered labels on interactive elements
  • Hot Reload--reload flag for development
  • Auto-Startwinremote install / winremote uninstall for Windows scheduled tasks

Installation

# From PyPI (once published)
pip install winremote-mcp

# From source
pip install .

# With uv
uv pip install .

PyPI publishing: This repo uses GitHub Actions with trusted publishers. To enable, configure PyPI trusted publisher for the dddabtc/winremote-mcp repo, workflow publish.yml, environment pypi.

Usage

stdio transport

winremote-mcp
# or
uv run winremote-mcp

Streamable HTTP transport (default, for remote access)

winremote-mcp --transport streamable-http --host 0.0.0.0 --port 8090

With hot reload (development)

winremote-mcp --reload

With authentication

winremote-mcp --auth-key "my-secret-key"
# or via environment variable
WINREMOTE_AUTH_KEY="my-secret-key" winremote-mcp

Clients must include Authorization: Bearer my-secret-key header. The /health endpoint remains public.

Health check

curl http://localhost:8090/health
# {"status":"ok","version":"0.2.0"}

Auto-start (Windows scheduled task)

# Create scheduled task to start on boot
winremote-mcp install

# Remove scheduled task
winremote-mcp uninstall

MCP Client Config

stdio:

{
  "mcpServers": {
    "windows-remote": {
      "command": "uv",
      "args": ["run", "winremote-mcp"]
    }
  }
}

streamable-http:

{
  "mcpServers": {
    "windows-remote": {
      "type": "streamable-http",
      "url": "http://<windows-ip>:8090/mcp"
    }
  }
}

What's New in v0.2.0

  • Snapshot compression: Returns JPEG instead of PNG. Configurable quality (default 75) and max_width (default 1920) params. Significantly reduces image size.
  • Health endpoint: GET /health returns JSON status — useful for monitoring and load balancers.
  • Shell cwd parameter: Optional cwd param to run commands in a specific directory.
  • Better pywin32 error reporting: Explicit error messages when pywin32 is missing instead of silent failures.
  • Hot reload: --reload flag passes through to uvicorn for development.
  • Install/uninstall commands: winremote install creates a Windows scheduled task for auto-start on boot.

Tools

Tool Description
Snapshot Screenshot (JPEG, configurable quality/max_width) + window list + UI elements
Click Mouse click (left/right/middle, single/double/hover)
Type Type text at coordinates
Scroll Vertical/horizontal scroll
Move Move mouse / drag
Shortcut Keyboard shortcuts
Wait Pause execution
FocusWindow Bring window to front (fuzzy title match)
MinimizeAll Show desktop (Win+D)
App Launch/switch/resize applications
Shell Execute PowerShell commands (with optional cwd)
GetClipboard Read clipboard
SetClipboard Write clipboard
ListProcesses Process list with CPU/memory
KillProcess Kill process by PID or name
GetSystemInfo System information
Notification Windows toast notification
LockScreen Lock workstation
Scrape Fetch URL content
FileRead Read file content
FileWrite Write file content
FileList List directory contents
FileSearch Search files by pattern
FileDownload Download file as base64 (binary)
FileUpload Upload file from base64 (binary)
RegRead Read Windows Registry value
RegWrite Write Windows Registry value
ServiceList List Windows services
ServiceStart Start a Windows service
ServiceStop Stop a Windows service
TaskList List scheduled tasks
TaskCreate Create a scheduled task
TaskDelete Delete a scheduled task
Ping Ping a host
PortCheck Check if a TCP port is open
NetConnections List network connections
EventLog Read Windows Event Log entries
OCR Extract text from screen via OCR (pytesseract or Windows built-in)
ScreenRecord Record screen activity as animated GIF
AnnotatedSnapshot Screenshot with numbered labels on interactive elements

OCR (optional dependency)

The OCR tool supports two engines: pytesseract (recommended) and Windows built-in OCR (fallback).

Quick setup:

# 1. Install Tesseract-OCR engine
winget install UB-Mannheim.TesseractOCR

# 2. Install Python package
pip install winremote-mcp[ocr]

Supports 100+ languages including Chinese (chi_sim), Japanese (jpn), Korean (kor).

📖 Full guide: docs/ocr-setup.md — installation, language packs, Windows OCR fallback, troubleshooting.

Requirements

  • Windows 10/11
  • Python >= 3.10

Integration & Skills

Ready-to-use skill packages for popular AI platforms:

Platform Guide Transport
OpenClaw Full skill with 40 tools stdio / streamable-http
Claude Desktop / Claude Code MCP config for Claude stdio / streamable-http
Cursor .cursor/mcp.json config stdio / streamable-http

Quick Config (any MCP client)

Local (stdio):

{
  "mcpServers": {
    "winremote": {
      "command": "python",
      "args": ["-m", "winremote", "--transport", "stdio"]
    }
  }
}

Remote (streamable-http):

# On Windows: python -m winremote
{
  "mcpServers": {
    "winremote": {
      "type": "streamable-http",
      "url": "http://<windows-ip>:8090/mcp"
    }
  }
}

See docs/openclaw-integration.md for detailed setup with authentication.

Acknowledgments

Inspired by Windows-MCP by CursorTouch. Thanks for the pioneering work on Windows desktop automation via MCP.

Contributing

See CONTRIBUTING.md.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

winremote_mcp-0.3.0.tar.gz (29.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

winremote_mcp-0.3.0-py3-none-any.whl (26.5 kB view details)

Uploaded Python 3

File details

Details for the file winremote_mcp-0.3.0.tar.gz.

File metadata

  • Download URL: winremote_mcp-0.3.0.tar.gz
  • Upload date:
  • Size: 29.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for winremote_mcp-0.3.0.tar.gz
Algorithm Hash digest
SHA256 5a37a54938838b774ab4026a91f27da69d907cbf18a9e75ae51d982237b0a1f8
MD5 110175315a02ec1a715e99c4f04bf77c
BLAKE2b-256 8fb11c95446af358ce23adf98685a164a4655318469d0471ad1fdcad9a967fd2

See more details on using hashes here.

Provenance

The following attestation bundles were made for winremote_mcp-0.3.0.tar.gz:

Publisher: publish.yml on dddabtc/winremote-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file winremote_mcp-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: winremote_mcp-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 26.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for winremote_mcp-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1a014aa915d061fbd1cb645c3868a8f7a6305e3e4e7241fa767d75be92ac1d4f
MD5 0ac49d04c71a9b7361589b7462d2d3ac
BLAKE2b-256 559317320187c8ba2ebd08a2d664e1666e28b9ee30b110765d782063f1bd2345

See more details on using hashes here.

Provenance

The following attestation bundles were made for winremote_mcp-0.3.0-py3-none-any.whl:

Publisher: publish.yml on dddabtc/winremote-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page