MCP server for desktop UI automation
Project description
Blindpilot MCP
BlindPilot MCP redefines computer use. Instead of AI wasting time interpreting screenshots, it reads directly on the operating system's UI tree and sends it to the LLM as text, enabling faster, more accurate, and more reliable desktop automation. No screenshot -> AI -> control loop. This project is also compatible with Linux and macOS.
Installation
MCP Configuration
If blindpilot-mcp is published as a Python package, you only need the MCP
server name, command, and package executable:
{
"mcpServers": {
"blindpilot": {
"type": "stdio",
"command": "uvx",
"args": ["blindpilot-mcp"]
}
}
}
Claude Code:
claude mcp add --transport stdio blindpilot -- uvx blindpilot-mcp
MCP UI fields:
Name: blindpilot
Command: uvx
Arguments: blindpilot-mcp
If you publish the package under another name, replace blindpilot-mcp with
that package command.
Local Development
Use this while developing from a local clone.
- Clone the repository:
git clone <repo-url>
cd blindpilot-mcp
- Copy the absolute path to the project.
On Windows PowerShell:
(Get-Location).Path
On macOS or Linux:
pwd
- No project install is required for local Claude/uvx usage.
Claude can run the server through uvx, which creates an isolated environment
from this project automatically.
For local development, you can still install dependencies with uv:
uv sync
If you prefer pip:
pip install -r requirements.txt
- Install optional platform dependencies when needed.
Linux accessibility support:
uv sync --extra linux
macOS Appium support:
uv sync --extra macos
Install every optional dependency:
uv sync --all-extras
With pip, use:
pip install ".[linux]"
pip install ".[macos]"
Windows does not need an extra; pywinauto is installed automatically on Windows.
- Add the local MCP server to Claude Code with stdio and uvx.
Replace <absolute-project-path> with the path copied in step 2:
claude mcp add --transport stdio blindpilot -- uvx --from "<absolute-project-path>" blindpilot-mcp
Example on this machine:
claude mcp add --transport stdio blindpilot -- uvx --from "C:\Users\Noah\Documents\blindpilot-mcp" blindpilot-mcp
To share the MCP configuration with the repository:
claude mcp add --transport stdio --scope project blindpilot -- uvx --from "<absolute-project-path>" blindpilot-mcp
- For Claude Desktop or another MCP client, use this local stdio server configuration:
{
"mcpServers": {
"blindpilot": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"<absolute-project-path>",
"blindpilot-mcp"
]
}
}
}
GitHub Source
You can also run directly from a GitHub repository without cloning first:
claude mcp add --transport stdio blindpilot -- uvx --from "git+https://github.com/<owner>/blindpilot-mcp" blindpilot-mcp
MCP JSON:
{
"mcpServers": {
"blindpilot": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"git+https://github.com/<owner>/blindpilot-mcp",
"blindpilot-mcp"
]
}
}
}
Usage
Blindpilot exposes MCP tools for desktop UI automation:
- run multiple tools in order with
run_batch - list open windows
- read accessible elements from a window
- click accessible controls
- type text into controls or the active window
- use keyboard, mouse, and clipboard actions
- terminate processes
- handle system dialogs
Interaction guidance:
- Use
run_batchfor ordered action chains. - Do not add
waitbetween normal interactions. - Use short waits only for loading screens, routine checks, rate limits, or small animation delays.
- Prefer
wait_for_elementwhen waiting for a specific UI state. - If
snapshot_windowfails, returns empty data, or looks incomplete, call it a second time before giving up. - Use
key_down+key_press+key_upfor shortcuts. The unreliable combinedhotkeyhelper is not exposed.
Batch example:
{
"steps": [
{"tool": "key_down", "args": {"key": "ctrl"}},
{"tool": "key_press", "args": {"key": "l"}},
{"tool": "key_up", "args": {"key": "ctrl"}},
{"tool": "type_global", "args": {"text": "https://example.com"}},
{"tool": "key_press", "args": {"key": "enter"}}
]
}
Development
Sync dependencies:
uv sync
Run the stdio server manually:
uv run blindpilot-mcp
When launched manually, the process waits for MCP messages on stdin. In normal use, Claude Code, Claude Desktop, or another MCP client starts it automatically.
Compile the modules to validate syntax:
uv run python -m compileall src
Publishing
This project is configured for PyPI Trusted Publishing through GitHub Actions.
In PyPI, create a trusted publisher with:
Workflow name: publish.yml
Environment name: pypi
Then publish by creating a GitHub release, or run the Publish to PyPI
workflow manually from the repository's Actions tab.
Project Structure
src/
main.py Compatibility entrypoint
blindpilot_mcp/
__init__.py Package marker
server.py MCP server factory and stdio runner
tools/
__init__.py Tool package export
registry.py Tool registration list
context.py Platform detection and shared automation state
accessibility.py Window and accessibility-tree tools
batch.py Ordered batch execution tool
input.py Keyboard and mouse tools
clipboard.py Clipboard tools
processes.py Process termination tools
sync.py Waiting and polling helpers
values.py UI element value readers
dialogs.py System dialog handling
Requirements
- Python 3.14
- uv
- Windows for UIA automation through pywinauto
Linux requires AT-SPI/dogtail support. macOS requires Appium with the mac2 driver.
Troubleshooting
If Claude logs an error like:
error: The system cannot find the file specified. (os error 2)
check the uvx arguments in the MCP configuration.
For the simple published-package setup, use:
"command": "uvx",
"args": ["blindpilot-mcp"]
For local development, the --from value must point to this repository, not to
a Claude workspace folder.
Correct:
C:\Users\Noah\Documents\blindpilot-mcp
Incorrect:
C:\Users\Noah\Documents\Claude
The configured directory must contain:
pyproject.toml
src/blindpilot_mcp/server.py
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file blindpilot_mcp-0.1.0.tar.gz.
File metadata
- Download URL: blindpilot_mcp-0.1.0.tar.gz
- Upload date:
- Size: 48.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ea68ae6b18245b363c6df3feb608767580d3d62bffbd3597fbb52faad7e3efc
|
|
| MD5 |
968a032d9879e456eb3285716e8ab317
|
|
| BLAKE2b-256 |
3493a86bc88e615218aeb0a9f3629dbbe100ba3d1a68d74b0bc7d80f988914a5
|
File details
Details for the file blindpilot_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: blindpilot_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 18.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
65cc6b1a4a20135612fb36a7902c17859a97e8d05c392381620103d621e2d52d
|
|
| MD5 |
9f36cbdb62fcc3e5e9bf7bb1a844c242
|
|
| BLAKE2b-256 |
490f2df6a9153495f8d128a4f7ba0ffd326b1fd69dc397a7f854058da461a7de
|