Skip to main content
Glama

capture-win-mcp

MCP (Model Context Protocol) server for capturing macOS windows and tracking Spaces. This server provides tools for AI assistants to interact with macOS windows through yabai and the built-in screencapture utility.

📖 Quick Start Guide | 📦 Distribution Guide | 👨‍💻 Developer Docs

Features

  • List Windows: Get detailed information about all windows organized by macOS Space (virtual desktop)

  • Capture Window: Take screenshots of specific windows by their ID

Related MCP server: mac-mcp-server

Prerequisites

  • macOS (tested on macOS 15+)

  • Python 3.12 or higher

  • yabai window manager

Installing yabai

brew install koekeishiya/formulae/yabai
yabai --start-service

Installation

Using uv:

uv pip install git+https://github.com/huegli/capture-win-mcp.git

Using pip:

pip install git+https://github.com/huegli/capture-win-mcp.git

Method 2: Install from PyPI

Once published to PyPI:

# Using uv
uv pip install capture-win-mcp

# Using pip
pip install capture-win-mcp

Method 3: Install from Source (For Development)

# Clone the repository
git clone https://github.com/huegli/capture-win-mcp.git
cd capture-win-mcp

# Create virtual environment
uv venv  # or: python3 -m venv venv
source .venv/bin/activate

# Install in editable mode
uv pip install -e .  # or: pip install -e .

Usage

As an MCP Server

Claude Desktop Configuration

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

If installed via pip/uv (recommended):

{
  "mcpServers": {
    "capture-win": {
      "command": "capture-win-mcp"
    }
  }
}

If running from source directory:

{
  "mcpServers": {
    "capture-win": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/capture-win-mcp",
        "run",
        "capture-win-mcp"
      ]
    }
  }
}

If using a specific Python environment:

{
  "mcpServers": {
    "capture-win": {
      "command": "/path/to/venv/bin/capture-win-mcp"
    }
  }
}

After adding the configuration, restart Claude Desktop for the changes to take effect.

Available Tools

list_windows

Lists all windows organized by macOS Space.

Parameters:

  • format (optional): Output format - "json" (default) or "summary"

Example:

{
  "format": "summary"
}

Returns: Window and Space information including:

  • Space index, label, visibility status

  • Window ID, title, app name, position, size

  • Window counts per Space

capture_window

Captures a screenshot of a specific window.

Parameters:

  • window_id (required): The window ID to capture (get this from list_windows)

  • include_shadow (optional): Include window shadow in capture (default: true)

Example:

{
  "window_id": 12345,
  "include_shadow": false
}

Returns: Base64-encoded PNG image of the window

Standalone Usage

You can also use the original window tracking functionality:

# Show windows by space
python main.py

# Show spaces summary
python main.py --spaces

# Export to JSON
python main.py --export output.json

Development

# Create virtual environment
python3 -m venv venv
source venv/bin/activate

# Install in development mode
pip install -e .

# Run the MCP server
python -m capture_win_mcp.server

Architecture

  • capture_win_mcp/tracker.py: EnhancedSpaceTracker class that interfaces with yabai

  • capture_win_mcp/server.py: MCP server implementation with tools

  • main.py: Standalone CLI tool for window tracking

Troubleshooting

"yabai not found" error

Make sure yabai is installed and running:

brew install koekeishiya/formulae/yabai
yabai --start-service

Window capture fails

  • Ensure the window ID is valid (use list_windows first)

  • Check that macOS Screen Recording permissions are granted

  • Some system windows may not be capturable

License

MIT

Available Tools

2 tools
capture_windowA

