Skip to main content
Glama
sethbang

MCP Screenshot Server

by sethbang

MCP de captura de pantalla universal

npm version MCP Registry License

Un servidor MCP (Model Context Protocol) que proporciona a los asistentes de IA capacidades de captura de pantalla, tanto de páginas web mediante Puppeteer como capturas de pantalla del sistema multiplataforma utilizando herramientas nativas del SO.

Características

  • Capturas de pantalla de páginas web — Capture cualquier URL pública utilizando un navegador Chromium sin interfaz gráfica (headless).

  • Capturas de pantalla del sistema multiplataforma — Captura de pantalla completa, ventana o región utilizando herramientas nativas del SO (macOS screencapture, Linux maim/scrot/gnome-screenshot/etc., Windows PowerShell+.NET).

  • Diseño centrado en la seguridad — Prevención de SSRF, protección contra recorrido de rutas, defensa contra rebinding de DNS, prevención de inyección de comandos y limitación de DoS.

  • Nativo de MCP — Se integra directamente con Claude Desktop, Cursor y cualquier cliente compatible con MCP.

Related MCP server: Chrome DevTools MCP

Requisitos

  • Node.js >= 18.0.0

  • Chromium se descarga automáticamente mediante Puppeteer en la primera ejecución.

Requisitos específicos de la plataforma para take_system_screenshot

Plataforma

Herramientas requeridas

Notas

macOS

screencapture (integrado)

No requiere instalación adicional

Linux

Una de: maim, scrot, gnome-screenshot, spectacle, grim o import (ImageMagick)

Se recomienda maim o scrot para soporte completo de funciones. Para capturar ventanas por nombre, instale también xdotool.

Windows

powershell (integrado)

Utiliza .NET System.Drawing — no requiere instalación adicional

Ejemplos de instalación en Linux

# Ubuntu/Debian (recommended)
sudo apt install maim xdotool

# Fedora
sudo dnf install maim xdotool

# Arch Linux
sudo pacman -S maim xdotool

# Wayland (Sway, etc.)
sudo apt install grim

Después de instalar, puede verificar su configuración con:

npx universal-screenshot-mcp --doctor

Esto analiza el host e imprime comandos de instalación que puede copiar y pegar para cualquier herramienta faltante, adaptados a su distribución detectada.

Inicio rápido

Instalar desde npm

npm install -g universal-screenshot-mcp

O ejecútelo directamente con npx:

npx universal-screenshot-mcp

Instalar desde el código fuente

git clone https://github.com/sethbang/mcp-screenshot-server.git
cd mcp-screenshot-server
npm install
npm run build

Configure su cliente MCP

Añada el servidor a la configuración de su cliente MCP. Para Claude Desktop, edite ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "screenshot-server": {
      "command": "npx",
      "args": ["-y", "universal-screenshot-mcp"]
    }
  }
}

O si se instaló desde el código fuente:

{
  "mcpServers": {
    "screenshot-server": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-screenshot-server/build/index.js"]
    }
  }
}

Para Claude Code, registre el servidor con el comando claude mcp add:

# Project scope (current directory only)
claude mcp add screenshot-server -- npx -y universal-screenshot-mcp

# User scope (available across all projects)
claude mcp add --scope user screenshot-server -- npx -y universal-screenshot-mcp

O si se instaló desde el código fuente:

claude mcp add screenshot-server -- node /absolute/path/to/mcp-screenshot-server/build/index.js

Verifique que el servidor se registró con claude mcp list, o compruebe el estado en vivo desde una sesión con /mcp.

Para Cursor u otros clientes MCP, consulte su documentación para la configuración equivalente.

Herramientas

El servidor expone dos herramientas MCP:

take_screenshot

Captura una página web (o un elemento específico) a través de un navegador Puppeteer sin interfaz gráfica.

Parámetro

Tipo

Requerido

Descripción

url

string

✅

URL a capturar (solo http/https)

width

number

—

Ancho del viewport (1–3840)

height

number

