Universal Screenshot MCP

io.github.sethbangPublished by GitHub account sethbangv1.5.0Updated Oct 30, 2026

MCP server for web page and cross-platform system screenshots (macOS, Linux, Windows)

The publisher's own server: screenshot.com.ar

VerifiedSTDIODesktop onlyBrowser AutomationMedia & Design

Overview

AI-generated overview

Local MCP server that lets an assistant capture web pages with headless Chromium and take desktop, window, or region screenshots on macOS, Linux, and Windows.

What you can do
  • Capture a public web page or a specific CSS element via headless Chromium, with viewport size, full-page, wait-for-selector and delay options
  • Capture the desktop, an application window by name or ID, or a screen region using native OS tools, with format, cursor and delay options
  • Save images to a default screenshots folder or an allowed output directory
When to use it
Useful when an assistant needs visual evidence: rendering a page or element to an image, or grabbing what is currently on the user's screen, a window, or part of a display for documentation, bug reports, or UI checks.
Requirements
Runs as a local stdio process from the npm package universal-screenshot-mcp; Node.js 18 or newer. Puppeteer downloads Chromium on first run. System capture needs native tools: screencapture on macOS, one of maim, scrot, gnome-screenshot, spectacle, grim or import on Linux (plus xdotool for window-by-name), PowerShell on Windows. Optional environment variables SCREENSHOT_OUTPUT_DIR and ALLOW_LOCAL. Desktop only.
Before you install
System screenshots capture whatever is on the user's screen, which may include private or sensitive content, and the images are written to disk in allowed folders such as Documents, Desktop, Downloads or /tmp. Web capture fetches arbitrary public URLs, so pages are contacted by the local machine; localhost is blocked unless ALLOW_LOCAL is set to true. Output paths are restricted to a fixed set of directories.

Installation

In SourceWeft

  1. Open Universal Screenshot MCP in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Universal Screenshot MCP

[npm version] [MCP Registry] [License]

An MCP (Model Context Protocol) server that provides AI assistants with screenshot capabilities — both web page capture via Puppeteer and cross-platform system screenshots using native OS tools.

Features

  • Web Page Screenshots — Capture any public URL using a headless Chromium browser
  • Cross-Platform System Screenshots — Fullscreen, window, or region capture using native OS tools (macOS screencapture, Linux maim/scrot/gnome-screenshot/etc., Windows PowerShell+.NET)
  • Security-First Design — SSRF prevention, path traversal protection, DNS rebinding defense, command injection prevention, and DoS limiting
  • MCP Native — Integrates directly with Claude Desktop, Cursor, and any MCP-compatible client

Requirements

  • Node.js >= 18.0.0
  • Chromium is downloaded automatically by Puppeteer on first run

Platform-Specific Requirements for take_system_screenshot

PlatformRequired ToolsNotes
macOSscreencapture (built-in)No additional installation needed
LinuxOne of: maim, scrot, gnome-screenshot, spectacle, grim, or import (ImageMagick)maim or scrot recommended for full feature support. For window-by-name capture, also install xdotool.
Windowspowershell (built-in)Uses .NET System.Drawing — no additional installation needed
Linux Installation Examples
bash
# Ubuntu/Debian (recommended)sudo apt install maim xdotool
# Fedorasudo dnf install maim xdotool
# Arch Linuxsudo pacman -S maim xdotool
# Wayland (Sway, etc.)sudo apt install grim

After installing, you can verify your setup with:

bash
npx universal-screenshot-mcp --doctor

This probes the host and prints copy-pasteable install commands for any missing tools, tailored to your detected distro.

Quick Start

Install from npm

bash
npm install -g universal-screenshot-mcp

Or run directly with npx:

bash
npx universal-screenshot-mcp

Install from Source

bash
git clone https://github.com/sethbang/mcp-screenshot-server.gitcd mcp-screenshot-servernpm installnpm run build

Configure Your MCP Client

Add the server to your MCP client configuration. For Claude Desktop, edit ~/Library/Application Support/Claude/claude_desktop_config.json:

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

Or if installed from source:

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

For Claude Code, register the server with the claude mcp add command:

bash
# 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

Or if installed from source:

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

Verify the server registered with claude mcp list, or check live status from inside a session with /mcp.

For Cursor or other MCP clients, consult their documentation for the equivalent configuration.

Tools

The server exposes two MCP tools:

take_screenshot

Captures a web page (or a specific element) via a headless Puppeteer browser.

ParameterTypeRequiredDescription
urlstring✅URL to capture (http/https only)
widthnumber—Viewport width (1–3840)
heightnumber—Viewport height (1–2160)
fullPageboolean—Capture the full scrollable page
selectorstring—CSS selector to capture a specific element
waitForSelectorstring—Wait for this selector before capturing
waitForTimeoutnumber—Delay in milliseconds (0–30000)
outputPathstring—Output file path (default: ~/Documents/screenshots)

