glass
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| glass_a11y_marksA | 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 ( |
| glass_a11y_snapshotA | Capture the active window's accessibility tree (semantic elements: role, name, description, window-relative bounds) as compact text — deterministic, low-token element addressing alongside screenshots. Each line is |
| 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. |
| glass_capabilitiesA | 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 |
| 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. |
| 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 |
| glass_clipboard_getA | 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. |
| 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. |
| glass_diffA | Diff the current frame against a named baseline; returns change stats + bbox. Set |
| glass_doA | Run an ordered sequence of input actions in ONE call (collapsing per-action round-trips), then optionally observe. |
| 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 |
| 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 |
| 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. |
| 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 — |
| glass_list_windowsA | 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. |
| glass_logsA | 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 |
| glass_moveC | Move the pointer to window-relative coordinates. |
| glass_screenshotA | Capture the app window (or an optional window-relative |
| 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. |
| 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 |
| glass_select_windowA | Make a window active by id (from glass_list_windows). Subsequent screenshot/click/type/window ops target it; coordinates are relative to it. |
| 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. 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 |
| glass_startA | Build, launch, and locate a native GUI app; returns its window geometry. Choose a backend with the |
| glass_stopA | 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. |
| 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 |
| glass_wait_for_elementA | Block until a UI element reaches a precise state, then return it as text (no image). Select by |
| glass_wait_for_logA | Block until a log line containing |
| glass_wait_for_regionA | Block until a visual region changes (diverges from a reference) or matches (converges to a saved baseline), then return text metrics (no image unless |
| glass_wait_stableA | Wait until the window stops changing, then return the settled frame. Optional |
| glass_windowC | Focus/resize/move the window or read its geometry. op: focus|resize|move|geometry. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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