Skip to main content
Glama
README.md
# screenshot-mcp

A cross-platform MCP (Model Context Protocol) server for capturing screenshots. Designed for agent-based native application testing.

Also available as a **Claude Code plugin** with screenshot testing guidance.

## Features

- **List Windows**: Get all visible windows with IDs, titles, and bounds
- **List Displays**: Get all available monitors/displays
- **Screenshot Window**: Capture a specific window by ID or title
- **Screenshot Screen**: Capture an entire display
- **Screenshot Region**: Capture a specific screen region

## Installation

No installation required - use directly with `npx` or `bunx`.

## Usage

### Configure in Claude Code

Add to your MCP settings (`~/.claude/settings.json`):

```json
{
  "mcpServers": {
    "screenshot": {
      "command": "bunx",
      "args": ["screenshot-mcp"]
    }
  }
}
```

Or with npx:

```json
{
  "mcpServers": {
    "screenshot": {
      "command": "npx",
      "args": ["-y", "screenshot-mcp"]
    }
  }
}
```

### Run Standalone

```bash
# Using bunx (recommended)
bunx screenshot-mcp

# Using npx
npx -y screenshot-mcp
```

## MCP Tools

### `list_windows`

List all visible windows.

```json
// Response
[
  { "id": "1234", "title": "VS Code", "app": "Code", "bounds": { "x": 0, "y": 25, "width": 1920, "height": 1055 } }
]
```

### `list_displays`

List all available displays.

```json
// Response
[
  { "id": 1, "name": "Built-in Retina Display", "primary": true, "bounds": { "x": 0, "y": 0, "width": 2560, "height": 1600 } }
]
```

### `screenshot_window`

Capture a specific window.

```json
// Parameters
{ "window_id": "1234" }
// or
{ "window_title": "VS Code" }
// optional: save to file
{ "window_id": "1234", "save_dir": "/path/to/screenshots" }
```

### `screenshot_screen`

Capture the entire screen.

```json
// Parameters (all optional)
{ "display_id": 1, "save_dir": "/path/to/screenshots" }
```

### `screenshot_region`

Capture a specific region.

```json
// Parameters
{ "x": 100, "y": 100, "width": 800, "height": 600 }
// optional: save to file
{ "x": 100, "y": 100, "width": 800, "height": 600, "save_dir": "/path/to/screenshots" }
```

## Platform Support

| Platform | Status | Requirements |
|----------|--------|--------------|
| macOS | ✅ Supported | Screen Recording permission |
| Windows | ✅ Supported | PowerShell (built-in) |
| Linux (X11) | ✅ Supported | `xdotool` or `wmctrl` for windows, `gnome-screenshot`/`scrot`/`import` for capture |
| Linux (Wayland) | ⚠️ Partial | GNOME Shell only, `grim` for screenshots |

## Configuration (Plugin Settings)

Create `.claude/screenshot.local.md` in your project to set a default save directory:

```markdown
---
default_save_dir: /Users/yourname/Desktop/screenshots
---
```

When this file exists, Claude will automatically use this directory for saving screenshots.

**Note:** Add `.claude/*.local.md` to your `.gitignore`.

## Requirements

- **Runtime**: Bun v1.0+ or Node.js 18+

### macOS
- Screen Recording permission (System Settings > Privacy & Security > Screen Recording)

### Windows
- PowerShell (built-in, no extra installation needed)

### Linux (X11)
- Window listing: `xdotool` (recommended) or `wmctrl`
- Screenshots: `gnome-screenshot`, `scrot`, or `import` (ImageMagick)
- Display info: `xrandr`

```bash
# Ubuntu/Debian
sudo apt install xdotool scrot

# Fedora
sudo dnf install xdotool scrot

# Arch
sudo pacman -S xdotool scrot
```

### Linux (Wayland)
- Window listing: Only GNOME Shell supported (via gdbus)
- Screenshots: `gnome-screenshot` or `grim`
- Display info: `wlr-randr` or falls back to xrandr

## As Claude Code Plugin

Install as a plugin to get the `screenshot-testing` skill:

```bash
# Install from npm
npm install -g screenshot-mcp
claude plugin add screenshot-mcp

# Or use local development
claude --plugin-dir /path/to/screenshot-mcp
```

The skill provides guidance on:
- Effective screenshot testing workflows
- Comparison testing strategies
- Multi-display testing
- Electron app testing examples

## License

MIT