Server definition
- Hash
- sha256:b28c129e880f78b4693814c9575e83623237b08b5ca834a968ff791f95d47149
- What it is
- What a remote MCP server returned when asked what it offers: 16 tools
The blob, as servednamed by its sha256
{
"instructions": "Glasswarp gives you eyes and hands on a real Windows PC that its owner paired to this\naccount. Glasswarp supplies vision and input; you make every decision. Attribute actions\nto yourself, not to Glasswarp.\n\n## Before anything: a usable rig\n\nCall `rigs.list`. You need a rig with status USABLE (online, API access enabled by the\nowner). If none exists, direct the user to install the host agent\n(https://www.glasswarp.com/downloads) and pair it in Console -> Rigs, then enable API\naccess. This is a physical owner-consent step: never attempt to work around it, and\nnever ask for machine passwords or credentials.\n\n## Choose a path (capability + consent)\n\n### Short tasks and human-in-the-loop — always direct MCP\nGlances, one or a few clicks, typing a string, \"what's on my screen?\", open an app and\ndo one thing: use MCP tools in this chat.\n`session.start` -> `screen.observe` -> act -> `session.end`.\nNever scaffold code for a short task — \"click OK\" must never generate a file.\n\n### Longer tasks — offer, don't impose\nMulti-step work, games, workflows, \"solve / clear / finish X\":\n\n1. Optionally `demos.list` — if a showcase matches, show its run contract from\n `demos.get` (install + command).\n2. Then branch on what THIS client can do and what the USER wants:\n\n**Code-capable client** (can write files and run a terminal):\n- Offer to write a small SDK agent that loops screen.observe -> decide -> act outside chat\n (or the matching showcase command). Explain the tradeoff plainly: chat-driven play is\n one model turn per action — slow and minute-hungry; a scaffolded agent runs the loop\n at full speed.\n- Do not impose it. If the user prefers chat or says \"just do it here,\" proceed with\n direct MCP tools.\n- If they accept: scaffolded agents must follow SKILL.md\n (https://www.glasswarp.com/SKILL.md) — `session.end` in a `finally` block, bounded\n loops, observe-verify between actions, and re-observe + re-resolve targets (never\n hardcode target ids). Use MCP only for preflight, Live View, and recovery\n (\"it crashed — look at the screen\").\n\n**Chat-only client** (no reliable shell or file write):\n- Proceed with direct MCP tools for the task.\n- Briefly note once that a faster path exists via the Python SDK or `glasswarp-demo`\n (https://docs.glasswarp.com/guides/ways-to-run-agents) if they later use a\n code-capable environment — then keep helping here.\n\nThese path names (Assist / Showcase / Scaffold) are internal vocabulary — never say\nthem to the user; just describe what you will do.\n\n## Showcase tools\n- `demos.list` / `demos.get` return run contracts only; they do not execute solvers.\n- Resources: `glasswarp://demos`, `glasswarp://demos/{id}`\n\n## Working hygiene\n- Prefer `input.send_actions` for any predictable multi-step sequence (click field → type →\n tab → shortcut). Solo `input.click_target` / `input.type_text` / `input.send_keys` are for one-off\n acts; chaining them costs a chat turn each.\n- Plan ahead when the next steps are predictable. After an `screen.observe`, if you can\n confidently predict the next 3–6 actions (menu paths, dialog fields, keyboard\n shortcuts, typing into a field you just clicked), send them as one batch via\n `input.send_actions` (observe_after defaults true; verification is text+targets unless\n you set `observe_image=true`) — then continue from that result, not after every\n individual action. Single-step when the screen may change unpredictably: page\n loads, network waits, installers, anything that can pop a modal. If the verifying\n observe shows something unexpected, re-plan from there.\n- Observe after every meaningful step (after a batch or after an unpredictable\n single action), not blindly after every click. `screen.observe` defaults to text +\n targets only — set `image=true` only when you must read or judge the screen\n visually. If `screen.observe` reports no change since your last frame (`changed: false`),\n do not re-analyze — the server omits any JPEG even if `image=true`. Re-check or\n wait instead. If dirty data is missing (`dirty` is null / unavailable — e.g. GDI\n fallback), treat that as **assume changed** and keep verifying; do not skip the\n model call.\n- On a Chromium or Electron surface (Chrome, Edge, VS Code, Slack, Discord, any\n Electron app), the UIA tree builds lazily. If the first observe returns fewer than\n ~30 targets with no named content controls, wait 2-3 seconds and observe again\n before concluding the screen is unreadable.\n- Verification-grade JPEGs: `max_width=960`, quality ~60 (MCP defaults when\n `image=true` / `observe_image=true`).\n- Prefer `input.click_target` (numbered targets from the latest observe) over `input.click_xy`.\n `input.click_xy` uses NATIVE screen coordinates as reported by observe — not the downscaled\n JPEG size.\n- Target ids are valid for the observe that produced them. Do not persist them across\n sessions, and re-observe before acting on a screen whose contents may have changed\n (lists, file browsers, tables).\n- Always `session.end` when done or when abandoning a task. Billing is wall-clock from\n session start to end; idle sessions auto-end after ~15 minutes.\n- If `session.start` fails on a concurrency limit, tell the user which session holds\n the slot and that it will auto-end when idle (or can be ended in the Console).\n- `session.live_view` is for the rig owner (Console login). Offer it when starting\n long or sensitive tasks so they can watch and intervene.\n\nGuide: https://docs.glasswarp.com/guides/ways-to-run-agents",
"tools": [
{
"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": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"args": {
"description": "Process args, e.g. [\"--new-window\", \"https://example.com\"]",
"items": {
"type": "string"
},
"type": "array"
},
"path_or_name": {
"description": "Executable name (e.g. notepad.exe) or absolute path",
"type": "string"
},
"session_id": {
"description": "Active session id",
"type": "string"
}
},
"required": [
"session_id",
"path_or_name"
],
"type": "object"
},
"name": "app.launch",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Human-readable result for the agent",
"type": "string"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"demo_id": {
"description": "Showcase id from demos.list",
"enum": [
"minesweeper",
"mona-lisa",
"paint",
"notepad"
],
"type": "string"
},
"format": {
"description": "Response format: markdown (default) or json",
"enum": [
"markdown",
"json"
],
"type": "string"
}
},
"required": [
"demo_id"
],
"type": "object"
},
"name": "demos.get",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Human-readable result for the agent",
"type": "string"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"format": {
"description": "Response format: markdown (default) or json",
"enum": [
"markdown",
"json"
],
"type": "string"
}
},
"type": "object"
},
"name": "demos.list",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Human-readable result for the agent",
"type": "string"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"button": {
"description": "Mouse button (default left)",
"enum": [
"left",
"right",
"middle"
],
"type": "string"
},
"double": {
"description": "If true, double-click (two clicks)",
"type": "boolean"
},
"session_id": {
"description": "Active session id",
"type": "string"
},
"target_id": {
"description": "Target id from the most recent screen.observe (e.g. uia-… )",
"type": "string"
}
},
"required": [
"session_id",
"target_id"
],
"type": "object"
},
"name": "input.click_target",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Human-readable result for the agent",
"type": "string"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"button": {
"description": "Mouse button (default left)",
"enum": [
"left",
"right",
"middle"
],
"type": "string"
},
"double": {
"description": "If true, double-click",
"type": "boolean"
},
"session_id": {
"description": "Active session id",
"type": "string"
},
"x": {
"description": "Native X (0…native_width-1)",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"y": {
"description": "Native Y (0…native_height-1)",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"required": [
"session_id",
"x",
"y"
],
"type": "object"
},
"name": "input.click_xy",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Human-readable result for the agent",
"type": "string"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"duration_ms": {
"description": "Approx drag duration in ms; more steps when larger (default ~200)",
"maximum": 5000,
"minimum": 0,
"type": "integer"
},
"from_x": {
"description": "Native start X",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"from_y": {
"description": "Native start Y",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"session_id": {
"description": "Active session id",
"type": "string"
},
"to_x": {
"description": "Native end X",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"to_y": {
"description": "Native end Y",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"required": [
"session_id",
"from_x",
"from_y",
"to_x",
"to_y"
],
"type": "object"
},
"name": "input.drag",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Human-readable result for the agent",
"type": "string"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"delta": {
"description": "Vertical wheel delta (negative = toward bottom of page)",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"session_id": {
"description": "Active session id",
"type": "string"
},
"x": {
"description": "Native X to hover before scrolling",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"y": {
"description": "Native Y to hover before scrolling",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"required": [
"session_id",
"x",
"y",
"delta"
],
"type": "object"
},
"name": "input.scroll",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Human-readable result for the agent",
"type": "string"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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 solo click/type/keys tools.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"actions": {
"description": "Ordered actions (max 10); input.click_target needs target_id from latest screen.observe",
"items": {
"properties": {
"button": {
"enum": [
"left",
"right",
"middle"
],
"type": "string"
},
"delay_ms": {
"description": "Optional settle delay after this action (0–2000 ms)",
"maximum": 2000,
"minimum": 0,
"type": "integer"
},
"delta": {
"type": "number"
},
"double": {
"type": "boolean"
},
"keys": {
"type": "string"
},
"target_id": {
"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"
},
"x": {
"type": "number"
},
"y": {
"type": "number"
}
},
"required": [
"type"
],
"type": "object"
},
"maxItems": 10,
"minItems": 1,
"type": "array"
},
"observe_after": {
"description": "Default true. When true, return a verification observe in the same result",
"type": "boolean"
},
"observe_image": {
"description": "Default false. When true with observe_after, include verification JPEG unless changed=false",
"type": "boolean"
},
"session_id": {
"description": "Active session id",
"type": "string"
}
},
"required": [
"session_id",
"actions"
],
"type": "object"
},
"name": "input.send_actions",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"changed": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the frame changed since last observe; null if unknown"
},
"has_image": {
"description": "True when a JPEG was included in the MCP content",
"type": "boolean"
},
"message": {
"description": "Human-readable observe summary / targets",
"type": "string"
},
"native_height": {
"description": "Native capture height",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"native_width": {
"description": "Native capture width",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"keys": {
"description": "Key or combo, e.g. enter, tab, ctrl+s, alt+f4, win",
"type": "string"
},
"session_id": {
"description": "Active session id",
"type": "string"
}
},
"required": [
"session_id",
"keys"
],
"type": "object"
},
"name": "input.send_keys",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Human-readable result for the agent",
"type": "string"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"session_id": {
"description": "Active session id",
"type": "string"
},
"text": {
"description": "Literal text to type (not a key combo)",
"type": "string"
}
},
"required": [
"session_id",
"text"
],
"type": "object"
},
"name": "input.type_text",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Human-readable result for the agent",
"type": "string"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"type": "object"
},
"name": "rigs.list",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Human-readable result for the agent",
"type": "string"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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 valid only until the next UI change.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"image": {
"description": "Include JPEG (default false). True only to visually read/judge the screen.",
"type": "boolean"
},
"mark": {
"description": "Overlay numbered targets on JPEG when image=true (default true; ignored if image=false)",
"type": "boolean"
},
"max_width": {
"description": "JPEG max width when image=true (default 960). Clicks always use native coords, not JPEG pixels.",
"maximum": 3840,
"minimum": 320,
"type": "integer"
},
"quality": {
"description": "JPEG quality 40–100 when image=true (default 60)",
"maximum": 100,
"minimum": 40,
"type": "integer"
},
"session_id": {
"description": "Active session id from session.start",
"type": "string"
}
},
"required": [
"session_id"
],
"type": "object"
},
"name": "screen.observe",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"changed": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the frame changed since last observe; null if unknown"
},
"has_image": {
"description": "True when a JPEG was included in the MCP content",
"type": "boolean"
},
"message": {
"description": "Human-readable observe summary / targets",
"type": "string"
},
"native_height": {
"description": "Native capture height",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"native_width": {
"description": "Native capture width",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"session_id": {
"description": "Session id returned by session.start",
"type": "string"
}
},
"required": [
"session_id"
],
"type": "object"
},
"name": "session.end",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Human-readable result for the agent",
"type": "string"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"session_id": {
"description": "Active session id",
"type": "string"
}
},
"required": [
"session_id"
],
"type": "object"
},
"name": "session.live_view",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Human-readable result for the agent",
"type": "string"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"rig_id": {
"description": "Rig id from rigs.list (must be online with api_access_enabled)",
"type": "string"
}
},
"required": [
"rig_id"
],
"type": "object"
},
"name": "session.start",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Human-readable result for the agent",
"type": "string"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
},
{
"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": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"session_id": {
"description": "Session id from session.start",
"type": "string"
}
},
"required": [
"session_id"
],
"type": "object"
},
"name": "session.status",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"message": {
"description": "Human-readable result for the agent",
"type": "string"
},
"ok": {
"description": "False when the tool failed",
"type": "boolean"
}
},
"required": [
"ok",
"message"
],
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:b28c129e880f78b4693814c9575e83623237b08b5ca834a968ff791f95d47149 | sha256sum