Skip to main content
Glama

A-Eyes

CI License: MIT Node.js TypeScript MCP Platform: Windows + WSL2

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 Code

The 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

capture

Screenshot a window by title or process name. Optionally save to disk via output_path. Supports max_width for resize, crop for regions, and format/quality for JPEG output.

see

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_windows

List all visible windows. Shows +/- markers for capturable vs. blocked.

query

Capture a screenshot and forward a question about its content to Claude. Same parameters as capture.

check_status

Health check: verifies config, WSL interop, and script availability.

setup

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.sh

The 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 --check

Or 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.js

Or 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:\...). The cwd field 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

allowlist

[]

Window title or process name substrings that are allowed for capture. Empty = all blocked.

save_screenshots

false

Auto-save every capture to screenshot_dir.

screenshot_dir

"./screenshots"

Target directory for auto-saved PNGs.

max_captures_per_minute

0

Rate limit for capture/query calls. 0 = unlimited.

Testing

pnpm test           # 189 tests across 14 files
pnpm lint           # Biome linter + formatter

Test 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 MISSING

Author

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

MIT

Available Tools

11 tools
captureA

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cropNoOptional region to crop from the captured window. Coordinates are relative to the window. Values exceeding window dimensions are clamped.
modeNoCapture mode: 'window' (default) captures a specific window, 'screen' captures the full primary monitor. In screen mode, window_title and process_name are ignored. Screen capture requires '__screen__' in the allowlist.window
formatNoImage format: 'png' (default, lossless) or 'jpeg' (smaller, lossy)
qualityNoJPEG quality 1-100 (default: 85). Ignored for PNG.
dpi_modeNoDPI scaling: 'native' (default, raw pixel resolution) or 'logical' (scaled to match visible UI size on HiDPI displays). Reduces payload size on high-DPI monitors.
max_widthNoMaximum image width in pixels. If set, wider screenshots are proportionally scaled down.
output_pathNoOptional file path or directory to save the screenshot PNG to
process_nameNoThe process name to capture (e.g. 'chrome', 'Unity'). More stable than window titles which change dynamically.
window_titleNoThe window title or app name to capture. Omit to capture the foreground window.
copy_to_clipboardNoIf true, also copies the captured image to the Windows clipboard after redaction has been applied. The base64 image is still returned. Rejected when frontmost mode is used (window identity unknown before capture).

TDQS

A3.5/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 says 'capture', which is essentially the tool's name. It does not disclose whether the operation is read-only, what happens if the window is not found, or the return format/side effects. The schema descriptions provide some behavioral details, but the description itself adds no safety or failure context.

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?

The description is two sentences, front-loaded with the core purpose and followed by an important usage tip. Every word earns its place, with no redundancy or filler.

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?

The tool has 10 parameters and no output schema, so the description should explain the return value and any nuances like screen mode. The schema covers parameter semantics well, but the description omits the output format (base64 image) and screen capture behavior. It is adequate for basic use but incomplete for full understanding.

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% for all 10 parameters, so the schema fully documents each parameter. The description only repeats window_title and process_name without adding new meaning, thus meeting the baseline but not exceeding it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool captures a screenshot of a window by title or app name, using a specific verb and resource. It does not explicitly differentiate from sibling tools like 'see' or 'query', but the action is unambiguous.

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

Usage Guidelines4/5

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

The description provides clear usage context: it explains how to capture a specific window (by title or process name) and that omitting both captures the foreground window. However, it does not mention when to use this tool versus alternatives or mention screen capture mode.

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

check_statusA

Check A-Eyes health: config, WSL interop, and script availability

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses that the tool checks three specific components, which is useful, but it does not explicitly state whether it is read-only, what it returns, or any side effects (e.g., initiating WSL). The verb 'check' implies non-mutating behavior but lacks explicit detail.

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?

The description is a single, well-structured sentence with a colon-separated list. It is concise and front-loaded, with no wasted words.

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

Completeness4/5

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

For a simple zero-parameter tool with no output schema, the description covers the core scope. However, it does not describe the return format or exit status, which would help an agent interpret results. This minor gap prevents a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so the description does not need to add parameter semantics. The baseline of 4 applies given the zero-parameter case.

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 starts with 'Check A-Eyes health', a specific verb+resource pair, and then lists three distinct areas (config, WSL interop, script availability). This clearly differentiates it from sibling tools like capture or list_windows that handle other functions.

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

Usage Guidelines2/5

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

No usage guidance is provided. The description does not mention when to use this tool versus alternatives, nor does it state any prerequisites or exclusions. An agent would have to infer its role from the tool name and sibling context.

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

clipboardA

Read the current Windows clipboard content (text or image), or write text to it. Reading an image returns it as base64 PNG.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoText to write to clipboard (required when action is 'write')
actionNo'read' returns current clipboard content, 'write' sets clipboard textread

TDQS

A4/5.0
Behavior3/5

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

No annotations are present, so the description carries full responsibility for behavioral disclosure. It adds the useful detail that reading an image returns base64 PNG, but it does not describe error handling, side effects of writing (e.g., overwriting), or behavior when the clipboard contains unsupported content. This is minimal but not entirely absent.

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?

The description is two sentences long, front-loading the primary read/write functionality and adding the image format detail in the second sentence. Every word contributes value, with no redundancy or filler.

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

Completeness4/5

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

Given the tool's simplicity (two parameters, no output schema, no annotations), the description is nearly complete. It explains both operations and the image return format, but leaves a minor gap by not indicating what happens on write or whether text returns are plain strings. Overall, it's adequate for the tool's scope.

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%, with both 'action' and 'text' parameters already having descriptive explanations. The tool description does not add parameter-specific meaning beyond what the schema provides, so it stays at the baseline score of 3.

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 the tool's function with specific verbs: 'Read' and 'write', and identifies the resource as the current Windows clipboard. It further distinguishes behavior for text vs. image content, including the base64 PNG format for images, making it distinct from any sibling tool.

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

Usage Guidelines4/5

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

While no explicit alternatives or exclusions are mentioned, the description provides clear context for when to use the tool: whenever clipboard access is needed for reading or writing text/images. The sibling tools are unrelated to clipboard operations, so the usage context is sufficiently clear.

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoMax entries to return (default: 20)
levelNoMinimum severity level (default: error)error
sourceNoEvent log source (default: both)both

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It says 'Read' which implies a non-destructive operation, and mentions the config requirement, but does not disclose what happens if the config is missing, any potential side effects, or ordering/pagination behavior. This is adequate but lacks richer behavioral context.

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?

The description is two concise sentences with information front-loaded. The purpose is stated first, followed by use cases and a configuration note. No wasted words.

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

Completeness4/5

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

Given no output schema, the description could clarify what the returned data looks like, but it covers purpose, use cases, and a prerequisite. For a simple read tool with well-documented parameters, this is sufficient, though slightly more detail about output format would make it 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 schema already documents all parameters. The description adds minimal extra meaning, such as implying 'recent' for count and explicitly naming the Application and System sources, but it doesn't significantly go beyond the schema's parameter descriptions.

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 the tool reads recent entries from the Windows Event Log, specifying the Application and System logs. It separates this from sibling tools by focusing on a specific log source and diagnostic use case, making its purpose unambiguous.

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

Usage Guidelines4/5

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

It explicitly mentions when to use the tool (diagnosing crashes, service failures, driver issues, .NET errors) and states a prerequisite (allow_event_log: true). It doesn't explicitly name alternatives or exclusions, but the use cases are clear enough for an agent to distinguish it from siblings.

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

list_windowsA

List all visible windows on the Windows desktop

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only states 'list all visible windows' but doesn't explain what 'visible' means (e.g., excludes minimized windows?), what data is returned (titles, handles, positions), or whether it includes all desktop windows. This lack of detail could lead to incorrect assumptions.

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?

The description is a single, front-loaded sentence that immediately conveys the core action and scope. There is no verbosity or filler; every word contributes meaning ('List all visible windows on the Windows desktop').

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?

The tool is simple (no params), but the description is minimal and lacks critical details like return format or what fields are included for each window. Since there is no output schema, the description should compensate by indicating whether it returns titles, process IDs, coordinates, etc. It does not, leaving the agent with an incomplete picture of the tool's output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the input schema is an empty object with 100% schema coverage. Since there are no parameters to document, the description doesn't need to elaborate. The baseline score of 4 for zero-parameter tools is appropriate; no semantic gaps exist.

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 the tool's function with a specific verb and resource: 'List all visible windows on the Windows desktop'. It is distinct from sibling tools like 'processes' (which lists processes) and 'see' (likely a screenshot tool), making the purpose unambiguous.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. The description simply states what it does, without mentioning conditions, prerequisites, or exclusions (e.g., when to use 'see' or 'query' instead). This leaves the agent with limited decision support.

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFilter by process name (substring match, e.g. 'node', 'chrome')
limitNoMax processes to return (default: 30)
sort_byNoSort by CPU usage or memory (default: cpu)cpu

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It discloses the output fields (CPU, memory, PID) and a key behavioral nuance: omitting the name returns top processes by CPU. It does not mention permissions or edge cases, but the read-only nature is implied by 'List', and the description provides meaningful context beyond the schema.

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?

Three sentences, front-loaded with the core action and resource. Every sentence contributes either purpose, use case, or a usage tip. No filler or redundancy.

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

Completeness4/5

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

For a tool with three optional, well-documented parameters and no output schema, the description provides enough context: what it lists, when to use it, and a behavioral default. It lacks explicit output format, but the schema fills in parameter details. Slightly more could be said about return shape, but overall it is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/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 a parameter-specific nugget (omitting 'name' yields top processes by CPU) that enriches the schema's default value documentation. This extra guidance justifies a 4.

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 the specific verb 'List' with the resource 'running Windows processes' and explicitly names the returned attributes (CPU usage, memory, PID). It clearly distinguishes this from sibling tools like 'capture' or 'list_windows' by focusing on process details. The intended use for diagnosing performance issues is also explicit.

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

Usage Guidelines4/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 the tool ('diagnosing performance issues or checking if a specific app/service is running') and offers a usage tip ('Omit name to get the top processes by CPU'). It does not explicitly exclude alternatives or name sibling tools, but the guidance is sufficient for an agent to decide selection.

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cropNoOptional region to crop from the captured window. Coordinates are relative to the window. Values exceeding window dimensions are clamped.
modeNoCapture mode: 'window' (default) captures a specific window, 'screen' captures the full primary monitor. In screen mode, window_title and process_name are ignored. Screen capture requires '__screen__' in the allowlist.window
formatNoImage format: 'png' (default, lossless) or 'jpeg' (smaller, lossy)
qualityNoJPEG quality 1-100 (default: 85). Ignored for PNG.
dpi_modeNoDPI scaling: 'native' (default, raw pixel resolution) or 'logical' (scaled to match visible UI size on HiDPI displays). Reduces payload size on high-DPI monitors.
questionYesQuestion to answer about the screenshot content
max_widthNoMaximum image width in pixels. If set, wider screenshots are proportionally scaled down.
process_nameNoThe process name to capture (e.g. 'chrome', 'Unity'). More stable than window titles which change dynamically. Omit to capture the foreground window.
window_titleNoThe window title or app name to capture. Omit to capture the foreground window.

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does not state whether the operation is read-only, whether the screenshot is transmitted to an external service, what the response format is, or any privacy implications. The tool name and description imply a non-destructive query, but the lack of explicit behavioral context is a significant gap.

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?

The description is two sentences long, with the first sentence stating the purpose and the second providing a specific usage tip. Every sentence earns its place, with no redundant or irrelevant information. It is front-loaded with the core purpose and efficiently communicates the essential usage nuance.

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?

Given the tool's complexity (9 parameters, nested object, no output schema), the description is too minimal. It does not explain expected return values, how to choose mode, or when to prefer this over sibling tools. The schema covers parameter semantics, but the description lacks high-level context for an agent to decide on usage scenarios and anticipate behavior.

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 all parameters are individually documented. The description adds a cross-parameter rule ('Omit both...') which is already implied by each parameter's 'Omit to capture the foreground window' phrasing. Thus, the description adds little beyond the schema, meriting the baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: capture a screenshot of a window and ask a question about its content. It uses a specific verb ('capture' and 'ask') and identifies the resource (window content). However, it does not explicitly differentiate from sibling tools like 'capture' or 'see', which may also involve screenshots, so it misses the highest mark.

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

Usage Guidelines4/5

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

The description provides a clear usage instruction: omit both window_title and process_name to capture the focused foreground window. This gives context for a common use case. However, it does not explain when to use this tool over alternatives like 'capture' or 'see', nor does it mention exclusions or prerequisites (e.g., screen mode allowlist), so it falls short of explicit when/when-not guidance.

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

run_customB

Run a custom PowerShell tool registered in a-eyes.config.json. Use list_custom_tools to see available tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNoParameters to pass to the tool script
tool_nameYesName of the custom tool to run

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states 'Run a custom PowerShell tool' without mentioning potential side effects, permissions, or output behavior. For a tool that executes arbitrary scripts, this is a significant gap.

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 sentences: the first states the purpose, the second provides a necessary pointer to list_custom_tools. Every sentence earns its place with no redundancy or filler.

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?

With no output schema or annotations, the description is minimal. It references the config file and list_custom_tools, but omits important behavioral details about script execution and system effects. For an arbitrary script runner with potentially broad impact, this is insufficient.

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?

The input schema covers both parameters (tool_name and params) with clear descriptions, achieving 100% coverage. The description adds that the tool must be registered in a-eyes.config.json, which provides context for tool_name, but does not elaborate further beyond the schema.

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 the action ('Run a custom PowerShell tool') and the resource ('registered in a-eyes.config.json'). It distinguishes from siblings by referencing list_custom_tools for discovery, making the tool's purpose specific and unambiguous.

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 instructs to use list_custom_tools to see available tools, which is a useful prerequisite for choosing the correct tool_name. However, it does not explicitly contrast with alternative tools or state when not to use this tool, leaving usage guidance implied rather than explicit.

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoExtraction mode: 'full' (default) returns screenshot + UI element tree + visible text; 'text' returns screenshot + visible text only, skipping the element list for a smaller payload. Both modes walk the element tree internally to harvest nested text.full
process_nameNoThe process name to inspect (e.g. 'chrome', 'notepad'). More stable than window titles. Omit to inspect the foreground window.
window_titleNoThe window title or app name to inspect. Omit to inspect the foreground window.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It reveals that the tool captures a window, returns a UI tree, and describes internal behavior ('Both modes walk the element tree internally to harvest nested text'). It implies a read-only snapshot, though it doesn't explicitly state side effects or permissions. This is adequate for a non-destructive capture tool.

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?

Three well-structured sentences: purpose, usage context, and parameter guidance. It is front-loaded, every sentence earns its place, and no filler is present.

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

Completeness4/5

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

For a read-only tool with no output schema, the description covers the essential aspects: what it captures, what it returns, and how to target a window. It is reasonably complete given the tool's simplicity, though it could nod to exceptional behaviors (e.g., accessibility restrictions or failure modes) for full completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with parameter descriptions, providing a baseline of 3. The description adds valuable guidance beyond the schema: 'Omit both window_title and process_name to inspect the currently focused foreground window,' which clarifies optionality and default behavior.

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 a window and return its UI element tree... plus a screenshot' using a specific verb and resource. It distinguishes itself from siblings by emphasizing the element tree and the 'without asking a specific question' use case.

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

Usage Guidelines4/5

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

Explicitly says 'Use this to understand what is visible in an application without asking a specific question,' providing a clear when-to-use context. It does not explicitly mention alternative tools like 'capture' or 'query', but the guidance is still actionable, including the tip to omit parameters for the foreground window.

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

setupA

Interactive setup: preview open windows and create an allowlist config. Call without parameters to preview, or with an allowlist to write the config.

ParametersJSON Schema
NameRequiredDescriptionDefault
allowlistNoWindow title patterns to allow for capture. Omit to preview current windows and config status.

TDQS

A4.2/5.0
Behavior3/5

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

The description discloses two behavioral modes (preview vs. write) and their triggers, which is helpful. However, since no annotations are provided, it carries the full burden but doesn't mention potential side effects like overwriting an existing config or whether preview is read-only.

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?

The description is two sentences, front-loaded with the tool's purpose, and each sentence provides essential information without redundancy or excessive detail.

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

Completeness4/5

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

For a simple tool with one optional parameter, the description covers the main usage modes and what to expect from each. It doesn't mention the exact output format or edge cases, but given the low complexity, it is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes the allowlist parameter fully (100% coverage), and the description adds meaning by explicitly connecting the parameter to the write action ('with an allowlist to write the config'). This goes beyond the schema's description.

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 the tool's purpose with specific verbs: 'preview open windows' and 'create an allowlist config.' It distinguishes itself from sibling tools like capture or list_windows by focusing on configuration setup rather than capture or listing actions.

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

Usage Guidelines4/5

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

It explains exactly when to call without parameters ('to preview') and when to call with an allowlist ('to write the config'). While it doesn't explicitly mention alternatives or exclusions, it provides clear context for usage.

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoCapture mode: 'window' (default) or 'screen'. Screen mode requires '__screen__' in the allowlist.window
process_nameNoProcess name to watch (e.g. 'chrome'). More stable than window titles. Either window_title or process_name is required.
window_titleNoTitle of the window to watch. Either window_title or process_name is required.
timeout_secondsNoMaximum time to wait for a change in seconds (1–300, default 30). Returns last frame if no change detected.
poll_interval_msNoHow often to poll for changes in milliseconds (100–60000, default 1000).

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals key behaviors: polling until change, returning the changed screenshot, requiring explicit window/process identification, and the screen mode sentinel. It does not describe side effects (though a watch operation is inherently non-mutating) or error behaviors, but the explicit constraints and workflow are well covered.

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?

The description is extremely concise—only two sentences—yet packs in the primary action, the return value, and critical constraints. It is front-loaded with the verb and resource, making it easy to scan. No unnecessary words.

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

Completeness4/5

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

Given the tool's moderate complexity (five parameters, no output schema, no annotations), the description covers the essential context: what it does, the requirement for window_title/process_name, and the screen mode sentinel. It does not explain timeout behavior or return format in detail, but these are partially covered by the schema's parameter descriptions. A complete description could mention the timeout fallback, but this is still fairly 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?

The input schema already provides 100% coverage with detailed descriptions for all parameters, including the requirement for either window_title or process_name and the mode options. The description reinforces these constraints (e.g., frontmost not supported, '__screen__' sentinel) but adds minimal new meaning beyond what the schema already offers. The high schema coverage warrants a baseline 3.

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 the tool's purpose: to poll a window until its visual content changes, then return the changed screenshot. It uses a specific verb ('poll') and resource (window content), which distinguishes it from siblings like 'capture' or 'see' that likely take single snapshots.

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

Usage Guidelines4/5

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

The description provides clear context on when to use the tool: when you need to watch for visual changes in a window. It also includes important exclusions (frontmost capture not supported) and a specific requirement (window_title or process_name). However, it does not explicitly compare to alternatives or state when not to use it beyond the frontmost limitation.

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. 11 tool updatesv0.1.0
    • First observedcapture
    • First observedcheck_status
    • First observedclipboard
    • First observedevent_log
    • First observedlist_windows
    • First observedprocesses
    • First observedquery
    • First observedrun_custom
    • First observedsee
    • First observedsetup
    • First observedwatch

TDQS

A3.6/5.0

Scored across 11 tools

Disambiguation3/5

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.

Naming Consistency2/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP 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
  • A
    license
    A
    quality
    C
    maintenance
    An 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.
    6
    18
    MIT