Skip to main content
Glama
Screen Vision MCP Server

Screen Vision MCP Server

by avicuna

Screen Vision MCP Server

Give Claude Code the ability to see your screen

Screen Vision lets Claude capture screenshots, watch your screen in real-time with audio transcription, analyze video files, and read text via OCR. It runs locally as an MCP server — Claude sees what you see, when you ask.

Privacy & Security

All capture is local and on-demand — no background recording, no persistent process, no external transmission.

  • Screen Vision runs as a local MCP server (stdio transport). It only captures when Claude explicitly calls a tool in response to your request.

  • Captured images and transcriptions are sent only to your existing Claude Code session — the same endpoint all Claude Code traffic uses. No third-party services, no cloud storage.

  • The server does not run in the background between Claude Code sessions. It starts when Claude Code starts and stops when it stops.

  • No data is written to disk unless you explicitly ask Claude to save a file.

Related MCP server: sight-mcp

Quick Start

pip install screen-vision[ocr]

Then add to your Claude Code MCP config (.mcp.json):

{
  "mcpServers": {
    "screen-vision": {
      "command": "screen-vision-mcp"
    }
  }
}

System deps for OCR and video:

brew install tesseract   # Required for OCR (read_screen_text)
brew install ffmpeg      # Required for video analysis (analyze_video)

What You Can Say

"Take a screenshot of my screen"          → capture_screen
"Capture the Chrome window"               → capture_window
"Watch my screen for 1 minute"            → watch_screen (with audio transcription)
"Analyze the video at ~/Downloads/demo.mp4" → analyze_video
"Read the text on my screen"              → read_screen_text
"What window am I in?"                    → get_active_context (no screenshot)
"What's on my screen right now?"          → understand_screen (AI analysis)
"Analyze this photo I AirDropped"         → analyze_image

Tools (14)

Tool

What it does

Needs

capture_screen

Full screen capture with delay + multi-monitor

—

capture_region

Capture a specific rectangular area

—

capture_window

Capture a window by title

—

list_monitors

List displays with resolutions

—

get_active_context

Window/cursor/monitor info (no image)

—

read_screen_text

OCR text extraction from screen

tesseract

understand_screen

AI-powered screen analysis

Anthropic API key

analyze_image

Analyze a dropped/AirDropped image file

—

watch_screen

Watch screen with frame sampling + audio

ffmpeg (audio)

analyze_video

Extract keyframes from video files

ffmpeg

capture_camera

Grab latest frame from phone camera

—

watch_camera

Stream phone camera with scene detection + audio

—

show_pairing_qr

Show QR code to connect phone camera

—

phone_status

Check phone camera connection status

—

Security

Screen Vision includes security controls for corporate environments:

  • PII/PCI scanning — Detects credit card numbers, SSNs, phone numbers, email addresses in OCR text

  • App deny-list — Blocks captures of Slack, Teams, Zoom, banking apps, password managers

  • Call detection — Blocks captures during active audio calls

  • Rate limits — 200 captures/session, 2s minimum interval, 5min max watch duration

  • Audit logs — All captures logged to ~/.screen-vision/audit.log

Set SCREEN_VISION_MODE=work to enable all security controls. Default mode is personal (no restrictions).

Dependencies

Core (always installed): mcp[cli], mss, Pillow, numpy, httpx

Extras (mix and match):

Extra

Install

What you get

[ocr]

pip install screen-vision[ocr]

pytesseract — OCR via tesseract (~5MB, needs brew install tesseract)

[paddle]

pip install screen-vision[paddle]

paddleocr + opencv-python-headless — higher-accuracy OCR (~1GB, self-contained)

[audio]

pip install screen-vision[audio]

faster-whisper + sounddevice — audio transcription for watch_screen

[full]

pip install screen-vision[full]

All of the above

Python 3.11+ required.

Development

pip install -e ".[ocr,test]"
pytest tests/ -v
ruff check src/

Author

Alex Vicuna — github.com/avicuna

Contributing

Issues and PRs welcome: https://github.com/avicuna/screen-vision

Available Tools

14 tools
analyze_imageA

Analyze a dropped image file (AirDrop, screenshot, saved photo).

Works in both work and personal modes. In work mode, security scanning is applied.

Args: file_path: Path to the image file to analyze prompt: Optional analysis prompt (reserved for future use)

Returns: JSON string with analyzed image data or error

Inputs: file_path (required), prompt. Returns: result

analyze_videoA

Analyze a local video file.

