MCP server for Windows screen capture

Let your AI agent see your Windows screen

The Pointframe MCP server gives Claude, GitHub Copilot, Cursor, and any other MCP client real eyes on the Windows desktop. Agents can capture a monitor or a single window, read on-screen text with OCR, search earlier screenshots, and record a redacted MP4. Everything runs locally, and the server needs neither the Pointframe app nor the .NET runtime.

Why an agent needs a screenshot tool

A coding agent can read your files, but it cannot see what your app actually rendered, which error dialog popped up, or what a user would see on the second monitor. Describing it by hand is slow and loses detail. With the Pointframe MCP server, the agent captures the screen itself, looks at the image, and keeps a verifiable PNG on disk with its SHA-256 hash, monitor geometry, and DPI.

What the agent can do

  • See a monitor or a window. list_displays and list_windows find the target; capture_monitor and capture_window save a PNG and return it inline, downscaled to at most 1600 px, so the model sees it directly. A monitor capture can be limited to a sub-region.
  • Read on-screen text. read_text_from_monitor and read_text_from_window run Windows OCR on the capture, which is useful for error dialogs, logs, and terminals that the agent cannot otherwise read.
  • Find earlier screenshots. search_captures searches saved screenshots by filename or by the text inside them, and get_capture returns one with its metadata and a preview.
  • Record a reproduction. start_recording, get_recording_status, and stop_recording produce an MP4 of a monitor. Pass rectangles to pixelate passwords, tokens, or customer data before the frames are encoded.

Set it up

Claude Desktop. Download Pointframe.Mcp-win-x64.mcpb and open it. Claude Desktop installs it as an extension.

VS Code. Install the Pointframe CLI from the release ZIP (extract it and run the first command below from that folder), then let it download, verify, configure, and test the MCP server:

.\Pointframe.Cli.exe install
pointframe mcp install --client vscode
pointframe mcp doctor --client vscode

The installer preserves your other MCP servers, creates a backup before its first configuration change, and leaves desktop-testing tools disabled. Use pointframe mcp install --client vscode --dry-run to validate the package and proposed change without installing it.

Claude Code, Codex, Cursor, and VS Code run the server from a folder on disk. Download and verify the latest bundle once (a .mcpb is a ZIP archive):

$dir = "$env:LOCALAPPDATA\Programs\Pointframe.Mcp"
$mcpb = "$env:TEMP\Pointframe.Mcp-win-x64.mcpb"
$release = 'https://github.com/dimitar-radenkov/Pointframe/releases/latest/download'
Invoke-WebRequest "$release/Pointframe.Mcp-win-x64.mcpb" -OutFile $mcpb
Invoke-WebRequest "$release/Pointframe.Mcp-win-x64.mcpb.sha256" -OutFile "$mcpb.sha256"
$expected = ((Get-Content "$mcpb.sha256" -Raw).Trim() -split '\s+')[0]
$actual = (Get-FileHash $mcpb -Algorithm SHA256).Hash
if ($actual -ne $expected) { throw 'MCPB SHA-256 verification failed.' }
New-Item -ItemType Directory -Force $dir | Out-Null
tar -xf $mcpb -C $dir

Stop the server in your client before updating, because Windows locks a running Pointframe.Mcp.exe. Then register it. For Claude Code:

claude mcp add --scope user pointframe -- "$env:LOCALAPPDATA\Programs\Pointframe.Mcp\Pointframe.Mcp.exe"

claude mcp add refuses a name that already exists; to change the path, run claude mcp remove --scope user pointframe first. For Codex (running it again is safe):

codex mcp add pointframe -- "$env:LOCALAPPDATA\Programs\Pointframe.Mcp\Pointframe.Mcp.exe"

For VS Code, add it to .vscode/mcp.json or your user MCP configuration, using your own user name in the path:

{
  "servers": {
    "pointframe": {
      "type": "stdio",
      "command": "C:\\Users\\<you>\\AppData\\Local\\Programs\\Pointframe.Mcp\\Pointframe.Mcp.exe"
    }
  }
}

For Cursor and other clients that use the mcpServers format, such as %USERPROFILE%\.cursor\mcp.json:

{
  "mcpServers": {
    "pointframe": {
      "command": "C:\\Users\\<you>\\AppData\\Local\\Programs\\Pointframe.Mcp\\Pointframe.Mcp.exe"
    }
  }
}

In VS Code you can also run MCP: Add Server from the Command Palette, choose Command (stdio), and enter the path to Pointframe.Mcp.exe. To check the connection, ask the agent to list your displays; it should call list_displays. The pointframe://server-info resource reports the server version and whether ffmpeg was found for recording. The server is also listed in the official MCP Registry as io.github.dimitar-radenkov/pointframe-mcp.

All eleven tools

Discovery: list_displays, list_windows. Capture: capture_monitor, capture_window. OCR: read_text_from_monitor, read_text_from_window. Saved captures: search_captures, get_capture. Recording: start_recording, get_recording_status, stop_recording. The full reference is in the README, and a plain-text summary for agents is in llms.txt.

Things to ask your agent

  • "Take a screenshot of my second monitor and tell me why the layout looks broken."
  • "Read the error dialog in the installer window and suggest a fix."
  • "Capture the app before and after your change so I can compare them."
  • "Find the screenshot from yesterday that mentions 'timeout'."
  • "Record my main monitor while I reproduce the bug, and blur the token field."

Local and observable by default

The server runs as a local stdio process in your own Windows session and writes captures under %LOCALAPPDATA%\Pointframe. The capture, OCR, and recording tools only observe; they never click or type. Tools that drive the desktop exist for automated UI testing, but they stay off unless you enable them with a local policy file. A capture tool returns the image to your MCP client unless you pass includeImage: false. Official builds of the MCP server and the CLI send one anonymous event per tool call or command: the tool or command name, whether it succeeded, a coarse duration bucket, cli or mcp, the MCP client type, and the version. They never send arguments, paths, screenshots, text, error messages, or any user, machine, or install identifier, and Application Insights masks IP addresses. Opt out with POINTFRAME_TELEMETRY_OPTOUT=1 or DO_NOT_TRACK=1; source builds send nothing. See the privacy policy for the details and the desktop app's separate telemetry.

Prefer a script? Use the CLI

The same capture, OCR, and recording engine is available as a standalone command-line tool that prints single-line JSON with stable error codes, ready for scripts and CI jobs.

.\Pointframe.Cli.exe install
.\Pointframe.Cli.exe capture --monitor '\\.\DISPLAY1' --output .\shot.png
.\Pointframe.Cli.exe ocr-window --window-id 12345678

Give your agent eyes on Windows

Free and open source under the MIT license. Windows 10 and 11, interactive desktop session required.

Frequently asked questions

Can Claude see my screen on Windows?

Yes, with an MCP server that captures the screen. Pointframe's capture tools return the screenshot as an image the model can look at, along with the saved PNG and its metadata.

Does the MCP server send my screenshots anywhere?

The server itself runs locally and writes captures to your own disk. A screenshot reaches the model only when a capture tool returns it to your MCP client, and you can pass includeImage: false to return metadata only.

Does it need the Pointframe desktop app?

No. The MCP server is a standalone, self-contained executable. It does not need the Pointframe tray app or the .NET runtime, and the bundle includes ffmpeg for recording.

Can the agent click or type on my desktop?

Not by default. The capture, OCR, and recording tools only observe. Desktop-testing tools that send input are a separate, opt-in mode that stays off unless you enable it with a local policy file.