—

Alto del viewport (1–2160)

fullPage

boolean

—

Capturar la página completa desplazable

selector

string

—

Selector CSS para capturar un elemento específico

waitForSelector

string

—

Esperar a este selector antes de capturar

waitForTimeout

number

—

Retraso en milisegundos (0–30000)

outputPath

string

—

Ruta del archivo de salida (predeterminado: ~/Documents/screenshots)

Ejemplo de prompt:

Toma una captura de pantalla de https://example.com a 1920x1080

take_system_screenshot

Captura el escritorio, una ventana de aplicación específica o una región de la pantalla utilizando herramientas nativas del SO. Funciona en macOS, Linux y Windows.

Parámetro

Tipo

Requerido

Descripción

mode

enum

✅

fullscreen, window o region

windowId

number

—

ID de ventana para el modo ventana

windowName

string

—

Nombre de la aplicación (ej. "Safari", "Firefox") para el modo ventana

region

object

—

{ x, y, width, height } para el modo región

display

number

—

Número de pantalla para configuraciones multimonitor

includeCursor

boolean

—

Incluir el cursor del ratón en la captura

format

enum

—

png (predeterminado) o jpg

delay

number

—

Retraso de captura en segundos (0–10)

outputPath

string

—

Ruta del archivo de salida (predeterminado: ~/Documents/screenshots)

Soporte de funciones multiplataforma

Función

macOS

Linux

Windows

Pantalla completa

✅

✅

✅

Región

✅

✅ (maim, scrot, grim, import)

✅

Ventana por nombre

✅

⚠️ X11 + xdotool

⚠️ mejor esfuerzo

Ventana por ID

✅

✅ solo X11

⚠️ HWND

Multimonitor

✅

⚠️ depende de la herramienta

✅

Incluir cursor

✅

⚠️ depende de la herramienta

⚠️

Retraso

✅

✅

✅

Ejemplo de prompt:

Toma una captura de pantalla del sistema de la ventana de Safari

Configuración

Variables de entorno

Variable

Predeterminado

Descripción

SCREENSHOT_OUTPUT_DIR

Documents/screenshots

Directorio de salida predeterminado relativo a ~

ALLOW_LOCAL

false

Establecer en true para permitir capturas de localhost/127.x.x.x/[::1] (útil para servidores de desarrollo locales)

Directorios de salida

Las capturas de pantalla se guardan en ~/Documents/screenshots de forma predeterminada (configurable mediante SCREENSHOT_OUTPUT_DIR). Las rutas de salida personalizadas deben resolverse en uno de estos directorios permitidos:

Directorio

Descripción

~/Documents/screenshots

Ubicación de salida predeterminada (configurable)

~/Desktop/Screenshots

Ubicación predeterminada original

~/Downloads

Carpeta de descargas del usuario

~/Documents

Carpeta de documentos del usuario

/tmp

Directorio temporal del sistema

Seguridad

Este servidor implementa múltiples capas de refuerzo de seguridad:

ID

Amenaza

Mitigación

SEC-001

SSRF / Rebinding de DNS

URLs validadas contra rangos de IP bloqueados; DNS resuelto antes de la solicitud con fijación de IP mediante --host-resolver-rules; redirecciones de navegación revalidadas

SEC-003

Inyección de comandos

Todos los subprocesos utilizan execFile (sin shell); nombres de aplicaciones validados contra SAFE_APP_NAME_PATTERN

SEC-004

Recorrido de rutas

Rutas de salida validadas con resolución de enlace simbólico fs.realpath(); restringido a directorios permitidos

SEC-005

Denegación de servicio

Instancias concurrentes de Puppeteer limitadas a 3 mediante semáforo

Para obtener todos los detalles, consulte docs/security.md.

Desarrollo

Scripts

Comando

Descripción

npm run build

Compilar TypeScript a build/

npm run watch

Recompilar ante cambios de archivo

npm test

Pruebas unitarias (rápidas, totalmente simuladas)

npm run test:integration

