A-Eyes
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@A-Eyes List all visible windows"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
A-Eyes
Claude Code can read files and run commands, but it cannot see what is on your screen. A-Eyes closes that gap: it is an MCP server that lets Claude Code capture screenshots of Windows applications through WSL2 — so it can diagnose UI errors, verify layouts, or answer questions about what you are looking at. The Windows equivalent of Peekaboo (macOS).
Security Model
A-Eyes treats screenshot access as a security-sensitive operation. The design assumes that an AI agent requesting screen captures should be constrained by default, not trusted by default.
Deny-by-default access control. Without an explicit allowlist in a-eyes.config.json, every capture request is blocked. There is no "capture everything" mode. The operator decides which windows are accessible — the AI agent cannot override this.
Tamper-resistant audit logging. Every tool invocation (capture, query, list_windows, see, check_status, setup) is logged to ~/.a-eyes/logs/audit-YYYY-MM-DD.jsonl — append-only, daily rotation. There is no MCP tool to read, modify, or delete these logs. The AI agent can only access them through filesystem tools that the operator can deny at the permission prompt. Each log entry records timestamp, tool name, parameters, result status, and execution duration.
No shell interpolation. Window titles are passed as execFile argv arrays, never interpolated into shell command strings. This eliminates command injection through crafted window titles — a realistic attack vector when an AI agent chooses which windows to capture.
Schema-validated inputs. All MCP tool parameters are validated through Zod schemas before any processing. Malformed requests fail at the boundary, not inside business logic.
Related MCP server: WinSight MCP
Architecture
Claude Code ──MCP/stdio──► A-Eyes Server (TypeScript, WSL2)
│
powershell.exe (execFile, argv)
│
Win32 API (FindWindow, PrintWindow)
│
PNG/JPEG or UI element tree ──base64/text──► returned to Claude CodeThe server runs inside WSL2 and calls Windows PowerShell scripts through WSL interop. Screenshots never touch the filesystem unless explicitly configured — they are returned as base64-encoded PNG data over the MCP stdio transport.
Tools
Tool | Description |
| Screenshot a window by title or process name. Optionally save to disk via |
| Capture a window and return its full UI element tree (buttons, fields, labels, menus) via Windows UI Automation, plus all visible text. Use this to understand application state without asking a specific question. |
| List all visible windows. Shows |
| Capture a screenshot and forward a question about its content to Claude. Same parameters as |
| Health check: verifies config, WSL interop, and script availability. |
| Interactive first-run setup: preview open windows and create an allowlist config. |
Quick Start
Requirements: WSL2 on Windows 10/11, Node.js 18+
1. Clone and install
git clone https://github.com/florian-priegnitz/a-eyes.git
cd a-eyes
./install.shThe install script installs dependencies, builds the project, registers A-Eyes as a global MCP server (claude mcp add -s user), and runs a health check.
2. Configure allowlist
Restart Claude Code, then ask:
"Run the a-eyes setup tool"
This shows your open windows and lets you create an allowlist. Without an allowlist, all captures are blocked.
Then try: "Take a screenshot of Chrome" or "What windows are open?"
Verify
node dist/index.js --checkOr inside Claude Code: use the check_status tool, or check /mcp → "Manage MCP servers" — A-Eyes should show connected with 6 tools.
Manual installation
If you prefer not to use the install script:
pnpm install && pnpm build
claude mcp add a-eyes -s user -- node $(pwd)/dist/index.jsOr create .mcp.json in a project root for per-project registration:
{
"mcpServers": {
"a-eyes": {
"type": "stdio",
"command": "node",
"args": ["/path/to/a-eyes/dist/index.js"],
"cwd": "/path/to/a-eyes"
}
}
}Note: Use WSL paths (
/mnt/c/...), not Windows paths (C:\...). Thecwdfield ensures the server finds its PowerShell scripts.
Configuration
A-Eyes searches for config in order: ./a-eyes.config.json (cwd) → <package-root>/a-eyes.config.json → ~/.a-eyes/config.json (user home) → deny-all defaults.
{
"allowlist": ["Chrome", "VS Code", "Firefox"],
"save_screenshots": false,
"screenshot_dir": "./screenshots"
}Option | Default | Description |
|
| Window title or process name substrings that are allowed for capture. Empty = all blocked. |
|
| Auto-save every capture to |
|
| Target directory for auto-saved PNGs. |
|
| Rate limit for |
Testing
pnpm test # 189 tests across 14 files
pnpm lint # Biome linter + formatterTest coverage includes: config loading and search chain, capture/list-windows PowerShell integration, process name matching, audit log file rotation and append behavior, server-level tool handler responses for success, blocked, and error paths, rate limiting, WSL path conversion edge cases.
Troubleshooting
How do I know it's working? Run node dist/index.js --check for a full health check (config, WSL interop, scripts). Inside Claude Code, use the check_status tool or check /mcp → "Manage MCP servers".
Exec format error when calling PowerShell: WSL interop is disabled. Run wsl --shutdown from Windows CMD/PowerShell, then restart your distro.
"No allowlist configured": Use the setup tool in Claude Code, or create a-eyes.config.json manually with an allowlist array.
Quick WSL interop check (run inside WSL):
test -e /proc/sys/fs/binfmt_misc/WSLInterop && echo OK || echo MISSINGAuthor
Built by Florian Priegnitz, Information Security Consultant at SECURAM Consulting, Hamburg. Focus areas: ISO 27001, AI governance, and security tooling. More projects on GitHub.
Related project: Compliance Intelligence Dashboard — a DORA/ISO 27001/NIS-2 gap analysis tool with AI-assisted compliance scoring.
License
Available Tools
11 toolscaptureA
Capture a screenshot of a window by title or app name. Omit both window_title and process_name to capture the currently focused foreground window.
Inputs: crop, mode, format, quality, +6 more.
check_statusA
Check A-Eyes health: config, WSL interop, and script availability
Inputs: no named parameters.
clipboardA
Read the current Windows clipboard content (text or image), or write text to it. Reading an image returns it as base64 PNG.
Inputs: text, action.
event_logA
Read recent entries from the Windows Event Log (Application, System). Useful for diagnosing crashes, service failures, driver issues, and .NET errors. Requires allow_event_log: true in config.
Inputs: count, level, source.
list_windowsA
List all visible windows on the Windows desktop
Inputs: no named parameters.
processesA
List running Windows processes with CPU usage, memory, and PID. Useful for diagnosing performance issues or checking if a specific app/service is running. Omit name to get the top processes by CPU.
Inputs: name, limit, sort_by.
queryB
Capture a screenshot of a window and ask a question about its content. Omit both window_title and process_name to capture the currently focused foreground window.
Inputs: question (required), crop, mode, format, +5 more.
run_customB
Run a custom PowerShell tool registered in a-eyes.config.json. Use list_custom_tools to see available tools.
Inputs: tool_name (required), params.
seeA
Capture a window and return its UI element tree (buttons, text fields, labels, etc.) plus a screenshot. Use this to understand what is visible in an application without asking a specific question. Omit both window_title and process_name to inspect the currently focused foreground window.
Inputs: mode, process_name, window_title.
setupA
Interactive setup: preview open windows and create an allowlist config. Call without parameters to preview, or with an allowlist to write the config.
Inputs: allowlist.
watchA
Poll a window until its visual content changes, then return the changed screenshot. Requires window_title or process_name — frontmost capture is not supported for watch mode. Screen mode uses 'screen' allowlist sentinel.
Inputs: mode, process_name, window_title, timeout_seconds, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 11 tools
Several tools (see, capture, query, watch) all capture screenshots, which could cause confusion. However, each has a distinct purpose: UI tree inspection, raw screenshot, Q&A, and change detection, and the descriptions help differentiate them. The overlap between see and capture is the most concerning, as see also returns a screenshot.
Tool names follow no consistent pattern: single-word verbs (see, capture, query, watch) are mixed with compound noun/verb names (list_windows, check_status) and plain nouns (processes, clipboard, event_log). The naming style is inconsistent and lacks the predictable verb_noun convention seen in high-scoring servers.
With 11 tools, the set is well within the typical 3-15 range and covers a broad but focused domain of Windows observation, diagnostics, and configuration. Each tool adds a distinct capability, and the count does not feel bloated for the server's purpose.
The server provides solid coverage for visual UI inspection, screenshot capture, system diagnostics, and clipboard access. Missing interaction tools (click, type, launch) are a notable gap, but given the server's 'A-Eyes' (vision-focused) intent, the absence of manipulation tools may be a deliberate design choice. Custom PowerShell execution partially compensates for missing operations.
Maintenance
Related MCP Connectors
Hosted Screenshots MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Connect ChatGPT and Claude to your Mac, Windows or Linux with secure MCP remote access.
Shared memory MCP server for Claude Code, Codex, Gemini CLI and Cursor. Cited, editable.
MCP server giving Claude AI access to 22+ NYC public-record databases for real estate due diligence
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that enables Claude to access Windows screenshots from WSL2, allowing users to easily share screenshots with Claude Code without manually navigating complex file paths.317 npm6MIT
- AlicenseNot gradedqualityDmaintenanceWindows Screen Capture MCP Server — give Claude Code eyes on your Windows desktop.24 PyPI2MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for capturing screenshots of desktop windows on Windows. Allows AI assistants to see what's on screen for UI development, debugging, and iterating on designs.MIT
- AlicenseAqualityDmaintenanceAn MCP server that enables AI assistants like Claude Code to capture screenshots, view images, and manage screenshot files on Windows. It uses native Windows APIs for full-screen, region, or active-window captures, and supports image analysis and automated cleanup.624 npmMIT