glass
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| 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_clickB | 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_moveB | 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. 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 |
| 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_windowB | 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