Pruebas de integración (DNS/sistema de archivos real)

npm run test:e2e

Pruebas E2E (Puppeteer/herramientas nativas reales)

npm run test:all

Todos los niveles de prueba juntos

npm run test:linux

E2E de Linux mediante Docker (requiere Docker)

npm run test:watch

Ejecutar pruebas en modo watch

npm run test:coverage

Ejecutar pruebas con informe de cobertura

npm run lint

Analizar código fuente con ESLint

npm run inspector

Iniciar el Inspector MCP para depuración

Estructura del proyecto

src/
├── index.ts                 # Entry point — stdio transport
├── server.ts                # MCP server factory
├── config/
│   ├── index.ts             # Static constants (limits, allowed dirs)
│   └── runtime.ts           # Singleton semaphore, default directory
├── tools/
│   ├── take-screenshot.ts   # Web page capture tool
│   └── take-system-screenshot.ts  # macOS system capture tool
├── types/
│   └── index.ts             # Shared TypeScript interfaces
├── utils/
│   ├── helpers.ts           # Response builders, file utilities
│   ├── screenshot-provider.ts # Cross-platform provider interface + factory
│   ├── macos-provider.ts    # macOS: screencapture wrapper
│   ├── linux-provider.ts    # Linux: maim/scrot/gnome-screenshot/etc.
│   ├── windows-provider.ts  # Windows: PowerShell + .NET System.Drawing
│   ├── macos.ts             # Window ID lookup via CoreGraphics
│   └── semaphore.ts         # Async concurrency limiter
└── validators/
    ├── path.ts              # Output path validation (SEC-004)
    └── url.ts               # URL/SSRF validation (SEC-001)

Pruebas

Las pruebas utilizan Vitest en tres niveles:

  • Unitarias (npm test) — Inyección de dependencias completa, sin E/S real. Bucle de retroalimentación rápido.

  • Integración (npm run test:integration) — Resolución de DNS real, sistema de archivos real con directorios temporales, Puppeteer real contra un servidor HTTP local.

  • E2E (npm run test:e2e) — Herramientas de captura de pantalla nativas reales. Las pruebas de macOS se ejecutan de forma nativa; las pruebas de Linux se ejecutan en Docker mediante npm run test:linux.

npm test                 # Unit tests (~300ms)
npm run test:linux       # Linux provider tests in Docker
npm run test:all         # Everything

Depuración con el Inspector MCP

npm run inspector

Esto inicia el Inspector MCP conectado a su servidor compilado, lo que le permite invocar herramientas de forma interactiva.

Licencia

Apache-2.0 — Copyright 2026 Seth Bang

Available Tools

2 tools
take_screenshotB

Capture web page or element via headless browser. Saves to ~/Documents/screenshots by default (configurable via SCREENSHOT_OUTPUT_DIR env var).

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL to capture
widthNoViewport width
heightNoViewport height
fullPageNoCapture full page
selectorNoCSS selector for element
waitForSelectorNoWait for selector
waitForTimeoutNoDelay in ms
outputPathNoAbsolute path, or relative to home dir

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations, the description carries full burden but only mentions method and save location; it omits critical behavioral traits like destructiveness, permission needs, or return value.

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?

Two concise sentences: first states purpose, second details save behavior. Front-loaded and no wasted words.

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

Completeness2/5

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

Despite 8 parameters and no output schema, the description omits return value, error handling, and other essential context, leaving significant 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 covers all 8 parameters with descriptions, so baseline is 3. The description adds the default save path and env var override, providing marginal extra context.

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 uses specific verb 'capture' and resource 'web page or element' with method 'via headless browser', clearly distinguishing it from sibling 'take_system_screenshot' which captures system screens.

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

Usage Guidelines3/5

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

The description implies usage for web screenshots but does not explicitly state when to use versus alternatives, nor does it mention prerequisites or exclusions.

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

take_system_screenshotA