Example prompt:

Take a screenshot of https://example.com at 1920x1080

take_system_screenshot

Captures the desktop, a specific application window, or a screen region using native OS tools. Works on macOS, Linux, and Windows.

ParameterTypeRequiredDescription
modeenum✅fullscreen, window, or region
windowIdnumber—Window ID for window mode
windowNamestring—App name (e.g. "Safari", "Firefox") for window mode
regionobject—{ x, y, width, height } for region mode
displaynumber—Display number for multi-monitor setups
includeCursorboolean—Include the mouse cursor in the capture
formatenum—png (default) or jpg
delaynumber—Capture delay in seconds (0–10)
outputPathstring—Output file path (default: ~/Documents/screenshots)
Cross-Platform Feature Support
FeaturemacOSLinuxWindows
Fullscreen✅✅✅
Region✅✅ (maim, scrot, grim, import)✅
Window by name✅⚠️ X11 + xdotool⚠️ best-effort
Window by ID✅✅ X11 only⚠️ HWND
Multi-display✅⚠️ tool-dependent✅
Include cursor✅⚠️ tool-dependent⚠️
Delay✅✅✅

Example prompt:

Take a system screenshot of the Safari window

Configuration

Environment Variables

VariableDefaultDescription
SCREENSHOT_OUTPUT_DIRDocuments/screenshotsDefault output directory relative to ~
ALLOW_LOCALfalseSet to true to allow screenshotting localhost/127.x.x.x/[::1] (useful for local dev servers)

Output Directories

Screenshots are saved to ~/Documents/screenshots by default (configurable via SCREENSHOT_OUTPUT_DIR). Custom output paths must resolve to one of these allowed directories:

DirectoryDescription
~/Documents/screenshotsDefault output location (configurable)
~/Desktop/ScreenshotsOriginal default location
~/DownloadsUser downloads folder
~/DocumentsUser documents folder
/tmpSystem temp directory

Security

This server implements multiple layers of security hardening:

IDThreatMitigation
SEC-001SSRF / DNS rebindingURLs validated against blocked IP ranges; DNS resolved pre-request with IP pinning via --host-resolver-rules; navigation redirects re-validated
SEC-003Command injectionAll subprocesses use execFile (no shell); app names validated against SAFE_APP_NAME_PATTERN
SEC-004Path traversalOutput paths validated with fs.realpath() symlink resolution; restricted to allowed directories
SEC-005Denial of serviceConcurrent Puppeteer instances limited to 3 via semaphore; 120 s hard deadline per call, after which the browser is killed and the slot freed
SEC-006Popup SSRF bypassChromium's popup blocker kept on (Puppeteer disables it by default); any popup that still opens is closed

For full details, see docs/security.md.

Development

Scripts

CommandDescription
npm run buildCompile TypeScript to build/
npm run watchRecompile on file changes
npm testUnit tests (fast, fully mocked)
npm run test:integrationIntegration tests (real DNS/filesystem)
npm run test:e2eE2E tests (real Puppeteer/native tools)
npm run test:allAll test tiers together
npm run test:linuxLinux e2e via Docker (requires Docker)
npm run test:watchRun tests in watch mode
npm run test:coverageRun tests with coverage report
npm run lintLint source with ESLint
npm run inspectorLaunch MCP Inspector for debugging

Project Structure

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)

Testing

Tests use Vitest in three tiers:

  • Unit (npm test) — Full dependency injection, no real I/O. Fast feedback loop.
  • Integration (npm run test:integration) — Real DNS resolution, real filesystem with temp directories, real Puppeteer against a local HTTP server.
  • E2E (npm run test:e2e) — Real native screenshot tools. macOS tests run natively; Linux tests run in Docker via npm run test:linux; Windows tests run on the windows-latest CI runner.
bash
npm test                 # Unit tests (~300ms)npm run test:linux       # Linux provider tests in Dockernpm run test:all         # Everything

Debugging with MCP Inspector

bash
npm run inspector

This launches the MCP Inspector connected to your built server, allowing you to invoke tools interactively.

License

Apache-2.0 — Copyright 2026 Seth Bang

Source: README.md at commit d782ff3

Tools

2

take_screenshot

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

ParametersurlrequiredwidthheightfullPageselectoroutputPathwaitForTimeoutwaitForSelector

take_system_screenshot

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.

ParametersmoderequireddelayformatregiondisplaywindowIdoutputPathwindowNameincludeCursor

Version history

2
  1. v1.5.0LatestOct 30, 2026
  2. v1.4.0Sep 16, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

Other Screenshot integrations