Skip to main content
Glama

Capture Screenshot

alterlab_screenshot
Read-onlyIdempotent

Get a full-page PNG image of one URL, rendered in a real headless browser, when you need to see the page rather than read its text. Use when layout, charts or visual proof matter; for text content use alterlab_scrape. Cost: $0.004 per screenshot (browser tier). Use wait_for to wait for an element and wait_until to control load timing. Pass actions (for example dismiss_consent or evaluate) to prepare the page; the screenshot is captured after they run and action_results is returned. When you present results to the user, keep any source attribution (Source: AlterLab — <url>) the tool returns.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "url": "<url>"
    },
    "name": "alterlab_screenshot"
  }
}

Input Schema

NameRequiredDescriptionDefault
urlYes
actionsNoBrowser actions run in order after the page loads, before content extraction and any screenshot or PDF capture. Requires a rendered page; render_js defaults to true when actions are given. Selectors are CSS, or XPath when prefixed with '//' or 'xpath='. Failed actions are skipped and the sequence continues. The screenshot is captured after the actions run, and action_results is returned alongside it.
wait_forNoCSS selector to wait for.
wait_untilNoWait until. Default: networkidle.networkidle

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / actions / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "Fixed delay or wait for a selector; give milliseconds, selector or both.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "milliseconds": {
      -        "description": "Fixed delay in ms; with selector, the wait timeout",
      -        "maximum": 30000,
      -        "minimum": 100,
      -        "type": "integer"
      -      },
      -      "selector": {
      -        "description": "CSS selector to wait for visibility",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "wait"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector to wait for",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "state": {
      -        "default": "visible",
      -        "description": "Element state to wait for; hidden/detached wait for disappearance (e.g. a spinner)",
      -        "enum": [
      -          "visible",
      -          "hidden",
      -          "attached",
      -          "detached"
      -        ],
      -        "type": "string"
      -      },
      -      "timeout": {
      -        "description": "Timeout in ms (default 10000)",
      -        "maximum": 30000,
      -        "minimum": 1000,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "enum": [
      -          "wait_for"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector of the element to click",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "click"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector of the input",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "fill"
      -        ],
      -        "type": "string"
      -      },
      -      "value": {
      -        "description": "Value to fill in",
      -        "maxLength": 5000,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector",
      -      "value"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "key": {
      -        "description": "Key to press, e.g. Enter, Tab, Escape",
      -        "maxLength": 50,
      -        "type": "string"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to focus and press the key on; omit to press on the page",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "press"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "key"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "amount": {
      -        "default": 1,
      -        "description": "Viewport heights to scroll",
      -        "maximum": 20,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "direction": {
      -        "default": "down",
      -        "enum": [
      -          "down",
      -          "up"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "scroll"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "delay": {
      -        "default": 1000,
      -        "description": "Delay between scrolls in ms",
      -        "maximum": 5000,
      -        "minimum": 200,
      -        "type": "integer"
      -      },
      -      "end_selector": {
      -        "description": "CSS selector that marks the end of content",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "max_scrolls": {
      -        "default": 10,
      -        "description": "Maximum scroll iterations",
      -        "maximum": 50,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "enum": [
      -          "infinite_scroll"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Capture a screenshot at this point in the sequence.",
      -    "properties": {
      -      "full_page": {
      -        "default": true,
      -        "description": "Capture the full page or just the viewport",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "enum": [
      -          "screenshot"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "script": {
      -        "description": "JavaScript to run in the page. Network APIs (fetch, XMLHttpRequest, WebSocket) and eval/Function are blocked.",
      -        "maxLength": 5120,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "evaluate"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "script"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "mode": {
      -        "default": "hide",
      -        "description": "hide: hide the consent overlay without changing consent state; accept/reject: click the matching button, then hide what remains.",
      -        "enum": [
      -          "hide",
      -          "accept",
      -          "reject"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "dismiss_consent"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Choose a dropdown option; give exactly one of value or label. action_results[i].result holds the selected values.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "label": {
      -        "description": "Option visible label to select",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the <select> element",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "select"
      -        ],
      -        "type": "string"
      -      },
      -      "value": {
      -        "description": "Option value attribute to select",
      -        "maxLength": 500,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Move the pointer over an element, e.g. to open a hover menu.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to hover",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "hover"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Scroll an element into view, e.g. to reach a row of a virtualized list. Only the visible window is observed afterwards.",
      -    "properties": {
      -      "block": {
      -        "default": "center",
      -        "description": "Vertical alignment of the element in the viewport",
      -        "enum": [
      -          "start",
      -          "center",
      -          "end",
      -          "nearest"
      -        ],
      -        "type": "string"
      -      },
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to bring into view",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "scroll_into_view"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Click the first element whose visible text matches.",
      -    "properties": {
      -      "exact": {
      -        "default": false,
      -        "description": "Match the whole text case-sensitively (default: case-insensitive substring)",
      -        "type": "boolean"
      -      },
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "text": {
      -        "description": "Visible text of the element to click",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "click_text"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Read the first matching element's text or attribute into action_results[i].result (max 5000 chars; null when the attribute is absent).",
      -    "properties": {
      -      "attribute": {
      -        "description": "Attribute to return, e.g. href; omit for the visible text",
      -        "maxLength": 100,
      -        "type": "string"
      -      },
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to read",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "extract"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Check a checkbox or radio button.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox or radio",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "check"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Uncheck a checkbox.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "uncheck"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Wait until the page reaches a load state; fails on timeout.",
      -    "properties": {
      -      "event": {
      -        "default": "load",
      -        "description": "Load state to wait for",
      -        "enum": [
      -          "load",
      -          "domcontentloaded",
      -          "networkidle"
      -        ],
      -        "type": "string"
      -      },
      -      "timeout": {
      -        "description": "Timeout in ms (default 10000)",
      -        "maximum": 30000,
      -        "minimum": 1000,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "enum": [
      -          "wait_event"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Capture the page HTML or markdown at this step; delivered as action_results[i].snapshot_url",
      -    "properties": {
      -      "format": {
      -        "default": "html",
      -        "description": "Capture the rendered HTML or its markdown conversion",
      -        "enum": [
      -          "html",
      -          "markdown"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "snapshot"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Not yet available (beta): requests using this action are rejected with HTTP 400 action_not_available until artifact storage ships. Capture one file download started by the page. Provide exactly one of selector or url. The file is stored privately; action_results[i].artifact holds its metadata and GET /api/v1/artifacts/{artifact_id}/url returns a short-lived signed URL",
      -    "properties": {
      -      "frame": {
      -        "description": "Selector of the iframe containing the selector target",
      -        "oneOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ]
      -      },
      -      "max_bytes": {
      -        "description": "Reject files larger than this",
      -        "maximum": 104857600,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=', that starts the download",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "timeout_ms": {
      -        "default": 15000,
      -        "description": "Time to wait for the download, in ms",
      -        "maximum": 30000,
      -        "minimum": 1000,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "enum": [
      -          "download"
      -        ],
      -        "type": "string"
      -      },
      -      "url": {
      -        "description": "http(s) URL of a download link to open in a new tab",
      -        "maxLength": 2048,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "Fixed delay or wait for a selector; give milliseconds, selector or both.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "milliseconds": {
      +        "description": "Fixed delay in ms; with selector, the wait timeout",
      +        "maximum": 30000,
      +        "minimum": 100,
      +        "type": "integer"
      +      },
      +      "selector": {
      +        "description": "CSS selector to wait for visibility",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "wait"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector to wait for",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "state": {
      +        "default": "visible",
      +        "description": "Element state to wait for; hidden/detached wait for disappearance (e.g. a spinner)",
      +        "enum": [
      +          "visible",
      +          "hidden",
      +          "attached",
      +          "detached"
      +        ],
      +        "type": "string"
      +      },
      +      "timeout": {
      +        "description": "Timeout in ms (default 10000)",
      +        "maximum": 30000,
      +        "minimum": 1000,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "wait_for"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector of the element to click",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "click"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector of the input",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "fill"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "Value to fill in",
      +        "maxLength": 5000,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "key": {
      +        "description": "Key to press, e.g. Enter, Tab, Escape",
      +        "maxLength": 50,
      +        "type": "string"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to focus and press the key on; omit to press on the page",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "press"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "key"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "amount": {
      +        "default": 1,
      +        "description": "Viewport heights to scroll",
      +        "maximum": 20,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "direction": {
      +        "default": "down",
      +        "enum": [
      +          "down",
      +          "up"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "scroll"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "delay": {
      +        "default": 1000,
      +        "description": "Delay between scrolls in ms",
      +        "maximum": 5000,
      +        "minimum": 200,
      +        "type": "integer"
      +      },
      +      "end_selector": {
      +        "description": "CSS selector that marks the end of content",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "max_scrolls": {
      +        "default": 10,
      +        "description": "Maximum scroll iterations",
      +        "maximum": 50,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "infinite_scroll"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Capture a screenshot at this point in the sequence.",
      +    "properties": {
      +      "full_page": {
      +        "default": true,
      +        "description": "Capture the full page or just the viewport",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "enum": [
      +          "screenshot"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "script": {
      +        "description": "JavaScript to run in the page. Network APIs (fetch, XMLHttpRequest, WebSocket) and eval/Function are blocked.",
      +        "maxLength": 5120,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "evaluate"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "script"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "mode": {
      +        "default": "hide",
      +        "description": "hide: hide the consent overlay without changing consent state; accept/reject: click the matching button, then hide what remains.",
      +        "enum": [
      +          "hide",
      +          "accept",
      +          "reject"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "dismiss_consent"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Choose a dropdown option; give exactly one of value or label. action_results[i].result holds the selected values.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "label": {
      +        "description": "Option visible label to select",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the <select> element",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "select"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "Option value attribute to select",
      +        "maxLength": 500,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Move the pointer over an element, e.g. to open a hover menu.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to hover",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "hover"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Scroll an element into view, e.g. to reach a row of a virtualized list. Only the visible window is observed afterwards.",
      +    "properties": {
      +      "block": {
      +        "default": "center",
      +        "description": "Vertical alignment of the element in the viewport",
      +        "enum": [
      +          "start",
      +          "center",
      +          "end",
      +          "nearest"
      +        ],
      +        "type": "string"
      +      },
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to bring into view",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "scroll_into_view"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Click the first element whose visible text matches.",
      +    "properties": {
      +      "exact": {
      +        "default": false,
      +        "description": "Match the whole text case-sensitively (default: case-insensitive substring)",
      +        "type": "boolean"
      +      },
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "text": {
      +        "description": "Visible text of the element to click",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "click_text"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Read the first matching element's text or attribute into action_results[i].result (max 5000 chars; null when the attribute is absent).",
      +    "properties": {
      +      "attribute": {
      +        "description": "Attribute to return, e.g. href; omit for the visible text",
      +        "maxLength": 100,
      +        "type": "string"
      +      },
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to read",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "extract"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Check a checkbox or radio button.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox or radio",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "check"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Uncheck a checkbox.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "uncheck"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Wait until the page reaches a load state; fails on timeout.",
      +    "properties": {
      +      "event": {
      +        "default": "load",
      +        "description": "Load state to wait for",
      +        "enum": [
      +          "load",
      +          "domcontentloaded",
      +          "networkidle"
      +        ],
      +        "type": "string"
      +      },
      +      "timeout": {
      +        "description": "Timeout in ms (default 10000)",
      +        "maximum": 30000,
      +        "minimum": 1000,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "wait_event"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Capture the page HTML or markdown at this step; delivered as action_results[i].snapshot_url",
      +    "properties": {
      +      "format": {
      +        "default": "html",
      +        "description": "Capture the rendered HTML or its markdown conversion",
      +        "enum": [
      +          "html",
      +          "markdown"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "snapshot"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Return a capped map of the visible page elements; delivered as action_results[i].element_map (viewport, page size, elements with bounding box, tag, text and candidate CSS/XPath selectors)",
      +    "properties": {
      +      "max_elements": {
      +        "default": 200,
      +        "description": "Maximum number of elements returned (1-500)",
      +        "maximum": 500,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "inspect"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Not yet available (beta): requests using this action are rejected with HTTP 400 action_not_available until artifact storage ships. Capture one file download started by the page. Provide exactly one of selector or url. The file is stored privately; action_results[i].artifact holds its metadata and GET /api/v1/artifacts/{artifact_id}/url returns a short-lived signed URL",
      +    "properties": {
      +      "frame": {
      +        "description": "Selector of the iframe containing the selector target",
      +        "oneOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ]
      +      },
      +      "max_bytes": {
      +        "description": "Reject files larger than this",
      +        "maximum": 104857600,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=', that starts the download",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "timeout_ms": {
      +        "default": 15000,
      +        "description": "Time to wait for the download, in ms",
      +        "maximum": 30000,
      +        "minimum": 1000,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "download"
      +        ],
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "http(s) URL of a download link to open in a new tab",
      +        "maxLength": 2048,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / actions / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "Fixed delay or wait for a selector; give milliseconds, selector or both.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "milliseconds": {
      -        "description": "Fixed delay in ms; with selector, the wait timeout",
      -        "maximum": 30000,
      -        "minimum": 100,
      -        "type": "integer"
      -      },
      -      "selector": {
      -        "description": "CSS selector to wait for visibility",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "wait"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector to wait for",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "state": {
      -        "default": "visible",
      -        "description": "Element state to wait for; hidden/detached wait for disappearance (e.g. a spinner)",
      -        "enum": [
      -          "visible",
      -          "hidden",
      -          "attached",
      -          "detached"
      -        ],
      -        "type": "string"
      -      },
      -      "timeout": {
      -        "description": "Timeout in ms (default 10000)",
      -        "maximum": 30000,
      -        "minimum": 1000,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "enum": [
      -          "wait_for"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector of the element to click",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "click"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector of the input",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "fill"
      -        ],
      -        "type": "string"
      -      },
      -      "value": {
      -        "description": "Value to fill in",
      -        "maxLength": 5000,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector",
      -      "value"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "key": {
      -        "description": "Key to press, e.g. Enter, Tab, Escape",
      -        "maxLength": 50,
      -        "type": "string"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to focus and press the key on; omit to press on the page",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "press"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "key"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "amount": {
      -        "default": 1,
      -        "description": "Viewport heights to scroll",
      -        "maximum": 20,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "direction": {
      -        "default": "down",
      -        "enum": [
      -          "down",
      -          "up"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "scroll"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "delay": {
      -        "default": 1000,
      -        "description": "Delay between scrolls in ms",
      -        "maximum": 5000,
      -        "minimum": 200,
      -        "type": "integer"
      -      },
      -      "end_selector": {
      -        "description": "CSS selector that marks the end of content",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "max_scrolls": {
      -        "default": 10,
      -        "description": "Maximum scroll iterations",
      -        "maximum": 50,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "enum": [
      -          "infinite_scroll"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Capture a screenshot at this point in the sequence.",
      -    "properties": {
      -      "full_page": {
      -        "default": true,
      -        "description": "Capture the full page or just the viewport",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "enum": [
      -          "screenshot"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "script": {
      -        "description": "JavaScript to run in the page. Network APIs (fetch, XMLHttpRequest, WebSocket) and eval/Function are blocked.",
      -        "maxLength": 5120,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "evaluate"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "script"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "mode": {
      -        "default": "hide",
      -        "description": "hide: hide the consent overlay without changing consent state; accept/reject: click the matching button, then hide what remains.",
      -        "enum": [
      -          "hide",
      -          "accept",
      -          "reject"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "dismiss_consent"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Choose a dropdown option; give exactly one of value or label. action_results[i].result holds the selected values.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "label": {
      -        "description": "Option visible label to select",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the <select> element",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "select"
      -        ],
      -        "type": "string"
      -      },
      -      "value": {
      -        "description": "Option value attribute to select",
      -        "maxLength": 500,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Move the pointer over an element, e.g. to open a hover menu.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to hover",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "hover"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Click the first element whose visible text matches.",
      -    "properties": {
      -      "exact": {
      -        "default": false,
      -        "description": "Match the whole text case-sensitively (default: case-insensitive substring)",
      -        "type": "boolean"
      -      },
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "text": {
      -        "description": "Visible text of the element to click",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "click_text"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Read the first matching element's text or attribute into action_results[i].result (max 5000 chars; null when the attribute is absent).",
      -    "properties": {
      -      "attribute": {
      -        "description": "Attribute to return, e.g. href; omit for the visible text",
      -        "maxLength": 100,
      -        "type": "string"
      -      },
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to read",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "extract"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Check a checkbox or radio button.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox or radio",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "check"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Uncheck a checkbox.",
      -    "properties": {
      -      "frame": {
      -        "anyOf": [
      -          {
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          {
      -            "items": {
      -              "maxLength": 500,
      -              "type": "string"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          }
      -        ],
      -        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      -      },
      -      "selector": {
      -        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "uncheck"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "selector"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Wait until the page reaches a load state; fails on timeout.",
      -    "properties": {
      -      "event": {
      -        "default": "load",
      -        "description": "Load state to wait for",
      -        "enum": [
      -          "load",
      -          "domcontentloaded",
      -          "networkidle"
      -        ],
      -        "type": "string"
      -      },
      -      "timeout": {
      -        "description": "Timeout in ms (default 10000)",
      -        "maximum": 30000,
      -        "minimum": 1000,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "enum": [
      -          "wait_event"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "Capture the page HTML or markdown at this step; delivered as action_results[i].snapshot_url",
      -    "properties": {
      -      "format": {
      -        "default": "html",
      -        "description": "Capture the rendered HTML or its markdown conversion",
      -        "enum": [
      -          "html",
      -          "markdown"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "snapshot"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "Fixed delay or wait for a selector; give milliseconds, selector or both.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "milliseconds": {
      +        "description": "Fixed delay in ms; with selector, the wait timeout",
      +        "maximum": 30000,
      +        "minimum": 100,
      +        "type": "integer"
      +      },
      +      "selector": {
      +        "description": "CSS selector to wait for visibility",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "wait"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector to wait for",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "state": {
      +        "default": "visible",
      +        "description": "Element state to wait for; hidden/detached wait for disappearance (e.g. a spinner)",
      +        "enum": [
      +          "visible",
      +          "hidden",
      +          "attached",
      +          "detached"
      +        ],
      +        "type": "string"
      +      },
      +      "timeout": {
      +        "description": "Timeout in ms (default 10000)",
      +        "maximum": 30000,
      +        "minimum": 1000,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "wait_for"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector of the element to click",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "click"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector of the input",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "fill"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "Value to fill in",
      +        "maxLength": 5000,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "key": {
      +        "description": "Key to press, e.g. Enter, Tab, Escape",
      +        "maxLength": 50,
      +        "type": "string"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to focus and press the key on; omit to press on the page",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "press"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "key"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "amount": {
      +        "default": 1,
      +        "description": "Viewport heights to scroll",
      +        "maximum": 20,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "direction": {
      +        "default": "down",
      +        "enum": [
      +          "down",
      +          "up"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "scroll"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "delay": {
      +        "default": 1000,
      +        "description": "Delay between scrolls in ms",
      +        "maximum": 5000,
      +        "minimum": 200,
      +        "type": "integer"
      +      },
      +      "end_selector": {
      +        "description": "CSS selector that marks the end of content",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "max_scrolls": {
      +        "default": 10,
      +        "description": "Maximum scroll iterations",
      +        "maximum": 50,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "infinite_scroll"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Capture a screenshot at this point in the sequence.",
      +    "properties": {
      +      "full_page": {
      +        "default": true,
      +        "description": "Capture the full page or just the viewport",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "enum": [
      +          "screenshot"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "script": {
      +        "description": "JavaScript to run in the page. Network APIs (fetch, XMLHttpRequest, WebSocket) and eval/Function are blocked.",
      +        "maxLength": 5120,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "evaluate"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "script"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "mode": {
      +        "default": "hide",
      +        "description": "hide: hide the consent overlay without changing consent state; accept/reject: click the matching button, then hide what remains.",
      +        "enum": [
      +          "hide",
      +          "accept",
      +          "reject"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "dismiss_consent"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Choose a dropdown option; give exactly one of value or label. action_results[i].result holds the selected values.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "label": {
      +        "description": "Option visible label to select",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the <select> element",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "select"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "Option value attribute to select",
      +        "maxLength": 500,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Move the pointer over an element, e.g. to open a hover menu.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to hover",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "hover"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Scroll an element into view, e.g. to reach a row of a virtualized list. Only the visible window is observed afterwards.",
      +    "properties": {
      +      "block": {
      +        "default": "center",
      +        "description": "Vertical alignment of the element in the viewport",
      +        "enum": [
      +          "start",
      +          "center",
      +          "end",
      +          "nearest"
      +        ],
      +        "type": "string"
      +      },
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to bring into view",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "scroll_into_view"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Click the first element whose visible text matches.",
      +    "properties": {
      +      "exact": {
      +        "default": false,
      +        "description": "Match the whole text case-sensitively (default: case-insensitive substring)",
      +        "type": "boolean"
      +      },
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "text": {
      +        "description": "Visible text of the element to click",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "click_text"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Read the first matching element's text or attribute into action_results[i].result (max 5000 chars; null when the attribute is absent).",
      +    "properties": {
      +      "attribute": {
      +        "description": "Attribute to return, e.g. href; omit for the visible text",
      +        "maxLength": 100,
      +        "type": "string"
      +      },
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the element to read",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "extract"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Check a checkbox or radio button.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox or radio",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "check"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Uncheck a checkbox.",
      +    "properties": {
      +      "frame": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ],
      +        "description": "Selector of the <iframe> that contains the target; a list targets nested frames, outermost first"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=' of the checkbox",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "uncheck"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "selector"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Wait until the page reaches a load state; fails on timeout.",
      +    "properties": {
      +      "event": {
      +        "default": "load",
      +        "description": "Load state to wait for",
      +        "enum": [
      +          "load",
      +          "domcontentloaded",
      +          "networkidle"
      +        ],
      +        "type": "string"
      +      },
      +      "timeout": {
      +        "description": "Timeout in ms (default 10000)",
      +        "maximum": 30000,
      +        "minimum": 1000,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "wait_event"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Capture the page HTML or markdown at this step; delivered as action_results[i].snapshot_url",
      +    "properties": {
      +      "format": {
      +        "default": "html",
      +        "description": "Capture the rendered HTML or its markdown conversion",
      +        "enum": [
      +          "html",
      +          "markdown"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "snapshot"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Not yet available (beta): requests using this action are rejected with HTTP 400 action_not_available until artifact storage ships. Capture one file download started by the page. Provide exactly one of selector or url. The file is stored privately; action_results[i].artifact holds its metadata and GET /api/v1/artifacts/{artifact_id}/url returns a short-lived signed URL",
      +    "properties": {
      +      "frame": {
      +        "description": "Selector of the iframe containing the selector target",
      +        "oneOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "items": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        ]
      +      },
      +      "max_bytes": {
      +        "description": "Reject files larger than this",
      +        "maximum": 104857600,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "selector": {
      +        "description": "CSS selector, or XPath when prefixed with '//' or 'xpath=', that starts the download",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "timeout_ms": {
      +        "default": 15000,
      +        "description": "Time to wait for the download, in ms",
      +        "maximum": 30000,
      +        "minimum": 1000,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "enum": [
      +          "download"
      +        ],
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "http(s) URL of a download link to open in a new tab",
      +        "maxLength": 2048,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. First observed

TDQS

A4.3/5.0
Behavior4/5

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

Goes well beyond the annotations (readOnly/idempotent/openWorld already cover the safety profile) by disclosing the $0.004 browser-tier cost, the ordering guarantee that the screenshot fires after actions run, that action_results is returned alongside, and the source-attribution requirement. The remaining gap is the return shape itself — how the PNG is delivered — which is not stated and there is no output 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?

Purpose and the sibling contrast are front-loaded, and the cost, timing and action-ordering sentences all carry actionable information. It is dense but not padded; the attribution instruction is arguably operational boilerplate rather than tool-selection guidance, which keeps it off a 5.

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 screenshot tool with a large nested actions schema and no output schema, the description covers the essentials: rendering model, cost, load-control parameters, action sequencing and result delivery. The one omission is what the response contains besides action_results — e.g. an image reference or URL — which matters for a no-output-schema tool that returns a binary artifact.

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 coverage is 75%, so the baseline is 3. The description does add real meaning beyond the schema by explaining that actions run in order before capture and that action_results comes back, and it names the purpose of wait_for and wait_until. It does not explain the wait_until enum tradeoffs (networkidle vs load vs domcontentloaded), which is the choice most likely to affect results.

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, resource and output format ('Get a full-page PNG image of one URL') plus the rendering mechanism ('real headless browser'), and explicitly contrasts with alterlab_scrape for text. An agent can distinguish this from every listed sibling 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 an explicit when-to-use ('layout, charts or visual proof matter') and a named alternative for the opposite case ('for text content use alterlab_scrape'). Also names the concrete action types (dismiss_consent, evaluate) that justify choosing this tool over a plain scrape.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.