Capture desktop, window, or region screenshot. Cross-platform: macOS (screencapture), Linux (maim/scrot/gnome-screenshot/etc.), Windows (PowerShell+.NET). Saves to ~/Documents/screenshots by default (configurable via SCREENSHOT_OUTPUT_DIR env var). For window mode, provide windowName (app name like "Safari") or windowId.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesfullscreen=entire screen, window=specific app (requires windowName or windowId), region=coordinates
windowIdNoWindow ID (for window mode)
windowNameNoApp name like "Safari", "Firefox" (for window mode)
regionNoRegion {x,y,width,height}
displayNoDisplay number
includeCursorNoInclude cursor
formatNoImage format (png or jpg)
delayNoDelay seconds
outputPathNoAbsolute path, or relative to home dir

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the full burden. It discloses the default save location and cross-platform tool dependencies but does not mention return behavior (e.g., file path or binary), permission requirements, or failure modes.

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

Conciseness4/5

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

The description is concise with 4 sentences, front-loading the main action. It effectively uses bullet-like information for cross-platform details and mode instructions, though it could be slightly more structured.

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 9 parameters including a nested object and no output schema, the description covers default directory and platform support but omits return value, error handling, and comparison with the sibling tool. It is adequate but not fully complete.

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 baseline is 3. The description adds minor value by specifying default output directory and that windowName is an app name, but the schema already describes all parameters adequately.

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 'Capture desktop, window, or region screenshot' with specific verb and resource. It distinguishes from the sibling tool 'take_screenshot' by specifying cross-platform support and modes.

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

Usage Guidelines3/5

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

The description provides clear context for when to use each mode (fullscreen, window, region) and gives examples for window mode. However, it lacks guidance on when not to use this tool versus the sibling 'take_screenshot', missing explicit exclusion or alternative differentiation.

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 updatesv1.2.0
    • Changedtake_screenshot10 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / fullPage / description
        Previous value: -"Capture full scrollable page"New value: +"Capture full page"
      • changedInput schema / properties / height / description
        Previous value: -"Viewport height in pixels"New value: +"Viewport height"
      • changedInput schema / properties / outputPath / description
        Previous value: -"Custom output path (optional)"New value: +"Absolute path, or relative to home dir"
      • addedInput schema / properties / selector
        Added value: +{
        +  "description": "CSS selector for element",
        +  "type": "string"
        +}
      • changedInput schema / properties / url / description
        Previous value: -"URL to capture (can be http://, https://, or file:///)"New value: +"URL to capture"
      • addedInput schema / properties / waitForSelector
        Added value: +{
        +  "description": "Wait for selector",
        +  "type": "string"
        +}
      • addedInput schema / properties / waitForTimeout
        Added value: +{
        +  "description": "Delay in ms",
        +  "maximum": 30000,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / width / description
        Previous value: -"Viewport width in pixels"New value: +"Viewport width"
    • Addedtake_system_screenshot
  2. 1 tool update
    • First observedtake_screenshot

TDQS

A3.7/5.0

Scored across 2 tools

Disambiguation5/5

The two tools are clearly distinct: one captures web pages/elements via headless browser, the other captures desktop/system screenshots. There is no overlap in functionality.

Naming Consistency5/5

Both tools follow a consistent verb_noun pattern with snake_case (take_screenshot, take_system_screenshot), using the same 'take_' prefix.

Tool Count3/5

Only 2 tools for a screenshot server is minimal but still covers the core use cases. More tools might be expected for management or configuration, but the count is not severely inadequate.

Completeness4/5

The tool set covers the primary screenshot domains (web and system). Minor gaps exist, such as listing or deleting screenshots, but core functionality is well-covered.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    Enables taking screenshots of web pages with support for multiple devices (desktop, mobile, tablet), custom dimensions, full-page capture, and various image formats. Built with Playwright for reliable web page rendering and screenshot generation.
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to capture any public URL as PNG, JPEG, or PDF via REST API or MCP tools, including screenshot capture, page description, and PDF rendering.
    10 npm
    MIT