io.github.TheoEwzZer/winsight

Windows Screen Capture MCP Server — give Claude Code eyes on your desktop.

2MITdevtools

Install

Config snippet generator goes here (5 client tabs)

README

# WinSight MCP

mcp-name: io.github.TheoEwzZer/winsight

Windows Screen Capture MCP Server — give Claude Code eyes on your Windows desktop.

WinSight is an [MCP](https://modelcontextprotocol.io) server that lets Claude Code capture your screen, manage windows, and launch applications on Windows.

## Features

- **Screenshot** the full screen, a specific region, or a specific window
- **Window capture** uses Win32 `PrintWindow` API — captures the real window content even when it's behind other windows
- **List and inspect** open windows and monitors (title, position, size, state, resolution)
- **Control windows** — move, resize, minimize, maximize, restore, and focus
- **Launch** applications and wait for their windows

## Requirements

- **Windows 10/11**
- **Python 3.10+**

## Quick Start

### Option 1: uvx (recommended)

No install needed — runs directly:

```json
{
  "mcpServers": {
    "winsight": {
      "command": "uvx",
      "args": ["winsight-mcp"]
    }
  }
}
```

Add this to your project's `.mcp.json` or `~/.claude/claude_desktop_config.json`.

### Option 2: pip install

```bash
pip install winsight-mcp
```

Then configure:

```json
{
  "mcpServers": {
    "winsight": {
      "command": "winsight-mcp"
    }
  }
}
```

### Option 3: From source

```bash
git clone https://github.com/TheoEwzZer/WinSight-MCP.git
cd WinSight-MCP
uv sync
```

```json
{
  "mcpServers": {
    "winsight": {
      "command": "uv",
      "args": ["--directory", "/path/to/WinSight-MCP", "run", "winsight-mcp"]
    }
  }
}
```

## Tools

### Screenshot

| Tool                | Description                                                             |
| ------------------- | ----------------------------------------------------------------------- |
| `take_screenshot`   | Capture the full screen or a specific monitor                           |
| `screenshot_window` | Capture a specific window by title (works even if behind other windows) |
| `screenshot_region` | Capture a rectangular region of the screen                              |

### Window Management

| Tool              | Description                                                 |
| ----------------- | ----------------------------------------------------------- |
| `list_windows`    | List all visible windows with optional title filter         |
| `get_window_info` | Get detailed info about a window (position, size, state)    |
| `focus_window`    | Bring a window to the foreground                            |
| `resize_window`   | Resize a window to specific dimensions                      |
| `move_window`     | Move a window to a specific position                        |
| `minimize_window` | Minimize a window to the taskbar                            |
| `maximize_window` | Maximize a window to fill the screen                        |
| `restore_window`  | Restore a minimized or maximized window to its normal state |
| `wait_for_window` | Wait for a window to appear (adaptive polling with timeout) |

### System

| Tool               | Description                                                   |
| ------------------ | ------------------------------------------------------------- |
| `list_monitors`    | List all monitors with resolution, position, and primary flag |
| `open_application` | Launch an application and optionally wait for its window      |

## Examples

Once the MCP server is connected, you can ask Claude Code things like:

- "Take a screenshot of my screen"
- "List all open windows"
- "Capture the Notepad window"
- "Open calculator and take a screenshot of it"
- "Focus the Chrome window"
- "Resize the app window to 800x600 and take a screenshot"
- "Move the window to the top-left corner"
- "What monitors do I have?"

## Testing

The project has 112 tests covering all modules. Tests use mocks for Win32 APIs so they run on any platform.

### Running tests

```bash
uv run pytest
```

### Test structure

```text
tests/
  conftest.py              # Shared fixtures and Win32 stubs
  test_types.py            # TypedDict definitions validation
  test_screenshot.py       # Screen/region/window capture (mss, Win32 DC)
  test_window_manager.py   # Window listing, find, focus, resize, move, min/max/restore
  test_process_manager.py  # Application launch and window polling
  test_server.py           # MCP tool registration and integration
```

### Adding tests

1. Put new tests in the matching `test_<module>.py` file
2. Use the shared fixtures from `conftest.py` (`sample_window_info`, `mcp_server`, `fake_png_bytes`)
3. Mock Win32 APIs with `@patch("winsight_mcp.<module>.win32gui")` — never call real Win32 functions in tests
4. For server integration tests, use the `_call` helper to invoke tools and `_text` to extract string results

## License

MIT