Args: file_path: Path to the video file start_time: Start time in seconds (default: 0) end_time: End time in seconds (default: None = entire video) max_frames: Maximum number of frames to extract (default: 20)

Returns: JSON string with extracted frames and metadata

Inputs: file_path (required), end_time, max_frames, start_time. Returns: result

capture_cameraA

Grab the latest frame from connected phone camera.

Only available in personal mode. Requires phone to be connected via show_pairing_qr() first.

Args: prompt: Optional prompt (reserved for future use)

Returns: JSON string with frame data or error

Inputs: prompt. Returns: result

capture_regionB

Capture a specific screen region.

Args: x: Left coordinate of the region y: Top coordinate of the region width: Width of the region height: Height of the region scale: Scale factor for resizing (default: 1.0)

Returns: JSON string with captured frame data or error

Inputs: x (required), y (required), width (required), height (required), +1 more. Returns: result

capture_screenA

Capture the full screen with optional delay for window switching.

Args: delay_seconds: Wait this many seconds before capturing (default: 3) monitor: Monitor index to capture (0 = all monitors, 1+ = specific monitor) scale: Scale factor for resizing (default: 0.5)

Returns: JSON string with captured frame data or error

Inputs: scale, monitor, delay_seconds. Returns: result

capture_windowB

Capture a specific window by title.

Args: window_title: Title of the window to capture scale: Scale factor for resizing (default: 0.5)

Returns: JSON string with captured frame data or error

Inputs: window_title (required), scale. Returns: result

get_active_contextB

Get lightweight context: window, cursor, monitors.

Returns: JSON string with context information

Inputs: no named parameters. Returns: result

list_monitorsB

List available monitors.

Returns: JSON string with monitor information

Inputs: no named parameters. Returns: result

phone_statusB

Check phone camera connection status.

Returns connection status, frame queue size, and server state.

Returns: JSON string with status information

Inputs: no named parameters. Returns: result

read_screen_textB

OCR the screen or a region.

Args: region: Optional region as "x,y,width,height" string

Returns: JSON string with extracted text

Inputs: region. Returns: result

show_pairing_qrA

Show QR code to connect phone camera. Scan with iPhone to start streaming.

Only available in personal mode. In work mode, use analyze_image() with AirDrop instead.

Returns: JSON string with QR code data and pairing instructions, or error

Inputs: no named parameters. Returns: result

understand_screenA

Understand what's on screen — like Google Lens for your desktop. Returns structured analysis: what app, what content, what's happening, actionable insights. Optionally provide a prompt for focused analysis: 'what error is this?' or 'explain this dashboard'.

Args: prompt: Optional custom prompt for focused analysis (default: "")

Returns: JSON string with understanding result, image, OCR text, and metadata

Inputs: prompt. Returns: result

watch_cameraA

Stream phone camera frames with scene detection and optional audio.

Only available in personal mode. Requires phone to be connected via show_pairing_qr() first. Collects frames over the specified duration, applies scene change detection to keep only keyframes, and optionally records and transcribes audio.

Args: duration_seconds: How long to collect frames (default: 30) include_audio: Whether to collect and transcribe audio (default: True) max_frames: Maximum number of keyframes to keep (default: 20)

Returns: JSON string with keyframes, transcript, and metadata

Inputs: max_frames, include_audio, duration_seconds. Returns: result

watch_screenA

Watch the screen for a duration with frame sampling and optional audio.

Args: duration_seconds: How long to watch (default: 60) interval_seconds: Time between frame captures (default: 4.0) include_audio: Whether to record and transcribe audio (default: True) max_frames: Maximum number of keyframes to keep (default: 30)

Returns: JSON string with keyframes, transcript, and metadata

Inputs: max_frames, include_audio, duration_seconds, interval_seconds. Returns: result

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 14 tools

    Disambiguation5/5

    Each tool targets a distinct source or operation: capture tools differentiate by screen/window/region/camera, watch tools add duration, analyze tools handle files, and informational tools cover context and status. No two tools serve the same purpose.

    Naming Consistency4/5

    Most tools follow a verb_noun pattern (e.g., analyze_image, capture_screen). One outlier is 'phone_status', which uses a noun prefix instead of a verb, but the rest are consistent and clear.

    Tool Count5/5

    14 tools is well-scoped for a screen vision server, covering capture, analysis, OCR, context, camera streaming, and video analysis without feeling bloated or sparse.

    Completeness4/5

    The tool set covers core workflows: capture, analysis, OCR, context, and camera integration. Minor gaps like listing windows or managing streams are present but not critical for most use cases.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers