fenestra-mcp
This server enables AI assistants to render, interact with, and verify native UIs described in fenestra/1 JSON, offering a full suite of visual, accessibility, layout, and interaction testing tools.
Learn & Validate:
describe_vocabularyanddescribe_schemaexpose the description grammar and formal JSON Schema;validatechecks structural correctness without rendering.Render & Preview:
render_uiproduces a typed accessibility tree, downscaled preview image, and automatic accessibility warnings, with a link to the full-resolution PNG.Query & Interact:
query_uifinds nodes by semantic selector (role, name, value, id) with fallback candidates;interactdrives scripted interactions (click, type, key, tab, hover, wheel, drag) via selectors, returning emitted intents and the resulting access tree.Accessibility Checks:
check_a11yaudits theme contrast, interactive control labeling, and per-node text legibility (APCA + WCAG 2);match_aria_snapshotasserts expected accessibility snapshots in partial, strict, or regex modes.Layout & Focus:
check_layoutidentifies interactive targets below the 24px minimum hit size and off-screen signal-bearing nodes;focus_orderreturns the keyboard Tab cycle order, honoring modal focus traps.Visual Regression & Filmstrips:
match_screenshotperforms pixel-by-pixel comparison against a baseline PNG with tolerance, budget, and masks;film_uicaptures animated frames with motion enabled, composing a captioned filmstrip.Full Scenarios:
run_scenarioexecutes a description with optional interaction steps and bundles assertions for emitted intents, accessibility, ARIA snapshot, screenshot, and queries in one pass.Baseline Security: Reads baseline PNGs only from a configurable root directory, preventing path traversal even via symlinks.
Structured Outputs: Many tools provide typed
outputSchema; visual results include downscaled previews and resource links to avoid large responses.
fenestra-mcp
A Model Context Protocol server that lets an
AI assistant render and verify native UIs described as
fenestra fenestra/1 JSON.
Install
cargo install fenestra-mcpThe server speaks MCP over stdio — point your MCP client at the fenestra-mcp
binary.
Related MCP server: winauto-mcp
Tools
describe_vocabulary— the description grammar: every node type with a minimal example, and the theme color roles a color may name. Call this first.describe_schema— the formal JSON Schema for afenestra/1description, the machine-checkable complement todescribe_vocabulary.render_ui— render to a typed access tree, a downscaled preview image, and automatic accessibility warnings.query_ui— find nodes by a semantic selector (role, name, value, or id); a miss returns the nearest candidates to guide a retry.interact— drive scripted interactions (click, type, key, tab, hover, wheel, drag) by semantic selector, never coordinates.check_a11y— theme contrast, labeling of every interactive control, and per-text-node APCA + WCAG 2 legibility.focus_order— the keyboard focus order: the refs a Tab cycle visits, in order, honoring a modal focus trap.check_layout— layout geometry from the real frame: interactive targets below the minimum hit size, and signal-bearing nodes clipped off-screen.match_aria_snapshot— assert an expected accessibility snapshot (partial / strict / regex).match_screenshot— compare against a baseline PNG, pixel by pixel, with an optional tolerance, differing-pixel budget, and mask rectangles to ignore.validate— validate a description without rendering; problems come back path-pointed.run_scenario— drive a description + optional steps through a whole bundle of expectations (emitted intents, a11y, aria, screenshot, queries) in one pass, asserted against the post-interaction frame.film_ui— drive optional steps (applied first, so a click can trigger the transition to watch), then capture frames with real motion on and compose them into one captioned filmstrip. The one tool that turns reduced motion off — every other tool stays reduced-motion for deterministic pixels.
Each tool leads with a typed structured result — query_ui, check_a11y,
focus_order, check_layout, match_aria_snapshot, and describe_vocabulary
carry a formal outputSchema so a client knows the result shape up front. The
visual tools also attach a downscaled preview image and a resource_link to
the full-resolution PNG (a file:// temp path), so a large image never
bloats the response yet stays one fetch away.
Where baselines are read from
Two tools take a path to a PNG on disk: match_screenshot, and
run_scenario through its expect.screenshot.baseline. That path arrives
inside a tool call, which means it comes from an agent — and an agent is only
as trustworthy as whatever it last read. So the server reads baselines from
one directory and no further.
By default that directory is the working directory the MCP client launched
the server in, which is the project being worked on. Set
FENESTRA_MCP_BASELINE_ROOT to point somewhere else. Paths in a tool call
may be relative to the root or absolute inside it; anything that resolves
outside — including a symlink inside the root pointing out of it — is
refused, and the refusal names the root so a legitimate call can be retried.
A root that is not a readable directory stops the server from starting rather
than silently widening to the default.
The diff image a failed comparison returns draws the rendered pixels, never the baseline's, for the same reason.
Registry
MCP Registry name:
mcp-name: io.github.richer-richard/fenestra-mcp
License
Licensed under either of MIT or Apache-2.0 at your option.
Available Tools
13 toolscheck_a11yA
Check accessibility of a UI from the real render: theme contrast, labeling of every interactive control, and per-text-node APCA + WCAG 2 legibility. text_contrast_failures lists nodes failing the strict body-text floor even when the theme verdict is legible (catching authored low-contrast text). Returns a structured report; this is a normal result whether or not it passes.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | ||
| theme | No | ||
| description | Yes | The UI description: a `fenestra/1` JSON object. |
Output Schema
| Name | Required | Description |
|---|---|---|
| legible | Yes | True when the theme reports no contrast violations — its calibrated legibility contract. See `node_legibility` for the strict per-node detail. |
| unlabeled | No | Interactive nodes with no accessible name. |
| node_legibility | No | Per-text-node legibility measurements. |
| contrast_violations | No | Theme role pairs that fall short of their APCA floor. |
| text_contrast_failures | No | Text nodes that fail the strict per-node APCA floor, measured on real resolved colours. Surfaced even when `legible` is true: the theme's calibrated contract uses a relaxed floor for filled-control labels, so an authored low-contrast text run would otherwise pass silently. The honest per-node evidence behind a strict legibility gate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully bears the transparency burden. It discloses specific checks (contrast, labeling, legibility), mentions the text_contrast_failures special behavior, and states that results are always a normal report. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundancy. It front-loads the main action and adds a necessary clarification about text contrast failures and return type, efficiently using every word.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple checks, 3 parameters, output schema exists), the description explains the return type and a special case but fails to describe the size and theme parameters. It is partially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (only description has a description). The tool description does not clarify the size and theme parameters, which are left undocumented. The description's contribution is limited to the overall tool purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'check' and resource 'accessibility of a UI', and details the aspects checked (contrast, labeling, APCA+WCAG legibility), clearly differentiating from sibling tools like check_layout.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool vs alternatives, nor does it mention when not to use it. The phrase 'Returns a structured report...' implies it's for assessing accessibility but lacks explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_layoutB
Check layout geometry from the real frame: interactive targets below the 24px minimum hit size, and signal-bearing nodes that fall outside the window (clipped / off-screen). Returns a structured report — a normal result whether or not it finds problems.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | ||
| theme | No | ||
| description | Yes | The UI description: a `fenestra/1` JSON object. |
Output Schema
| Name | Required | Description |
|---|---|---|
| offscreen | No | Signal-bearing nodes that extend outside the window bounds. Measured against the window — exact for the authored format (which has no scroll viewports); a builder-built frame with a scroll container would over-report content scrolled below the fold. |
| small_targets | No | Interactive targets smaller than the 24x24 minimum hit size (WCAG 2.5.8). |
TDQS
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 returns a structured report and that results are normal whether problems are found. However, it does not state that the tool is read-only, describe side effects (likely none), or detail the report structure beyond a vague 'structured report'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loads the purpose, and contains no redundant or irrelevant information. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and three parameters, the description is incomplete. It does not explain the output schema, provide parameter context, or offer usage guidance. The tool's purpose is clear but the description lacks necessary context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is low (33%) with size and theme lacking descriptions. The tool description does not explain any parameters, failing to compensate for the schema gap. Users are left guessing the meaning and required format of size and theme.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks layout geometry for two specific issues: interactive targets below 24px hit size and signal-bearing nodes outside the window. This verb+resource combination distinguishes it from sibling tools like check_a11y, which focuses on accessibility.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as check_a11y, describe_schema, or match_screenshot. It does not mention prerequisites or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_schemaA
Return the formal JSON Schema for a fenestra/1 description — a machine-checkable input grammar to validate or autocomplete against before rendering, the structured complement to describe_vocabulary's prose grammar. Structural only (shape, required/optional fields, unions); still call validate for semantic checks like colour roles, numeric ranges, and enum-like fields.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description fully discloses the tool's behavior: it is structural only (shape, fields, unions) and does no semantic validation. It explicitly directs users to validate for semantic checks, leaving no hidden side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero wasted words. The first sentence defines purpose and relationship; the second sentence clarifies limitations and alternative. Perfectly front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and simple inputs, the description fully explains what the tool returns (formal JSON Schema) and what it does not do (semantic checks). Comparisons with describe_vocabulary and validate complete the context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, so the baseline is 4. The description does not need to add parameter details, and the context signals confirm 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns the formal JSON Schema for a fenestra/1 description, distinguishing it from the related describe_vocabulary tool by calling itself a 'structured complement' to its 'prose grammar'. The verb 'return' and specific resource are explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells when to use the tool (before rendering for structural validation/autocomplete) and when not to use it (for semantic checks, defer to validate). It implicitly contrasts with describe_vocabulary but does not explicitly list all sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_vocabularyA
Return the description grammar: every node type with a minimal example, and the theme color roles a color may name. Call this first to learn how to author a fenestra/1 description.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| enums | Yes | Closed enum token sets: the allowed string values for keyed fields. |
| nodes | Yes | Every node type, with a minimal example. |
| style | Yes | Every style property a node's `"style"` may carry, with a minimal example. |
| schema | Yes | The schema tag every description must carry. |
| color_roles | Yes | The color roles a `ColorSpec` may name (besides the `oklch` hatch). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It discloses the return content (grammar, examples, color roles) but does not mention safety (read-only), limitations, or format. Adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no waste. First sentence defines output, second gives usage advice. Perfectly concise and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and existence of output schema, the description is largely sufficient. It could mention that the tool is safe to call or hint at output structure, but the directive to call first provides enough context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters; schema coverage is 100%. The description adds no param info, but none is needed. Baseline of 4 is appropriate as the schema already covers everything.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns the description grammar with node types, examples, and color roles. The phrase 'Call this first' distinguishes it as an introductory tool, differentiating it from siblings like describe_schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit instruction to 'Call this first to learn how to author a fenestra/1 description' provides clear when-to-use guidance. No exclusions or alternatives are mentioned, but the context is sufficient for a learning tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
film_uiA
Render a filmstrip: drive optional interaction steps (applied first, so a click can trigger the transition to watch), then capture frames with real motion turned on — every other tool stays reduced-motion for deterministic pixels; this is the one place the point is watching motion play — and compose them into one captioned strip image. Returns the actual frame count/interval/scale used (each is clamped to a documented ceiling, so a hostile request degrades instead of hanging) plus the strip's pixel dimensions, a downscaled inline preview, and a resource_link to the full-resolution strip.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | ||
| scale | No | Per-cell strip scale, `0.05..=1.0` (clamped; non-finite clamps to 1.0). | |
| steps | No | An array of interaction steps, applied before capture starts (optional — e.g. `[{"click":{"role":"button","name":"Add"}}]`). | |
| theme | No | ||
| frames | No | Frames to capture (clamped to a documented ceiling). | |
| description | Yes | The UI description: a `fenestra/1` JSON object. | |
| interval_ms | No | Milliseconds between captured frames (clamped to a documented ceiling). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: it drives interaction steps first, captures frames with real motion, clamps parameters with documented ceilings to prevent hanging, and returns specific values (frame count, interval, scale, pixel dimensions, preview, resource link). This provides comprehensive transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that front-loads the main purpose. It is informative but somewhat run-on. It could be broken into shorter sentences for better readability, but it earns its sentences without unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 params, no output schema), the description covers the main workflow, safety mechanisms, and return values. However, it could be more explicit about the output structure, especially since there is no output schema to fall back on. It provides a good overview.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 71%, so the baseline is 3. The description adds context about how steps are applied and clamping, but does not add new details for the undocumented parameters (size, theme) or significantly enhance understanding of those documented. It provides process context rather than per-parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Render a filmstrip' with a specific verb and resource. It distinguishes itself from sibling tools by explicitly noting that 'every other tool stays reduced-motion for deterministic pixels; this is the one place the point is watching motion play', making it unique among rendering tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides guidance on when to use this tool: for capturing motion with real motion enabled, as opposed to other reduced-motion tools. It also explains the optional interaction steps and clamping behavior, but could more explicitly list alternative tools and when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
focus_orderA
Return the keyboard focus order: the refs a Tab cycle visits, in order, honoring a modal focus trap (disabled controls excluded). Verifies reachability and tab sequence as typed data, without driving the UI.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | ||
| theme | No | ||
| description | Yes | The UI description: a `fenestra/1` JSON object. |
Output Schema
| Name | Required | Description |
|---|---|---|
| order | Yes | Focusable node refs in tab order, honoring a modal focus trap (disabled controls excluded). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses key behaviors: returns data, honors focus traps, excludes disabled controls, and does not drive the UI. However, it does not mention permissions, rate limits, or performance characteristics. Still, provides sufficient transparency for a read-only query tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. Every sentence adds meaningful information about the tool's function and behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate but incomplete: return format is implied but not explicit ('refs... in order'). Output schema exists but is not shown; description suffices for that. However, parameter coverage is lacking for size and theme, making it less complete for a tool with 3 parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is low (33%) with only 'description' documented in schema. The tool description adds no further detail for 'size' or 'theme', leaving them unexplained. The description does reiterate the 'description' parameter's purpose but does not compensate for missing parameter info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool returns keyboard focus order (Tab cycle refs) honoring modal focus traps and excluding disabled controls. Distinguishes from sibling tools like check_a11y by specifying it's about focus order and not driving the UI.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies use case for verifying tab order and reachability, but does not provide explicit guidance on when to use versus alternatives (e.g., check_a11y might also focus on accessibility). No when-not-to-use or alternative tool names mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interactA
Drive a UI through scripted interactions (click, type, key, tab, hover, wheel, drag — by semantic selector, never coordinates). Returns the emitted intent messages and the access tree afterwards; set screenshot=true for a preview image.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | ||
| steps | Yes | An array of interaction steps, e.g. `[{"click":{"role":"button","name":"Add"}}]`. | |
| theme | No | ||
| screenshot | No | Attach a preview image of the UI after the steps. | |
| description | Yes | The UI description: a `fenestra/1` JSON object. |
TDQS
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 that the tool returns 'the emitted intent messages and the access tree afterwards' and that a screenshot can be requested. It also clarifies the interaction method (semantic selectors, not coordinates). However, it does not mention side effects, permissions, or whether interactions are synchronous, which would improve transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundant information. It front-loads the core action ('Drive a UI through scripted interactions'), then specifies supported actions, constraints, and return values. Every sentence is necessary and contributes to understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 parameters, no output schema, no annotations), the description provides essential information about purpose and returns but misses contextual details like error handling, sequencing (e.g., need to render UI first), or any limitations. It is adequate for a simple use case but lacks completeness for robust agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 60%. The description adds value for the 'steps' parameter by providing an example format, and for 'screenshot' by explaining its effect. However, parameters like 'size', 'theme', and 'description' are not elaborated beyond the schema, leaving the agent to rely on their names. The description partially compensates for gaps but does not fully cover all parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Drive a UI through scripted interactions' and lists supported actions (click, type, key, tab, hover, wheel, drag) with the constraint 'by semantic selector, never coordinates'. This distinguishes it from sibling tools like render_ui (which renders) and query_ui (which queries). The verb 'Drive' with 'scripted interactions' is 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly guides usage by specifying 'by semantic selector, never coordinates', but it does not explicitly state when to use this tool versus alternatives like run_scenario or describe_schema. No exclusion criteria or prerequisites (e.g., needing a rendered UI) are mentioned, leaving the agent to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_aria_snapshotB
Match an expected accessibility snapshot (Playwright - role "name" [attr] grammar) against a UI. mode: partial (subset, default) | strict (exact) | regex (each expected line is a pattern). Returns a pass/fail diff — a normal result.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | `partial` (default) | `strict` | `regex`. | partial |
| size | No | ||
| theme | No | ||
| expected | Yes | The expected aria snapshot. | |
| description | Yes | The UI description: a `fenestra/1` JSON object. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the actual tree matched the expected snapshot. |
| diff | Yes | A unified-style diff (empty when `ok`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavioral traits. It only states it matches and returns a diff, but does not mention side effects, error behavior, or required permissions. The phrase 'a normal result' is vague.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that packs the key elements (purpose, modes, result). It is concise without extraneous text, though a slightly more structured format could improve readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, return values are sufficiently explained. However, with 5 parameters and a non-trivial matching behavior, the description lacks details on how mode affects matching and what constitutes pass/fail. Leaves gaps for an agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 60%. The tool description adds meaning for 'mode' (lists values) and 'expected' (aria snapshot), but 'size' and 'theme' are not elaborated. The description provides some context but does not fully compensate for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states verb 'match', resource 'accessibility snapshot' against UI, and specifies the grammar format (Playwright `- role "name" [attr]`). Distinguishes itself from siblings like check_a11y and match_screenshot by focusing on ARIA snapshots.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Mentions three modes (partial, strict, regex) and returns a pass/fail diff, but does not provide guidance on when to use each mode or compare to alternative tools. Lacks when-not-to-use scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_screenshotA
Compare a UI's render against a baseline PNG (path on disk), pixel by pixel, with an optional per-channel tolerance, differing-pixel budget, and mask rectangles to ignore (volatile regions). Returns the diff stats and a diff-image preview on mismatch — a normal result.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | ||
| masks | No | Rectangles to ignore when comparing (volatile regions), logical px. | |
| theme | No | ||
| budget | No | Allowed differing-pixel fraction. | |
| tolerance | No | Per-channel tolerance (0 = exact). | |
| description | Yes | The UI description: a `fenestra/1` JSON object. | |
| baseline_path | Yes | Path to the baseline PNG on disk. |
TDQS
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 describes the comparison operation and output, but does not mention side effects (e.g., read-only, destructive), required permissions, or behavior when baseline is missing. It is adequate but not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that includes all key aspects (comparison, baseline path, tolerance, budget, masks, return value). It is front-loaded with the main action, but its density could be slightly improved by splitting into two sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity and absence of an output schema, the description covers core functionality but misses details on the return format (e.g., diff stats structure) and prerequisites (e.g., baseline file existence, UI state). It is adequate for basic understanding but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning beyond the schema by explaining tolerance as per-channel, budget as allowed differing-pixel fraction, and masks as volatile region ignore. However, it does not cover all parameters (e.g., 'description' param is not mentioned). Schema coverage is 71%, so description adds good context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool compares a UI render against a baseline PNG pixel by pixel, with specific optional parameters (tolerance, budget, masks) and return value. This distinguishes it from sibling tools like check_layout or match_aria_snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but does not explicitly state when to use it versus alternatives, nor does it provide exclusion criteria. The purpose implies usage for visual regression testing, but no direct guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_uiA
Find nodes in a UI by a semantic selector (role, name, value, or id). Returns matches with stable refs; on a miss, returns the nearest candidates to guide a retry.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | ||
| theme | No | ||
| selector | Yes | Selector: `{"role":"button","name":"Add"}` (role/name/value/id). | |
| description | Yes | The UI description: a `fenestra/1` JSON object. |
Output Schema
| Name | Required | Description |
|---|---|---|
| matches | Yes | Nodes matching the selector, in tree order. |
| nearest | No | When `matches` is empty, up to a few nearest candidates to guide a retry. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses two key behaviors not implied by the name: stable references and return of nearest candidates on a miss. This adds transparency beyond the name, though it does not explicitly state read-only nature (no annotations provided).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two succinct sentences: the first states the core function, the second adds critical error-handling behavior. No wasted words, front-loaded with the action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a query tool with output schema present, but incomplete regarding parameters size and theme. The description covers the main behavior but misses input details for two of four parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 50% schema description coverage, the description adds minimal parameter context. Only the 'selector' is explained via an example in the schema; size and theme are undocumented in both schema and description, leaving their purpose unclear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds UI nodes using a semantic selector and lists selector fields (role, name, value, or id). It also specifies the outcome: returns matches with stable refs or nearest candidates on a miss, distinguishing it from sibling tools like check_a11y.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus the 12 sibling tools (e.g., check_a11y, interact). No mention of alternatives, prerequisites, or conditions for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_uiA
Render a fenestra/1 UI description to a typed accessibility tree, a downscaled preview image, and automatic accessibility warnings (contrast, labeling, per-text-node legibility). Read the access tree first; the full-resolution PNG comes back as a resource_link.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | Window size as `WxH` (default `800x600`). | |
| theme | No | Optional theme: a `ThemeSpec` object, or `{"preset":"dark"}`. | |
| description | Yes | The UI description: a `fenestra/1` JSON object. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description discloses that tool returns a typed accessibility tree, downscaled preview, and automatic accessibility warnings. It also notes that full-resolution PNG comes as a resource_link and advises reading the access tree first. This provides useful behavioral context beyond a simple 'render' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no redundancy. First sentence lists core outputs, second sentence gives action guidance (read tree first), third clarifies image format. Front-loaded with most important info.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description adequately explains what the tool returns (tree, preview, warnings, resource_link). Siblings suggest alternative rendering/comparison tools, but description is sufficient for an agent to understand the tool's role.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already describes parameters completely. The description adds no additional meaning beyond what the schema provides for 'description', 'size', or 'theme'. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb ('Render') and resource ('fenestra/1 UI description'), lists three specific outputs (accessibility tree, preview image, warnings). Does not explicitly differentiate from siblings like film_ui or match_screenshot, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like film_ui or match_screenshot. No 'when not to use' advice or context about prerequisites. The description assumes the agent knows to use it for rendering, but lacks explicit selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_scenarioA
Run a verification scenario in one pass: a fenestra/1 description, optional interaction steps, and a bundle of expectations (emitted intents, a11y, an aria snapshot, a screenshot baseline, query match-counts). Drives the steps, then asserts every expectation against the resulting frame — the screenshot check compares the POST-interaction pixels. Returns a unified report (one ok plus a per-check breakdown) and a preview: the diff image on a screenshot mismatch, else the final render. A failed check is a normal result, not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| scenario | Yes | The scenario: a `fenestra/1` description, optional `steps`, and an `expect` bundle (emitted/a11y/aria/screenshot/queries). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully bears the burden and discloses key behaviors: drives steps, asserts expectations, compares screenshot post-interaction, returns a report with ok and breakdown, provides preview (diff image on mismatch). It also clarifies that failed checks are normal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph with clear front-loading of purpose. While informative, it could be slightly more concise by merging some sentences. Overall, no unnecessary verbiage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately explains the return format (report with ok and per-check breakdown, preview image). It covers the scenario components, execution, and handling of failures, making it complete for a complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (only one parameter), and the description adds meaningful context beyond the schema by elaborating on the scenario structure (fenestra/1 description, steps, expect bundle).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs a verification scenario in one pass, listing components (fenestra/1 description, steps, expectations). This distinguishes it from sibling tools that perform individual checks (e.g., check_a11y, interact).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but does not explicitly state when to use it versus alternatives (e.g., using individual tools for step-by-step verification). While the purpose implies it's for a combined run, no exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validateA
Validate a fenestra/1 description without rendering. Structural problems (unknown fields, bad node tags) and semantic ones (an unknown color role) come back path-pointed. Returns isError when the description is invalid.
| Name | Required | Description | Default |
|---|---|---|---|
| description | Yes | The UI description: a `fenestra/1` JSON object. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It explains that structural and semantic errors are detected and returned 'path-pointed', and that 'isError' indicates invalidity. However, it does not mention if the tool is read-only, any side effects, or authentication needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no extraneous content. The first sentence states the core function, the second details types of errors found. It is efficiently front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description should clarify the return structure more fully. It mentions 'path-pointed' errors and 'isError', but does not specify the actual response format or fields. For a simple single-parameter tool, it is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes the parameter as 'The UI description: a fenestra/1 JSON object.' The description adds value by explaining what validation entails (structural and semantic checks), going beyond the schema's minimal description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool validates a 'fenestra/1' description, specifying the action and the resource. It also distinguishes itself by noting 'without rendering', contrasting with siblings like 'render_ui'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when validation without rendering is needed, but does not explicitly state when it should be used over siblings like 'check_a11y' or 'check_layout'. No exclusions or alternatives are given.
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.
13 tool updates
v0.1.0- First observed
check_a11y - First observed
check_layout - First observed
describe_schema - First observed
describe_vocabulary - First observed
film_ui - First observed
focus_order - First observed
interact - First observed
match_aria_snapshot - First observed
match_screenshot - First observed
query_ui - First observed
render_ui - First observed
run_scenario - First observed
validate
TDQS
Scored across 13 tools
Most tools have distinct purposes, but `render_ui` and `run_scenario` both involve rendering and could cause confusion when a user wants only rendering. `check_a11y` and `render_ui` both provide accessibility warnings, though with different granularity. Overall, descriptions help distinguish, but minor overlap exists.
All tool names follow a consistent `verb_noun` pattern in snake_case (e.g., `check_a11y`, `describe_schema`, `run_scenario`). No mixed conventions, making the set predictable and easy to navigate.
With 13 tools, the server is well-scoped for its domain of UI accessibility testing. Each tool covers a clear aspect (rendering, interaction, validation, comparison) without excessive overlap or missing essentials.
The tool set covers the full lifecycle: schema/vocabulary description, validation, rendering, interaction, accessibility checks, layout verification, focus order, aria/screenshot comparison, and scenario orchestration. No obvious gaps for typical UI testing workflows.
Maintenance
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
MCP server for visual regression testing: triage a PR's UI diffs from your coding agent.
MCP server to assist with JxBrowser development.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
MCP server for Superserve sandboxes: create, exec, and manage Firecracker microVMs
Related MCP Servers
- FlicenseAqualityBmaintenanceA Windows-only MCP server for controlling a real browser using native screenshots, Windows accessibility, and node-interception mouse/keyboard input, without CDP or Playwright.4-
- FlicenseNot gradedqualityAmaintenanceMCP server that lets an LLM see and drive any running Windows app: attach a window, screenshot it, read its UI Automation tree, and send clicks, typed text, and key presses with pixel coordinates.-
- FlicenseNot gradedqualityBmaintenanceMCP server that enables AI agents to control Windows by clicking, typing, and navigating with a visible cursor overlay, using a layered approach (native UIA, browser CDP, pixel fallback) for reliable interaction.1-
- AlicenseNot gradedqualityBmaintenanceMCP server providing AI-friendly computer-use primitives (capture, detect, click) to let LLM agents drive desktop GUI applications on Windows, macOS, and Linux.MIT