Skip to main content
Glama

pov - Point of View

Screenshot capture, mouse/keyboard control, and window management — as a CLI and MCP server for LLM vision agents.

Lets LLMs (Claude Desktop, Cursor, OpenCode) see and interact with the Windows desktop. Works on Windows, macOS, Linux (X11/Wayland), and WSL.

Install

# With uv
uv pip install pov-desktop

# With pip
pip install pov-desktop

To install the pov CLI as a standalone tool:

uv tool install pov-desktop

Or from source:

git clone https://github.com/empezarcero/pov.git
cd pov
uv sync

Related MCP server: desktop-touch-mcp

CLI Usage

# Screenshots
pov capture                     # Capture screenshot, print base64
pov capture --output shot.png   # Save to file
pov capture --monitor 1         # Specific monitor
pov monitors                    # List available monitors

# Mouse
pov click                       # Left-click at current position
pov click 500 300               # Left-click at (500, 300)
pov click 500 300 --button right --clicks 2
pov move-mouse 800 600          # Move cursor to (800, 600)
pov scroll -3                   # Scroll down 3 clicks
pov scroll 5 --x 400 --y 200   # Scroll up at position
pov cursor                      # Print current cursor position

# Keyboard
pov type "Hello, world!"        # Type text literally
pov key enter                   # Press a key
pov key ctrl+c                  # Key combo
pov key alt+f4                  # Another combo

# Windows
pov windows                     # List visible windows
pov processes                   # List windowed processes
pov foreground                  # Get the focused window
pov focus <hwnd>                # Focus a window by handle
pov window-state <hwnd> minimize
pov move-window <hwnd> --x 100 --y 100
pov resize-window <hwnd> --width 1024 --height 768
pov close-window <hwnd>         # Gracefully close a window

# MCP server
pov serve                       # stdio transport (default)
pov serve --transport sse --port 8000

MCP Server

The MCP server exposes 16 tools:

Screenshots

Tool

Description

screenshot

Capture a screenshot and return it as an image

list_monitors

List available monitors and their geometry

Mouse

Tool

Description

mouse_move

Move the cursor to screen coordinates

mouse_click

Click at coordinates (or current position)

mouse_scroll

Scroll the mouse wheel

get_cursor_position

Get the current cursor position

Keyboard

Tool

Description

keyboard_type

Type a string of text literally

keyboard_key

Press a key or combo (e.g. ctrl+c, alt+f4)

Window Management

Tool

Description

list_windows

List all visible windows with handles, titles, positions

focus_window

Bring a window to the foreground

set_window_state

Minimize, maximize, restore, hide, or show a window

move_window

Move and/or resize a window

resize_window

Resize a window without moving it

get_foreground_window

Get info about the currently focused window

close_window

Gracefully close a window (WM_CLOSE)

list_processes

List running processes with visible windows

Claude Desktop / Cursor / OpenCode

Add to your MCP config:

{
  "mcpServers": {
    "pov": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/pov", "pov", "serve"]
    }
  }
}

SSE Transport

{
  "mcpServers": {
    "pov": {
      "url": "http://127.0.0.1:8000/sse"
    }
  }
}

Platform Support

Platform

Backend

Notes

Windows

mss + ctypes

Screenshots via mss, input/windows via Win32

macOS

mss

Screenshot capture only

Linux

mss

Screenshot capture only (X11 and Wayland)

WSL

PowerShell + .NET/Win32

Full support — captures the Windows desktop, controls mouse/keyboard, manages windows

Development

# Install in development mode
uv sync

# Run the CLI
uv run pov --help

# Run the MCP server
uv run pov serve

Available Tools

16 tools
close_windowA

Gracefully close a window (sends WM_CLOSE).

The application may prompt the user to save before closing.

Parameters

hwnd: The window handle.

Inputs: hwnd (required). Returns: object

focus_windowA

Bring a window to the foreground and give it focus.

Parameters

hwnd: The window handle (from list_windows).

Inputs: hwnd (required). Returns: object

get_cursor_positionA

Get the current mouse cursor position.

Returns {"x": <int>, "y": <int>}.

Inputs: no named parameters. Returns: object

get_foreground_windowA

Get information about the currently focused window.

Returns hwnd, title, process_name, pid.

Inputs: no named parameters. Returns: object

keyboard_keyA

Press a key or key combination.

Accepts human-friendly combos. Examples:

  • Single keys: "enter", "tab", "escape", "f5", "space"

  • Combos: "ctrl+c", "ctrl+shift+t", "alt+f4", "ctrl+a"

Parameters

keys: Key combination string (e.g. "ctrl+c", "enter", "alt+tab").

Inputs: keys (required). Returns: object

keyboard_typeA

Type a string of text as keyboard input.

Types the text literally -- special characters are escaped so they are sent as-is.

Parameters

text: The text to type.

Inputs: text (required). Returns: object

list_monitorsA

List available monitors and their geometry.

Returns a list of monitors with their index, position (left, top), and size (width, height). Index 0 is the virtual bounding box that spans all monitors.

Inputs: no named parameters. Returns: result

list_processesA

List running processes that have visible windows.

Returns a list with pid, process_name, title, responding (bool), and memory_mb.

Inputs: no named parameters. Returns: result

list_windowsA

List all visible windows on the desktop.

Returns a list of window objects with: hwnd (window handle), title, process_name, pid, class_name, state (normal/minimized/maximized), left, top, width, height.

Use hwnd to identify a window for other window tools.

Inputs: no named parameters. Returns: result

mouse_clickA

Click the mouse at the given coordinates.

Parameters

x: Horizontal pixel coordinate. -1 = click at current cursor position. y: Vertical pixel coordinate. -1 = click at current cursor position. button: Which button: "left", "right", or "middle". clicks: Number of clicks (1 = single, 2 = double).

Inputs: x, y, button, clicks. Returns: object

mouse_moveA

Move the mouse cursor to the given screen coordinates.

Parameters

x: Horizontal pixel coordinate. y: Vertical pixel coordinate.

Inputs: x (required), y (required). Returns: object

mouse_scrollA

Scroll the mouse wheel.

Parameters

amount: Number of scroll "clicks". Positive = scroll up, negative = scroll down. x: Horizontal pixel coordinate. -1 = scroll at current cursor position. y: Vertical pixel coordinate. -1 = scroll at current cursor position.

Inputs: amount (required), x, y. Returns: object

move_windowA

Move and/or resize a window.

Pass -1 for any parameter to keep its current value.

Parameters

hwnd: The window handle. x: New left edge in pixels (-1 = keep current). y: New top edge in pixels (-1 = keep current). width: New width in pixels (-1 = keep current). height: New height in pixels (-1 = keep current).

Inputs: hwnd (required), x, y, width, +1 more. Returns: object

resize_windowA

Resize a window without moving it.

Pass -1 for either dimension to keep its current value.

Parameters

hwnd: The window handle. width: New width in pixels (-1 = keep current). height: New height in pixels (-1 = keep current).

Inputs: hwnd (required), width, height. Returns: object

screenshotA

Capture a screenshot of the user's screen.

Returns the image so you can see what the user sees.

Parameters

monitor: Which monitor to capture. 0 = all monitors combined into one image, 1 = primary monitor, 2 = second monitor, etc. Use list_monitors first if you're unsure. max_width: Maximum width in pixels. The image is down-scaled (preserving aspect ratio) if it exceeds this. Use 0 to disable.

Inputs: monitor, max_width.

set_window_stateA

Change a window's display state (minimize, maximize, restore, etc.).

Parameters

hwnd: The window handle (from list_windows). state: One of "minimize", "maximize", "restore", "hide", "show".

Inputs: hwnd (required), state (required). Returns: object

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 16 tools

    Disambiguation4/5

    Most tools have clearly distinct purposes (mouse vs keyboard vs window vs display), but move_window and resize_window overlap since move_window can also resize with -1 parameters, and focus_window vs set_window_state could potentially confuse. Descriptions are clear enough to disambiguate.

    Naming Consistency3/5

    Naming follows mixed conventions: list_monitors, close_window, and focus_window use verb-first, while mouse_move, mouse_click, and keyboard_type are noun-first, and screenshot is a single word. The pattern is readable but not consistent across the set.

    Tool Count4/5

    With 16 tools, the set is on the heavier side of typical scopes, but it covers four distinct domains (display, input, window, process) with no redundant tools. Each tool earns its place, though it feels slightly larger than necessary.

    Completeness4/5

    Core desktop automation workflows are covered: capture screen, move/click/scroll, type, and manage windows. Missing capabilities like per-window screenshots and drag-and-drop are minor gaps that agents can often work around with existing tools.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      A local, dependency-free MCP server that gives AI agents controlled access to the active Windows desktop, enabling automated interaction with applications through screenshots, clicks, typing, and window management.
      151 npm
      1
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI agents to capture multi-monitor screenshots with coordinate grids and perform mouse, keyboard, scrolling, dragging, and window-management actions on Windows via MCP tools or CLI. It provides pixel-accurate desktop automation for computer-use agents.
      MIT