claude-screen-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SCREEN_MCP_LOG_LEVEL | No | Log level: debug, info, warn, or error. | info |
| SCREEN_MCP_OCR_LANGS | No | Tesseract language list (allowlist enforced). | eng+chi_sim |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| screenshotA | Capture the entire primary display (or a specific display) and return it as an image. Use when the user asks you to see, look at, describe, or troubleshoot what's on their screen. Auto-resizes to maxEdge=1600 by default to keep vision tokens reasonable. |
| screenshot_regionA | Capture a rectangular region of the screen. Use when the user points at a specific area or you only need part of the screen — way cheaper in vision tokens than a full screenshot. |
| list_displaysA | List all connected displays with id, name, and primary flag. Use the returned id with |
| list_windowsA | List visible top-level windows on the user's desktop, with handle, title, and process id. Useful for orienting yourself before deciding what to screenshot. |
| read_screen_textA | Run OCR on the screen (or a region) and return the recognized text. Cheaper than |
| find_text_on_screenA | Search the screen (or a region) for a text substring via OCR. Returns matching lines with display-coordinate bounding boxes — feed those to |
| screenshot_if_changedA | Capture the screen only if it has changed (perceptual-hash dHash distance ≥ threshold) since the last call with the same cacheKey. Otherwise returns just diagnostics — no image, no vision tokens. Makes polling / 24h monitoring economically viable: static screens cost 0 image tokens. First call always returns the image (reason=no_baseline). Use pinBaseline=true to keep the reference point fixed across calls. |
| get_screen_diffA | Compute the perceptual-hash distance between the current screen and the cached baseline (set by previous calls of |
| wait_for_changeA | Long-poll the screen and return as soon as the perceptual-hash distance from the start frame ≥ threshold, or when the timeout elapses. Useful for 'ping me when X finishes' workflows — the server does the polling so the client only spends a turn when something actually changed. Returns an image on change, or a no-image diagnostics text on timeout. Polling is CPU-light (dHash on a 9x8 downscale). Hard timeout cap is 5 minutes. |
| record_screenA | Capture the screen at |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 10 tools
Most tools target clearly distinct operations (full capture, region capture, OCR, text search, recording). The one area of overlap is the change-detection trio — screenshot_if_changed, get_screen_diff, and wait_for_change all key off perceptual-hash distance — but their descriptions carefully delineate behavior (image vs diagnostics vs blocking poll), so an agent can still choose correctly.
The set predominantly follows a verb_noun convention (list_displays, read_screen_text, find_text_on_screen, get_screen_diff, wait_for_change, record_screen). Minor deviations are the bare noun 'screenshot' and 'screenshot_if_changed', but overall the pattern is predictable and readable.
Ten tools is well-scoped for a screen-capture/observation server, with each tool earning its place across capture, enumeration, OCR, and change-monitoring capabilities. Nothing feels redundant or padded.
The surface covers the full observation lifecycle: display/window enumeration, full and regional capture, OCR, text search, change detection, polling, and short recording. The notable gap is window-specific capture — list_windows returns handles but no tool captures a single window, and there are no save-to-file or input/action operations, though the latter is plausibly out of scope.