Skip to main content
Glama

glass

CI glass MCP server

Give your coding agent hands for the app it's building — launch it, drive it, and verify the result, without burning a screenshot on every step.

A Rust MCP server that gives an AI coding agent a closed build → see → interact → debug loop over external native GUI applications.

glass lets an agent launch a GUI app, capture what is on screen, inject mouse and keyboard input, read the app's logs, and detect visual changes — so a coding agent can build and debug UI applications independently instead of asking the user "does this look right?".

glass drives apps as an external black box, so it works with any native GUI app regardless of toolkit or language. It has two Linux backends (X11 and Wayland), a Windows backend, an Android backend (an AVD emulator, driven over adb from any host), an iOS backend (native apps in the Simulator over xcrun simctl, with input and the accessibility tree via idb_companion, including a two-finger pinch), and a macOS backend, behind a platform-agnostic core.

See it

An agent debugging a GTK app under glass

An agent building a GUI app runs it under glass, reproduces a bug from the accessibility tree (no screenshots), fixes the code, and re-verifies — the loop it otherwise can't close on its own. Try it yourself.

Related MCP server: Playwright MCP

Try it in 60 seconds

  1. Download glass for your platform from the Releases page and connect it to your agent — glass works with any MCP host (see which are verified).

  2. Get the example app — clone this repo, or download examples/tasks-demo/tasks_demo.py (on Linux it needs sudo apt install python3-gi gir1.2-gtk-4.0).

  3. Paste this to your agent:

    Use glass to run examples/tasks-demo/tasks_demo.py with accessibility on. There's a bug: clicking Add doesn't add the typed task. Reproduce it by driving the UI and checking the accessibility tree (don't just screenshot), then find and fix the bug in the code and verify a task actually appears.

Your agent launches the app, reproduces the bug from the accessibility tree, fixes the one-line wiring bug, and confirms the task appears — the whole build → see → interact → debug loop, start to finish. (glass-mcp doctor checks your environment if anything's off.)

The loop in practice

Point an agent at a GUI app and it runs the whole cycle itself. When the app exposes an accessibility tree, the agent resolves each intended unique widget immediately before acting and confirms each step from text, with no per-step screenshot or carried element id:

glass_start { "run": ["python3", "app.py"] }
glass_do { "actions": [
  { "action": "set_value",
    "target": { "query": "account", "role": "TextField", "states": ["enabled"] },
    "text": "hello" },
  { "action": "click_element",
    "target": { "query": "Save", "role": "Button", "states": ["enabled"] },
    "mode": "auto" },
  { "action": "wait_for_element", "name": "Saved" }
] }
glass_logs

Use glass_find_elements to inspect candidates when the intended target is not unique or known well enough to act on directly. Use glass_a11y_snapshot for broad structural diagnosis.

For a canvas or custom-rendered app with no accessibility tree, drive it by pixels instead — glass_screenshot, glass_click {x,y}, and glass_diff, which returns changed_pct + a bbox as text, so routine checks between screenshots cost no vision tokens. Why the loop is shaped this way: the build → see → interact → debug loop.

glass_click_element tries the platform's native accessibility action first — AT-SPI Action on Linux, UI Automation patterns on Windows, AXPress on macOS, and ACTION_CLICK on Android when the optional on-device accessibility companion is installed — which actuates elements that are occluded or scrolled off-screen and, on macOS, without moving the cursor. Not every control exposes one (some toolkit checkbuttons expose no action even on a backend that otherwise supports it), so the click falls back to a synthetic pointer click at the element's center when it doesn't. Where a control's label is a separate element from the control itself, as in Jetpack Compose, Android resolves to the enclosing control that would have handled the tap. iOS and Android's companion-free uiautomator reader always use the pointer path. The result's method field (native-action/pointer) says which path actually ran for that click, with native_fallback explaining why when it fell back — the source of truth per click, not the backend alone — and actuated_id naming the element actually clicked when it isn't the one you named. On the backends that attempt it, the native path re-checks the element against the live tree, so a click whose element no longer matches errors instead of clicking stale coordinates; the pointer-only paths have no such live check.

Selector clicks resolve uniquely and disclose which checks were passed, failed, or unavailable. Forced pointer mode waits for stable in-window bounds and refuses a target known to be disabled, hidden, moving, off-window, or occluded. Native accessibility actions can legitimately actuate a covered or off-screen control, so geometry and occlusion are optional disclosures on that path.

Install at a glance

Download the latest build for your platform from the Releases page, then set up your host:

Every asset is listed in docs/reference/platforms.md. Prefer to compile, or on an architecture with no published asset? See docs/how-to/build-from-source.md — it is a single cargo build.

Then connect glass to your agent and run glass-mcp doctor to check the environment. New here? Follow the tutorial for a guaranteed first success.

The full toolbox remains the default. For fewer agent tool definitions, start with glass-mcp --tool-profile lean and use glass_do for actions. Inspect either inventory without starting a session using glass-mcp tools --json; see tool profiles.

Drive it well — the glass-drive skill

glass needs no app integration and no skill to run, but an agent drives it far more reliably with the open glass-drive Agent Skill — it stops the agent spending its first turns rediscovering the verify-cheaply-then-look loop. Installing it is the single highest-leverage thing you can add when pointing an agent at glass.

Platform support

supported · partial · not supported · 🚧 planned.

Capability

Linux (X11 + Wayland)

Windows

Android (AVD)

iOS (Simulator)

macOS

Capture · input · windows · clipboard · logs

Accessibility (semantic addressing)

✓ AT-SPI

✓ UI Automation

✓ UIAutomator

✓ idb

✓ AX

Containment / sandboxing

✓ bubblewrap

✓ Sandboxie

✓ the emulator VM

✓ the Simulator

✓ Seatbelt

Display isolation (app off your desktop)

✓ headless Xvfb / sway

◑ virtual display · VM tier

✓ headless emulator

✓ headless simctl boot

🚧

Full matrix, per-capability detail, and system requirements: docs/reference/platforms.md. Transport is MCP over stdio (default) or network HTTP.

Documentation

The full docs — tutorial, how-to guides, reference, and explanations — are under docs/. See CHANGELOG.md for release notes, and Stability and versioning for what a 1.0 release guarantees.

Contributing? CONTRIBUTING.md has the gates a PR has to pass, and Verify a change covers platform code your own host cannot run.

License

glass is open core, licensed Apache-2.0 — see LICENSE-APACHE.

Available Tools

31 tools
glass_a11y_marksA
Read-only

Screenshot of the active window with a numbered box drawn on each interactable element (Set-of-Mark) — returns the annotated image plus a text legend (#<id> <Role> "<name>", or #<id> <Role> desc="<description>" for an element that has only a description). Pick an element visually, then click it with glass_click_element using its #id (same ids as glass_a11y_snapshot). Chips sit just outside each element so small icon buttons stay visible. The box is only as precise as the toolkit's accessibility geometry (it can drift ~10-20px), but the #id and the click are exact (click_element actuates via the native accessibility action when available, else clicks the element's center). Errors if no accessibility tree is available — use glass_screenshot then.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations provide readOnlyHint=true, and the description aligns with that by describing a read-only operation. It adds context about the precision of bounding boxes (~10-20px drift), how clicks are actuated (native accessibility action vs center), and error behavior. The only minor gap is not detailing what the legend format is for elements with both a name and description, but the overall transparency is strong.

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 dense but perfectly scannable: it opens with what the tool does, explains the legend format, then covers precision, click mechanism, and error handling. Every sentence adds unique information with no fluff.

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

Completeness5/5

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

Despite being a zero-parameter tool, it fully explains the output format, error conditions, precision limitations, and how to use the output. The error fallback to glass_screenshot is a nice operational detail.

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 0 parameters, and schema coverage is 100%. The description doesn't need to add parameter info since there are none. It adds value by explaining the return format (image + legend) which goes beyond parameters.

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 takes a screenshot of the active window with numbered boxes on interactable elements (Set-of-Mark) and returns the image plus a text legend. It distinguishes itself from siblings by using the phrase 'Pick an element visually, then click it with glass_click_element using its #id', and mentions it returns errors differently than glass_screenshot.

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

Usage Guidelines5/5

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

It explicitly says when to use it: 'Pick an element visually, then click it with glass_click_element using its #id', and when it's not appropriate: 'Errors if no accessibility tree is available — use glass_screenshot then.' It also clarifies the relationship with glass_click_element and glass_a11y_snapshot.

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

glass_a11y_snapshotA
Read-only

Capture the active window's current semantic state as a compact accessibility tree (role, name, description, bounded editable value, window-relative bounds and states). This is one observation, not proof of transition completion or visual appearance. For exact runtime verification, call glass_wait_for_element with the element's name, description and/or role, plus value for an exact editable value (value_contains for a substring). The compact value may be unavailable, redacted or truncated; use that wait rather than repeated snapshots when the full queryable value matters. Rendered as compact text — deterministic, low-token element addressing alongside screenshots. Each line is #<id> <Role> "<name>" desc="<description>" (x,y wxh) [states]. desc carries a second label the platform exposes apart from the name, and appears only where one exists and differs from the name; glass_wait_for_element and glass_scroll_to_element can select it with the description parameter. Pass an #id to glass_click_element. Errors if the backend or app exposes no accessibility tree (e.g. a canvas/black-box app) — fall back to glass_screenshot then. Web content arrives under a Document element, and a childless Document is disclosed in its own notice: take a fresh snapshot first, then pixels. A placeholder the app published for content it has not exposed gets its own notice — only pixels reach it. Optional max_nodes: raise the element cap, or 0 to remove the element-count limit (default caps protect the token budget).

ParametersJSON Schema
NameRequiredDescriptionDefault
max_nodesNoMaximum number of elements to include. Omit for the default cap (protects the token budget). Pass a larger number to raise it, or `0` for the full tree (no limit). A snapshot renumbers ids, so re-read them after changing this.

TDQS

A4.6/5.0
Behavior5/5

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

The annotations only provide readOnlyHint=true; the description goes far beyond that by disclosing the compact-text line format, stable id-based addressing, redaction/truncation of the compact value, error behavior when no accessibility tree exists, the Document wrapper for web content, placeholder notices, and the max_nodes token-budget cap. There is no contradiction with the annotations, and the extra behavior detail is exactly what an agent needs to interpret results safely.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded with the core purpose and each sentence carries a distinct operational fact: output format, sibling routing, value redaction, error fallback, Document behavior, placeholder noticess, and cap behavior. It could be improved with structured bullets or shorter sections, but no sentence is filler for a tool this behaviorally rich.

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

Completeness5/5

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

No output schema exists, so the description correctly carries the burden of explaining return values; it gives the exact line grammar `#<id> <Role> "<name>" desc="<description>" (x,y wxh) [states]` and explains how desc, ids, and states are used. It also covers error cases, web-content structure, placeholder notices, the single optional parameter, and explicit fallback tools, making the definition complete for a one-optional-param read-only tool.

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%, and the schema already fully documents max_nodes: omit for default cap, pass a larger number to raise it, pass 0 for no limit, and re-read ids because snapshots renumber them. The description's max_nodes sentence mostly paraphrases the schema ('raise the element cap', '0 to remove the element-count limit', 'default caps protect the token budget'), so it adds no material new parameter meaning beyond the schema. The baseline of 3 for high schema coverage is appropriate.

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 opens with a specific action and resource: 'Capture the active window's current semantic state as a compact accessibility tree' and enumerates exactly what the tree contains (role, name, description, bounded editable value, window-relative bounds, and states). It also distinguishes itself from glass_wait_for_element and glass_screenshot by explicitly labeling itself as one observation, not proof of transition completion or visual appearance.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use and when-not-to-use guidance: call glass_wait_for_element for exact runtime verification, use value/value_contains for editable values, and prefer the wait over repeated snapshots when the full queryable value matters. It also names concrete fallback paths, such as using glass_screenshot when no accessibility tree exists and taking a fresh snapshot before pixels for a childless Document.

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

glass_baseline_saveA

Save the current frame as a named visual baseline — a reference image glass_diff and glass_wait_for_region later compare against, so you can ask what changed without spending image tokens on a before-and-after pair. Captures the whole window at call time (not a saved region), so settle the UI first if something is still animating. Saving over an existing name replaces it silently; baselines live outside the app under a per-server directory and last until the server exits, surviving glass_stop. Use this plus glass_diff to detect change; use glass_screenshot when you actually need to look at the pixels.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName to file this baseline under, reused by `glass_diff` and `glass_wait_for_region`. ASCII letters, digits, `-` and `_` only; saving over an existing name replaces it without warning.

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses several important behaviors beyond the annotations: capturing the whole window at call time rather than a saved region, silent replacement on overwrite, storage outside the app in a per-server directory, and persistence until server exit. These are exactly the kind of behavioral details an agent needs.

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 dense but every sentence contributes: it defines the baseline, explains the capture scope, discloses replacement and lifetime semantics, and routes to alternatives. The most important purpose is front-loaded.

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

Completeness5/5

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

For a single-parameter tool with no output schema, the description is complete. It covers what the tool does, how it behaves, what conditions matter, and which sibling to choose instead. Nothing an agent needs to decide whether to invoke it is missing.

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 schema already fully describes the single `name` parameter, including allowed characters and overwrite behavior. The description adds baseline semantics and capture scope, but not additional parameter-level detail, so the high-coverage baseline of 3 is appropriate.

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?

States a specific verb and resource: 'Save the current frame as a named visual baseline.' It clearly distinguishes the tool from siblings by explaining what glass_diff and glass_wait_for_region use it for and explicitly contrasts it with glass_screenshot.

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

Usage Guidelines5/5

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

Gives explicit when-to-use guidance: use this with glass_diff to detect change, and use glass_screenshot when you need to inspect pixels. Also provides a timing constraint—settle the UI first if it is still animating—which is practical usage advice.

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

glass_capabilitiesA
Read-only

Report which operations (input, multi-touch, clipboard, accessibility, window move/resize) can be performed right now on a backend, and any setup a blocked one needs — so you can check before acting instead of hitting an Unsupported error. Each operation reports a live status (supported, degraded — works now at reduced fidelity, note says what's lost; requires_setup — a setup step is missing, note says what; or unsupported — this backend never does it) plus the tools it gates, so a degraded or blocked operation names exactly which tool calls to expect trouble from. Pass backend to query a specific backend by name; omit for the active one. Static — no session required.

ParametersJSON Schema
NameRequiredDescriptionDefault
backendNoWhich backend to report: `x11`, `wayland`, `windows`, `macos`, `android`, or `ios`. Omit for the active/default backend (`GLASS_BACKEND`, else the host default). A valid name for a backend not built into this binary reports `available: false`.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the description doesn't need to repeat that. It adds valuable behavioral context: the tool is static (no session required), reports live status with specific enum values, and explains what each status implies (e.g., degraded means reduced fidelity, requires_setup means a setup step is missing). This goes beyond the annotations by detailing the response semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured, front-loading the purpose and then explaining the status values and parameter usage. It's a bit long but every sentence adds value, explaining the status enum and the `tools` field. The structure is logical: purpose, status explanation, parameter guidance.

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 capability check tool with a single optional parameter and no output schema, the description is quite complete. It explains the status values, what they mean, and how to use the parameter. The only minor gap is that it doesn't explicitly state the return format beyond the status and tools fields, but given the tool's simplicity and the annotations, this is sufficient.

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 schema already provides 100% coverage of the `backend` parameter, including valid values and the behavior for omitted vs. invalid names. The description adds a brief note about omitting for the active backend, but the schema already covers this. Since schema coverage is high, the baseline of 3 is appropriate.

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 reports which operations can be performed on a backend, listing specific operations (input, multi-touch, clipboard, accessibility, window move/resize) and the purpose (check before acting to avoid Unsupported errors). It distinguishes itself from siblings by focusing on capability reporting rather than performing actions.

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

Usage Guidelines5/5

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

The description explicitly says to use this tool to check capabilities before acting, and explains the status values and what they mean for subsequent tool calls. It also specifies when to pass the `backend` parameter and when to omit it, providing clear guidance on usage.

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

glass_clickA

Click at window-relative coordinates. button: left|right|middle; count for multi-click. Optional modifiers held during the action, e.g. ["ctrl"] or ["ctrl","shift"] for multi/range-select. If at least two next actions or waits are known, use glass_do instead of separate calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesClick point x, window-relative — 0 is the window's left edge, not the screen's.
yYesClick point y, window-relative — 0 is the window's top edge, not the screen's.
countNoConsecutive clicks at this point (default 1, valid range 1 through 10); pass 2 for a double-click.
buttonNo"left" (default), "right", or "middle".
modifiersNoModifier keys to hold during the action, e.g. ["ctrl"] or ["ctrl","shift"] for multi/range-select.

TDQS

A4/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false, so the click is known to be an input action rather than a read-only or outright destructive operation. The description adds the modifier-held-during-action behavior and coordinate-relative semantics, but it does not disclose potential side effects, focus requirements, or failure modes. This is adequate but not highly transparent given the action-oriented nature of the 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?

The description is compact and front-loaded with the core action. Every sentence serves a purpose: the coordinate mechanism, the parameter variants, the modifier behavior, and the batching alternative via glass_do. There is no filler or redundant elaboration.

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 five-parameter tool with full schema coverage and no output schema, the description covers the essential call context: coordinate frame, click variants, modifier usage, and an alternative for batching. It could mention window focus or the need to select a target window beforehand, but that is likely handled by the surrounding workflow and sibling tools. Overall, an agent has enough to invoke this tool correctly.

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 fully documents x, y, count, button, and modifiers. The description largely restates these values ('button: left|right|middle; count for multi-click') and gives examples already present in the schema. It adds little meaning beyond what the schema provides, so the baseline score of 3 is appropriate.

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 opens with a specific verb and resource: 'Click at window-relative coordinates.' This clearly identifies the tool's action and distinguishes it from element-based siblings like glass_click_element, since it works from raw coordinates rather than UI elements. The button/count/modifiers details further pin down the operation.

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 gives explicit routing guidance: when at least two subsequent actions or waits are known, use glass_do instead of issuing separate calls. This is a concrete alternative with a clear condition. It does not explicitly contrast with glass_click_element, but the 'window-relative coordinates' language makes the coordinate-based use case reasonably clear.

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

glass_click_elementA

Click an element by its #id from glass_a11y_snapshot (actuates via the platform's native accessibility action when the element exposes one — works even when it's occluded or scrolled off-screen — else falls back to a synthetic pointer click at the center of its bounds; the result's method field says which path ran, native_fallback says why when the pointer path was used, and actuated_id names the element actually clicked when a control's label is a separate element from the control itself). If the element actually renders in a popover owned by a different window than the active one (e.g. an open dropdown's option row), the click is automatically routed into that popover window and the previously-active window is restored afterward. Ids are only valid within the latest snapshot — re-run glass_a11y_snapshot if the UI changed. Optional return: "snapshot" settles the UI then folds a fresh a11y tree into the result (and refreshes the snapshot cache); "settle" waits for the UI to stop changing (text-only); omit or "none" for no observe (default). If at least two next actions or waits are known, use glass_do instead of separate calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesElement `#id` from the latest `glass_a11y_snapshot`. Re-snapshot after UI changes. Popover-owned targets route to their window and restore the prior active window. The role-appropriate native accessibility operation handles occluded or off-screen targets and separate labels through their enclosing control. Unavailable native operations fall back to a pointer click at the target center. Text editors may receive focus without activation. `method:"native-action"` labels any native path. `native_fallback` explains pointer fallback. `actuated_id` identifies a substituted enclosing control.
returnNoTerminal observation: "snapshot" settles and refreshes/folds a11y, "settle" waits for visual stability and returns text-only metadata, and "none" skips observation (default).

TDQS

A4.8/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint=false, destructiveHint=false), the description richly discloses fallback behavior (native action vs. pointer click), result fields that reveal which path ran ('method', 'native_fallback', 'actuated_id'), popover routing with window restoration, and default observation behavior ('none'). It also warns about snapshot invalidation and text editors focus behavior. This is substantial behavioral context far beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every clause carries operational weight, and the most important behavioral facts (native-action-first, fallback, result fields) are front-loaded. It is not wastefully wordy, but it is a dense single paragraph that could be slightly more scannable with sentence breaks or bullets.

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

Completeness5/5

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

For a 2-parameter tool with no output schema, the description is complete: it explains why the tool exists, what happens when native actions are unavailable, how popover routing works, when to re-snapshot, what the optional return parameter does, and when to prefer glass_do. Nothing needed to invoke it correctly is missing.

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 schema already documents both parameters well. The main description adds only modest extra value by naming the optional return values and their effects ('snapshot', 'settle', 'none'), but it does clarify the default. Since the schema is already strong, this is a solid 4, losing a point because the description itself doesn't add much beyond what the schema already says.

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 names a specific verb ('Click'), a precise resource ('an element by its #id from glass_a11y_snapshot'), and immediately distinguishes the primary native accessibility action from the synthetic pointer fallback. This clearly separates it from sibling tools like glass_click (generic click) and glass_click_element is scoped to a11y snapshot ids.

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

Usage Guidelines5/5

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

The description explicitly tells the agent when to use it (element from latest snapshot, even occluded/off-screen), when to re-run glass_a11y_snapshot, and when to prefer glass_do instead ('If at least two next actions or waits are known'). It also discloses automatic routing for popover-owned targets, which prevents misuse.

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

glass_clipboard_getA
Read-only

Read the app's clipboard as text ("" if empty). Also the cheap text-extraction path: glass_do ctrl+a then ctrl+c, then read here (beats OCR for selectable text). Returns Unsupported where the backend can't provide clipboard access.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark readOnlyHint=true, so the description adds value beyond that by disclosing edge cases: "" if empty and "Unsupported where the backend can't provide clipboard access." It also explains the ctrl+a/c Ctrl+c workflow as an implementation detail. No contradiction with readOnlyHint.

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, front-loaded with the primary purpose, then the secondary use case. Every clause contributes information: return value, empty-handling, workflow hint, OCR comparison, and failure mode. No waste.

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

Completeness5/5

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

For a zero-parameter read-only tool with no output schema, the description covers the essential behavioral contract: what it returns (text), empty case, and the Unsupported state. It also ties into the broader tool ecosystem with the glass_do reference, making it complete for an agent to call correctly.

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 schema coverage is trivially 100%. The description cannot add parameter-level meaning, but it does not need to. The baseline for 0-param tools is 4, and the description doesn't introduce any ambiguity about inputs.

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 states a clear verb ("Read") and resource ("the app's clipboard"), and specifies the return type (text) and empty-string behavior. It also differentiates from siblings like glass_clipboard_set by framing itself as the read counterpart and adding a specific text-extraction 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?

It provides a concrete usage scenario: "the cheap text-extraction path" using glass_do ctrl+a then ctrl+c, and explicitly compares to OCR ("beats OCR for selectable text"). It lacks explicit exclusion criteria or when-not-to-use guidance, hence not a 5, but the context is clear enough for an agent to select correctly.

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

glass_clipboard_setA

Write text to the app's clipboard so it can paste it. Returns Unsupported where the backend can't provide clipboard access.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text to write to the clipboard.

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate this is a write operation (readOnlyHint=false, destructiveHint=false). The description adds a specific error condition ('Returns Unsupported where the backend can't provide clipboard access'), which goes beyond the annotations. This is useful context about a failure mode that an agent would not otherwise know.

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 short sentences with no filler. The primary action is in the first sentence, and the error condition in the second. Every word contributes to the tool's understanding.

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 one-parameter write operation with no output schema, the description covers the core behavior and the only notable edge case (Unsupported backend). It does not mention return values on success, but that is implied for a write operation and not essential. The absence of output schema means the description isn't required to explain return format.

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 the single 'text' parameter, with a clear description ('The text to write to the clipboard.'). The tool description does not add any additional meaning or nuance beyond the schema's own documentation, so it meets the baseline but adds no extra value.

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 states a clear verb ('Write') and resource ('text to the app's clipboard'), with an explicit purpose ('so it can paste it'). It is easily distinguishable from its sibling 'glass_clipboard_get' since it names the opposite action (write vs. get).

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 usage context is implied by the tool's name and description (write text to clipboard), but no explicit guidance is given about when to use this versus the sibling 'glass_clipboard_get' or any exclusions. The description does not mention alternatives, so it relies on the agent to infer from the sibling list.

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

glass_diffA
Read-only

Compare current visual evidence with a named pixel baseline; returns change stats and a bounding box. This is a single current-state comparison, not a wait for transition completion or stability; use glass_wait_for_region to wait for pixel change/match and glass_wait_stable for quiescence. Set include_image:true to return the changed crop when pixels differ.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo`"perceptual"` (default) or `"exact"`.
nameYesName of a baseline saved by `glass_baseline_save`; an unsaved name errors rather than reporting no change.
ignoreNoWindow-relative rectangles to exclude from the comparison. Use for perpetually animating content — a blinking text caret, a clock, a spinner — which otherwise keeps `changed_pct` permanently non-zero. `changed_pct` is measured over the pixels that remain; the excluded count is reported as `ignored_pixels`. Combines with `region`: rects are always window-relative and are intersected with it.
regionNoOptional window-relative sub-rectangle to diff; omit to diff the whole window. Scopes the comparison (and the reported `bbox`, which becomes region-relative) to just this area — the way to ask "did *only* this part change?" Mirrors `glass_wait_for_region`'s `region`.
thresholdNoPerceptual sensitivity for `mode="perceptual"`, 0..1 (default 0.1; smaller = stricter).
toleranceNoPer-channel tolerance for `mode="exact"` (default 0).
include_imageNoAlso return the current frame cropped to the changed region (default false). No image is returned when nothing changed.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark the tool as read-only, and the description adds valuable behavioral context: this is a non-waiting, one-shot comparison, and include_image only returns a crop when pixels actually differ. This goes beyond what annotations alone convey, though it does not describe full return-structure details.

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 with no filler: the core action and outputs are front-loaded, the distinguishing usage guidance follows, and the optional include_image behavior closes efficiently. Every sentence earns its place.

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, full parameter schema coverage, and readOnly annotation, the description covers purpose, usage boundaries, and the key optional behavior. It does not detail the exact shape of 'change stats' or the bbox, but that is not required without an output schema and does not prevent correct invocation.

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 seven parameters thoroughly. The description only reiterates include_image's effect without adding meaning beyond the schema, which keeps this at the baseline for fully-covered schemas.

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 a specific verb ('Compare'), names the resource ('current visual evidence with a named pixel baseline'), and states the outputs ('change stats and a bounding box'). It also explicitly distinguishes itself from wait-for tools, making its purpose unmistakable among siblings.

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

Usage Guidelines5/5

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

It clearly states when to use this tool ('single current-state comparison') and when not to, naming the alternatives: 'glass_wait_for_region to wait for pixel change/match and glass_wait_stable for quiescence.' It also gives a concrete usage tip for include_image, so an agent knows how to get the changed crop.

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

glass_doA

Prefer glass_do whenever at least two upcoming actions or verification waits are already known. Typical form flow: take one fresh glass_a11y_snapshot, retain the needed ids, then run set_value, wait_for_element, click_element, and wait_for_element here in one ordered call. Use standalone tools only when the next step depends on newly observed state. Inspect the structured outcomes before recovery. Run fixed static ordered actions in one call: click, move, drag, scroll, type, key, settle, click_element, set_value, wait_for_element, scroll_to_element. At most 64 actions and 65536 compact argument bytes. Optional absolute sequence timeout_ms defaults to 30000ms, is valid from 1 through 120000ms, and uses one absolute deadline shared by all actions and terminal settle/diff/screenshot. Fail-fast on action errors, sequence deadline, and unmatched batched wait_for_element/scroll_to_element predicates; standalone predicates remain soft. Successful calls return a structured completed outcome for every action. Once execution starts, action failures return completed, failed, and unexecuted action outcomes in the MCP error; terminal-observation failures return completed action outcomes plus terminal_steps. Preflight validation failures return an invalid_sequence error without step outcomes. Optional terminal settle, diff, screenshot adds corresponding terminal_steps outcomes. type retains return:"none|settle|snapshot" support. No variables, result bindings, interpolation, branching, loops, retries, or dynamic action generation.

ParametersJSON Schema
NameRequiredDescriptionDefault
thenNoOptional observe run once after the last action, in the order settle → diff → screenshot.
actionsYesActions to run in order; must be non-empty. Fail-fast — the first failing action aborts the rest and reports its index, so a partial sequence may already have landed.
timeout_msNoOverall sequence budget in milliseconds. Omit for 30000; valid range 1..=120000. One absolute deadline is shared by all actions and terminal observations.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations are minimal (three negative hints), so the description carries the full burden and delivers: fail-fast semantics on action errors, sequence deadline, and unmatched batched predicates; the exact error outcome shapes (completed/failed/unexecuted in the MCP error); the preflight invalid_sequence path; terminal_steps additions; and hard limits (64 actions, 65536 bytes). The explicit 'No variables, result bindings, interpolation…' dislosure prevents false expectations. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but every sentence carries distinct information, and the most actionable guidance (when to prefer, canonical flow, when not to) is front-loaded. A mild structural ding for presenting this much detail as one unbroken wall of text without bullets or paragraph breaks.

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

Completeness5/5

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

With no output schema, the description documents result shapes: structured completed outcomes per action on success, and the completed/failed/unexecuted split in MCP errors on mid-sequence failure. Combined with a schema that fully documents every action variant and the then-args, nothing an agent needs to invoke it correctly or recover from failures is missing.

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%, so the baseline is 3. The description earns above baseline by adding constraints the schema omits — max 64 actions, 65536 compact argument bytes, and the one shared absolute deadline for timeout_ms — plus fail-fast ordering for the actions array.

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?

Neames a specific operation — running multiple fixed ordered UI actions (click, set_value, wait_for_element, etc.) in one call — and explicitly contrasts itself with the standalone siblings. The phrase 'Run fixed static ordered actions in one call' plus the enumerated action list make the resource and scope unmistakable.

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

Usage Guidelines5/5

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

Explicitly states when to prefer this tool: 'Prefer glass_do whenever at least two upcoming actions or verification waits are already known.' It also gives the canonical form flow and the exclusion condition — 'Use standalone tools only when the next step depends on newly observed state.' This is textbook when/when-not guidance with alternatives named.

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

glass_doctorA

Diagnose the glass environment and report per-check status + how to fix anything missing. Use this to self-diagnose a glass_start failure. Optional deep: also spin up and tear down the default backend's headless display to verify it starts. Returns report (the rendered text above) plus structured data: sections (each a {title, backend, checks: [{name, status, detail, remedy?, remedy_action?}]}, where backend is null for general checks that apply to every backend, and status is one of "ok"/"warn"/"fail"/"skip"; remedy and remedy_action are each omitted when absent, so a failing check may carry neither) and overall — the single verdict to branch on, since it already downgrades a non-default backend's failing check to a warning the way the rendered summary does.

ParametersJSON Schema
NameRequiredDescriptionDefault
deepNoAlso spawn and tear down the default backend's headless display to verify it actually starts (slower). Default false.

TDQS

A5/5.0
Behavior5/5

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

The description discloses that the deep option spawns and tears down a headless display, implying side effects, which aligns with the annotations. It also details the return structure (sections, checks, statuses, remedies) and overall verdict, providing full transparency about behavior.

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 well-structured and concise, covering purpose, usage, parameter, and output in a logical flow. It avoids redundancy and each sentence adds value, despite being somewhat detailed for the return structure.

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

Completeness5/5

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

The description fully explains the tool's functionality, optional deep behavior, and the complete structure of the returned data, including status values and remedy fields. It leaves no ambiguity for an agent using this tool.

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

Parameters5/5

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

The only parameter 'deep' is fully described: 'Also spawn and tear down the default backend's headless display to verify it actually starts (slower). Default false.' Schema coverage is 100%, so the parameter semantics are complete and clear.

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 diagnoses the glass environment and reports per-check status, with a specific verb and resource. It also mentions the self-diagnosis use case, effectively distinguishing it from sibling tools that perform other actions.

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

Usage Guidelines5/5

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

The description explicitly instructs 'Use this to self-diagnose a glass_start failure', providing a precise when-to-use scenario. It also explains the optional deep check, making the tool's intended usage unambiguous.

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

glass_dragA

Drag with a button held from (x1,y1) to (x2,y2) — window-relative coordinates, so 0,0 is the window's top-left, not the screen's. Presses at the start point, moves across in steps over duration_ms, and releases at the end; the button is left (button overrides) and optional modifiers are held throughout, e.g. ["ctrl"] or ["ctrl","shift"] for multi/range-select. Either endpoint outside the window is refused with an error giving the window size, so a drag never lands somewhere you did not aim. Use this for a single pointer — selecting text, moving an item, resizing a pane; glass_gesture is the multi-touch equivalent (2+ pointers, for pinch/rotate), and glass_click is the press-and-release-in-place case. If at least two next actions or waits are known, use glass_do instead of separate calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
x1YesPress-point x, window-relative — 0 is the window's left edge, not the screen's.
x2YesRelease-point x, window-relative.
y1YesPress-point y, window-relative — 0 is the window's top edge, not the screen's.
y2YesRelease-point y, window-relative.
buttonNoButton held for the drag: "left" (default), "right", or "middle".
modifiersNoModifier keys to hold during the action, e.g. ["ctrl"] or ["ctrl","shift"] for multi/range-select.
duration_msNoSpan the drag's motion over this many milliseconds so a frame-based GUI samples the path across multiple frames (and registers the drag even while it repaints). Default 200. Lower = faster but coarser.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only carry basic hints (readOnly=false, destructive=false), so the description carries the behavioral burden and delivers richly: window-relative vs screen-relative coordinate semantics, the press-move-release lifecycle in steps over duration_ms, default button behavior, modifiers held throughout, and the safety behavior that out-of-window endpoints are refused with an error reporting window size. No contradiction with annotations.

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?

Dense but every sentence earns its place: coordinate semantics, mechanics, defaults, error behavior, use cases, alternatives, and batching guidance. The most decision-relevant fact (window-relative coordinates disambiguating 0,0) is front-loaded, and the sibling routing is compactly appended.

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

Completeness5/5

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

For a 7-parameter, 4-required tool with no output schema, the description covers the key behavioral surface an agent needs: coordinate frame, execution lifecycle, defaults, modifier handling, out-of-bounds refusal, and alternative-tool routing. No critical call-time decision is left undocumented.

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%, so baseline is 3. The description adds value beyond the schema by explaining how duration_ms shapes motion ('moves across in steps'), the default button behavior, and how modifiers apply ('held throughout'), plus the endpoint-validation constraint tying x1/y1/x2/y2 to the window bounds. This is genuine added meaning, not mere restatement.

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?

Opens with a specific verb+resource: 'Drag with a button held from (x1,y1) to (x2,y2)'. It explicitly differentiates from siblings — glass_gesture (multi-touch pinch/rotate), glass_click (press-and-release in place), and glass_do (batching). An agent can tell exactly what this tool does and what it is not without opening the schema.

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

Usage Guidelines5/5

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

Gives explicit selection criteria: 'Use this for a single pointer — selecting text, moving an item, resizing a pane', then names the alternatives with their distinguishing conditions (glass_gesture for 2+ pointers, glass_click for in-place press/release, glass_do when two or more next actions are known). The when/when-not/alternatives guidance is complete and leaves nothing to inference.

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

glass_find_elementsA
Read-only

Find a bounded ranked set of accessibility elements from one fresh read. Use this when the target text is approximate, duplicated, or not yet identified; use glass_wait_for_element for one precise runtime condition and glass_a11y_snapshot for broad tree inspection. query is a deterministic case-insensitive substring over accessible name, description and non-secure value; optional role/states narrow targets, optional within must match one semantic scope, max_results defaults to 10 and is capped at 20, max_nodes uses snapshot walk-limit semantics, and positive timeout_ms waits for a match. Returns trusted counts plus one untrusted match array with actionable ids and compact context. Complete success and error text is capped at 8 KiB.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoNormalized target role.
queryNoApproximate case-insensitive semantic text. Optional when role or states are supplied.
statesNoTarget state predicates combined with AND.
withinNoOptional unique semantic scope resolved in the same fresh tree.
max_nodesNoExisting accessibility walk limit semantics; 0 removes the node-count limit.
timeout_msNoOptional wait for at least one match; default 0 performs one fresh read.
max_resultsNoMaximum ranked matches before the byte budget; default 10, range 1 through 20.

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, but the description adds substantial behavioral context: it performs a single fresh read, returns a bounded ranked set, treats query as deterministic, caps max_results at 20, uses snapshot walk-limit semantics for max_nodes, and caps complete output at 8 KiB. It also discloses the trusted/untrusted nature of returned data. No annotation contradiction is present.

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 dense but every sentence earns its place: it front-loads the core behavior, immediately gives routing guidance, then compacts parameter semantics, return shape, and error limits. Despite its length, it avoids repetition and stays organized.

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

Completeness5/5

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

There is no output schema, so the description correctly covers return semantics: trusted counts plus one untrusted match array with actionable ids and compact context. It also covers key constraints like the 8 KiB cap. For a tool with seven optional parameters and rich sibling context, this description provides enough for correct invocation.

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

Parameters5/5

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

Schema coverage is 100%, so the baseline is 3, but the description meaningfully extends the schema. It clarifies that query is a deterministic case-insensitive substring over accessible name/description/non-secure value, that within must match one semantic scope, that max_results defaults to 10, that positive timeout_ms waits for a match, and that max_nodes reuses snapshot walk-limit semantics. These details are absent from the schema 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 opens with a specific verb and resource: 'Find a bounded ranked set of accessibility elements from one fresh read.' It clearly differentiates this tool from glass_wait_for_element and glass_a11y_snapshot by naming them as alternatives, so an agent can select the right sibling without opening their schemas.

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

Usage Guidelines5/5

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

The description gives explicit selection criteria: use this when target text is 'approximate, duplicated, or not yet identified,' and use glass_wait_for_element for 'one precise runtime condition' or glass_a11y_snapshot for 'broad tree inspection.' This provides both when-to-use and when-not-to-use guidance.

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

glass_gestureA

Perform a multi-touch gesture: 2–10 pointers, each a straight from→to segment in window-relative px, all down together at t=0 and up at duration_ms. Pinch = two pointers toward/apart; rotate = two on an arc; two-finger swipe = two parallel segments; a from==to pointer is held. Multi-touch isn't available on every backend — it returns a clear Unsupported error where the active backend can't do it.

ParametersJSON Schema
NameRequiredDescriptionDefault
pointersYes2–10 simultaneous pointers; each a straight from→to segment. Pinch = two pointers moving toward/apart; rotate = two on an arc; two-finger swipe = two parallel segments.
duration_msNoSpan the gesture over this many ms (all pointers down at 0, up at duration). Default 250.

TDQS

A4.4/5.0
Behavior4/5

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

The description discloses that multi-touch isn't available on every backend and that it returns a clear Unsupported error where unsupported, which is valuable beyond the annotations (which declare only safety hints). It also explains the timing model (all down at t=0, up at duration_ms) and the 'held pointer' behavior, adding behavioral context that helps the agent anticipate results. The annotations don't specify these runtime behaviors, so the description fills a real 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 concise and information-dense, front-loading the core action and mechanics in the first sentence, then adding gesture examples and a critical limitation note. Every sentence adds non-redundant value; there's no filler or repetition of schema details. It's well-structured for quick scanning by an agent.

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 and a moderate-complexity parameter set (only two parameters), the description covers the essential semantics: pointer segments, gesture types, timing, and backend limitations. The only minor gap is that it doesn't explicitly state the default duration_ms, but that's in the schema description. Overall, an agent has enough to call it correctly without missing critical behavior.

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 covers the parameters thoroughly, but the description adds glossary-level meaning: it defines what a 'from==to pointer' means (held), and clarifies how the pointer count maps to gesture types. It reinforces window-relative coordinate semantics already in the schema, and explains the duration default implicitly by describing the timeline. Since schema coverage is 100%, the description's additional gestures and examples go beyond repetition, earning 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 states a specific verb ('perform'), a precise resource ('multi-touch gesture'), and enumerates pointer count and segment mechanics. It lists concrete gesture patterns (pinch, rotate, swipe, hold), which clearly distinguishes it from single-pointer tools like glass_drag and glass_click, and from other input tools such as glass_key or glass_type.

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 explains the gesture mechanics and provides examples of when to use each pattern (pinch, rotate, swipe), giving clear context. It doesn't explicitly say when NOT to use this tool versus alternatives, but the detailed gesture-specific guidance implies usage for multi-touch scenarios, leaving no ambiguity for common cases.

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

glass_keyA

Press a key chord like 'ctrl+s', 'Return', 'alt+F4'. One key with any number of modifiers, joined by '+': the last token is the key, every earlier one a modifier (ctrl, shift, alt, super — cmd, win and meta are accepted names for super, and all of them are case-insensitive). The key is a named key such as Return, Escape, Tab, Delete, an arrow or F1-F12, or a single printable ASCII character. An unrecognised modifier or key name is rejected with an error naming the token, so nothing is half-pressed; modifiers are released again when the chord completes. Use this for shortcuts and named keys — glass_type is for literal text and cannot express either. If at least two next actions or waits are known, use glass_do instead of separate calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
chordYesA chord like "ctrl+s", "Return", "alt+F4".

TDQS

A5/5.0
Behavior5/5

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

Beyond the sparse annotations, it discloses important runtime behavior: unknown tokens are rejected with a named error, nothing is half-pressed, and modifiers are released on completion. It also explains case-insensitivity and aliases for super, which materially affect how the agent should construct calls.

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 long but every sentence earns its place: syntax, accepted values, error behavior, release semantics, and routing to alternatives. It is front-loaded with examples before grammar details, making it easy to scan.

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

Completeness5/5

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

For a single-parameter keyboard tool with no output schema, the description covers everything needed to invoke it correctly: chord grammar, modifier aliases, key categories, error handling, and alternative tools. There is no critical missing context.

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

Parameters5/5

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

Although the schema provides a simple example, the description substantially expands the meaning of the `chord` parameter: last token is the key, earlier tokens are modifiers, accepted modifier names, key categories, and printable ASCII support. This adds real semantic value beyond the schema's one-line 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 begins with an explicit verb and resource: 'Press a key chord', followed by concrete examples. It clearly differentiates from glass_type ('for literal text') and glass_do ('for batching'), so an agent can distinguish the tool from siblings without inspecting schemas.

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

Usage Guidelines5/5

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

The description gives explicit guidance: use for shortcuts and named keys, glass_type for literal text, and glass_do when batching multiple actions or waits. It also specifies exact chord syntax and accepted modifier forms, leaving little to inference.

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

glass_list_windowsA
Read-only

List the app's top-level windows: id, title, class, geometry, and which is active. Returns a JSON array. Window ids are not stable across calls — re-list after windows open/close instead of caching ids.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior4/5

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

The description adds valuable behavioral context beyond the readOnlyHint and openWorldHint annotations. The note that 'Window ids are not stable across calls' is a critical runtime behavior that agents must know to avoid caching issues, and it explicitly advises re-listing after window changes. This is a significant disclosure that goes beyond the annotations.

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 compact—two sentences—with the core action and return format first, followed by the important stability warning. Every sentence earns its place; there is no fluff or redundancy. The structure front-loads the essential information effectively.

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 zero-parameter tool with no output schema, the description covers the key aspects: what it lists, the fields included, the JSON array format, and a caution about id stability. It does not explicitly mention behavior when no windows are present, but that is not critical. The description is sufficiently complete for an agent to call this tool correctly.

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 tool has zero parameters and the schema description coverage is 100% (effectively no parameters to describe). The description does not need to add parameter semantics since there are none. Based on the rubric, with high schema coverage the baseline is 3, and the description does not add any extra parameter-related information because none exists.

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 action: 'List the app's top-level windows' and enumerates the specific fields returned (id, title, class, geometry, and active status). It also specifies the return format as a JSON array. While the verb and resource are specific, it does not explicitly differentiate from sibling tools like glass_select_window or glass_window, though the 'list' action makes the distinction reasonably clear.

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?

The description does not provide any guidance on when to use this tool versus alternatives. It offers a behavioral warning about id instability, which suggests a usage pattern (re-list instead of caching), but it does not explicitly state when to choose this over related tools like glass_select_window or glass_window. No exclusions or context for selection are given.

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

glass_logsA
Read-only

Read captured stdout/stderr log lines with a resumable cursor. glass_start captures the app's output from launch; this returns what has accumulated and a cursor to pass back next time, so a loop reads each line once. Returns immediately with whatever is there, including nothing at all — it does not wait, so use glass_wait_for_log when you want to block until a line appears (starting up, finishing work). Filter server-side with stream and contains rather than reading everything and scanning it yourself. The buffer keeps the most recent lines and drops the oldest, so a chatty app can age out lines you never read; the lines are the app's own output and are returned marked as untrusted.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoResume point — the `cursor` a previous call returned, to read only what has been logged since. Omit to read from the oldest buffered line.
streamNo"stdout", "stderr", or "both" (default).
containsNoReturn only lines containing this substring (case-sensitive). Filtering happens server-side, so it narrows what the cap applies to.
max_linesNoCap on lines returned (default 200); the returned `cursor` resumes at the first line left unread, so a capped read is not a lost one.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true and openWorldHint=false, but the description adds substantial behavioral context: the resumable cursor semantics, immediate non-blocking return, buffer rotation that can age out unread lines, and the fact that returned lines are marked untrusted. This goes far beyond what annotations provide and contradicts nothing.

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?

Four dense sentences, each earning its place: the core operation, cursor behavior, the blocking alternative, filtering guidance, and the buffer/untrusted caveats. The most important information is front-loaded and no sentence is wasted.

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

Completeness5/5

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

For a tool with 4 optional parameters, no output schema, and read-only annotations, this description covers everything needed to call it correctly: what it returns, how cursors resume, empty-return behavior, when to choose the waiting sibling, filtering options, and buffer limitations. Nothing essential is missing.

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%, so the baseline is 3. The description adds meaning beyond the schema by explaining the cursor's loop-once semantics, why filtering server-side matters, and how the buffer can cause unread lines to be dropped. It doesn't detail every parameter, but the schema already documents them well.

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 opens with a specific verb and resource: 'Read captured stdout/stderr log lines with a resumable cursor.' It clearly distinguishes this from the sibling glass_wait_for_log by explaining the non-blocking behavior, so an agent can tell which tool to pick without opening schemas.

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

Usage Guidelines5/5

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

The description explicitly says to use glass_wait_for_log when blocking is desired ('it does not wait, so use glass_wait_for_log when you want to block until a line appears'). It also advises server-side filtering with stream and contains instead of reading everything, giving clear guidance on how to use this tool efficiently.

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

glass_moveA

Move the pointer to window-relative coordinates. If at least two next actions or waits are known, use glass_do instead of separate calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesDestination x, window-relative — 0 is the window's left edge, not the screen's.
yYesDestination y, window-relative — 0 is the window's top edge, not the screen's.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already signal readOnlyHint=false and destructiveHint=false, so the mutation aspect is covered. The description adds 'window-relative' coordinate semantics, but it doesn't disclose additional behavior such as hover side effects or whether this moves the OS cursor. No contradiction exists between annotations and description.

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 concise sentences: the first states the core action, the second provides routing guidance for an alternative. Every sentence earns its place and there is no 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?

For a simple pointer-move tool with only two required parameters, full schema coverage, and no output schema, the description is largely complete. It covers the coordinate semantics and the main alternative batching path, though it doesn't mention possible side effects or success criteria.

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 fully documents both x and y, including window-relative meaning and edge clarifications. The description echoes 'window-relative coordinates' but adds no extra semantic information beyond the schema, so baseline 3 is appropriate.

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 states a specific verb ('Move'), a clear resource ('the pointer'), and target coordinates. It also distinguishes itself from related tools by referencing glass_do for batched actions, so an agent can tell what this tool does without ambiguity.

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

Usage Guidelines5/5

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

The description explicitly says to use glass_do instead of separate calls when at least two next actions or waits are known. This provides clear when-not-to-use guidance and names the alternative, which is exactly what an agent needs for tool selection.

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

glass_screenshotA
Read-only

Capture current visual evidence from the app window (or an optional window-relative region) as a lossless WebP screenshot. This proves only what pixels are visible at capture time, not semantic state or transition completion; use glass_wait_for_element for an accessible condition/value, glass_wait_for_region for pixel transition completion, or glass_wait_stable for visual quiescence. A capture reaching off the display edge is clipped to the on-screen portion — the returned width/height are the actual captured size, so a frame smaller than the window/region means it was clipped; only a fully off-screen surface errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
regionNoOptional window-relative sub-rectangle to capture; omit for the whole window.
window_idNoCapture/observe this window (id from `glass_list_windows`) instead of the active one, without changing which window subsequent ops target. Omit for the active window.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses important behaviors: captures are clipped at display edges, the returned width/height reflect the actual captured size, a smaller frame indicates clipping, and only a fully off-screen surface errors. It also clarifies the screenshot's evidential limitation.

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 front-loaded with the core purpose, then gives usage routing, then covers edge-case behavior. Every sentence earns its place, and there is no filler or repetition of schema boilerplate.

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?

Coverage is strong for an invoke-time decision: purpose, alternatives, clipping, and error conditions are all present. However, there is no output schema, and the description only mentions returned width/height without stating how the screenshot image itself is returned, which is a minor completeness gap.

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% and the schema already explains window_id and region semantics in detail, including window-relative coordinates and optionality. The description mostly restates 'window-relative region' without adding substantial parameter-level meaning 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 states a specific verb and resource: 'Capture current visual evidence from the app window' as a 'lossless WebP screenshot.' It also distinguishes itself from sibling wait tools by explicitly saying it proves pixel visibility, not semantic state or transition completion.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance and names specific alternatives: use glass_wait_for_element for accessible conditions, glass_wait_for_region for pixel transition completion, and glass_wait_stable for visual quiescence. This lets an agent route correctly without guessing.

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

glass_scrollA

Scroll at window-relative coordinates by (dx,dy) wheel steps. Optional modifiers held during the action, e.g. ["ctrl"] or ["ctrl","shift"] for multi/range-select. If at least two next actions or waits are known, use glass_do instead of separate calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesPointer x the wheel is aimed at, window-relative — apps scroll the container under this point, so it selects which pane moves.
yYesPointer y the wheel is aimed at, window-relative. See `x`.
dxNoHorizontal wheel notches from -100 through 100, not pixels. Positive is right and negative is left, repeated `|dx|` times. Typical values are 1–5.
dyNoVertical wheel notches from -100 through 100, not pixels. Positive is down and negative is up, repeated `|dy|` times. Typical values are 1–5. Apps choose how a notch maps to lines, pixels, or zoom.
modifiersNoModifier keys to hold during the action, e.g. ["ctrl"] or ["ctrl","shift"] for multi/range-select.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate this is not read-only and not destructive. The description adds useful behavioral context: scrolling is measured in wheel steps, modifiers are held during the action, and it names the batching behavior via glass_do when multiple actions are known. This goes beyond the schema but stops short of describing side effects or edge cases in depth.

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 tight sentences with no filler. The core action is front-loaded, the modifier behavior is stated briefly, and the batching alternative is placed at the end where it belongs.

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

Completeness5/5

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

For a simple action tool with 100% schema coverage and no output schema, the description provides all necessary context: what the tool does, coordinate semantics, modifier behavior, and when to route to glass_do. Nothing critical is missing.

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 fully documents all five parameters. The description adds a concise restatement of the coordinate model and modifier purpose, but the heavy lifting is already done by the 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 opens with a specific verb and resource: 'Scroll at window-relative coordinates by (dx,dy) wheel steps.' It clearly distinguishes coordinate-based scrolling from the sibling glass_scroll_to_element, and the batching note differentiates it from glass_do.

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

Usage Guidelines5/5

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

Explicitly states when to prefer glass_do instead: 'If at least two next actions or waits are known, use glass_do instead of separate calls.' This gives a concrete condition for choosing an alternative and implies glass_scroll is for single, ad-hoc scroll actions.

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

glass_scroll_to_elementA

Scroll a container (any axis) until an accessibility element is on-screen, then return it (text-only, no image). Requires the element to be actually visible — not merely present in the a11y tree — so the returned id is usable with glass_click_element. Select by name (accessible-name substring) and/or role (e.g. "Button"); optional value_contains. direction: "up"/"down"/"left"/"right"; omit to infer it from the target's off-screen position (falls back to a vertical down→up sweep when the target isn't in the tree yet). It sweeps that way to the end, then reverses. Optional x,y aim the swipe at a specific container; by default it anchors on the target's own row/column so a container that isn't window-centered (e.g. a top toolbar) is still driven. step sets wheel notches per move (default 3). Returns {matched,elapsed_ms,element{id,role,name,bounds,states},scrolled{steps,reversed,direction}} — the id is usable with glass_click_element. Returns {matched:false} if it never becomes visible after sweeping both ends or timeout_ms (default 20000). Errors if the app exposes no accessibility tree. If at least two next actions or waits are known, use glass_do instead of separate calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoScroll anchor x (window-relative). By default the swipe anchors on the target's own row/column (falling back to the window center if it isn't in the a11y tree yet); set both `x` and `y` to point the wheel at a specific container instead.
yNoScroll anchor y (window-relative). See `x`.
nameNoSubstring of the target element's accessible name (selector).
roleNoElement role filter, e.g. "ListItem", "Button", "Document" (selector).
stepNoWheel notches per scroll step (default 3). A calibration escape hatch — larger covers distance faster but risks stepping past a row's/column's realized band.
directionNoSweep direction: "up"/"down" (vertical) or "left"/"right" (horizontal). Omit to infer it from the target's off-screen position (falls back to a vertical down→up sweep when the target isn't in the a11y tree yet). The search reverses to the other end if the target isn't found first.
timeout_msNoGive up after this long (default 20000ms); returns `{matched:false}`.
descriptionNoSubstring of the target element's accessible description (selector). This can select an unnamed control, including an Android text field labelled only by its hint.
value_containsNoAdditionally require the matched element's `value` to contain this substring. Not a standalone selector — `name`, `description`, and/or `role` is still required.

TDQS

A4.6/5.0
Behavior5/5

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

The description goes well beyond the annotations by disclosing the visible-not-merely-present requirement, the sweep-and-reverse search strategy, fallback direction inference, anchoring behavior, text-only return, timeout behavior, and error case. This is exactly the operational context an agent needs and is not available from readOnlyHint/destructiveHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded with the core purpose, then parameter behavior, then return contract and alternatives. Every sentence carries operational value for a 9-parameter tool, though the single-paragraph format is long and could be improved with clearer structural breaks.

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

Completeness5/5

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

Given the tool has 9 parameters, no output schema, and no nested objects, the description covers selectors, direction inference, sweep-reversal, anchor defaults, step, timeout, return shape, error conditions, and the glass_do alternative. An agent has enough to decide when to call it and what to expect.

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?

Parameter semantics are already fully documented in the schema (100% coverage), including defaults for `step`, `timeout_ms`, and validation that `value_contains` is not standalone. The description summarizes some of this behavior but does not substantially add new parameter meaning beyond what the schema already provides.

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 states a specific action (scroll any axis), a resource (container/element), and the outcome (element returned as text-only with usable id for glass_click_element). It clearly distinguishes itself from generic scrolling and clicking siblings by framing the purpose around finding a visible accessibility element.

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

Usage Guidelines5/5

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

It explicitly explains when the tool is appropriate — when an element must actually be visible for a later click — and routes to an alternative: 'If at least two next actions or waits are known, use glass_do instead of separate calls.' It also states a hard failure condition (no accessibility tree), giving agents a clear signal for when not to call it.

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

glass_select_windowA
Idempotent

Make a window active by id (from glass_list_windows). Subsequent screenshot/click/type/window ops target it; coordinates are relative to it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe window id from `glass_list_windows`. Ids are not stable across calls — re-list rather than caching them.

TDQS

A4.3/5.0
Behavior4/5

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

Beyond the annotations (idempotent, non-destructive), the description reveals a key behavioral trait: selecting a window redirects subsequent operations and changes the coordinate system. The schema description also warns that ids are not stable across calls, which is important operational behavior. This adds real value beyond the annotation flags.

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 compact and efficient: one sentence that states the action, the id source, and the consequential effect on later operations. Every clause earns its place, and the most important information is front-loaded.

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

Completeness5/5

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

For a single-parameter tool with no output schema and annotations covering safety, the description is complete. It tells the agent what to pass, where to get it, and what side effects to expect on future calls. Nothing essential is missing for correct invocation.

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 schema already covers the only parameter fully, describing it as a window id from glass_list_windows and noting instability. The main description merely repeats 'by id (from glass_list_windows)', adding no new meaning. With 100% schema coverage, the baseline of 3 is appropriate.

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 a specific verb ('Make a window active') and resource ('window'), and immediately identifies the source of the id ('from glass_list_windows'). This clearly distinguishes the tool from siblings like glass_list_windows, glass_screenshot, or glass_click by explaining that it sets the target for subsequent operations.

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: before screenshot/click/type/window operations, since those will target the selected window and interpret coordinates relative to it. It does not explicitly name alternatives or exclusions, but the usage pattern is strongly implied and reinforced by the schema's note about re-listing rather than caching ids.

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

glass_set_valueA

Set an editable element's value — pick the element's #id from glass_a11y_snapshot. Where the platform can write the value directly this is instant and takes no keystrokes; where it has to be typed, glass taps the element, clears it and types, then reads the element back to confirm — up to three accessibility reads, since a field may commit a frame or two later. Errors if the element isn't editable, if it changed since the snapshot (re-snapshot), if the element does not hold the requested value afterwards, or if the app exposes no accessibility tree. That does-not-hold error names both what you asked for and what the element holds, and which one it is decides your next move: your text in another form means the element transformed it and writing again will not help; part of your text means a keystroke was dropped, so write again; what it held before means the write took no effect, and the error then closes with what this backend knows about that. A separate error says the text WAS typed but the write could not be confirmed — the read-back failed, or could not tell which element now holds it. Do NOT write again on that one: the keystrokes already went out, and re-snapshotting is how you see where they landed. Optional return: "snapshot" settles the UI then folds a fresh a11y tree into the result (and refreshes the snapshot cache); "settle" waits for the UI to stop changing (text-only); omit or "none" for no observe (default). If at least two next actions or waits are known, use glass_do instead of separate calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe element `#id` from `glass_a11y_snapshot`.
textYesThe value to set. For a text field, the text. For a spin/slider, a number. For a switch/checkbox/toggle, a boolean (`"true"`/`"false"`/`"on"`/`"off"`/ `"1"`/`"0"`) — idempotent. For a dropdown/combo box, an option label (case-insensitive); glass opens it and picks that option.
returnNoOptional observe folded into the result: "snapshot" (wait for the UI to settle, then fold a fresh a11y tree, also refreshing the snapshot cache), "settle" (waits for visual stability and returns text-only metadata), or "none" (default).

TDQS

A4.3/5.0
Behavior5/5

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

The description discloses the underlying mechanism: direct write where possible, otherwise tap-clear-type, up to three a11y reads, and confirmation. It explains error conditions and the meaning of each error variant, including the decision implication ('write again', 'do not write again'). This goes far beyond the annotations, which are all false and offer no behavioral signal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very dense and front-loads the core operation well. All sentences carry meaningful information, especially the error-handling guidance. However, the long run-on paragraphs about error variants and next moves are harder to scan, and a bulleted structure would improve readability without losing content.

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 no output schema, the description is unusually complete: it covers prerequisities, performanc behavior, error conditions, recovery tactics, return modes, and relation to glass_do. It doesn't explicitly state what a successful result looks like when return is omitted, but the confirmation read-back and error semantics make successful invocatoin inferable. This is a small gap in an otherwise thorough definition.

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 baseline is 3. The description reinforces that id comes from glass_a11y_snapshot and repeats return option semantics, but it does not add meaningfully new parameter-level detail beyond what the schema already documents. It adds selectively behavioral context, especially around errors, but not enough to raise the score above baseline.

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 states a specific verb and resource: 'Set an editable element's value' and anchors the target via '#id from glass_a11y_snapshot'. This clearly distinguishes it from sibling tools like glass_type, glass_click, and glass_do. It is not a tautology and names the batching alternary glass_do at the end.

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 tells the agent to pick the element's id from glass_a11y_snapshot, so the intended pre-recondition is clear. It explicitly says to use glass_do when two or more next actions/waits are known, which is useful routing guidance. It does not explicitly contrast with glass_type, but the semantic 'set value' versus raw typing is reasonably implied.

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

glass_startA

Build, launch, and locate a native GUI app; returns its window geometry. Choose a backend with the backend param (defaults to the host). The accessibility tools are enabled by default; pass a11y:false to skip the accessibility bus for canvas/pixel-only apps. Optional window_hint ({ title?, class? }) picks the right window when several appear, or locates one the launched process hands off to another process.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoWorking directory for both `build` and the launched app; omit to inherit the server's own.
envNoExtra environment variables, as a `{ "KEY": "VALUE" }` object. They reach the launched app on the desktop backends and on `ios`; on `android` they configure the `build` command on the host only, since an app launched by `am start` is forked from zygote and never sees the shell's environment.
runYesWhat to launch: desktop `[executable, args...]`; iOS `[.app-or-bundle-id, args...]`; Android `[apk?, package/.Activity]` in either order, for example `["/absolute/path/app.apk", "com.example.app/.MainActivity"]`.
a11yNoSpawn a private accessibility (AT-SPI) bus so `glass_a11y_snapshot` / `marks` / `set_value` / `click_element` / `wait_for_element` work against this app. **On by default** — the accessibility path is the cheap, low-token way to drive a UI, so it is available unless you opt out. Pass `false` to skip the bus for canvas/pixel-only apps (it spawns extra processes). Effective on Linux only; other backends read accessibility ambiently and ignore this flag.
buildNoOptional shell command to run (in `cwd`) before launching.
backendNoBackend to launch under: `"x11"` or `"wayland"` (Linux), `"windows"` (on a Windows host), `"macos"` (on a macOS host), `"android"` (an AVD emulator, any host), or `"ios"` (an iOS Simulator, macOS host). Omit for the server default (`GLASS_BACKEND`, else `windows` on Windows, `macos` on macOS, else x11).
sandboxNoContainment level for the launched app: `"default"` (filesystem/process containment, network on), `"strict"` (also no network), or `"off"` (no containment). Omit for the server default (`GLASS_SANDBOX`, else `default`). An operator-set floor (`GLASS_SANDBOX_FLOOR`) may raise an omitted level, and refuses an explicit level requested below it.
timeout_msNoHow long to wait for the app's window to appear before failing the launch (default 10000ms). Does not bound `build`.
window_hintNoOptional `{ title?, class? }` to disambiguate which window is the app's when more than one appears, or to find a window the launched process hands off to an unrelated process. Omit to take the first window owned by the launched process or a descendant it can follow.

TDQS

A4.7/5.0
Behavior5/5

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

With annotations only indicating readOnly=false, openWorld=true, and destructive=false, the description carries the burden and handles it well. It discloses that the tool builds and launches processes, may spawn extra accessibility-bus processes, defaults behavior by host, and can follow a window handed off to an unrelated process — all useful behavioral context beyond the raw annotations.

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?

Four dense sentences, with the core purpose and return value front-loaded. Every sentence adds useful guidance: backend choice, a11y behavior, and window_hint semantics. No filler or restatement of schema details.

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

Completeness5/5

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

For a complex 9-parameter tool with a nested object and no output schema, the description covers the key behavioral decisions, default selections, platform scope, and how to locate the correct window. Combined with the very rich input schema, an agent has enough context to invoke the tool correctly without guessing.

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%, so the schema already documents every parameter thoroughly. The description adds value by synthesizing the most important defaults and decision points: backend defaults to the host, a11y is on by default, and window_hint disambiguates windows or handles process handoff. This is modest but real added meaning 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 opens with a specific verb plus resource ('Build, launch, and locate a native GUI app') and states the return value ('returns its window geometry'). It clearly distinguishes glass_start from the sibling tools by framing it as the app-launch entry point rather than an inspection or interaction 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?

The description gives concrete usage direction: pick a backend with the `backend` param, pass `a11y:false` for pixel-only apps, and use `window_hint` when multiple windows appear or the process hands off to another process. It does not explicitly name when not to use this tool or contrast it with alternatives, so it stops short of a 5.

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

glass_stopA
DestructiveIdempotent

Stop the running app and end the session. The app is asked to close first, so it saves state and starts clean next time; one that will not close is terminated, which takes a moment longer. Ends everything session-scoped: captured logs and a11y element ids are gone afterwards, so read what you need first (saved baselines outlive it, until the server exits). There is no resume — only glass_start runs the app again, as a fresh session. Not needed between steps of a task; one session can be driven for as long as you need it, and errors if no session is running.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

The description goes far beyond the annotations by explaining the graceful shutdown behavior, the slower force-termination fallback, the loss of session-scoped logs and a11y element ids, the persistence of saved baselines, and the no-resume guarantee. This fully discloses the destructive consequences of the call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than strictly necessary but every sentence carries relevant operational information: shutdown mechanics, session scope, persistence, no-resume, and usage frequency. It is front-loaded with the core action and then builds context logically without unnecessary filler.

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

Completeness5/5

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

Given the zero-parameter schema and the destructive nature of the operation, the description is complete. It tells the agent exactly what will happen, what will be lost, what will survive, when the tool should be called, when it should not be called, and what happens when no session exists.

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 schema coverage is 100%, so there are no parameter semantics to document. The description appropriately does not invent parameter-related detail, and the baseline for zero-parameter tools is satisfied.

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 opens with a specific verb and resource: 'Stop the running app and end the session.' It clearly differentiates from glass_start by stating there is no resume and only glass_start runs the app again as a fresh session, so an agent can distinguish this from sibling tools.

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

Usage Guidelines5/5

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

The description is explicit about when to use the tool: it is not needed between steps of a task, one session can be driven for as long as needed, and it errors if no session is running. It also directs the agent to glass_start as the only alternative for starting a fresh session.

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

glass_typeA

Type a string of text into the focused window. Does not focus anything itself — click the field first (glass_click_element, or glass_click), or the text goes wherever focus already was. Sent as individual keystrokes, not a paste, so per-key handlers, autocomplete and validation all run; a newline in text does not press Return, so send that as a separate glass_key. Prefer glass_set_value for a field the a11y tree exposes: it addresses the field directly and reports whether the value landed, where this types wherever the cursor already sits and cannot tell you what it hit. Optional return: "snapshot" settles the UI then folds a fresh a11y tree into the result (and refreshes the snapshot cache); "settle" waits for the UI to stop changing (text-only); omit or "none" for no observe (default). If at least two next actions or waits are known, use glass_do instead of separate calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesText to type into whatever currently has keyboard focus — this tool does not focus a field, so click or `glass_click_element` one first. Sent as synthetic key events, not pasted, so an app's per-keystroke handlers run.
returnNoTerminal observation: "snapshot" settles and refreshes/folds a11y, "settle" waits for visual stability and returns text-only metadata, and "none" skips observation (default).

TDQS

A4.8/5.0
Behavior5/5

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

The description discloses key behavioral traits beyond annotations: keystrokes are sent individually, not pasted, so per-key handlers run; newline does not press Return; the tool cannot report where text landed; and return modes ('snapshot', 'settle') are explained. Annotations provide no such detail, so the description carries the full burden and does so thoroughly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured: main action first, then focus caveat, keystroke behavior, alternative tool, and return options. Every sentence adds information, though it is longer than strictly necessary and could benefit from bullet-style segmentation for faster parsing.

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

Completeness5/5

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

Given the tool's interaction complexity—focus dependence, keystroke behavior, return modes, and sibling alternatives—the description covers all essential aspects. It explains prerequisites, side effects, limitations, and fallback tools. No output schema exists, but the return modes are clearly described, making it complete for an agent to invoke correctly.

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% and both parameters already have descriptions. The tool description adds value by clarifying the practical implications of 'text' (keystroke-level sending, newline behavior) and the exact semantics of each 'return' option, going beyond the schema's brief wording without redundancy.

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 opens with a specific verb and resource: 'Type a string of text into the focused window.' It immediately distinguishes itself from siblings by noting it does not focus anything and by naming alternatives like glass_set_value and glass_key, so an agent can tell exactly what this tool does.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: click the field first, prefer glass_set_value for a11y-exposed fields, send newline via glass_key separately, and use glass_do when multiple actions are known. It also states what happens if prerequisites are ignored ('text goes wherever focus already was'), leaving no ambiguity.

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

glass_wait_for_elementA
Read-only

Wait for semantic transition completion: block until an accessible element reaches a condition and optional value, then return it as text (no image). This verifies runtime semantic state, not pixels or visual stability. Select by name (accessible-name substring), description (accessible-description substring) and/or role (e.g. "Button"); condition (default appears): appears|disappears|enabled|disabled|checked|unchecked|selected|unselected|expanded|collapsed|focused|visible|hidden; value additionally requires an exact editable value, while value_contains requires a substring (combine either with a selector). Returns {matched,elapsed_ms} plus the matched element, including value — its id is usable with glass_click_element. On timeout returns {matched:false}. Waits through a just-launched app that has not published its accessibility tree yet, and errors if none appeared before the timeout. Collapses screenshot poll-loops into one call. If at least two next actions or waits are known, use glass_do instead of separate calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoSubstring of the element's accessible name (selector).
roleNoElement role filter, e.g. "Button", "ProgressBar", "Document" (selector).
valueNoExact case-sensitive accessible value, requiring another selector and excluding `value_contains`.
conditionNoWhat to wait for (default "appears"): appears|disappears|enabled|disabled| checked|unchecked|selected|unselected|expanded|collapsed|focused|visible|hidden. `checked`/`unchecked` only match a checkable element (one exposing a real toggle state) — a non-toggle element matches neither.
timeout_msNoGive up after this long (default 10000ms); returns `{matched:false}`.
descriptionNoSubstring of the element's accessible description (selector). Useful for unnamed controls whose platform label is exposed as a hint, help text, or description.
interval_msNoPoll interval (default 200ms — an a11y snapshot per tick).
value_containsNoAdditionally require the matched element's `value` to contain this substring. Not a standalone selector — `name`, `description`, and/or `role` is still required.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only supply readOnlyHint=true; the description alone discloses the blocking behavior, the return contract ({matched,elapsed_ms} plus matched element, and {matched:false} on timeout), the error case ('errors if none appeared before the timeout'), the just-launched-app edge case, and that the returned id is reusable with glass_click_element. This is rich behavioral context well beyond the annotations, with no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and every sentence carries a distinct fact: selector rules, condition enum, return shape, timeout semantics, unready-app handling, and glass_do routing — there is no fluff. It runs long and the condition enum restates the schema, but the density is justified for an 8-parameter wait tool.

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

Completeness5/5

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

With no output schema, the description carries the full return contract and does so completely: matched/elapsed_ms, element with value, id reuse, timeout shape, and the error case. Combined with 100%-covered parameters and readOnlyHint, nothing an agent needs to invoke it correctly is missing.

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 covers 100% of the 8 parameters, so the baseline is 3. The description restates selector semantics (substrings, role filter) and the rule that value/value_contains must combine with a selector, adding only minor nuance such as 'value' requiring an 'exact editable value' — most of this repeats what the schema already documents.

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?

Opens with a specific verb and resource: 'Wait for semantic transition completion: block until an accessible element reaches a condition and optional value, then return it as text (no image).' It also scopes itself against siblings by asserting it verifies 'runtime semantic state, not pixels or visual stability,' clearly separating it from glass_wait_stable and screenshot-based tools.

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?

Gives an explicit when-not with a named alternative: 'If at least two next actions or waits are known, use glass_do instead of separate calls,' and frames itself as replacing 'screenshot poll-loops.' However, differentiation from the other wait siblings (glass_wait_for_log, glass_wait_for_region, glass_wait_stable) is only implicit via 'accessible element' and 'not pixels or visual stability,' not stated as explicit exclusions.

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

glass_wait_for_logA
Read-only

Block until a log line containing contains (optionally on a given stream) appears, then return it as text. By default only lines emitted after this call count; pass a cursor from glass_logs to catch a line emitted just before. Returns {matched,line{seq,stream,text},cursor,elapsed_ms}; on timeout {matched:false}. Resume reading from the returned cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoStart scanning from this cursor (from a prior glass_logs). Omit to match only lines emitted after this call.
streamNo"stdout", "stderr", or "both" (default).
containsYesSubstring to wait for (required, non-empty).
timeout_msNoGive up after this long (default 10000ms); returns `{matched:false}`.
interval_msNoPoll interval (default 100ms).

TDQS

A4.5/5.0
Behavior5/5

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

Discloses blocking semantics, timeout behavior returning {matched:false}, the exact return shape, cursor semantics, and the default time window. Annotations mark this as readOnly and non-open-world, and the description adds timing and continuation behavior without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences, dense and front-loaded with the core action. Every sentence contributes essential behavior, and the detailed return-shape note is warranted because no output schema exists. It is slightly longer than minimal but not wasteful.

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 blocking timeout tool with no output schema, the description fully covers return values, timeout behavior, and cursor continuation. All 5 parameters are documented in the schema, and optional poll/default settings are present. Minor gaps like explicit error cases do not undermine usability.

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%, but the description adds meaningful semantics beyond the schema: it clarifies that cursor from glass_logs can catch a pre-existing line, explains the resume behavior, and highlights stream optionality. This exceeds the baseline for fully-covered schemas.

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?

Description states a specific verb ('Block until...'), resource ('log line'), and conditions ('contains', optional 'stream'). It clearly differentiates from sibling tools like glass_logs by emphasizing wait-until behavior and from other wait_* tools by focusing on logs and cursor semantics.

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?

Description gives practical context: default behavior matches only new lines, pass a cursor from glass_logs to catch an earlier line, and resume from returned cursor. It references glass_logs explicitly, implying a usage sequence, but does not state explicit when-not-to-use or name alternative tools beyond glass_logs.

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

glass_wait_for_regionA
Read-only

Wait for pixel transition completion: block until a visual region changes (diverges from a reference) or matches (converges to a saved baseline), then return text metrics (no image unless include_image:true). until: "changes" (default) or "matches" (needs baseline); optional window-relative region; mode perceptual|exact with threshold/tolerance. Returns {matched,changed_pct,bbox,elapsed_ms}. Use "matches" to confirm the UI reached an approved design without spending vision tokens. This verifies pixels, not semantic state or subsequent stability; use glass_wait_for_element for accessible conditions/values and glass_wait_stable when animation completion means visual quiescence.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo"perceptual" (default) or "exact".
untilNo"changes" (default; diverge from reference) or "matches" (converge to baseline).
ignoreNoWindow-relative rectangles to exclude from the comparison. Use for perpetually animating content — a blinking text caret, a clock, a spinner — which otherwise keeps `changed_pct` permanently non-zero. `changed_pct` is measured over the pixels that remain. Combines with `region`: rects are always window-relative and are intersected with it. A rect that falls partially or entirely outside the compared area — the frame, or the `region` sub-rectangle when one is set — is silently clamped or dropped, masking less than requested or nothing at all; the excluded count is reported as `ignored_pixels`, so a smaller-than- expected value flags a misplaced rect.
regionNoWindow-relative sub-rectangle to watch; omit for the whole window.
baselineNoSaved baseline name to compare against; omit to use the frame at call start.
thresholdNoPerceptual sensitivity (default 0.1; smaller = stricter).
toleranceNoExact per-channel tolerance (default 0).
window_idNoCapture/observe this window (id from `glass_list_windows`) instead of the active one, without changing which window subsequent ops target. Omit for the active window.
timeout_msNoGive up after this long (default 10000ms); returns `{matched:false}`.
interval_msNoPoll interval (default 100ms).
include_imageNoOn match, also return the watched region as an image (default false).

TDQS

A4.9/5.0
Behavior5/5

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

With readOnlyHint=true already present, the description adds meaningful behavioral context: blocking semantics, default until='changes', matches requiring a baseline, no image unless include_image:true, and the important caveat that this verifies pixels, not semantic state or subsequent stability. It goes beyond annotations and does not contradict them.

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?

Dense but efficient: the first sentence establishes the blocking behavior and return shape, later sentences cover parameter modes, the primary use case, and the critical exclusion from semantic/stability checks. Every sentence earns its place with no filler.

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

Completeness5/5

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

Despite 11 parameters and no output schema, the description covers the essential output structure, key parameter relationships, the main use case, and the alternatives. The remaining parameters (timeout_ms, interval_ms, ignore, window_id) are fully described in the 100%-coverage schema, so nothing critical is missing.

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%, so the schema carries the parameter details; the description still adds cross-parameter relationships not obvious from the schema alone — 'matches' needs a baseline, 'mode' pairs with threshold/tolerance, and include_image gates image output. This is useful but not a full re-derivation of 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 names a specific verb ('wait'), resource ('visual region'), and the two conditions (change or match) with return value details. It also explicitly distinguishes itself from glass_wait_for_element and glass_wait_stable, so an agent can tell them apart without opening schemas.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance ('Use matches to confirm the UI reached an approved design without spending vision tokens') and explicit when-not-to-use guidance with named alternatives ('use glass_wait_for_element for accessible conditions/values and glass_wait_stable when animation completion means visual quiescence').

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

glass_wait_stableA
Read-only

Wait for visual quiescence: consecutive frames stop changing, then return the last frame. This proves stability, not that an expected semantic state or pixel design was reached; use glass_wait_for_element for a semantic condition/value or glass_wait_for_region with a baseline for expected pixels. Optional stability_region watches only that sub-rectangle; optional region crops the returned frame. Set include_image:false for text-only metadata. If at least two next actions or waits are known, use glass_do instead of separate calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
ignoreNoWindow-relative rectangles to exclude from the settle comparison. Use for perpetually animating content — a blinking text caret, a clock, a spinner — which otherwise keeps the window from ever settling. Pixels inside a rect never count as changed and never set `saw_motion`. Combines with `stability_region`: rects are always window-relative and are intersected with it. Independent of `region`, which only crops the returned image. A rect that falls partially or entirely outside the compared area — the frame, or the `stability_region` sub-rectangle when one is set — is silently clamped or dropped, masking less than requested or nothing at all; the excluded count is reported as `ignored_pixels`, so a smaller-than-expected value flags a misplaced rect.
regionNoOptional window-relative sub-rectangle for the returned frame.
toleranceNoPer-channel difference (0–255) two frames may have and still count as unchanged (default 0, exact match). Raise it for a backend with dithering or compression noise.
window_idNoCapture/observe this window (id from `glass_list_windows`) instead of the active one, without changing which window subsequent ops target. Omit for the active window.
timeout_msNoGive up after this long (default 5000ms); returns `{settled:false}` rather than erroring.
interval_msNoHow long to wait between capture ticks (default 100ms).
include_imageNoReturn the settled frame as an image (default true). Set false for a text-only `{settled, saw_motion, observed_ms, ignored_pixels, width, height}` result with no WebP — cheap when the next step is a text `glass_diff`. `region` is ignored when false.
settle_framesNoConsecutive unchanged frames required before the UI counts as settled (default 3). Raise it for an app that pauses mid-animation.
stability_regionNoOptional window-relative sub-rectangle to watch for settling; when set, the settle decision ignores changes outside it. Independent of `region`.

TDQS

A4.4/5.0
Behavior4/5

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

The description goes beyond the readOnlyHint annotation by clarifying that this tool proves stability, not that a specific semantic state or pixel design was reached — a key behavioral caveat. It also documents the optional include_image:false path for text-only metadata and notes that region only crops the returned frame. It doesn't mention all parameter interactions, but the schema already covers those details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the core definition and the semantic distinction from sibling tools appear in the first two sentences. The later sentences about optional parameters and batching are efficient. It earns a 4 rather than 5 because it packs several ideas into a dense paragraph and could be slightly more scannable, but it has no wasted words.

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

Completeness5/5

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

For a tool with 9 parameters, all documented in the schema, and a readOnlyHint annotation, the description is complete enough. It communicates the tool's guarantee (stability, not semantic state), routes to alternatives, and surfaces the include_image optimization for text-only workflows. An agent can select and invoke this tool correctly without further clarification.

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 thoroughly, including tolerance, stability_region, ignore, window_id, timeout, interval, settle_frames, and include_image. The description adds high-level meaning for stability_region and region and mentions include_image's performance benefit, but the detailed semantics live in the schema, so baseline 3 is appropriate.

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?

States a specific verb and resource: 'Wait for visual quiescence' and defines the stopping condition as consecutive frames no longer changing, then returning the last frame. The description also clearly distinguishes this from sibling tools glass_wait_for_element and glass_wait_for_region, so an agent can tell them apart without inspecting schemas.

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

Usage Guidelines5/5

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

Provides explicit when-to-use guidance by naming alternatives: use glass_wait_for_element for semantic conditions/values and glass_wait_for_region with a baseline for expected pixels. It also gives a batching direction: use glass_do instead of separate calls when at least two next actions or waits are known.

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

glass_windowB

Focus/resize/move the window or read its geometry. op: focus|resize|move|geometry.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoNew left edge for `op: "move"`, required there and ignored otherwise. Screen coordinates — the one place in this API that is not window-relative, since a window cannot be positioned relative to itself.
yNoNew top edge for `op: "move"`, required there and ignored otherwise. Screen coordinates; see `x`.
opYesOne of: "focus", "resize", "move", "geometry".
widthNoNew width in pixels for `op: "resize"`, required there and ignored otherwise.
heightNoNew height in pixels for `op: "resize"`, required there and ignored otherwise.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations (readOnlyHint: false, destructiveHint: false) already convey that the tool can mutate but is not dangerous. The description adds value by splitting behavior into mutating operations (focus, resize, move) and a read-only one (geometry). It does not, however, disclose consequences such as focus stealing, whether resize/move out-of-bound values are clamped, or whether geometry is returned in window-relative or screen coordinates beyond the x/y note in 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with a scannable op list, no filler, and the core action is front-loaded. It earns a 4 rather than 5 because the omitted target-window context and the shorthand 'window' without a definition make the sentence slightly under-specified rather than merely concise.

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?

For a multi-operation tool with 5 parameters, the description plus schema covers dispatch semantics well, including per-param conditions and coordinates. But there is no output schema, and the description does not state what 'geometry' returns, which window the action applies to, or whether calls are relative to the currently active/selected window. These gaps are meaningful but partially offset by the very detailed schema.

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%, and each parameter description already explains its meaning, per-op requirements, and coordinate semantics. The tool description itself adds no new semantic detail beyond naming the op values. With full schema coverage, the baseline of 3 is appropriate; the description does not need to compensate.

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 names concrete verbs (focus, resize, move, read geometry) against a clear resource (the window), so an agent quickly understands what the tool does. It is distinguishable from siblings like glass_select_window and glass_move because the word 'window' anchors the resource. It loses a point for not stating which window is targeted or how that target is established.

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 'op: focus|resize|move|geometry' list implies usage dispatch, and the schema reinforces per-parameter conditions ('required there and ignored otherwise'), which is decent guidance. However, the description never says when to use this tool instead of related tools — for instance, whether the targeted window must first be selected via glass_select_window, or whether op:"move" is the right path versus the sibling glass_move. The guidance is 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 10 tool updatesv1.5.1
    • Changedglass_click3 fields changed
      • changedInput schema / properties / count / description
        Previous value: -"Consecutive clicks at this point (default 1); pass 2 for a double-click."New value: +"Consecutive clicks at this point (default 1, valid range 1 through 10); pass 2 for a\ndouble-click."
      • addedInput schema / properties / count / maximum
        Added value: +10
      • changedInput schema / properties / count / minimum
        Previous value: -0New value: +1
    • Changedglass_click_element2 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"The element `#id` from `glass_a11y_snapshot`. Valid only within the latest\nsnapshot — re-snapshot if the UI changed. If the element actually renders in a\npopover owned by a different window than the active one (e.g. an open\ndropdown's option row), the click is automatically routed into that popover\nwindow and the previously-active window is restored afterward — no extra step\nneeded.\n\nClicks via the platform's native accessibility action when the element exposes\none (works even when the element is occluded or scrolled off-screen), falling\nback to a synthetic pointer click at the element's center; the result's\n`method` field says which path ran, and `native_fallback` says why when the\npointer path was used. Where a control's label is a separate element from the\ncontrol itself, the native action fires on the enclosing control and the\nresult carries `actuated_id` — the element actually clicked."New value: +"Element `#id` from the latest `glass_a11y_snapshot`.\nRe-snapshot after UI changes.\nPopover-owned targets route to their window and restore the prior active window.\nThe role-appropriate native accessibility operation handles occluded or off-screen targets\nand separate labels through their enclosing control.\nUnavailable native operations fall back to a pointer click at the target center.\nText editors may receive focus without activation.\n`method:\"native-action\"` labels any native path.\n`native_fallback` explains pointer fallback.\n`actuated_id` identifies a substituted enclosing control."
      • changedInput schema / properties / return / description
        Previous value: -"Optional observe folded into the result: \"snapshot\" (wait for the UI to settle, then\nfold a fresh a11y tree, also refreshing the snapshot cache), \"settle\" (wait for the UI\nto stop changing, text-only), or \"none\" (default)."New value: +"Terminal observation: \"snapshot\" settles and refreshes/folds a11y, \"settle\" waits for\nvisual stability and returns text-only metadata, and \"none\" skips observation (default)."
    • Changedglass_do17 fields changed
      • changedInput schema / $defs / Action / oneOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/ClickArgs",
        -    "properties": {
        -      "action": {
        -        "const": "click",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "action"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "$ref": "#/$defs/MoveArgs",
        -    "properties": {
        -      "action": {
        -        "const": "move",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "action"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "$ref": "#/$defs/DragArgs",
        -    "properties": {
        -      "action": {
        -        "const": "drag",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "action"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "$ref": "#/$defs/ScrollArgs",
        -    "properties": {
        -      "action": {
        -        "const": "scroll",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "action"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "$ref": "#/$defs/TypeArgs",
        -    "properties": {
        -      "action": {
        -        "const": "type",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "action"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "$ref": "#/$defs/KeyArgs",
        -    "properties": {
        -      "action": {
        -        "const": "key",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "action"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "$ref": "#/$defs/SettleArgs",
        -    "properties": {
        -      "action": {
        -        "const": "settle",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "action"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "$ref": "#/$defs/ClickArgs",
        +    "properties": {
        +      "action": {
        +        "const": "click",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/MoveArgs",
        +    "properties": {
        +      "action": {
        +        "const": "move",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/DragArgs",
        +    "properties": {
        +      "action": {
        +        "const": "drag",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/ScrollArgs",
        +    "properties": {
        +      "action": {
        +        "const": "scroll",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/TypeArgs",
        +    "properties": {
        +      "action": {
        +        "const": "type",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/KeyArgs",
        +    "properties": {
        +      "action": {
        +        "const": "key",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/SettleArgs",
        +    "properties": {
        +      "action": {
        +        "const": "settle",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/ClickElementArgs",
        +    "properties": {
        +      "action": {
        +        "const": "click_element",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/SetValueArgs",
        +    "properties": {
        +      "action": {
        +        "const": "set_value",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/WaitForElementArgs",
        +    "properties": {
        +      "action": {
        +        "const": "wait_for_element",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/ScrollToElementArgs",
        +    "properties": {
        +      "action": {
        +        "const": "scroll_to_element",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedInput schema / $defs / ClickArgs / properties / count / description
        Previous value: -"Consecutive clicks at this point (default 1); pass 2 for a double-click."New value: +"Consecutive clicks at this point (default 1, valid range 1 through 10); pass 2 for a\ndouble-click."
      • addedInput schema / $defs / ClickArgs / properties / count / maximum
        Added value: +10
      • changedInput schema / $defs / ClickArgs / properties / count / minimum
        Previous value: -0New value: +1
      • addedInput schema / $defs / ClickElementArgs
        Added value: +{
        +  "properties": {
        +    "id": {
        +      "description": "Element `#id` from the latest `glass_a11y_snapshot`.\nRe-snapshot after UI changes.\nPopover-owned targets route to their window and restore the prior active window.\nThe role-appropriate native accessibility operation handles occluded or off-screen targets\nand separate labels through their enclosing control.\nUnavailable native operations fall back to a pointer click at the target center.\nText editors may receive focus without activation.\n`method:\"native-action\"` labels any native path.\n`native_fallback` explains pointer fallback.\n`actuated_id` identifies a substituted enclosing control.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "return": {
        +      "description": "Terminal observation: \"snapshot\" settles and refreshes/folds a11y, \"settle\" waits for\nvisual stability and returns text-only metadata, and \"none\" skips observation (default).",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "id"
        +  ],
        +  "type": "object"
        +}
      • changedInput schema / $defs / ScrollArgs / properties / dx / description
        Previous value: -"Horizontal scroll in **wheel notches** (discrete clicks — small integers like 1–5, NOT\npixels). Positive `dx` sends wheel-right, negative wheel-left; glass clicks `|dx|` times."New value: +"Horizontal wheel notches from -100 through 100, not pixels.\nPositive is right and negative is left, repeated `|dx|` times.\nTypical values are 1–5."
      • addedInput schema / $defs / ScrollArgs / properties / dx / maximum
        Added value: +100
      • addedInput schema / $defs / ScrollArgs / properties / dx / minimum
        Added value: +-100
      • changedInput schema / $defs / ScrollArgs / properties / dy / description
        Previous value: -"Vertical scroll in **wheel notches** (discrete clicks — small integers like 1–5, NOT\npixels). Positive `dy` sends wheel-down, negative wheel-up; glass clicks `|dy|` times. How\nan app maps a wheel notch to its view (lines, pixels, zoom) is the app's choice."New value: +"Vertical wheel notches from -100 through 100, not pixels.\nPositive is down and negative is up, repeated `|dy|` times.\nTypical values are 1–5.\nApps choose how a notch maps to lines, pixels, or zoom."
      • addedInput schema / $defs / ScrollArgs / properties / dy / maximum
        Added value: +100
      • addedInput schema / $defs / ScrollArgs / properties / dy / minimum
        Added value: +-100
      • addedInput schema / $defs / ScrollToElementArgs
        Added value: +{
        +  "properties": {
        +    "description": {
        +      "description": "Substring of the target element's accessible description (selector). This can select\nan unnamed control, including an Android text field labelled only by its hint.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "direction": {
        +      "description": "Sweep direction: \"up\"/\"down\" (vertical) or \"left\"/\"right\" (horizontal).\nOmit to infer it from the target's off-screen position (falls back to a\nvertical down→up sweep when the target isn't in the a11y tree yet). The\nsearch reverses to the other end if the target isn't found first.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "name": {
        +      "description": "Substring of the target element's accessible name (selector).",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "role": {
        +      "description": "Element role filter, e.g. \"ListItem\", \"Button\", \"Document\" (selector).",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "step": {
        +      "description": "Wheel notches per scroll step (default 3). A calibration escape hatch — larger\ncovers distance faster but risks stepping past a row's/column's realized band.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "timeout_ms": {
        +      "description": "Give up after this long (default 20000ms); returns `{matched:false}`.",
        +      "format": "uint64",
        +      "minimum": 0,
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "value_contains": {
        +      "description": "Additionally require the matched element's `value` to contain this substring.\nNot a standalone selector — `name`, `description`, and/or `role` is still required.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "x": {
        +      "description": "Scroll anchor x (window-relative). By default the swipe anchors on the target's\nown row/column (falling back to the window center if it isn't in the a11y tree\nyet); set both `x` and `y` to point the wheel at a specific container instead.",
        +      "format": "int32",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "y": {
        +      "description": "Scroll anchor y (window-relative). See `x`.",
        +      "format": "int32",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / $defs / SetValueArgs
        Added value: +{
        +  "properties": {
        +    "id": {
        +      "description": "The element `#id` from `glass_a11y_snapshot`.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "return": {
        +      "description": "Optional observe folded into the result: \"snapshot\" (wait for the UI to settle, then\nfold a fresh a11y tree, also refreshing the snapshot cache), \"settle\" (waits for visual\nstability and returns text-only metadata), or \"none\" (default).",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "text": {
        +      "description": "The value to set. For a text field, the text. For a spin/slider, a number.\nFor a switch/checkbox/toggle, a boolean (`\"true\"`/`\"false\"`/`\"on\"`/`\"off\"`/\n`\"1\"`/`\"0\"`) — idempotent. For a dropdown/combo box, an option label\n(case-insensitive); glass opens it and picks that option.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "text"
        +  ],
        +  "type": "object"
        +}
      • changedInput schema / $defs / SettleArgs / properties / timeout_ms / description
        Previous value: -"Give up after this long (default 5000ms); the sequence continues rather than\nfailing."New value: +"Give up after this long (default 5000ms).\nThis settle's timeout returns settled:false and completes the step.\nThe enclosing glass_do deadline fails the sequence."
      • changedInput schema / $defs / TypeArgs / properties / return / description
        Previous value: -"Optional observe folded into the result: \"snapshot\" (wait for the UI to settle, then\nfold a fresh a11y tree, also refreshing the snapshot cache), \"settle\" (wait for the UI\nto stop changing, text-only), or \"none\" (default). Not accepted inside a `glass_do`\n`type` action — use a `settle` action or the terminal `then` observe there."New value: +"Terminal observation: \"snapshot\" settles and refreshes/folds a11y, \"settle\" waits for\nvisual stability and returns text-only metadata, and \"none\" skips observation (default)."
      • addedInput schema / $defs / WaitForElementArgs
        Added value: +{
        +  "properties": {
        +    "condition": {
        +      "description": "What to wait for (default \"appears\"): appears|disappears|enabled|disabled|\nchecked|unchecked|selected|unselected|expanded|collapsed|focused|visible|hidden.\n`checked`/`unchecked` only match a checkable element (one exposing a real toggle\nstate) — a non-toggle element matches neither.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "description": {
        +      "description": "Substring of the element's accessible description (selector). Useful for unnamed\ncontrols whose platform label is exposed as a hint, help text, or description.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "interval_ms": {
        +      "description": "Poll interval (default 200ms — an a11y snapshot per tick).",
        +      "format": "uint64",
        +      "minimum": 0,
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "name": {
        +      "description": "Substring of the element's accessible name (selector).",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "role": {
        +      "description": "Element role filter, e.g. \"Button\", \"ProgressBar\", \"Document\" (selector).",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "timeout_ms": {
        +      "description": "Give up after this long (default 10000ms); returns `{matched:false}`.",
        +      "format": "uint64",
        +      "minimum": 0,
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "value": {
        +      "description": "Exact case-sensitive accessible value, requiring another selector and excluding `value_contains`.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "value_contains": {
        +      "description": "Additionally require the matched element's `value` to contain this substring.\nNot a standalone selector — `name`, `description`, and/or `role` is still required.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / timeout_ms
        Added value: +{
        +  "description": "Overall sequence budget in milliseconds. Omit for 30000; valid range\n1..=120000. One absolute deadline is shared by all actions and terminal\nobservations.",
        +  "format": "uint64",
        +  "minimum": 0,
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
    • Addedglass_find_elements
    • Changedglass_scroll6 fields changed
      • changedInput schema / properties / dx / description
        Previous value: -"Horizontal scroll in **wheel notches** (discrete clicks — small integers like 1–5, NOT\npixels). Positive `dx` sends wheel-right, negative wheel-left; glass clicks `|dx|` times."New value: +"Horizontal wheel notches from -100 through 100, not pixels.\nPositive is right and negative is left, repeated `|dx|` times.\nTypical values are 1–5."
      • addedInput schema / properties / dx / maximum
        Added value: +100
      • addedInput schema / properties / dx / minimum
        Added value: +-100
      • changedInput schema / properties / dy / description
        Previous value: -"Vertical scroll in **wheel notches** (discrete clicks — small integers like 1–5, NOT\npixels). Positive `dy` sends wheel-down, negative wheel-up; glass clicks `|dy|` times. How\nan app maps a wheel notch to its view (lines, pixels, zoom) is the app's choice."New value: +"Vertical wheel notches from -100 through 100, not pixels.\nPositive is down and negative is up, repeated `|dy|` times.\nTypical values are 1–5.\nApps choose how a notch maps to lines, pixels, or zoom."
      • addedInput schema / properties / dy / maximum
        Added value: +100
      • addedInput schema / properties / dy / minimum
        Added value: +-100
    • Changedglass_scroll_to_element4 fields changed
      • addedInput schema / properties / description
        Added value: +{
        +  "description": "Substring of the target element's accessible description (selector). This can select\nan unnamed control, including an Android text field labelled only by its hint.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedInput schema / properties / name / description
        Previous value: -"Substring of the target element's accessible name (selector). `name` and/or\n`role` is required."New value: +"Substring of the target element's accessible name (selector)."
      • changedInput schema / properties / role / description
        Previous value: -"Element role filter, e.g. \"ListItem\", \"Button\" (selector)."New value: +"Element role filter, e.g. \"ListItem\", \"Button\", \"Document\" (selector)."
      • changedInput schema / properties / value_contains / description
        Previous value: -"Additionally require the matched element's `value` to contain this substring.\nNot a standalone selector — `name` and/or `role` is still required."New value: +"Additionally require the matched element's `value` to contain this substring.\nNot a standalone selector — `name`, `description`, and/or `role` is still required."
    • Changedglass_set_value1 field changed
      • changedInput schema / properties / return / description
        Previous value: -"Optional observe folded into the result: \"snapshot\" (wait for the UI to settle, then\nfold a fresh a11y tree, also refreshing the snapshot cache), \"settle\" (wait for the UI\nto stop changing, text-only), or \"none\" (default)."New value: +"Optional observe folded into the result: \"snapshot\" (wait for the UI to settle, then\nfold a fresh a11y tree, also refreshing the snapshot cache), \"settle\" (waits for visual\nstability and returns text-only metadata), or \"none\" (default)."
    • Changedglass_start1 field changed
      • changedInput schema / properties / run / description
        Previous value: -"What to launch, then its arguments. `run[0]` is the executable on a desktop backend, an\n`.app` path or bundle id on `ios`, and a `package/.Activity` component — optionally with\nan `.apk` to install first — on `android`. `run[1..]` are the app's own arguments;\n`android` has no argument vector to put them in and returns an error rather than\nignoring them."New value: +"What to launch: desktop `[executable, args...]`; iOS `[.app-or-bundle-id, args...]`;\nAndroid `[apk?, package/.Activity]` in either order, for example\n`[\"/absolute/path/app.apk\", \"com.example.app/.MainActivity\"]`."
    • Changedglass_type1 field changed
      • changedInput schema / properties / return / description
        Previous value: -"Optional observe folded into the result: \"snapshot\" (wait for the UI to settle, then\nfold a fresh a11y tree, also refreshing the snapshot cache), \"settle\" (wait for the UI\nto stop changing, text-only), or \"none\" (default). Not accepted inside a `glass_do`\n`type` action — use a `settle` action or the terminal `then` observe there."New value: +"Terminal observation: \"snapshot\" settles and refreshes/folds a11y, \"settle\" waits for\nvisual stability and returns text-only metadata, and \"none\" skips observation (default)."
    • Changedglass_wait_for_element4 fields changed
      • addedInput schema / properties / description
        Added value: +{
        +  "description": "Substring of the element's accessible description (selector). Useful for unnamed\ncontrols whose platform label is exposed as a hint, help text, or description.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedInput schema / properties / role / description
        Previous value: -"Element role filter, e.g. \"Button\", \"ProgressBar\" (selector)."New value: +"Element role filter, e.g. \"Button\", \"ProgressBar\", \"Document\" (selector)."
      • addedInput schema / properties / value
        Added value: +{
        +  "description": "Exact case-sensitive accessible value, requiring another selector and excluding `value_contains`.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedInput schema / properties / value_contains / description
        Previous value: -"Additionally require the matched element's `value` to contain this substring.\nNot a standalone selector — `name` and/or `role` is still required."New value: +"Additionally require the matched element's `value` to contain this substring.\nNot a standalone selector — `name`, `description`, and/or `role` is still required."
  2. 26 tool updatesv1.2.0
    • Changedglass_a11y_snapshot2 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / max_nodes
        Added value: +{
        +  "description": "Maximum number of elements to include. Omit for the default cap (protects the token\nbudget). Pass a larger number to raise it, or `0` for the full tree (no limit). A\nsnapshot renumbers ids, so re-read them after changing this.",
        +  "format": "uint32",
        +  "minimum": 0,
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
    • Changedglass_baseline_save2 fields changed
      • addedInput schema / properties / name / description
        Added value: +"Name to file this baseline under, reused by `glass_diff` and\n`glass_wait_for_region`. ASCII letters, digits, `-` and `_` only; saving over\nan existing name replaces it without warning."
      • removedInput schema / title
        Removed value: -"BaselineSaveArgs"
    • Addedglass_capabilities
    • Changedglass_click4 fields changed
      • addedInput schema / properties / count / description
        Added value: +"Consecutive clicks at this point (default 1); pass 2 for a double-click."
      • addedInput schema / properties / x / description
        Added value: +"Click point x, window-relative — 0 is the window's left edge, not the screen's."
      • addedInput schema / properties / y / description
        Added value: +"Click point y, window-relative — 0 is the window's top edge, not the screen's."
      • removedInput schema / title
        Removed value: -"ClickArgs"
    • Changedglass_click_element2 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"The element `#id` from `glass_a11y_snapshot`. Valid only within the latest\nsnapshot — re-snapshot if the UI changed. If the element actually renders in a\npopover owned by a different window than the active one (e.g. an open\ndropdown's option row), the click is automatically routed into that popover\nwindow and the previously-active window is restored afterward — no extra step\nneeded."New value: +"The element `#id` from `glass_a11y_snapshot`. Valid only within the latest\nsnapshot — re-snapshot if the UI changed. If the element actually renders in a\npopover owned by a different window than the active one (e.g. an open\ndropdown's option row), the click is automatically routed into that popover\nwindow and the previously-active window is restored afterward — no extra step\nneeded.\n\nClicks via the platform's native accessibility action when the element exposes\none (works even when the element is occluded or scrolled off-screen), falling\nback to a synthetic pointer click at the element's center; the result's\n`method` field says which path ran, and `native_fallback` says why when the\npointer path was used. Where a control's label is a separate element from the\ncontrol itself, the native action fires on the enclosing control and the\nresult carries `actuated_id` — the element actually clicked."
      • removedInput schema / title
        Removed value: -"ClickElementArgs"
    • Changedglass_clipboard_set1 field changed
      • removedInput schema / title
        Removed value: -"ClipboardSetArgs"
    • Changedglass_diff6 fields changed
      • addedInput schema / $defs / RegionArgs / properties / height / description
        Added value: +"Height in pixels, extending down from `y`."
      • addedInput schema / $defs / RegionArgs / properties / width / description
        Added value: +"Width in pixels, extending right from `x`."
      • addedInput schema / $defs / RegionArgs / properties / x / description
        Added value: +"Left edge in pixels, window-relative — 0 is the window's left edge, not the screen's."
      • addedInput schema / $defs / RegionArgs / properties / y / description
        Added value: +"Top edge in pixels, window-relative — 0 is the window's top edge, not the screen's."
      • addedInput schema / properties / name / description
        Added value: +"Name of a baseline saved by `glass_baseline_save`; an unsaved name errors\nrather than reporting no change."
      • removedInput schema / title
        Removed value: -"DiffArgs"
    • Changedglass_do31 fields changed
      • addedInput schema / $defs / ClickArgs / properties / count / description
        Added value: +"Consecutive clicks at this point (default 1); pass 2 for a double-click."
      • addedInput schema / $defs / ClickArgs / properties / x / description
        Added value: +"Click point x, window-relative — 0 is the window's left edge, not the screen's."
      • addedInput schema / $defs / ClickArgs / properties / y / description
        Added value: +"Click point y, window-relative — 0 is the window's top edge, not the screen's."
      • addedInput schema / $defs / DiffArgs / properties / name / description
        Added value: +"Name of a baseline saved by `glass_baseline_save`; an unsaved name errors\nrather than reporting no change."
      • addedInput schema / $defs / DragArgs / properties / button / description
        Added value: +"Button held for the drag: \"left\" (default), \"right\", or \"middle\"."
      • addedInput schema / $defs / DragArgs / properties / x1 / description
        Added value: +"Press-point x, window-relative — 0 is the window's left edge, not the screen's."
      • addedInput schema / $defs / DragArgs / properties / x2 / description
        Added value: +"Release-point x, window-relative."
      • addedInput schema / $defs / DragArgs / properties / y1 / description
        Added value: +"Press-point y, window-relative — 0 is the window's top edge, not the screen's."
      • addedInput schema / $defs / DragArgs / properties / y2 / description
        Added value: +"Release-point y, window-relative."
      • addedInput schema / $defs / MoveArgs / properties / x / description
        Added value: +"Destination x, window-relative — 0 is the window's left edge, not the screen's."
      • addedInput schema / $defs / MoveArgs / properties / y / description
        Added value: +"Destination y, window-relative — 0 is the window's top edge, not the screen's."
      • addedInput schema / $defs / RegionArgs / properties / height / description
        Added value: +"Height in pixels, extending down from `y`."
      • addedInput schema / $defs / RegionArgs / properties / width / description
        Added value: +"Width in pixels, extending right from `x`."
      • addedInput schema / $defs / RegionArgs / properties / x / description
        Added value: +"Left edge in pixels, window-relative — 0 is the window's left edge, not the screen's."
      • addedInput schema / $defs / RegionArgs / properties / y / description
        Added value: +"Top edge in pixels, window-relative — 0 is the window's top edge, not the screen's."
      • addedInput schema / $defs / ScrollArgs / properties / x / description
        Added value: +"Pointer x the wheel is aimed at, window-relative — apps scroll the container\nunder this point, so it selects which pane moves."
      • addedInput schema / $defs / ScrollArgs / properties / y / description
        Added value: +"Pointer y the wheel is aimed at, window-relative. See `x`."
      • addedInput schema / $defs / SettleArgs / properties / interval_ms / description
        Added value: +"How long to wait between capture ticks (default 100ms)."
      • addedInput schema / $defs / SettleArgs / properties / settle_frames / description
        Added value: +"Consecutive unchanged frames required before the UI counts as settled (default 3)."
      • addedInput schema / $defs / SettleArgs / properties / stability_region / description
        Added value: +"Window-relative sub-rectangle to watch for settling; when set, changes outside\nit are ignored."
      • addedInput schema / $defs / SettleArgs / properties / timeout_ms / description
        Added value: +"Give up after this long (default 5000ms); the sequence continues rather than\nfailing."
      • addedInput schema / $defs / SettleArgs / properties / tolerance / description
        Added value: +"Per-channel difference (0–255) two frames may have and still count as\nunchanged (default 0, exact match)."
      • addedInput schema / $defs / ThenArgs / properties / diff / description
        Added value: +"Compare against a saved baseline and return change stats as text."
      • addedInput schema / $defs / ThenArgs / properties / screenshot / description
        Added value: +"Capture the window as an image — the only field here that always spends image\ntokens; prefer `diff` when you just need to know whether something changed."
      • addedInput schema / $defs / ThenArgs / properties / settle / description
        Added value: +"Wait for the UI to stop changing first. Set this whenever `diff` or\n`screenshot` follows, or they observe a half-drawn frame."
      • addedInput schema / $defs / TypeArgs / properties / return
        Added value: +{
        +  "description": "Optional observe folded into the result: \"snapshot\" (wait for the UI to settle, then\nfold a fresh a11y tree, also refreshing the snapshot cache), \"settle\" (wait for the UI\nto stop changing, text-only), or \"none\" (default). Not accepted inside a `glass_do`\n`type` action — use a `settle` action or the terminal `then` observe there.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedInput schema / $defs / TypeArgs / properties / text / description
        Added value: +"Text to type into whatever currently has keyboard focus — this tool does not\nfocus a field, so click or `glass_click_element` one first. Sent as synthetic\nkey events, not pasted, so an app's per-keystroke handlers run."
      • removedInput schema / description
        Removed value: -"Arguments for `glass_do`: an ordered, non-empty action sequence + optional observe."
      • addedInput schema / properties / actions / description
        Added value: +"Actions to run in order; must be non-empty. Fail-fast — the first failing\naction aborts the rest and reports its index, so a partial sequence may\nalready have landed."
      • addedInput schema / properties / then / description
        Added value: +"Optional observe run once after the last action, in the order settle → diff\n→ screenshot."
      • removedInput schema / title
        Removed value: -"DoArgs"
    • Changedglass_doctor1 field changed
      • removedInput schema / title
        Removed value: -"DoctorArgs"
    • Changedglass_drag6 fields changed
      • addedInput schema / properties / button / description
        Added value: +"Button held for the drag: \"left\" (default), \"right\", or \"middle\"."
      • addedInput schema / properties / x1 / description
        Added value: +"Press-point x, window-relative — 0 is the window's left edge, not the screen's."
      • addedInput schema / properties / x2 / description
        Added value: +"Release-point x, window-relative."
      • addedInput schema / properties / y1 / description
        Added value: +"Press-point y, window-relative — 0 is the window's top edge, not the screen's."
      • addedInput schema / properties / y2 / description
        Added value: +"Release-point y, window-relative."
      • removedInput schema / title
        Removed value: -"DragArgs"
    • Changedglass_gesture3 fields changed
      • addedInput schema / $defs / PointArg / properties / x / description
        Added value: +"Window-relative x — 0 is the window's left edge, not the screen's."
      • addedInput schema / $defs / PointArg / properties / y / description
        Added value: +"Window-relative y — 0 is the window's top edge, not the screen's."
      • removedInput schema / title
        Removed value: -"GestureArgs"
    • Changedglass_key1 field changed
      • removedInput schema / title
        Removed value: -"KeyArgs"
    • Changedglass_logs4 fields changed
      • addedInput schema / properties / contains / description
        Added value: +"Return only lines containing this substring (case-sensitive). Filtering\nhappens server-side, so it narrows what the cap applies to."
      • addedInput schema / properties / cursor / description
        Added value: +"Resume point — the `cursor` a previous call returned, to read only what has\nbeen logged since. Omit to read from the oldest buffered line."
      • addedInput schema / properties / max_lines / description
        Added value: +"Cap on lines returned (default 200); the returned `cursor` resumes at the\nfirst line left unread, so a capped read is not a lost one."
      • removedInput schema / title
        Removed value: -"LogsArgs"
    • Addedglass_move
    • Addedglass_screenshot
    • Changedglass_scroll3 fields changed
      • addedInput schema / properties / x / description
        Added value: +"Pointer x the wheel is aimed at, window-relative — apps scroll the container\nunder this point, so it selects which pane moves."
      • addedInput schema / properties / y / description
        Added value: +"Pointer y the wheel is aimed at, window-relative. See `x`."
      • removedInput schema / title
        Removed value: -"ScrollArgs"
    • Changedglass_scroll_to_element1 field changed
      • removedInput schema / title
        Removed value: -"ScrollToElementArgs"
    • Changedglass_select_window1 field changed
      • removedInput schema / title
        Removed value: -"SelectWindowArgs"
    • Addedglass_set_value
    • Changedglass_start5 fields changed
      • addedInput schema / properties / cwd / description
        Added value: +"Working directory for both `build` and the launched app; omit to inherit the\nserver's own."
      • changedInput schema / properties / env / description
        Previous value: -"Extra environment variables for the launched app, as a `{ \"KEY\": \"VALUE\" }` object."New value: +"Extra environment variables, as a `{ \"KEY\": \"VALUE\" }` object. They reach the launched app\non the desktop backends and on `ios`; on `android` they configure the `build` command on\nthe host only, since an app launched by `am start` is forked from zygote and never sees\nthe shell's environment."
      • changedInput schema / properties / run / description
        Previous value: -"Program and arguments to launch; `run[0]` is the executable."New value: +"What to launch, then its arguments. `run[0]` is the executable on a desktop backend, an\n`.app` path or bundle id on `ios`, and a `package/.Activity` component — optionally with\nan `.apk` to install first — on `android`. `run[1..]` are the app's own arguments;\n`android` has no argument vector to put them in and returns an error rather than\nignoring them."
      • addedInput schema / properties / timeout_ms / description
        Added value: +"How long to wait for the app's window to appear before failing the launch\n(default 10000ms). Does not bound `build`."
      • removedInput schema / title
        Removed value: -"StartArgs"
    • Changedglass_type3 fields changed
      • addedInput schema / properties / return
        Added value: +{
        +  "description": "Optional observe folded into the result: \"snapshot\" (wait for the UI to settle, then\nfold a fresh a11y tree, also refreshing the snapshot cache), \"settle\" (wait for the UI\nto stop changing, text-only), or \"none\" (default). Not accepted inside a `glass_do`\n`type` action — use a `settle` action or the terminal `then` observe there.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / text / description
        Added value: +"Text to type into whatever currently has keyboard focus — this tool does not\nfocus a field, so click or `glass_click_element` one first. Sent as synthetic\nkey events, not pasted, so an app's per-keystroke handlers run."
      • removedInput schema / title
        Removed value: -"TypeArgs"
    • Addedglass_wait_for_element
    • Addedglass_wait_for_log
    • Addedglass_wait_for_region
    • Addedglass_wait_stable
    • Addedglass_window
  3. 13 tool updatesv1.1.0
    • Addedglass_a11y_marks
    • Removedglass_capabilities
    • Addedglass_clipboard_get
    • Addedglass_diff
    • Addedglass_do
    • Addedglass_key
    • Removedglass_screenshot
    • Addedglass_scroll_to_element
    • Addedglass_select_window
    • Removedglass_set_value
    • Addedglass_start
    • Removedglass_wait_for_log
    • Removedglass_wait_for_region
  4. 20 tool updatesv1.0.3
    • Addedglass_a11y_snapshot
    • Addedglass_baseline_save
    • Addedglass_capabilities
    • Addedglass_click
    • Addedglass_click_element
    • Removedglass_clipboard_get
    • Removedglass_diff
    • Removedglass_do
    • Removedglass_key
    • Addedglass_list_windows
    • Removedglass_move
    • Addedglass_screenshot
    • Addedglass_scroll
    • Removedglass_scroll_to_element
    • Removedglass_select_window
    • Addedglass_stop
    • Addedglass_type
    • Removedglass_wait_for_element
    • Addedglass_wait_for_log
    • Addedglass_wait_for_region
  5. 9 tool updatesv1.0.3
    • Addedglass_clipboard_get
    • Addedglass_clipboard_set
    • Removedglass_list_windows
    • Addedglass_logs
    • Removedglass_screenshot
    • Addedglass_scroll_to_element
    • Removedglass_start
    • Removedglass_wait_for_log
    • Removedglass_window
  6. 12 tool updatesv1.0.2
    • Addedglass_diff
    • Addedglass_do
    • Addedglass_gesture
    • Addedglass_key
    • Addedglass_list_windows
    • Removedglass_logs
    • Addedglass_move
    • Removedglass_scroll_to_element
    • Addedglass_select_window
    • Addedglass_set_value
    • Addedglass_start
    • Removedglass_type
  7. 9 tool updatesv1.0.1
    • First observedglass_doctor
    • First observedglass_drag
    • First observedglass_logs
    • First observedglass_screenshot
    • First observedglass_scroll_to_element
    • First observedglass_type
    • First observedglass_wait_for_element
    • First observedglass_wait_for_log
    • First observedglass_window

TDQS

A4/5.0
Disambiguation4/5

Each tool targets a genuinely distinct operation, and the descriptions cross-reference each other extensively (semantic vs pixel vs log vs stability waits are carefully separated). A few pairs could still be confused at first glance — a11y_marks vs a11y_snapshot and find_elements vs wait_for_element — though their descriptions resolve the differences.

Naming Consistency4/5

The glass_ prefix is uniform and nearly all tools follow a lowercase verb or verb_noun pattern (click_element, list_windows, wait_for_region). Minor deviations: capabilities, logs, window, and doctor are bare nouns rather than verb_noun, and 'do' is a vague generic verb, but the overall style is predictable.

Tool Count3/5

31 tools is heavy and the verbosely worded descriptions add real token cost, but the domain is unusually broad — lifecycle, window management, accessibility observation/actuation, pixel baselines, input, clipboard, logs, and batched actions all need coverage. Each tool earns its place, but several clusters (wait tools, a11y find tools, screenshot/baseline tools) could tempt consolidation.

Completeness4/5

The lifecycle is fully covered: glass_start → observe (a11y/pixels/logs) → interact (pointer/keyboard/touch/clipboard) → verify (wait_for_element/region/stable/log) → glass_stop, with doctor/capabilities for diagnostics. Minor gaps exist — no explicit exit-code query or hover-specific action — but agents can work around them, and fallback paths for a11y-less apps are built in.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/fixed-width/glass'

If you have feedback or need assistance with the MCP directory API, please join our Discord server