Capture a screenshot of a specific window by its ID. Returns the image as base64-encoded PNG. Use list_windows first to get window IDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
window_idYesThe window ID to capture (from list_windows)
include_shadowNoInclude window shadow in the capture

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It describes the return format ('Returns the image as base64-encoded PNG') which is valuable, but doesn't mention potential limitations like window visibility requirements, performance impact, or error conditions. It provides basic behavioral context but could be more comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is perfectly concise with two sentences that each serve distinct purposes: the first states the tool's purpose and return format, the second provides usage guidance. There's no wasted language and it's front-loaded with the core functionality.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (screenshot capture with parameters), no annotations, and no output schema, the description does well by explaining the return format and workflow. However, it could provide more context about potential constraints or error cases. It's mostly complete but has minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents both parameters. The description mentions window IDs come from 'list_windows' which adds some context, but doesn't provide additional semantic meaning beyond what's in the schema descriptions. This meets the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Capture a screenshot') and target resource ('a specific window by its ID'), distinguishing it from the sibling tool 'list_windows' which provides window IDs. It uses precise verbs and resources without being vague or tautological.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool ('Capture a screenshot of a specific window by its ID') and provides a clear alternative/pre-requisite ('Use list_windows first to get window IDs'). This gives complete guidance on tool selection and workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_windowsB

List all windows organized by macOS Space. Returns detailed information about windows, spaces, and which windows belong to which Space.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoOutput format: 'json' (structured data) or 'summary' (human-readable)json

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It mentions the tool returns 'detailed information about windows, spaces, and which windows belong to which Space,' which gives some behavioral insight. However, it lacks critical details like whether this requires permissions, how data is sourced (real-time vs cached), performance characteristics, or error handling. For a tool with no annotations, this is insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with zero waste: the first states the purpose and scope, and the second specifies the return content. It's front-loaded with the core functionality and appropriately sized for a simple tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (1 optional parameter, no output schema, no annotations), the description is minimally complete. It covers what the tool does and what it returns, but lacks behavioral details that would be helpful for an agent (e.g., permissions, data freshness). Without annotations or output schema, it's adequate but has clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents the single parameter 'format' with its enum values and default. The description adds no parameter-specific information beyond what the schema provides, which is acceptable given the high coverage. Baseline 3 is appropriate as the schema handles the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('List') and resource ('windows organized by macOS Space'), specifies the scope ('all windows'), and distinguishes from the sibling tool 'capture_window' by focusing on listing rather than capturing. It's specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It mentions the sibling tool 'capture_window' exists but gives no context on when to choose listing over capturing or other potential scenarios. Usage is implied but not explicitly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updates
    • First observedcapture_window
    • First observedlist_windows

TDQS

A3.9/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have completely distinct purposes: list_windows enumerates available windows with organizational details, while capture_window takes a specific window ID to capture an image. There is no overlap in functionality, and the descriptions clearly differentiate their roles, making misselection unlikely.

Naming Consistency5/5

Both tools follow a consistent verb_noun naming pattern (list_windows, capture_window), using snake_case throughout. The naming is predictable and aligns well with their actions, providing clear and uniform identification.

Tool Count4/5

With only 2 tools, the server is minimal but appropriately scoped for its purpose of window listing and screenshot capture. It feels slightly thin, as additional related operations (e.g., capturing the entire screen or managing windows) could enhance coverage, but the core workflow is supported without bloat.

Completeness4/5

For the domain of window management and screenshot capture, the tools cover the essential workflow: listing windows to obtain IDs and capturing specific windows. A minor gap exists, such as the inability to capture the entire screen or multiple windows at once, but agents can effectively use the provided tools without dead ends.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to capture and analyze screenshots of macOS applications, windows, or the entire screen using local (Ollama) or cloud-based AI vision models, with non-intrusive, fast screen capture via Apple's ScreenCaptureKit.
    3
    5 npm
    2
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables AI assistants to automate macOS through AppleScript and JXA by providing 44 tools for application management, window control, and UI interaction. It allows for comprehensive system control including screen capture, keyboard and mouse simulation, and system information retrieval.
    44
    27 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables AI assistants to automate macOS desktop tasks including mouse control, keyboard input, screenshots, window management, and UI interaction.
    7 npm
    415
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to control macOS desktop apps via screenshots, mouse clicks, keyboard input, accessibility queries, and AppleScript.
    11
    8 npm
    MIT