{"serverId":"mcp-registry/com.glasswarp/mcp-server","tools":[{"name":"app.launch","fixed":{"name":"app_launch","description":"Launch an executable on the remote Windows rig (name on PATH or absolute path), optional args. Side effects: starts a process; Glasswarp tracks it and closes it on session.end. Use for notepad.exe, mspaint.exe, chrome with URL args, etc. Wait/re-observe after launch before clicking — do not assume the window is focused immediately.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["session_id","path_or_name"],"properties":{"args":{"type":"array","items":{"type":"string"},"description":"Process args, e.g. [\"--new-window\", \"https://example.com\"]"},"session_id":{"type":"string","description":"Active session id"},"path_or_name":{"type":"string","description":"Executable name (e.g. notepad.exe) or absolute path"}}},"annotations":{"openWorldHint":true,"destructiveHint":true}},"changes":[{"kind":"name","detail":"Renamed \"app.launch\" → \"app_launch\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":224,"tokensAfter":224},{"name":"demos.get","fixed":{"name":"demos_get","description":"Return one showcase run contract (install, command, needs, framing). Does NOT execute the demo or control a PC. Call after demos.list when you know the demo_id. If the client can run shell, offer the command; if chat-only, show the card. Do not replace this with a slow MCP click loop for solver demos.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["demo_id"],"properties":{"format":{"enum":["markdown","json"],"type":"string","description":"Response format: markdown (default) or json"},"demo_id":{"enum":["minesweeper","mona-lisa","paint","notepad"],"type":"string","description":"Showcase id from demos.list"}}},"annotations":{"readOnlyHint":true,"openWorldHint":false}},"changes":[{"kind":"name","detail":"Renamed \"demos.get\" → \"demos_get\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":195,"tokensAfter":195},{"name":"demos.list","fixed":{"name":"demos_list","description":"List showcase run contracts (id, title, install, command). Read-only catalog — does NOT start a session, touch a rig, or run solvers. Use when the user asks for Minesweeper/Mona Lisa/Paint demos or you need the glasswarp-demo command. Prefer demos.get for one full card. For ad-hoc UI work use rigs.list → session.start → screen.observe instead.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"format":{"enum":["markdown","json"],"type":"string","description":"Response format: markdown (default) or json"}}},"annotations":{"readOnlyHint":true,"openWorldHint":false}},"changes":[{"kind":"name","detail":"Renamed \"demos.list\" → \"demos_list\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":166,"tokensAfter":166},{"name":"input.click_target","fixed":{"name":"input_click_target","description":"Left/right/middle-click a UIA target by id from the latest screen.observe (uses native center coords). Prefer over input.click_xy. Side effect: real mouse click on the remote Windows desktop. Do not reuse target_id after the screen may have changed — re-observe first. For click→type→keys sequences, use input.send_actions (one turn) instead of chaining this tool.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["session_id","target_id"],"properties":{"button":{"enum":["left","right","middle"],"type":"string","description":"Mouse button (default left)"},"double":{"type":"boolean","description":"If true, double-click (two clicks)"},"target_id":{"type":"string","description":"Target id from the most recent screen.observe (e.g. uia-… )"},"session_id":{"type":"string","description":"Active session id"}}},"annotations":{"openWorldHint":true,"destructiveHint":true}},"changes":[{"kind":"name","detail":"Renamed \"input.click_target\" → \"input_click_target\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":251,"tokensAfter":251},{"name":"input.click_xy","fixed":{"name":"input_click_xy","description":"Click at native screen coordinates (0…native_width-1, 0…native_height-1 from screen.observe). Last resort when no suitable UIA target exists — prefer input.click_target. Never use JPEG/downscaled pixel coords. Side effect: real mouse click on the remote desktop.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["session_id","x","y"],"properties":{"x":{"type":"integer","maximum":9007199254740991,"minimum":-9007199254740991,"description":"Native X (0…native_width-1)"},"y":{"type":"integer","maximum":9007199254740991,"minimum":-9007199254740991,"description":"Native Y (0…native_height-1)"},"button":{"enum":["left","right","middle"],"type":"string","description":"Mouse button (default left)"},"double":{"type":"boolean","description":"If true, double-click"},"session_id":{"type":"string","description":"Active session id"}}},"annotations":{"openWorldHint":true,"destructiveHint":true}},"changes":[{"kind":"name","detail":"Renamed \"input.click_xy\" → \"input_click_xy\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":255,"tokensAfter":255},{"name":"input.drag","fixed":{"name":"input_drag","description":"Press-move-release mouse drag in native capture coordinates. Use for drawing, sliders, selection boxes, and drag-and-drop. Side effect: mouse_down → moves → mouse_up on the remote desktop. Prefer input.send_actions if the drag is one step in a longer predictable sequence.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["session_id","from_x","from_y","to_x","to_y"],"properties":{"to_x":{"type":"integer","maximum":9007199254740991,"minimum":-9007199254740991,"description":"Native end X"},"to_y":{"type":"integer","maximum":9007199254740991,"minimum":-9007199254740991,"description":"Native end Y"},"from_x":{"type":"integer","maximum":9007199254740991,"minimum":-9007199254740991,"description":"Native start X"},"from_y":{"type":"integer","maximum":9007199254740991,"minimum":-9007199254740991,"description":"Native start Y"},"session_id":{"type":"string","description":"Active session id"},"duration_ms":{"type":"integer","maximum":5000,"minimum":0,"description":"Approx drag duration in ms; more steps when larger (default ~200)"}}},"annotations":{"openWorldHint":true,"destructiveHint":true}},"changes":[{"kind":"name","detail":"Renamed \"input.drag\" → \"input_drag\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":312,"tokensAfter":312},{"name":"input.scroll","fixed":{"name":"input_scroll","description":"Move the cursor to native (x,y) then apply a vertical mouse-wheel delta. Side effect: scroll on whatever is under that point. Negative delta scrolls toward the bottom of the page. Prefer input.send_actions when scroll is part of a multi-step sequence. Re-observe after scrolling lists/pages before clicking targets.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["session_id","x","y","delta"],"properties":{"x":{"type":"integer","maximum":9007199254740991,"minimum":-9007199254740991,"description":"Native X to hover before scrolling"},"y":{"type":"integer","maximum":9007199254740991,"minimum":-9007199254740991,"description":"Native Y to hover before scrolling"},"delta":{"type":"integer","maximum":9007199254740991,"minimum":-9007199254740991,"description":"Vertical wheel delta (negative = toward bottom of page)"},"session_id":{"type":"string","description":"Active session id"}}},"annotations":{"openWorldHint":true,"destructiveHint":true}},"changes":[{"kind":"name","detail":"Renamed \"input.scroll\" → \"input_scroll\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":271,"tokensAfter":271},{"name":"input.send_actions","fixed":{"name":"input_send_actions","description":"PREFERRED multi-step tool: run 1–10 predictable UI actions in one call (input.click_target, input.click_xy, input.type_text, input.send_keys, input.drag, input.scroll). Side effects: all actions execute on the remote desktop; fails fast before sending if any action is invalid. observe_after defaults true (verification observe: text+targets; set observe_image=true for JPEG). Do not batch across unpredictable waits (page loads, installers, modals) — single-step those. Prefer this over chaining sol","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["session_id","actions"],"properties":{"actions":{"type":"array","items":{"type":"object","required":["type"],"properties":{"x":{"type":"number"},"y":{"type":"number"},"keys":{"type":"string"},"text":{"type":"string"},"to_x":{"type":"number"},"to_y":{"type":"number"},"type":{"enum":["click_target","click_xy","type_text","send_keys","drag","scroll"],"type":"string"},"delta":{"type":"number"},"button":{"enum":["left","right","middle"],"type":"string"},"double":{"type":"boolean"},"delay_ms":{"type":"integer","maximum":2000,"minimum":0,"description":"Optional settle delay after this action (0–2000 ms)"},"target_id":{"type":"string"}}},"maxItems":10,"minItems":1,"description":"Ordered actions (max 10); input.click_target needs target_id from latest screen.observe"},"session_id":{"type":"string","description":"Active session id"},"observe_after":{"type":"boolean","description":"Default true. When true, return a verification observe in the same result"},"observe_image":{"type":"boolean","description":"Default false. When true with observe_after, include verification JPEG unless changed=false"}}},"annotations":{"openWorldHint":true,"destructiveHint":true}},"changes":[{"kind":"name","detail":"Renamed \"input.send_actions\" → \"input_send_actions\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":485,"tokensAfter":485},{"name":"input.send_keys","fixed":{"name":"input_send_keys","description":"Send a key or chord to the focused window (e.g. enter, tab, ctrl+s, alt+f4, win). Side effect: real key events on the remote desktop. Prefer bundling into input.send_actions when the shortcut follows a click/type in the same planned sequence. Use input.type_text for literal strings, not this tool.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["session_id","keys"],"properties":{"keys":{"type":"string","description":"Key or combo, e.g. enter, tab, ctrl+s, alt+f4, win"},"session_id":{"type":"string","description":"Active session id"}}},"annotations":{"openWorldHint":true,"destructiveHint":true}},"changes":[{"kind":"name","detail":"Renamed \"input.send_keys\" → \"input_send_keys\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":175,"tokensAfter":175},{"name":"input.type_text","fixed":{"name":"input_type_text","description":"Type a Unicode string into the currently focused control via native input. Does not click first — focus the field (input.click_target / input.send_actions) before calling. Side effect: keystrokes on the remote desktop. For form fills (click → type → tab/enter), prefer input.send_actions in one call.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["session_id","text"],"properties":{"text":{"type":"string","description":"Literal text to type (not a key combo)"},"session_id":{"type":"string","description":"Active session id"}}},"annotations":{"openWorldHint":true,"destructiveHint":true}},"changes":[{"kind":"name","detail":"Renamed \"input.type_text\" → \"input_type_text\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":173,"tokensAfter":173},{"name":"rigs.list","fixed":{"name":"rigs_list","description":"List Windows machines (rigs) paired to this API key: id, name, online, api_access_enabled, and USABLE flag. Read-only — does not start a session. Call first before start_session. A rig is USABLE only when online AND the owner enabled API access. If none are USABLE, tell the user to install the host agent, pair in Console → Rigs, and enable API access — never ask for OS passwords.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"annotations":{"readOnlyHint":true,"openWorldHint":true}},"changes":[{"kind":"name","detail":"Renamed \"rigs.list\" → \"rigs_list\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":145,"tokensAfter":145},{"name":"screen.observe","fixed":{"name":"screen_observe","description":"Read the current screen: UIA targets (numbered ids + native coords) and a text summary. Does not move mouse/keyboard. Default image=false (no JPEG) for speed; set image=true only when you must judge pixels visually (then max_width≈960, quality≈60). If changed=false, JPEG is omitted even when requested — do not re-analyze; wait or act differently. If dirty is null, assume changed. Prefer input.send_actions for multi-step UI; observe after meaningful steps, not after every click. Target ids are va","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["session_id"],"properties":{"mark":{"type":"boolean","description":"Overlay numbered targets on JPEG when image=true (default true; ignored if image=false)"},"image":{"type":"boolean","description":"Include JPEG (default false). True only to visually read/judge the screen."},"quality":{"type":"integer","maximum":100,"minimum":40,"description":"JPEG quality 40–100 when image=true (default 60)"},"max_width":{"type":"integer","maximum":3840,"minimum":320,"description":"JPEG max width when image=true (default 960). Clicks always use native coords, not JPEG pixels."},"session_id":{"type":"string","description":"Active session id from session.start"}}},"annotations":{"readOnlyHint":true,"openWorldHint":true}},"changes":[{"kind":"name","detail":"Renamed \"screen.observe\" → \"screen_observe\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":359,"tokensAfter":359},{"name":"session.end","fixed":{"name":"session_end","description":"End an active session. Side effects: stops billing, runs host safety_restore, closes apps launched via app.launch. Always call when finished or abandoning — do not leave sessions open. Safe to call once; further observe/input on that session_id will fail.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["session_id"],"properties":{"session_id":{"type":"string","description":"Session id returned by session.start"}}},"annotations":{"openWorldHint":true,"destructiveHint":true}},"changes":[{"kind":"name","detail":"Renamed \"session.end\" → \"session_end\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":140,"tokensAfter":140},{"name":"session.live_view","fixed":{"name":"session_live_view","description":"Return the console Live View URL (≈60fps) for the rig owner to watch and intervene. Read-only for the agent — does not grant the API key console access. Offer on long or sensitive tasks. Owner must be signed into Glasswarp; API keys alone cannot open the player.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["session_id"],"properties":{"session_id":{"type":"string","description":"Active session id"}}},"annotations":{"readOnlyHint":true,"openWorldHint":true}},"changes":[{"kind":"name","detail":"Renamed \"session.live_view\" → \"session_live_view\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":139,"tokensAfter":139},{"name":"session.start","fixed":{"name":"session_start","description":"Start a metered desktop session on a USABLE rig from rigs.list. Side effects: begins wall-clock billing, shows an on-screen “API session active” indicator, enables observe/input until session.end. Idle sessions auto-end after ~15 minutes. Always call session.end when done or abandoning. Do not call if no USABLE rig exists. Returns session_id and Live View URL (owner console login required).","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["rig_id"],"properties":{"rig_id":{"type":"string","description":"Rig id from rigs.list (must be online with api_access_enabled)"}}},"annotations":{"openWorldHint":true,"destructiveHint":true}},"changes":[{"kind":"name","detail":"Renamed \"session.start\" → \"session_start\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":184,"tokensAfter":184},{"name":"session.status","fixed":{"name":"session_status","description":"Fetch session metadata: status, host, mode, created_at, action_count, billed_minutes. Read-only — no input side effects. Use to tell the user about metered time or confirm the session is still active before more actions.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["session_id"],"properties":{"session_id":{"type":"string","description":"Session id from session.start"}}},"annotations":{"readOnlyHint":true,"openWorldHint":true}},"changes":[{"kind":"name","detail":"Renamed \"session.status\" → \"session_status\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":129,"tokensAfter":129}],"toolsChanged":16,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}