Skip to main content
Glama

screen-mcp

An MCP (Model Context Protocol) server that gives AI agents eyes on an Omarchy / Hyprland Wayland desktop. It captures screenshots via grim and offers optional image analysis powered by the Gemini API — useful when the calling model has no native vision encoder.

Features

Tool

What it does

Returns

list_windows

Enumerate Hyprland windows via hyprctl

Text listing with addresses, titles, workspaces, sizes

screenshot_region

Capture a pixel rectangle (x, y, width, height)

Inline PNG image (base64)

screenshot_window

Capture a window by title, class, address, or "focused"

Inline PNG image (base64)

screenshot_fullscreen

Capture the entire screen

Inline PNG image (base64)

analyze_image

Send an image (base64 or file path) to Gemini for reasoning

Text response

screenshot_and_analyze

Capture a region and analyze it in one call

Text (Gemini response)

Screenshots use grim (wlroots screencopy protocol) — no X11 required.

Related MCP server: hyprland-mcp-server

Prerequisites

  • Omarchy, Hyprland, or any wlroots-based Wayland compositor

  • grim — Wayland screenshot tool

  • slurp — (optional) interactive region selection helper

  • hyprctl — Hyprland window/query CLI

  • jq — (optional) used by some helper scripts

Check with:

grim --help && hyprctl clients -j | head -c 20

For image analysis (optional)

export GEMINI_API_KEY="your-api-key-here"

Without the key, the screenshot tools still work; only analyze_image and screenshot_and_analyze will return an error.

Installation

Via Claude Desktop

Add this to your Claude Desktop claude_desktop_config.json:

{
  "mcpServers": {
    "screen-mcp": {
      "command": "npx",
      "args": ["-y", "screen-mcp"],
      "env": {
        "GEMINI_API_KEY": "your-api-key-here"
      }
    }
  }
}

Via npx

npx -y screen-mcp

# Or install globally:
npm install -g screen-mcp

Usage examples

Capture a screen region

screenshot_region(x=100, y=200, width=800, height=600, include_cursor=true)

Capture a specific window

First list available windows to get an address or title:

list_windows()

Then capture by title (substring match), address, or "focused":

screenshot_window(window="Spotify")
screenshot_window(window="focused")
screenshot_window(window="0x557ba79b4900")

Analyze an image with Gemini

analyze_image(
  image_path="/tmp/my-screenshot.png",
  prompt="What applications are visible in this screenshot?",
  model="gemini-2.5-flash"
)

Or pass base64-encoded image data directly:

analyze_image(
  image="<base64-encoded-image>",
  prompt="Describe what you see in this image.",
  mime_type="image/png"
)

Capture and analyze in one call

screenshot_and_analyze(
  x=0, y=0, width=1920, height=1080,
  prompt="Count the number of windows open and list their titles.",
  scale=0.5,
  model="gemini-2.5-flash"
)

Development

# Install deps
npm install

# Build
npm run build

# Run
npm start

# Development (recompile on change)
npm run dev

How it works

  • Capture: src/capture.ts wraps grim (screenshots) and hyprctl (window enumeration). Window capture first tries grim -T <stableId> (foreign-toplevel handle), falling back to grim -g "<x>,<y> <w>x<h>" (geometry from hyprctl).

  • Analysis: src/gemini.ts uses the official @google/genai SDK. Images are passed inline as base64 to the Gemini API's interactions.create endpoint.

  • Server: src/index.ts wires everything together as a stdio-transported MCP server using @modelcontextprotocol/server.

License

MIT

Available Tools

6 tools
analyze_imageAnalyze Image (Gemini)A
Read-only

Send an image to the Gemini API for visual reasoning. Useful when the calling model has no native image encoder. Provide either a base64-encoded image or a local file path.

Inputs: prompt (required), image, model, mime_type, +1 more.

list_windowsList WindowsA
Read-onlyIdempotent

List all visible windows on the Hyprland desktop via hyprctl. Use the returned address with screenshot_window, or use "focused" to target the active window.

Inputs: workspace.

screenshot_and_analyzeScreenshot & AnalyzeA
Read-only

Capture a screen region and immediately send it to Gemini for analysis in a single call. Combines screenshot_region and analyze_image. Useful for agents without native vision.

Inputs: x (required), y (required), width (required), height (required), +4 more.

screenshot_fullscreenScreenshot FullscreenA
Read-onlyIdempotent

Capture the entire screen using grim. Returns the image inline as base64.

Inputs: include_cursor.

screenshot_regionScreenshot RegionA
Read-onlyIdempotent

Capture a rectangular screen region by pixel coordinates using grim (Wayland wlroots screencopy). Coordinates are in layout pixels. Returns the image inline as base64.

Inputs: x (required), y (required), width (required), height (required), +2 more.

screenshot_windowScreenshot WindowA
Read-onlyIdempotent

Capture a specific window by title, class, address, or the keyword "focused". Uses hyprctl to resolve the window and grim -T to capture it. Returns the image inline as base64.

Inputs: window (required), include_cursor.

Tool Schema Changelog

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

    TDQS

    A4.3/5.0

    Scored across 6 tools

    Disambiguation4/5

    Each tool has a distinct purpose: listing windows, capturing by target (window/region/fullscreen), analyzing an existing image, and a combined capture+analyze convenience. The overlap between screenshot_and_analyze and screenshot_region+analyze_image is intentional but creates slight ambiguity for agents choosing between them.

    Naming Consistency5/5

    All tool names follow a consistent snake_case verb_noun pattern (list_windows, screenshot_window, analyze_image). The compound screenshot_and_analyze is well-formed and consistent with the style, maintaining a clear and predictable naming convention.

    Tool Count5/5

    With 6 tools, the server is well-scoped and each tool serves a clear, non-redundant function for screen capture and image analysis. The count is ideal for a focused utility server.

    Completeness4/5

    The tool surface covers the core lifecycle of capturing and analyzing screenshots, including window enumeration and multiple capture modes. Minor gaps exist, such as no explicit monitor listing or image format options, but the essential workflows are fully supported.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      Enables AI assistants to automate Wayland desktop environments through screenshot analysis, mouse control, and keyboard input simulation. It supports visual context via VLM providers like Gemini and OpenRouter to perform complex, multi-step desktop actions.
      10
      35 PyPI
      15
      GPL 3.0
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI agents to control a Hyprland Wayland desktop by listing windows, capturing screenshots, and sending input to a dedicated agent workspace without disrupting the user's screen.
      1
      MIT