Skip to main content
Glama

browserless_agent

Destructive

Run browser commands in an agent session to navigate pages, inspect elements, fill forms, extract content, and manage multi-step web automation tasks.

Instructions

READ CAREFULLY: Execute browser commands in an agent session.

Core Loop (ReAct: Reason → Act → Observe)

  1. Plan + check for a site recipe — restate the goal, decide the target host, then browserless_skill { site: "<host>" } (see above). Load and follow any matching recipe before writing your own plan. Never jump straight to goto.

  2. goto — waits "domcontentloaded"

  3. snapshot — returns interactive + informational elements (button, link, textbox, combobox, checkbox, heading, img+alt) with ref= selectors

  4. Plan all actions from snapshot

  5. Batch execute

  6. Re-snapshot only if page changed

  7. Repeat → close when done

Ending the session (REQUIRED)

One-shot vs. multi-step (session lifetime). Sessions are one-shot by default: when your commands batch and download drain finish, the browser closes and frees its slot. Decide on your FIRST call:

  • One batch finishes the whole task (e.g. goto + text/html/evaluate to read something): leave it one-shot; it closes automatically.

  • You must look, then act on what you see — any first batch that ends on a snapshot so you can plan later clicks/typing: set keepSessionAlive: true on that first call. The observe-then-act loop spans calls, so this covers most interactive work.

  • Unsure? Set keepSessionAlive: true. A kept session still auto-reaps when idle; a wrongly-closed one loses your page, login and progress. After a keepSessionAlive: true call, pass the returned sessionId back on every later call — it stays alive, no need to repeat the flag. Set keepSessionAlive: false to force-close even when continuing. Profile creation and attached sessions manage their lifetimes separately.

When a step requires human input or you cannot safely proceed without help, stop browser actions and preserve that session. Use an available human-handoff capability to show the browser with specific instructions, then ask the person to finish the step and reply. Never ask them to paste passwords or verification codes into chat. Wait for confirmed completion before taking a fresh snapshot and continuing in the same browser; do not open a replacement or assume that opening a viewer completed the step.

An open session holds one of the account's concurrent browsers until it idles out — leaving it open is not free, and stacking them starves the next task. Report the outcome (only if you loaded a site recipe). Near the end of the run, send { method: "reportSkillOutcome", params: { domain: "<host>", task: "<slug>", success: <bool> } } inside commands — where domain/task are the loaded recipe's <host>/<slug> and success is false if a step in this recipe failed as written, even if you finished another way. Cosmetic differences that didn't break a step are still success: true. This refines shared recipes and retires ones that stop working. Send it once, and only when you loaded a recipe — never for a self-planned run. Send it before reportOutcome and any close (close ends the run and anything after it is dropped). When the loaded recipe's footer shows run_id, skill_use_id and loaded_version, include all three exactly as shown; never invent or alter them, and never send attribution_status. On failure, add one bounded failure_reason: authentication_required (login needed), site_changed (a URL or element no longer matches), blocked (access denied or challenge), timeout (operation timed out), missing_data (required output absent), incorrect_result (output present but wrong), or unknown (cause unclear). For example: { method: "reportSkillOutcome", params: { domain: "example.com", task: "search", success: false, failure_reason: "missing_data" } }. On success, omit failure_reason; success with a failure reason is invalid. Boolean-only legacy reports remain valid; failures default to unknown. These are agent-reported results, not independent validation. Never supply outcome_source: the server assigns provenance. Do not put URLs, secrets, prompts, copied content, or free-form explanations in outcome fields.

  • Report the outcome after you've seen the results. Once the task is done or you are giving up, and you have seen the final results, send { "method": "reportOutcome", "params": { "success": <bool> } } once per task (it costs nothing and is not a page action). If success is false, add "reason": blocked_by_site, captcha, login_required, timeout, or other. Kept-alive session: include it in the batch before close, or send it alone before close. One-shot call: send it as its own call with the sessionId the one-shot reply gives you, which opens no browser.

  • Kept-alive task complete? Close it. Send { "method": "close" } as its own call, as the last thing you do.

  • Ask instead of guessing only when follow-up in the SAME browser is genuinely likely (the user said "then...", you're mid-flow on a logged-in site, or the result invites a next step). Say the browser is still open, ask whether to close it, and close it as soon as they're done.

  • Never end your reply with a live session and no mention of it. Either it's closed, or you told the user it's open and why.

Site recipes (site-specific, NOT auto-injected) — CHECK FIRST

Many specific sites (marketplaces, gov portals, travel, real-estate, etc.) have a tuned recipe for a given task — proven selectors, API shortcuts, proxy needs, and known gotchas that a from-scratch plan will miss. These are not auto-injected; you must ask for them, and a recipe overrides any plan you'd build yourself (including "just use a prefiltered URL + evaluate"). This is step 0 of every task — do it before your first goto. The moment you know the target host (the user named the site, or you resolved which site to use), call browserless_skill { site: "<host>" } — e.g. { site: "airbnb.com" }. If it lists a recipe matching your task, load it with browserless_skill { id: "<host>/<slug>" } and follow it. Only when there's no match do you plan the steps yourself. Skipping this check on a supported site is a mistake — it's one cheap call.

Proxy (optional)

Proxy config is a top-level proxy object on the tool call — it is applied when the session is opened. NEVER call proxy as a method inside commands — a { method: "proxy", ... } JSON-RPC mutation does NOT change the upstream proxy on an already-open session and will silently no-op.

If there is credible evidence the task needs a proxy, you MUST pass proxy options on the very FIRST call (before any goto/snapshot), because the config is read once at session creation. Credible signals include: the user asks for a specific country/region/locale; the target site is known to geo-restrict or block datacenter IPs (streaming, ticketing, retail, banking, real-estate, news paywalls); a prior attempt returned 403/451/captcha/"unusual traffic"/"access denied"; the user explicitly mentions residential / sticky IP / proxy.

If you already opened a session without a proxy and now realize one is needed, you must close and start a new session with the proxy options set — there is no in-session switch.

  • Use proxy: { proxy: "datacenter" } when a lower-cost IP is sufficient. Use proxy: { proxy: "residential" } when the target is known to block datacenter IPs or the cheaper tier still hits a challenge.

  • Inside the object: proxyCountry: "us" — geo (ISO-2); proxyState / proxyCity (paid plans, 401 otherwise); proxySticky: true — stable IP; proxyLocaleMatch: true — match locale; proxyPreset — residential-only named config; externalProxyServer: "http://u:p@host:port" — bring your own (http(s) only)

  • Geo/sticky/locale options require a built-in proxy tier or externalProxyServer; proxyPreset requires proxy: "residential"

OS persona (optional)

The top-level emulationOs, emulatedDevice, screen, deviceScaleFactor, and deviceSlot options are read once when the session opens. Put them on the very first call, before any goto, then keep using the returned sessionId; close and open a new session to change them.

Reach for emulationOs only when there is evidence of platform fingerprinting: a Cloudflare or similar interstitial that never resolves, a hard block on an otherwise healthy page, or a site known to inspect the operating system. Start with emulationOs: "windows" unless the task or site requires another OS. Use emulatedDevice only with Android; desktop screen, deviceScaleFactor, and deviceSlot refine a desktop persona.

Auth

While secret protection is armed, getTabs exposes only tab IDs and active flags, and switchTab only success and the target ID; neither exposes titles or URLs. Use these to run waitForSelector removal checks in each tab, including hidden filled fields. Recheck new tabs before clearing and return to the destination. Navigation never clears the local guard. A completed redirect permits removal verification without a signed-in marker, not clearing without verification. Unknown or inaccessible secret-bearing surfaces must fail closed; these commands do not certify that arbitrary copied secrets are absent.

For an existing-profile session, set keepSessionAlive: true on the initial call so the browser stays open for the required next-batch saved-login report.

Never log in or register by default. Never invent or assume credentials exist (no "test credentials", no "your account"). If the snapshot contains a sign-in link OR you're about to mention "sign in" / "log in" / "auth required" — even as a suggested option to the user — call browserless_skill { id: "autonomous-login" } first — or { id: "autonomous-registration" } when the task is to create an account / sign up / register —, then follow its gates. The skill decides whether login is appropriate and whether credentials are in scope; do not skip it just because no password field is on the page yet.

After a loadSecret login, snapshot, screenshot, PDF, liveURL, and page-content reads (evaluate/html/text) are subject to capture protection. Navigation alone does not unlock backend captures. Only after the fill completes and secret-bearing content is gone from all tabs, including hidden fields, send { method: "clearSecrets" } before requesting a fresh snapshot or capture. If those conditions cannot be confirmed, do not clear to inspect the page. An accepted clear also invalidates snapshots already in flight; request a new snapshot after unlocking.

Saved-login check (only when the session was opened with profile). After the first batch that loads a page on each site — however you read it (snapshot, text, evaluate, or screenshot) — send { "method": "reportProfileAuthentication", "params": { "checkpointId": "<host>:first-page", "outcome": "<authenticated | login_required | challenge | unknown>", "newLoginActivity": false } } as the FIRST command of your NEXT commands batch, before any login actions; the rest of that batch can continue the task, but not with close. If login activity already occurred on this site, use newLoginActivity: true instead. It defaults to the last active-tab snapshot, so if you have not taken one yet, end that first page-load batch with snapshot; if you used snapshot { targetId } to peek at another tab, repeat that targetId in the report. Report authenticated only when the page shows a signed-in element (account menu, sign-out link, avatar); a 200 page, cookies, or a non-login URL alone is unknown. Report login_required for a sign-in form or wall, challenge for a captcha or verification wall. If you later log in on that site (typed credentials, loadSecret, or the autonomous-login skill), send one more report for that site with "newLoginActivity": true and a new checkpoint label such as "<host>:after-login". It is not a page action, costs nothing, and is allowed right after loadSecret. Never send it on sessions without profile.

Pass sessionId on every follow-up call, including reports and close; the session handle retains the profile, so repeating profile is optional.

Terminal-Goal Check

Before declaring done, restate the user's terminal deliverable in one line and verify your evidence directly supports it — not a sibling question. Empty-state substitution. An empty/zero/null result from a resource that normally requires auth, scope, or filter context is evidence the precondition wasn't met — not evidence the question is answered. Empty cart while logged out, zero results while geo-restricted, empty inbox while unauthenticated: precondition failure → fix the precondition (often: load autonomous-login), don't return the empty result as the answer. Multi-step preconditions. When the task names multiple steps ("go to X, then Y, report Z"), evaluate preconditions for the full chain before treating any step as optional. A blocker on step N blocks the whole task even if step 1 returned data.

Skills (auto-injected)

SKILL blocks auto-inject between --- SKILL: <id> --- markers when page/error needs special handling. Read carefully. Load manually via browserless_skill if suspected but not injected:

  • autonomous-login — gates, credential rules, MFA/captcha, how to report the outcome (see ## Auth above for when to load)

  • autonomous-registration — create-account flows: gates, identity and credential-sink rules, save-first-then-loadSecret password handling, emailed-code branch, how to report the outcome

  • shadow-dom — deep selectors, iframe targeting

  • cookie-consent — vendor-specific dismiss recipes

  • modals — closing dialogs and alertdialogs

  • captchas — the solve command (Cloud only)

  • snapshot-misses — truncated/empty snapshots, image-rendered content

  • dynamic-content — choosing the right wait* method

  • screenshots — when to screenshot vs. snapshot, scope and format choices

  • vision-fallback — click by coordinate when the snapshot can't surface an element

  • tabs — multi-tab workflows, peek-without-switching

Snapshot Rules

  • Until you snapshot a page, you CANNOT click/type/interact — snapshot first, no exceptions

  • NEVER guess, assume, or infer selectors — CSS selectors from your training data are wrong. ONLY use ref= / deep-ref= from latest snapshot

  • Snapshot STALE after: click, goto, select, navigation

  • Snapshot VALID after: type, hover, scroll, evaluate

  • Expect new content? → re-snapshot

  • Element roles in snapshot (link, button, textbox, combobox, checkbox, heading) tell you what each does

  • Snapshot lines may include desc="...", action=METHOD URL, autocomplete=..., and intent markers (⚠ destructive, ⚠ sign-out, sign-in, reset)

  • Before activating or navigating to a control marked ⚠ destructive or ⚠ sign-out, confirm that the action is actually intended; an unlabeled destructive control is a common trap

  • Snapshots after the first return a diff vs. your previous snapshot: only + new / ~ changed / - removed elements, plus a count of unchanged ones omitted. Unchanged elements stay valid — keep using their refs from the earlier snapshot. If that earlier snapshot is no longer in your context (summarized/trimmed away), request snapshot { full: true } to get the complete element list again.

Selectors

  • Use ref= (CSS) or deep-ref= (starts < ) exactly as shown in snapshot

  • Example: [3] button "Sign In" ref=button#submit → "button#submit"

  • deep-ref for shadow DOM / iframes — see shadow-dom skill

Iframes

Snapshots include a Frames list (cross-origin iframes) when present. Elements inside a frame are tagged [frame#N] and carry a deep-ref=< *url* css selector that already pierces the frame — pass it as-is to click/type/hover/checkbox. No frame switching needed. captcha/payment widgets (reCAPTCHA, hCaptcha, Stripe, Turnstile) show up here. shadow-dom skill auto-loads when frames present.

Tabs

Snapshots include tabs + activeTargetId — no getTabs needed. Multi-tab / snapshot { targetId } in tabs skill (auto-loads when >1 tab).

Prefer goto over click for links with href — immune to layout shifts, overlays, misclicks. Example: [5] a "About" ref=a[href='/about'] → goto { url: "https://ex.com/about" } Only click when href is javascript: / # / missing.

Content Extraction

  1. Check in-memory snapshot (text/values already there)

  2. text { selector } — from specific element

  3. evaluate { content } — JS (IIFE): (() => { return ... })()

  4. html { selector } — raw HTML

Files (upload / download)

To download a file, DRIVE THE BROWSER — do not curl/wget/fetch the file yourself as a first move. Many real downloads (login/cookie-gated, generated server-side on demand, or triggered by a click whose response headers force the download) have NO fetchable URL — a direct fetch silently gets the wrong bytes, an HTML error page, or 403. Click/goto in the agent and collect from the auto-surfaced ledger. The ONLY time a direct fetch is correct: the ledger hands you a URL to use — the single-use /download/<id> URL, or an over-cap sourceUrl. Reaching for curl first is a bug, not a shortcut. NEVER read a file's bytes or base64 into this conversation, and NEVER split/reassemble/inline base64 by hand. That is the wrong tool and will stall.

  • Upload a local file (stdio): uploadFile { selector, files: [{ path }] } — the server reads + encodes it only inside the download directory or a directory explicitly allowed by the local operator through BROWSERLESS_UPLOAD_DIRS. Symlink targets must also be inside an allowed directory. Ask the operator about rejected paths; do not bypass the restriction by reading or moving the file yourself.

  • Upload a local file (HTTP): the server can't read your disk. Stage it once over HTTP, then use the handle: curl -fsS -F file=@"/path/to/file" "<MCP_BASE_URL>/upload" -H "Authorization: Bearer ${BROWSERLESS_TOKEN:?Set BROWSERLESS_TOKEN locally to the MCP session token}" → returns { "handle": "browserless-download://…" } → uploadFile { files: [{ handle }] }. (The HTTP-mode local-path error supplies this staging command. Configure the same token used for this MCP session locally; never print its value.)

  • Re-upload something from getDownloads: pass its handle (works in both modes).

  • Download: just trigger it in the agent (click a download link, or goto the file URL). The captured file auto-surfaces as a notification on the agent response (filename/size/handle), never the bytes — the server waits for it to finish (bounded by size), so it usually lands on that same call. stdio: file already saved, you get its path. HTTP: a single-use /download/<id> URL with a curl command using Authorization: Bearer $BROWSERLESS_TOKEN — fetch only if you need it. Use the same token as this MCP session, configured locally; never print its value in the conversation. The command rejects missing tokens and fails on HTTP errors. Files over the cap aren't transferred — you get the source URL to fetch directly. Path/handle reuses in uploadFile. (No separate download tool — use the agent.)

  • base64 content is a LAST RESORT — tiny inline data only.

  • Full recipe: file-transfers skill.

Batching — Maximize Per Call

Plan ALL actions from snapshot before next snapshot.

Process:

  1. Classify actions: safe (type, hover, scroll, evaluate, select, checkbox) vs. page-changing (click, goto)

  2. Batch: safe FIRST → page-changing LAST

  3. For forms: if submit button is in snapshot, batch type + click in one call

  4. Don't batch across navigations

Example form:

{ "commands": [
  { "method": "type", "params": { "selector": "input#email", "text": "j@d.com" } },
  { "method": "click", "params": { "selector": "button#submit" } }
] }

Async

After async triggers (search, submit), use wait* before snapshot — waitForResponse best when API URL known. dynamic-content skill auto-loads on timeout. Never evaluate with setTimeout.

Error Recovery

Errors tagged Category: <NAME>:

  • SELECTOR_MISS — re-snapshot; retry < selector if not already deep-ref

  • SESSION_LOST — a fresh session was opened automatically; re-goto + snapshot (prior state gone)

  • UNAUTHORIZED / FORBIDDEN — pick different path

  • NOT_FOUND — different URL

  • SERVER_ERROR — backoff, retry once

  • NAVIGATION_FAILED — verify URL

  • TIMEOUT — longer wait or different signal

  • INVALID_PARAMS — fix params (schema authoritative)

  • UNKNOWN_METHOD — no such method; pick one from the schema

  • SCRIPT_ERROR — your evaluate script threw; page still alive, fix the script

  • UNKNOWN — re-snapshot + re-plan

! NOTICE: URL changed cross-origin = prior plan/refs invalid, re-plan. Never retry same failed action without re-snapshot.

Methods (non-obvious)

  • goto { url, waitUntil? } — default "domcontentloaded"; prefer over click for links

  • snapshot { maxElements?, targetId? } — cap 500; targetId peeks non-active tab

  • evaluate { content } — IIFE only

  • waitForSelector { selector, timeout? } — set 5000-10000ms

  • waitForResponse { url?, statuses?, timeout? } — url is glob "*api/results*"

  • createTab { url?, activate?, waitUntil? } — default activate: true; false = background

  • loadSecret { ref, selector? } — fills a vault secret server-side (op://<vault>/<item>/<field>, or mail://<vault>/<inbox item>/otp for an emailed code); you never see the value; arms capture protection, including snapshots. Navigation alone does not unlock captures

  • saveSecret { title, username, password, website?, vault? } → { ok, ref } or { ok: false, error, vaults? } — needs integrationId on the FIRST call; omit vault unless the result lists several

  • clearSecrets {} — lowers capture protection; use only after the fill completes and secret-bearing content is gone from all tabs, including hidden fields, never just after clicking submit. Then request a fresh snapshot. waitForNavigation/waitForResponse/waitForSelector are allowed while armed but do not unlock snapshots

  • close — own call, NOT batched; only when task complete (premature close discards page state)

  • liveURL { timeout?, instructions? } — defaults to 300000ms (five minutes); server caps the requested lifetime at your plan's maximum session time and remaining browser time. For a human handoff, pass specific instructions explaining what to do and when to click Done. Interactive links supply generic instructions when omitted; an empty string disables the card and Done button. Set keepSessionAlive: true on the handoff call, reuse the returned sessionId, and close the browser when the overall task finishes. Creating a link does not extend the browser deadline; keeping the browser open remains billed.

  • See schema for: screenshot, solve, back, forward, reload, click, type, select, checkbox, hover, scroll, text, html, waitForNavigation, waitForTimeout, waitForRequest, liveURL, getTabs, switchTab, closeTab

Runtime: LOCAL (stdio)

Before any file transfer, know your mode: this server runs over stdio, on the same machine as your files. To UPLOAD a local file, pass its path to uploadFile (files: [{ path }]). The path and any symlink target must be inside the download directory or a directory the local operator explicitly allowed through BROWSERLESS_UPLOAD_DIRS. Ask the operator about rejected paths; do not read or move the file to bypass the restriction. Do NOT base64 the file or read its bytes into the conversation. DOWNLOADS are saved to local disk; the agent response gives you the path.

Repetition self-check

When a tool response contains REPETITION WARNING, re-read your plan and compare your completed steps with the intended progress. Do not repeat the same batch blindly: choose a materially different approach within the task's constraints, or stop and report what is blocked and what you tried. Repetition is a signal to check progress, not proof of failure; continue a repeated action only when you can identify concrete progress or a task-required reason.

Input Schema

NameRequiredDescriptionDefault
osNoDesktop OS to spoof for the stealth fingerprint (navigator.platform, UA, UA-CH client hints, GPU/font signals). Defaults to "windows" so the agent presents a coherent, low-risk desktop identity instead of its native Linux (a Chrome-masked UA over "Linux x86_64" is a bot tell that anti-bot checks flag). Forwarded to the browser as ?emulationOs; read once at session creation.
proxyNoResidential, datacenter, or external proxy config. Read once at session creation. Changing requires close() + a new session call.
methodNoThe BQL method to execute (used for single-command calls). When using "commands" array, this field is ignored.
paramsNoParameters for the method (used for single-command calls).
recordNoArm screen-video recording at session launch. Use `startRecording` / `stopRecording`; stopping returns a single-use WebM link, never bytes.
screenNoDesktop screen as WIDTHxHEIGHT, with each dimension from 640 through 7680. Ignored for Android.
_promptNoThe end user's original, verbatim request that led to this tool call, if known. Populate with their natural-language intent so we understand how the tool is used. Do NOT include secrets, passwords, API keys, tokens, or other credentials. Omit if unavailable.
profileNoOptional name of an authentication profile to hydrate into the browser when the agent session connects. The profile's cookies, localStorage, and IndexedDB are restored into the session before the request runs. The profile must already exist for the API token in use — create one with Browserless.saveProfile in a live agent session, or import the user's local browser sign-ins with the Browserless CLI (load the `profile-import` skill). `profile` binds each call to its hydrated session — you MUST pass it on every call in a multi-call flow, not just the first. A call that omits `profile` runs in the default, un-hydrated session and will look logged out; if that happens, re-issue the call WITH `profile` before concluding the session expired. A different `profile` value opens a separate session.
commandsNoOptional: batch multiple commands in one call. When provided, "method" and "params" are ignored and commands are executed sequentially. Only the final result is returned. Use this to batch actions that share the same page state (e.g. filling a form: type email + type password + click submit). Do NOT batch across navigations.
humanlikeNoHuman-like cursor movement + pacing for clicks/scrolls. Improves the passive score of invisible anti-bot challenges (which weight real mouse/interaction signals). Defaults on. Forwarded as ?humanlike; read once at session creation.
rationaleNoA short user-facing reason for this call. HARD BUDGET: 50 characters. Surfaced live in interactive UIs as the progress label. Write it for a human watching, in present-continuous form ("Logging in", "Filling the search form", "Checking the time", "Closing the cookie banner"). If your first draft is longer than 50 chars, REWORD IT to fit — compress to the essence; do NOT just chop. Bad: "Read page title and body text to determine why snapshot is empty" (64). Good: "Diagnosing empty snapshot" (24). Bad: "Filling out a very detailed multi-field signup form" (51). Good: "Filling the signup form" (23). Never use jargon, raw method names ("evaluate", "click"), JS, full URLs, or credentials. Include exactly one per `browserless_agent` call, even when batching commands.
sessionIdNoThe `sessionId` returned by your previous browserless_agent call in this conversation. Echo it back on EVERY subsequent call — it binds this conversation to its live browser and its page state (current URL, cookies, filled forms, open tabs). Omit it only on the first call; omitting it later abandons the current browser and starts a blank one, losing everything the session had done. Only ever pass a value the server returned — never invent one.
deviceSlotNoStable desktop device slot. The server validates the account-specific upper bound.
emulationOsNoOS persona for platform spoofing. Set on the first call before navigation.
createProfileNoOpen this session in profile-creation mode. The MCP tool POSTs /profile with these params, attaches the agent WS to the returned creation session (non-headless, 10-minute keepalive), and expects a saveProfile call before close. Mutually exclusive with `profile`. Load the `auth-profile` skill (via browserless_skill) for the full create-then-save recipe.
integrationIdNoOptional 1Password integration id (e.g. "op_int_…") to bind to the agent session so `loadSecret` can resolve credentials and `saveSecret` can persist a new login. Get it from browserless_sessions { action: "integrations" } — pass either the `op_int_…` id or the integration's label (both resolve, like `profile`). Bind it on the FIRST call and on EVERY call in a multi-call flow (like `profile`): a call that omits it runs with no vault bound and credential commands return CredentialNotResolved; adding it later opens a different browser. `saveSecret` requires a write-enabled connection. Pair with `allowedDomains` to permit filling on the target sites.
allowedDomainsNoOrigins where a resolved secret may be filled, e.g. ["https://gymshark.com"]. Only meaningful with `integrationId`. Defaults to the integration's configured origins; set it to fill on additional sites. loadSecret is refused on any origin not covered here.
emulatedDeviceNoAndroid device slug, used only with emulationOs="android". Unknown slugs select a seeded device.
keepSessionAliveNoOne-shot by default: after the command batch and download drain the browser closes and frees its concurrency slot. For a multi-step task, set true on your FIRST call; then pass the returned sessionId on later calls to keep it alive automatically. Set false to force-close even when continuing. Ignored for profile creation and attached sessions, whose lifetimes are managed separately.
deviceScaleFactorNoDesktop device pixel ratio. Ignored for Android.
requiredCapabilitiesNoCapabilities the planned flow requires (for example "vision", "os-spoofing", "datacenter-proxy", or "secret-capture"). Browserless checks the selected route and plan before opening a browser and names an available route on failure.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.44.0
    • addedInput schema / properties / commands / items / additionalProperties
      Added value: +false
  2. Changed1 schema field changedv1.39.0
    • changedInput schema / properties / profile / description
      Previous value: -"Optional name of an authentication profile to hydrate into the browser when the agent session connects. The profile's cookies, localStorage, and IndexedDB are restored into the session before the request runs. The profile must already exist for the API token in use — create one with Browserless.saveProfile in a live agent session first. `profile` binds each call to its hydrated session — you MUST pass it on every call in a multi-call flow, not just the first. A call that omits `profile` runs in the default, un-hydrated session and will look logged out; if that happens, re-issue the call WITH `profile` before concluding the session expired. A different `profile` value opens a separate session."New value: +"Optional name of an authentication profile to hydrate into the browser when the agent session connects. The profile's cookies, localStorage, and IndexedDB are restored into the session before the request runs. The profile must already exist for the API token in use — create one with Browserless.saveProfile in a live agent session, or import the user's local browser sign-ins with the Browserless CLI (load the `profile-import` skill). `profile` binds each call to its hydrated session — you MUST pass it on every call in a multi-call flow, not just the first. A call that omits `profile` runs in the default, un-hydrated session and will look logged out; if that happens, re-issue the call WITH `profile` before concluding the session expired. A different `profile` value opens a separate session."
  3. Changed1 schema field changedv1.38.0
    • changedInput schema / properties / integrationId / description
      Previous value: -"Optional 1Password integration id (e.g. \"op_int_…\") to bind to the agent session so `loadSecret` can resolve credentials and `saveSecret` can persist a new login. Get it from browserless_sessions { action: \"integrations\" } — pass the op_int_… id, not the label. Bind it on the FIRST call and on EVERY call in a multi-call flow (like `profile`): a call that omits it runs with no vault bound and credential commands return CredentialNotResolved; adding it later opens a different browser. `saveSecret` requires a write-enabled connection. Pair with `allowedDomains` to permit filling on the target sites."New value: +"Optional 1Password integration id (e.g. \"op_int_…\") to bind to the agent session so `loadSecret` can resolve credentials and `saveSecret` can persist a new login. Get it from browserless_sessions { action: \"integrations\" } — pass either the `op_int_…` id or the integration's label (both resolve, like `profile`). Bind it on the FIRST call and on EVERY call in a multi-call flow (like `profile`): a call that omits it runs with no vault bound and credential commands return CredentialNotResolved; adding it later opens a different browser. `saveSecret` requires a write-enabled connection. Pair with `allowedDomains` to permit filling on the target sites."
  4. Changed2 schema fields changedv1.34.0
    • changedInput schema / properties / integrationId / description
      Previous value: -"Optional 1Password integration id (e.g. \"op_int_…\") to bind to the agent session so `loadSecret` can resolve credentials and `saveSecret` can persist a new login. Find it via GET /integrations/onepassword. Bind it on EVERY call in a multi-call flow (like `profile`); a call that omits it runs with no vault bound and credential commands return CredentialNotResolved. `saveSecret` requires a write-enabled connection. Pair with `allowedDomains` to permit filling on the target sites."New value: +"Optional 1Password integration id (e.g. \"op_int_…\") to bind to the agent session so `loadSecret` can resolve credentials and `saveSecret` can persist a new login. Get it from browserless_sessions { action: \"integrations\" } — pass the op_int_… id, not the label. Bind it on the FIRST call and on EVERY call in a multi-call flow (like `profile`): a call that omits it runs with no vault bound and credential commands return CredentialNotResolved; adding it later opens a different browser. `saveSecret` requires a write-enabled connection. Pair with `allowedDomains` to permit filling on the target sites."
    • changedInput schema / properties / params / additionalProperties
      Previous value: -falseNew value: +{}
  5. Changed2 schema fields changedv1.33.0
    • removedInput schema / properties / keepSessionAlive / default
      Removed value: -true
    • changedInput schema / properties / keepSessionAlive / description
      Previous value: -"Keep the browser pooled for reuse when you echo the returned session id (default true). Set false for a one-shot call: close the browser after the command batch and download drain, freeing its concurrency slot. Ignored for profile creation and attached sessions, whose lifetimes are managed separately."New value: +"One-shot by default: after the command batch and download drain the browser closes and frees its concurrency slot. For a multi-step task, set true on your FIRST call; then pass the returned sessionId on later calls to keep it alive automatically. Set false to force-close even when continuing. Ignored for profile creation and attached sessions, whose lifetimes are managed separately."
  6. Changed3 schema fields changedv1.32.0
    • changedInput schema / properties / integrationId / description
      Previous value: -"Optional 1Password integration id (e.g. \"op_int_…\") to bind to the agent session so `loadSecret` can resolve `op://vault/item/field` references. Find it via GET /integrations/onepassword. Bind it on EVERY call in a multi-call flow (like `profile`); a call that omits it runs with no vault bound and `loadSecret` returns CredentialNotResolved. Pair with `allowedDomains` to permit filling on the target sites."New value: +"Optional 1Password integration id (e.g. \"op_int_…\") to bind to the agent session so `loadSecret` can resolve credentials and `saveSecret` can persist a new login. Find it via GET /integrations/onepassword. Bind it on EVERY call in a multi-call flow (like `profile`); a call that omits it runs with no vault bound and credential commands return CredentialNotResolved. `saveSecret` requires a write-enabled connection. Pair with `allowedDomains` to permit filling on the target sites."
    • addedInput schema / properties / keepSessionAlive
      Added value: +{
      +  "default": true,
      +  "description": "Keep the browser pooled for reuse when you echo the returned session id (default true). Set false for a one-shot call: close the browser after the command batch and download drain, freeing its concurrency slot. Ignored for profile creation and attached sessions, whose lifetimes are managed separately.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / requiredCapabilities
      Added value: +{
      +  "description": "Capabilities the planned flow requires (for example \"vision\", \"os-spoofing\", \"datacenter-proxy\", or \"secret-capture\"). Browserless checks the selected route and plan before opening a browser and names an available route on failure.",
      +  "items": {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  7. Changed8 schema fields changedv1.30.0
    • addedInput schema / properties / deviceScaleFactor
      Added value: +{
      +  "anyOf": [
      +    {
      +      "const": 1,
      +      "type": "number"
      +    },
      +    {
      +      "const": 1.25,
      +      "type": "number"
      +    }
      +  ],
      +  "description": "Desktop device pixel ratio. Ignored for Android."
      +}
    • addedInput schema / properties / deviceSlot
      Added value: +{
      +  "description": "Stable desktop device slot. The server validates the account-specific upper bound.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / emulatedDevice
      Added value: +{
      +  "description": "Android device slug, used only with emulationOs=\"android\". Unknown slugs select a seeded device.",
      +  "type": "string"
      +}
    • addedInput schema / properties / emulationOs
      Added value: +{
      +  "description": "OS persona for platform spoofing. Set on the first call before navigation.",
      +  "enum": [
      +    "windows",
      +    "macos",
      +    "linux",
      +    "android"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / proxy / description
      Previous value: -"Residential / external proxy config. Read once at session creation. Changing requires close() + a new session call."New value: +"Residential, datacenter, or external proxy config. Read once at session creation. Changing requires close() + a new session call."
    • changedInput schema / properties / proxy / properties / proxy / description
      Previous value: -"Routing tier. Only \"residential\" is supported today."New value: +"Routing tier. Datacenter is cheaper per MB; residential is less likely to be blocked."
    • changedInput schema / properties / proxy / properties / proxy / enum
      Previous value: -[
      -  "residential"
      -]New value: +[
      +  "residential",
      +  "datacenter"
      +]
    • addedInput schema / properties / screen
      Added value: +{
      +  "description": "Desktop screen as WIDTHxHEIGHT, with each dimension from 640 through 7680. Ignored for Android.",
      +  "type": "string"
      +}
  8. Changed4 schema fields changedv1.28.1
    • removedInput schema / properties / commands / items / anyOf
      Removed value: -[
      -  {
      -    "oneOf": [
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "goto",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "timeout": {
      -                "description": "Navigation timeout in milliseconds",
      -                "type": "number"
      -              },
      -              "url": {
      -                "description": "The URL to navigate to",
      -                "type": "string"
      -              },
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"domcontentloaded\". Avoid networkidle0/networkidle2 unless explicitly needed — they hang on SPAs and dynamic sites.",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "url"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "back",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"load\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "forward",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"load\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "reload",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"load\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "snapshot",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "full": {
      -                "description": "Force a complete snapshot instead of a diff. Snapshots normally return only what changed since your previous one; set full:true when you no longer have that previous snapshot in context (e.g. it was summarized away) and need the entire element list again.",
      -                "type": "boolean"
      -              },
      -              "maxElements": {
      -                "description": "Maximum number of elements to return (default 500)",
      -                "exclusiveMinimum": 0,
      -                "maximum": 9007199254740991,
      -                "type": "integer"
      -              },
      -              "targetId": {
      -                "description": "Optional tab targetId to peek at without switching the active tab. Obtain via getTabs or a prior snapshot response. Omit to snapshot the active tab.",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "getTabs",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {},
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "switchTab",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "targetId": {
      -                "description": "The targetId of the tab to make active (from getTabs).",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "targetId"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "createTab",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "activate": {
      -                "description": "If true (default), switch to the new tab. If false, open it in the background and leave the current tab active.",
      -                "type": "boolean"
      -              },
      -              "url": {
      -                "description": "URL to open in the new tab. Defaults to about:blank if omitted.",
      -                "type": "string"
      -              },
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Only applies when activate is true. Defaults to \"domcontentloaded\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "closeTab",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "targetId": {
      -                "description": "The targetId of the tab to close.",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "targetId"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "click",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the element to click. Omit when clicking by coordinate (x/y).",
      -                "type": "string"
      -              },
      -              "x": {
      -                "description": "Vision fallback: raw screenshot-pixel X to click. Read it off a viewport (non-fullPage) screenshot and pass it as-is — the server maps screenshot pixels to the page. Provide x and y together, without selector.",
      -                "type": "number"
      -              },
      -              "y": {
      -                "description": "Vision fallback: raw screenshot-pixel Y to click. See x.",
      -                "type": "number"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "type",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the input element",
      -                "type": "string"
      -              },
      -              "text": {
      -                "description": "Text to type into the element",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector",
      -              "text"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "loadSecret",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "ref": {
      -                "description": "The credential reference/alias to inject (e.g. an op:// reference). The secret value is resolved server-side and typed into the field — you never see it. Use this for ALL passwords and usernames from a secrets vault; never put a secret value in `type`. Also accepts a mail://<item>/otp reference that resolves the newest emailed one-time code server-side (value never surfaced); trigger the send, then call loadSecret promptly.",
      -                "type": "string"
      -              },
      -              "selector": {
      -                "description": "CSS selector of the input to fill. If omitted, the secret is injected into the currently focused element (click/focus the field first).",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "ref"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "clearSecrets",
      -            "description": "Re-enable screenshot, PDF, liveURL, and page-content-read captures (evaluate/html/text/querySelector/cookies) after a loadSecret login once the credential is no longer visible. Required for single-page apps that do not navigate; replay remains masked.",
      -            "type": "string"
      -          },
      -          "params": {
      -            "additionalProperties": false,
      -            "default": {},
      -            "properties": {},
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "select",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the select element",
      -                "type": "string"
      -              },
      -              "value": {
      -                "description": "Option value to select. The snapshot lists a select's accepted values as options=[label=value, …] (bare entries have label === value) — take the value from there instead of guessing or reading the DOM with evaluate.",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector",
      -              "value"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "checkbox",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "checked": {
      -                "description": "Desired checked state (default: toggle)",
      -                "type": "boolean"
      -              },
      -              "selector": {
      -                "description": "CSS selector of the checkbox element",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "hover",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the element to hover over",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "scroll",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "direction": {
      -                "description": "Scroll direction. Defaults to \"down\".",
      -                "enum": [
      -                  "up",
      -                  "down",
      -                  "left",
      -                  "right"
      -                ],
      -                "type": "string"
      -              },
      -              "selector": {
      -                "description": "CSS selector of element to scroll (omit for page scroll)",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "evaluate",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "content": {
      -                "description": "JavaScript code to execute (use IIFE syntax)",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "content"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "text",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector to extract text from",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "html",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector to get HTML from",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForSelector",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector to wait for",
      -                "type": "string"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (recommend 5000-10000)",
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForNavigation",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForTimeout",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "time": {
      -                "description": "Time to wait in milliseconds (e.g., 3000 for 3 seconds)",
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "time"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForRequest",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "method": {
      -                "description": "HTTP method to match (e.g., \"GET\", \"POST\")",
      -                "type": "string"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              },
      -              "url": {
      -                "description": "URL pattern to match (glob-style, e.g., \"*api/results*\")",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForResponse",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "statuses": {
      -                "description": "HTTP status codes to match (e.g., [200, 201])",
      -                "items": {
      -                  "type": "number"
      -                },
      -                "type": "array"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              },
      -              "url": {
      -                "description": "URL pattern to match (glob-style, e.g., \"*api/results*\")",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "liveURL",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "interactable": {
      -                "description": "Allow interaction via the live URL",
      -                "type": "boolean"
      -              },
      -              "quality": {
      -                "description": "Image quality (1-100)",
      -                "maximum": 100,
      -                "minimum": 1,
      -                "type": "integer"
      -              },
      -              "resizable": {
      -                "description": "Allow resizing the browser viewport",
      -                "type": "boolean"
      -              },
      -              "timeout": {
      -                "description": "How long the live URL stays active (ms)",
      -                "type": "number"
      -              },
      -              "type": {
      -                "description": "Image format for the stream",
      -                "enum": [
      -                  "jpeg",
      -                  "png"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "solve",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "timeout": {
      -                "description": "How long to wait for the captcha to appear (ms). Default 30000. Does not bound the solver itself once a captcha is found.",
      -                "exclusiveMinimum": 0,
      -                "maximum": 9007199254740991,
      -                "type": "integer"
      -              },
      -              "type": {
      -                "description": "Captcha type to solve. Omit to auto-detect.",
      -                "enum": [
      -                  "cloudflare",
      -                  "hcaptcha",
      -                  "recaptcha",
      -                  "recaptchaV3",
      -                  "geetest",
      -                  "normal",
      -                  "friendlyCaptcha",
      -                  "capy",
      -                  "textCaptcha",
      -                  "amazonWaf",
      -                  "dataDome",
      -                  "akamai",
      -                  "lemin",
      -                  "mtcaptcha",
      -                  "slider"
      -                ],
      -                "type": "string"
      -              },
      -              "wait": {
      -                "description": "Wait for the captcha to appear before solving (default true). Set false if you have already verified the widget is on screen.",
      -                "type": "boolean"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "screenshot",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "clip": {
      -                "description": "Region of the page to capture. Mutually exclusive with selector/fullPage.",
      -                "properties": {
      -                  "height": {
      -                    "description": "Height of the clip, in CSS pixels (>0)",
      -                    "minimum": 1,
      -                    "type": "number"
      -                  },
      -                  "scale": {
      -                    "description": "Scale factor of the clip (default 1, >0)",
      -                    "exclusiveMinimum": 0,
      -                    "type": "number"
      -                  },
      -                  "width": {
      -                    "description": "Width of the clip, in CSS pixels (>0)",
      -                    "minimum": 1,
      -                    "type": "number"
      -                  },
      -                  "x": {
      -                    "description": "X coordinate of the top-left corner, in CSS pixels",
      -                    "type": "number"
      -                  },
      -                  "y": {
      -                    "description": "Y coordinate of the top-left corner, in CSS pixels",
      -                    "type": "number"
      -                  }
      -                },
      -                "required": [
      -                  "x",
      -                  "y",
      -                  "width",
      -                  "height"
      -                ],
      -                "type": "object"
      -              },
      -              "fullPage": {
      -                "description": "Capture the entire scrollable page (default false)",
      -                "type": "boolean"
      -              },
      -              "omitBackground": {
      -                "description": "Hide default white background for transparent screenshots",
      -                "type": "boolean"
      -              },
      -              "quality": {
      -                "description": "Image quality 0-100. Applies to jpeg/webp only.",
      -                "maximum": 100,
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "selector": {
      -                "description": "CSS selector of an element to screenshot. Mutually exclusive with fullPage/clip.",
      -                "type": "string"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              },
      -              "toDisk": {
      -                "description": "Save the screenshot to disk instead of returning it inline. You will NOT see the image; the response gives a reusable handle (local path in stdio, single-use GET URL over HTTP) exactly like a download — reuse it with uploadFile or hand it to the user. Use when you only need the file later, not to look at now (see file-transfers).",
      -                "type": "boolean"
      -              },
      -              "type": {
      -                "description": "Image format. Default \"png\". Use \"jpeg\" for smaller payloads on large pages.",
      -                "enum": [
      -                  "jpeg",
      -                  "png",
      -                  "webp"
      -                ],
      -                "type": "string"
      -              },
      -              "waitForImages": {
      -                "description": "Wait for all images on the page to load before capturing",
      -                "type": "boolean"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "uploadFile",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "files": {
      -                "description": "Files to attach. Combined decoded size is capped (server default 10MB, hard max 50MB).",
      -                "items": {
      -                  "properties": {
      -                    "content": {
      -                      "description": "Base64-encoded file content. LAST RESORT — only for tiny data you already hold inline. Do NOT read a file into the conversation, and never split/reassemble base64 by hand: use `path` (stdio) or `handle` so the server moves the bytes.",
      -                      "type": "string"
      -                    },
      -                    "handle": {
      -                      "description": "A download handle from a prior getDownloads (a path in stdio mode, a `browserless-download://` URI in HTTP mode). The MCP server reads the stored file — works in both transports and keeps the bytes out of the conversation. Use this to re-upload a file you just downloaded.",
      -                      "type": "string"
      -                    },
      -                    "mimeType": {
      -                      "description": "MIME type; inferred from the extension when omitted.",
      -                      "type": "string"
      -                    },
      -                    "name": {
      -                      "description": "Filename reported to the page. Defaults to the basename of `path`, else \"file\".",
      -                      "type": "string"
      -                    },
      -                    "path": {
      -                      "description": "Local filesystem path to read and upload. stdio (local) mode only — the MCP server reads and base64-encodes it. In HTTP mode use `handle` or `content` instead.",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "type": "object"
      -                },
      -                "minItems": 1,
      -                "type": "array"
      -              },
      -              "selector": {
      -                "description": "CSS selector of the <input type=\"file\"> element",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector",
      -              "files"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "getDownloads",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {},
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "startRecording",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "height": {
      -                "type": "number"
      -              },
      -              "width": {
      -                "type": "number"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "stopRecording",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {},
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "close",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {},
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      }
      -    ]
      -  },
      -  {
      -    "properties": {
      -      "method": {
      -        "description": "The BQL method name",
      -        "type": "string"
      -      },
      -      "params": {
      -        "additionalProperties": {},
      -        "default": {},
      -        "description": "Parameters for the method",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "method"
      -    ],
      -    "type": "object"
      -  }
      -]
    • addedInput schema / properties / commands / items / properties
      Added value: +{
      +  "method": {
      +    "description": "The BQL method name, e.g. \"goto\", \"click\", \"type\", \"snapshot\", \"screenshot\". See the tool description for the full command list.",
      +    "type": "string"
      +  },
      +  "params": {
      +    "additionalProperties": {},
      +    "description": "Parameters for the method (see the tool description).",
      +    "propertyNames": {
      +      "type": "string"
      +    },
      +    "type": "object"
      +  }
      +}
    • addedInput schema / properties / commands / items / required
      Added value: +[
      +  "method"
      +]
    • addedInput schema / properties / commands / items / type
      Added value: +"object"
  9. Changed4 schema fields changedv1.27.0
    • changedInput schema / properties / commands / items / anyOf
      Previous value: -[
      -  {
      -    "oneOf": [
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "goto",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "timeout": {
      -                "description": "Navigation timeout in milliseconds",
      -                "type": "number"
      -              },
      -              "url": {
      -                "description": "The URL to navigate to",
      -                "type": "string"
      -              },
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"domcontentloaded\". Avoid networkidle0/networkidle2 unless explicitly needed — they hang on SPAs and dynamic sites.",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "url"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "back",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"load\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "forward",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"load\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "reload",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"load\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "snapshot",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "full": {
      -                "description": "Force a complete snapshot instead of a diff. Snapshots normally return only what changed since your previous one; set full:true when you no longer have that previous snapshot in context (e.g. it was summarized away) and need the entire element list again.",
      -                "type": "boolean"
      -              },
      -              "maxElements": {
      -                "description": "Maximum number of elements to return (default 500)",
      -                "exclusiveMinimum": 0,
      -                "maximum": 9007199254740991,
      -                "type": "integer"
      -              },
      -              "targetId": {
      -                "description": "Optional tab targetId to peek at without switching the active tab. Obtain via getTabs or a prior snapshot response. Omit to snapshot the active tab.",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "getTabs",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {},
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "switchTab",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "targetId": {
      -                "description": "The targetId of the tab to make active (from getTabs).",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "targetId"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "createTab",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "activate": {
      -                "description": "If true (default), switch to the new tab. If false, open it in the background and leave the current tab active.",
      -                "type": "boolean"
      -              },
      -              "url": {
      -                "description": "URL to open in the new tab. Defaults to about:blank if omitted.",
      -                "type": "string"
      -              },
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Only applies when activate is true. Defaults to \"domcontentloaded\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "closeTab",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "targetId": {
      -                "description": "The targetId of the tab to close.",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "targetId"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "click",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the element to click",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "type",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the input element",
      -                "type": "string"
      -              },
      -              "text": {
      -                "description": "Text to type into the element",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector",
      -              "text"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "loadSecret",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "ref": {
      -                "description": "The credential reference/alias to inject (e.g. an op:// reference). The secret value is resolved server-side and typed into the field — you never see it. Use this for ALL passwords and usernames from a secrets vault; never put a secret value in `type`. Also accepts a mail://<item>/otp reference that resolves the newest emailed one-time code server-side (value never surfaced); trigger the send, then call loadSecret promptly.",
      -                "type": "string"
      -              },
      -              "selector": {
      -                "description": "CSS selector of the input to fill. If omitted, the secret is injected into the currently focused element (click/focus the field first).",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "ref"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "select",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the select element",
      -                "type": "string"
      -              },
      -              "value": {
      -                "description": "Option value to select. The snapshot lists a select's accepted values as options=[label=value, …] (bare entries have label === value) — take the value from there instead of guessing or reading the DOM with evaluate.",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector",
      -              "value"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "checkbox",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "checked": {
      -                "description": "Desired checked state (default: toggle)",
      -                "type": "boolean"
      -              },
      -              "selector": {
      -                "description": "CSS selector of the checkbox element",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "hover",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the element to hover over",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "scroll",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "direction": {
      -                "description": "Scroll direction. Defaults to \"down\".",
      -                "enum": [
      -                  "up",
      -                  "down",
      -                  "left",
      -                  "right"
      -                ],
      -                "type": "string"
      -              },
      -              "selector": {
      -                "description": "CSS selector of element to scroll (omit for page scroll)",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "evaluate",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "content": {
      -                "description": "JavaScript code to execute (use IIFE syntax)",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "content"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "text",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector to extract text from",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "html",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector to get HTML from",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForSelector",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector to wait for",
      -                "type": "string"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (recommend 5000-10000)",
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForNavigation",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForTimeout",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "time": {
      -                "description": "Time to wait in milliseconds (e.g., 3000 for 3 seconds)",
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "time"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForRequest",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "method": {
      -                "description": "HTTP method to match (e.g., \"GET\", \"POST\")",
      -                "type": "string"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              },
      -              "url": {
      -                "description": "URL pattern to match (glob-style, e.g., \"*api/results*\")",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForResponse",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "statuses": {
      -                "description": "HTTP status codes to match (e.g., [200, 201])",
      -                "items": {
      -                  "type": "number"
      -                },
      -                "type": "array"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              },
      -              "url": {
      -                "description": "URL pattern to match (glob-style, e.g., \"*api/results*\")",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "liveURL",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "interactable": {
      -                "description": "Allow interaction via the live URL",
      -                "type": "boolean"
      -              },
      -              "quality": {
      -                "description": "Image quality (1-100)",
      -                "maximum": 100,
      -                "minimum": 1,
      -                "type": "integer"
      -              },
      -              "resizable": {
      -                "description": "Allow resizing the browser viewport",
      -                "type": "boolean"
      -              },
      -              "timeout": {
      -                "description": "How long the live URL stays active (ms)",
      -                "type": "number"
      -              },
      -              "type": {
      -                "description": "Image format for the stream",
      -                "enum": [
      -                  "jpeg",
      -                  "png"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "solve",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "timeout": {
      -                "description": "How long to wait for the captcha to appear (ms). Default 30000. Does not bound the solver itself once a captcha is found.",
      -                "exclusiveMinimum": 0,
      -                "maximum": 9007199254740991,
      -                "type": "integer"
      -              },
      -              "type": {
      -                "description": "Captcha type to solve. Omit to auto-detect.",
      -                "enum": [
      -                  "cloudflare",
      -                  "hcaptcha",
      -                  "recaptcha",
      -                  "recaptchaV3",
      -                  "geetest",
      -                  "normal",
      -                  "friendlyCaptcha",
      -                  "capy",
      -                  "textCaptcha",
      -                  "amazonWaf",
      -                  "dataDome",
      -                  "akamai",
      -                  "lemin",
      -                  "mtcaptcha",
      -                  "slider"
      -                ],
      -                "type": "string"
      -              },
      -              "wait": {
      -                "description": "Wait for the captcha to appear before solving (default true). Set false if you have already verified the widget is on screen.",
      -                "type": "boolean"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "screenshot",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "clip": {
      -                "description": "Region of the page to capture. Mutually exclusive with selector/fullPage.",
      -                "properties": {
      -                  "height": {
      -                    "description": "Height of the clip, in CSS pixels (>0)",
      -                    "minimum": 1,
      -                    "type": "number"
      -                  },
      -                  "scale": {
      -                    "description": "Scale factor of the clip (default 1, >0)",
      -                    "exclusiveMinimum": 0,
      -                    "type": "number"
      -                  },
      -                  "width": {
      -                    "description": "Width of the clip, in CSS pixels (>0)",
      -                    "minimum": 1,
      -                    "type": "number"
      -                  },
      -                  "x": {
      -                    "description": "X coordinate of the top-left corner, in CSS pixels",
      -                    "type": "number"
      -                  },
      -                  "y": {
      -                    "description": "Y coordinate of the top-left corner, in CSS pixels",
      -                    "type": "number"
      -                  }
      -                },
      -                "required": [
      -                  "x",
      -                  "y",
      -                  "width",
      -                  "height"
      -                ],
      -                "type": "object"
      -              },
      -              "fullPage": {
      -                "description": "Capture the entire scrollable page (default false)",
      -                "type": "boolean"
      -              },
      -              "omitBackground": {
      -                "description": "Hide default white background for transparent screenshots",
      -                "type": "boolean"
      -              },
      -              "quality": {
      -                "description": "Image quality 0-100. Applies to jpeg/webp only.",
      -                "maximum": 100,
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "selector": {
      -                "description": "CSS selector of an element to screenshot. Mutually exclusive with fullPage/clip.",
      -                "type": "string"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              },
      -              "toDisk": {
      -                "description": "Save the screenshot to disk instead of returning it inline. You will NOT see the image; the response gives a reusable handle (local path in stdio, single-use GET URL over HTTP) exactly like a download — reuse it with uploadFile or hand it to the user. Use when you only need the file later, not to look at now (see file-transfers).",
      -                "type": "boolean"
      -              },
      -              "type": {
      -                "description": "Image format. Default \"png\". Use \"jpeg\" for smaller payloads on large pages.",
      -                "enum": [
      -                  "jpeg",
      -                  "png",
      -                  "webp"
      -                ],
      -                "type": "string"
      -              },
      -              "waitForImages": {
      -                "description": "Wait for all images on the page to load before capturing",
      -                "type": "boolean"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "uploadFile",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "files": {
      -                "description": "Files to attach. Combined decoded size is capped (server default 10MB, hard max 50MB).",
      -                "items": {
      -                  "properties": {
      -                    "content": {
      -                      "description": "Base64-encoded file content. LAST RESORT — only for tiny data you already hold inline. Do NOT read a file into the conversation, and never split/reassemble base64 by hand: use `path` (stdio) or `handle` so the server moves the bytes.",
      -                      "type": "string"
      -                    },
      -                    "handle": {
      -                      "description": "A download handle from a prior getDownloads (a path in stdio mode, a `browserless-download://` URI in HTTP mode). The MCP server reads the stored file — works in both transports and keeps the bytes out of the conversation. Use this to re-upload a file you just downloaded.",
      -                      "type": "string"
      -                    },
      -                    "mimeType": {
      -                      "description": "MIME type; inferred from the extension when omitted.",
      -                      "type": "string"
      -                    },
      -                    "name": {
      -                      "description": "Filename reported to the page. Defaults to the basename of `path`, else \"file\".",
      -                      "type": "string"
      -                    },
      -                    "path": {
      -                      "description": "Local filesystem path to read and upload. stdio (local) mode only — the MCP server reads and base64-encodes it. In HTTP mode use `handle` or `content` instead.",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "type": "object"
      -                },
      -                "minItems": 1,
      -                "type": "array"
      -              },
      -              "selector": {
      -                "description": "CSS selector of the <input type=\"file\"> element",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector",
      -              "files"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "getDownloads",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {},
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "close",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {},
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      }
      -    ]
      -  },
      -  {
      -    "properties": {
      -      "method": {
      -        "description": "The BQL method name",
      -        "type": "string"
      -      },
      -      "params": {
      -        "additionalProperties": {},
      -        "default": {},
      -        "description": "Parameters for the method",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "method"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "oneOf": [
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "goto",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "timeout": {
      +                "description": "Navigation timeout in milliseconds",
      +                "type": "number"
      +              },
      +              "url": {
      +                "description": "The URL to navigate to",
      +                "type": "string"
      +              },
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Defaults to \"domcontentloaded\". Avoid networkidle0/networkidle2 unless explicitly needed — they hang on SPAs and dynamic sites.",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "url"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "back",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Defaults to \"load\".",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "forward",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Defaults to \"load\".",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "reload",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Defaults to \"load\".",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "snapshot",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "full": {
      +                "description": "Force a complete snapshot instead of a diff. Snapshots normally return only what changed since your previous one; set full:true when you no longer have that previous snapshot in context (e.g. it was summarized away) and need the entire element list again.",
      +                "type": "boolean"
      +              },
      +              "maxElements": {
      +                "description": "Maximum number of elements to return (default 500)",
      +                "exclusiveMinimum": 0,
      +                "maximum": 9007199254740991,
      +                "type": "integer"
      +              },
      +              "targetId": {
      +                "description": "Optional tab targetId to peek at without switching the active tab. Obtain via getTabs or a prior snapshot response. Omit to snapshot the active tab.",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "getTabs",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {},
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "switchTab",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "targetId": {
      +                "description": "The targetId of the tab to make active (from getTabs).",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "targetId"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "createTab",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "activate": {
      +                "description": "If true (default), switch to the new tab. If false, open it in the background and leave the current tab active.",
      +                "type": "boolean"
      +              },
      +              "url": {
      +                "description": "URL to open in the new tab. Defaults to about:blank if omitted.",
      +                "type": "string"
      +              },
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Only applies when activate is true. Defaults to \"domcontentloaded\".",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "closeTab",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "targetId": {
      +                "description": "The targetId of the tab to close.",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "targetId"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "click",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector of the element to click. Omit when clicking by coordinate (x/y).",
      +                "type": "string"
      +              },
      +              "x": {
      +                "description": "Vision fallback: raw screenshot-pixel X to click. Read it off a viewport (non-fullPage) screenshot and pass it as-is — the server maps screenshot pixels to the page. Provide x and y together, without selector.",
      +                "type": "number"
      +              },
      +              "y": {
      +                "description": "Vision fallback: raw screenshot-pixel Y to click. See x.",
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "type",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector of the input element",
      +                "type": "string"
      +              },
      +              "text": {
      +                "description": "Text to type into the element",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector",
      +              "text"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "loadSecret",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "ref": {
      +                "description": "The credential reference/alias to inject (e.g. an op:// reference). The secret value is resolved server-side and typed into the field — you never see it. Use this for ALL passwords and usernames from a secrets vault; never put a secret value in `type`. Also accepts a mail://<item>/otp reference that resolves the newest emailed one-time code server-side (value never surfaced); trigger the send, then call loadSecret promptly.",
      +                "type": "string"
      +              },
      +              "selector": {
      +                "description": "CSS selector of the input to fill. If omitted, the secret is injected into the currently focused element (click/focus the field first).",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "ref"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "clearSecrets",
      +            "description": "Re-enable screenshot, PDF, liveURL, and page-content-read captures (evaluate/html/text/querySelector/cookies) after a loadSecret login once the credential is no longer visible. Required for single-page apps that do not navigate; replay remains masked.",
      +            "type": "string"
      +          },
      +          "params": {
      +            "additionalProperties": false,
      +            "default": {},
      +            "properties": {},
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "select",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector of the select element",
      +                "type": "string"
      +              },
      +              "value": {
      +                "description": "Option value to select. The snapshot lists a select's accepted values as options=[label=value, …] (bare entries have label === value) — take the value from there instead of guessing or reading the DOM with evaluate.",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector",
      +              "value"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "checkbox",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "checked": {
      +                "description": "Desired checked state (default: toggle)",
      +                "type": "boolean"
      +              },
      +              "selector": {
      +                "description": "CSS selector of the checkbox element",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "hover",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector of the element to hover over",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "scroll",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "direction": {
      +                "description": "Scroll direction. Defaults to \"down\".",
      +                "enum": [
      +                  "up",
      +                  "down",
      +                  "left",
      +                  "right"
      +                ],
      +                "type": "string"
      +              },
      +              "selector": {
      +                "description": "CSS selector of element to scroll (omit for page scroll)",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "evaluate",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "content": {
      +                "description": "JavaScript code to execute (use IIFE syntax)",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "content"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "text",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector to extract text from",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "html",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector to get HTML from",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForSelector",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector to wait for",
      +                "type": "string"
      +              },
      +              "timeout": {
      +                "description": "Timeout in milliseconds (recommend 5000-10000)",
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "selector"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForNavigation",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "timeout": {
      +                "description": "Timeout in milliseconds (default 30000)",
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForTimeout",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "time": {
      +                "description": "Time to wait in milliseconds (e.g., 3000 for 3 seconds)",
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "time"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForRequest",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "method": {
      +                "description": "HTTP method to match (e.g., \"GET\", \"POST\")",
      +                "type": "string"
      +              },
      +              "timeout": {
      +                "description": "Timeout in milliseconds (default 30000)",
      +                "type": "number"
      +              },
      +              "url": {
      +                "description": "URL pattern to match (glob-style, e.g., \"*api/results*\")",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForResponse",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "statuses": {
      +                "description": "HTTP status codes to match (e.g., [200, 201])",
      +                "items": {
      +                  "type": "number"
      +                },
      +                "type": "array"
      +              },
      +              "timeout": {
      +                "description": "Timeout in milliseconds (default 30000)",
      +                "type": "number"
      +              },
      +              "url": {
      +                "description": "URL pattern to match (glob-style, e.g., \"*api/results*\")",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "liveURL",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "interactable": {
      +                "description": "Allow interaction via the live URL",
      +                "type": "boolean"
      +              },
      +              "quality": {
      +                "description": "Image quality (1-100)",
      +                "maximum": 100,
      +                "minimum": 1,
      +                "type": "integer"
      +              },
      +              "resizable": {
      +                "description": "Allow resizing the browser viewport",
      +                "type": "boolean"
      +              },
      +              "timeout": {
      +                "description": "How long the live URL stays active (ms)",
      +                "type": "number"
      +              },
      +              "type": {
      +                "description": "Image format for the stream",
      +                "enum": [
      +                  "jpeg",
      +                  "png"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "solve",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "timeout": {
      +                "description": "How long to wait for the captcha to appear (ms). Default 30000. Does not bound the solver itself once a captcha is found.",
      +                "exclusiveMinimum": 0,
      +                "maximum": 9007199254740991,
      +                "type": "integer"
      +              },
      +              "type": {
      +                "description": "Captcha type to solve. Omit to auto-detect.",
      +                "enum": [
      +                  "cloudflare",
      +                  "hcaptcha",
      +                  "recaptcha",
      +                  "recaptchaV3",
      +                  "geetest",
      +                  "normal",
      +                  "friendlyCaptcha",
      +                  "capy",
      +                  "textCaptcha",
      +                  "amazonWaf",
      +                  "dataDome",
      +                  "akamai",
      +                  "lemin",
      +                  "mtcaptcha",
      +                  "slider"
      +                ],
      +                "type": "string"
      +              },
      +              "wait": {
      +                "description": "Wait for the captcha to appear before solving (default true). Set false if you have already verified the widget is on screen.",
      +                "type": "boolean"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "screenshot",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "clip": {
      +                "description": "Region of the page to capture. Mutually exclusive with selector/fullPage.",
      +                "properties": {
      +                  "height": {
      +                    "description": "Height of the clip, in CSS pixels (>0)",
      +                    "minimum": 1,
      +                    "type": "number"
      +                  },
      +                  "scale": {
      +                    "description": "Scale factor of the clip (default 1, >0)",
      +                    "exclusiveMinimum": 0,
      +                    "type": "number"
      +                  },
      +                  "width": {
      +                    "description": "Width of the clip, in CSS pixels (>0)",
      +                    "minimum": 1,
      +                    "type": "number"
      +                  },
      +                  "x": {
      +                    "description": "X coordinate of the top-left corner, in CSS pixels",
      +                    "type": "number"
      +                  },
      +                  "y": {
      +                    "description": "Y coordinate of the top-left corner, in CSS pixels",
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "x",
      +                  "y",
      +                  "width",
      +                  "height"
      +                ],
      +                "type": "object"
      +              },
      +              "fullPage": {
      +                "description": "Capture the entire scrollable page (default false)",
      +                "type": "boolean"
      +              },
      +              "omitBackground": {
      +                "description": "Hide default white background for transparent screenshots",
      +                "type": "boolean"
      +              },
      +              "quality": {
      +                "description": "Image quality 0-100. Applies to jpeg/webp only.",
      +                "maximum": 100,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "selector": {
      +                "description": "CSS selector of an element to screenshot. Mutually exclusive with fullPage/clip.",
      +                "type": "string"
      +              },
      +              "timeout": {
      +                "description": "Timeout in milliseconds (default 30000)",
      +                "type": "number"
      +              },
      +              "toDisk": {
      +                "description": "Save the screenshot to disk instead of returning it inline. You will NOT see the image; the response gives a reusable handle (local path in stdio, single-use GET URL over HTTP) exactly like a download — reuse it with uploadFile or hand it to the user. Use when you only need the file later, not to look at now (see file-transfers).",
      +                "type": "boolean"
      +              },
      +              "type": {
      +                "description": "Image format. Default \"png\". Use \"jpeg\" for smaller payloads on large pages.",
      +                "enum": [
      +                  "jpeg",
      +                  "png",
      +                  "webp"
      +                ],
      +                "type": "string"
      +              },
      +              "waitForImages": {
      +                "description": "Wait for all images on the page to load before capturing",
      +                "type": "boolean"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "uploadFile",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "files": {
      +                "description": "Files to attach. Combined decoded size is capped (server default 10MB, hard max 50MB).",
      +                "items": {
      +                  "properties": {
      +                    "content": {
      +                      "description": "Base64-encoded file content. LAST RESORT — only for tiny data you already hold inline. Do NOT read a file into the conversation, and never split/reassemble base64 by hand: use `path` (stdio) or `handle` so the server moves the bytes.",
      +                      "type": "string"
      +                    },
      +                    "handle": {
      +                      "description": "A download handle from a prior getDownloads (a path in stdio mode, a `browserless-download://` URI in HTTP mode). The MCP server reads the stored file — works in both transports and keeps the bytes out of the conversation. Use this to re-upload a file you just downloaded.",
      +                      "type": "string"
      +                    },
      +                    "mimeType": {
      +                      "description": "MIME type; inferred from the extension when omitted.",
      +                      "type": "string"
      +                    },
      +                    "name": {
      +                      "description": "Filename reported to the page. Defaults to the basename of `path`, else \"file\".",
      +                      "type": "string"
      +                    },
      +                    "path": {
      +                      "description": "Local filesystem path to read and upload. stdio (local) mode only — the MCP server reads and base64-encodes it. In HTTP mode use `handle` or `content` instead.",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "type": "object"
      +                },
      +                "minItems": 1,
      +                "type": "array"
      +              },
      +              "selector": {
      +                "description": "CSS selector of the <input type=\"file\"> element",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector",
      +              "files"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "getDownloads",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {},
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "startRecording",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "height": {
      +                "type": "number"
      +              },
      +              "width": {
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "stopRecording",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {},
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "close",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {},
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  {
      +    "properties": {
      +      "method": {
      +        "description": "The BQL method name",
      +        "type": "string"
      +      },
      +      "params": {
      +        "additionalProperties": {},
      +        "default": {},
      +        "description": "Parameters for the method",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "method"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / humanlike
      Added value: +{
      +  "description": "Human-like cursor movement + pacing for clicks/scrolls. Improves the passive score of invisible anti-bot challenges (which weight real mouse/interaction signals). Defaults on. Forwarded as ?humanlike; read once at session creation.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / os
      Added value: +{
      +  "description": "Desktop OS to spoof for the stealth fingerprint (navigator.platform, UA, UA-CH client hints, GPU/font signals). Defaults to \"windows\" so the agent presents a coherent, low-risk desktop identity instead of its native Linux (a Chrome-masked UA over \"Linux x86_64\" is a bot tell that anti-bot checks flag). Forwarded to the browser as ?emulationOs; read once at session creation.",
      +  "enum": [
      +    "windows",
      +    "macos",
      +    "linux"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / record
      Added value: +{
      +  "description": "Arm screen-video recording at session launch. Use `startRecording` / `stopRecording`; stopping returns a single-use WebM link, never bytes.",
      +  "type": "boolean"
      +}
  10. Changed3 schema fields changedv1.24.0
    • addedInput schema / properties / allowedDomains
      Added value: +{
      +  "description": "Origins where a resolved secret may be filled, e.g. [\"https://gymshark.com\"]. Only meaningful with `integrationId`. Defaults to the integration's configured origins; set it to fill on additional sites. loadSecret is refused on any origin not covered here.",
      +  "items": {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / commands / items / anyOf
      Previous value: -[
      -  {
      -    "oneOf": [
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "goto",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "timeout": {
      -                "description": "Navigation timeout in milliseconds",
      -                "type": "number"
      -              },
      -              "url": {
      -                "description": "The URL to navigate to",
      -                "type": "string"
      -              },
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"domcontentloaded\". Avoid networkidle0/networkidle2 unless explicitly needed — they hang on SPAs and dynamic sites.",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "url"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "back",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"load\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "forward",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"load\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "reload",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"load\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "snapshot",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "full": {
      -                "description": "Force a complete snapshot instead of a diff. Snapshots normally return only what changed since your previous one; set full:true when you no longer have that previous snapshot in context (e.g. it was summarized away) and need the entire element list again.",
      -                "type": "boolean"
      -              },
      -              "maxElements": {
      -                "description": "Maximum number of elements to return (default 500)",
      -                "exclusiveMinimum": 0,
      -                "maximum": 9007199254740991,
      -                "type": "integer"
      -              },
      -              "targetId": {
      -                "description": "Optional tab targetId to peek at without switching the active tab. Obtain via getTabs or a prior snapshot response. Omit to snapshot the active tab.",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "getTabs",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {},
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "switchTab",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "targetId": {
      -                "description": "The targetId of the tab to make active (from getTabs).",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "targetId"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "createTab",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "activate": {
      -                "description": "If true (default), switch to the new tab. If false, open it in the background and leave the current tab active.",
      -                "type": "boolean"
      -              },
      -              "url": {
      -                "description": "URL to open in the new tab. Defaults to about:blank if omitted.",
      -                "type": "string"
      -              },
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Only applies when activate is true. Defaults to \"domcontentloaded\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "closeTab",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "targetId": {
      -                "description": "The targetId of the tab to close.",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "targetId"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "click",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the element to click",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "type",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the input element",
      -                "type": "string"
      -              },
      -              "text": {
      -                "description": "Text to type into the element",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector",
      -              "text"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "loadSecret",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "ref": {
      -                "description": "The credential reference/alias to inject (e.g. an op:// reference). The secret value is resolved server-side and typed into the field — you never see it. Use this for ALL passwords and usernames from a secrets vault; never put a secret value in `type`.",
      -                "type": "string"
      -              },
      -              "selector": {
      -                "description": "CSS selector of the input to fill. If omitted, the secret is injected into the currently focused element (click/focus the field first).",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "ref"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "select",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the select element",
      -                "type": "string"
      -              },
      -              "value": {
      -                "description": "Option value to select. The snapshot lists a select's accepted values as options=[label=value, …] (bare entries have label === value) — take the value from there instead of guessing or reading the DOM with evaluate.",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector",
      -              "value"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "checkbox",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "checked": {
      -                "description": "Desired checked state (default: toggle)",
      -                "type": "boolean"
      -              },
      -              "selector": {
      -                "description": "CSS selector of the checkbox element",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "hover",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the element to hover over",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "scroll",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "direction": {
      -                "description": "Scroll direction. Defaults to \"down\".",
      -                "enum": [
      -                  "up",
      -                  "down",
      -                  "left",
      -                  "right"
      -                ],
      -                "type": "string"
      -              },
      -              "selector": {
      -                "description": "CSS selector of element to scroll (omit for page scroll)",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "evaluate",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "content": {
      -                "description": "JavaScript code to execute (use IIFE syntax)",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "content"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "text",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector to extract text from",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "html",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector to get HTML from",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForSelector",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector to wait for",
      -                "type": "string"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (recommend 5000-10000)",
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForNavigation",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForTimeout",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "time": {
      -                "description": "Time to wait in milliseconds (e.g., 3000 for 3 seconds)",
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "time"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForRequest",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "method": {
      -                "description": "HTTP method to match (e.g., \"GET\", \"POST\")",
      -                "type": "string"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              },
      -              "url": {
      -                "description": "URL pattern to match (glob-style, e.g., \"*api/results*\")",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForResponse",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "statuses": {
      -                "description": "HTTP status codes to match (e.g., [200, 201])",
      -                "items": {
      -                  "type": "number"
      -                },
      -                "type": "array"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              },
      -              "url": {
      -                "description": "URL pattern to match (glob-style, e.g., \"*api/results*\")",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "liveURL",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "interactable": {
      -                "description": "Allow interaction via the live URL",
      -                "type": "boolean"
      -              },
      -              "quality": {
      -                "description": "Image quality (1-100)",
      -                "maximum": 100,
      -                "minimum": 1,
      -                "type": "integer"
      -              },
      -              "resizable": {
      -                "description": "Allow resizing the browser viewport",
      -                "type": "boolean"
      -              },
      -              "timeout": {
      -                "description": "How long the live URL stays active (ms)",
      -                "type": "number"
      -              },
      -              "type": {
      -                "description": "Image format for the stream",
      -                "enum": [
      -                  "jpeg",
      -                  "png"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "solve",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "timeout": {
      -                "description": "How long to wait for the captcha to appear (ms). Default 30000. Does not bound the solver itself once a captcha is found.",
      -                "exclusiveMinimum": 0,
      -                "maximum": 9007199254740991,
      -                "type": "integer"
      -              },
      -              "type": {
      -                "description": "Captcha type to solve. Omit to auto-detect.",
      -                "enum": [
      -                  "cloudflare",
      -                  "hcaptcha",
      -                  "recaptcha",
      -                  "recaptchaV3",
      -                  "geetest",
      -                  "normal",
      -                  "friendlyCaptcha",
      -                  "capy",
      -                  "textCaptcha",
      -                  "amazonWaf",
      -                  "dataDome",
      -                  "akamai",
      -                  "lemin",
      -                  "mtcaptcha",
      -                  "slider"
      -                ],
      -                "type": "string"
      -              },
      -              "wait": {
      -                "description": "Wait for the captcha to appear before solving (default true). Set false if you have already verified the widget is on screen.",
      -                "type": "boolean"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "screenshot",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "clip": {
      -                "description": "Region of the page to capture. Mutually exclusive with selector/fullPage.",
      -                "properties": {
      -                  "height": {
      -                    "description": "Height of the clip, in CSS pixels (>0)",
      -                    "minimum": 1,
      -                    "type": "number"
      -                  },
      -                  "scale": {
      -                    "description": "Scale factor of the clip (default 1, >0)",
      -                    "exclusiveMinimum": 0,
      -                    "type": "number"
      -                  },
      -                  "width": {
      -                    "description": "Width of the clip, in CSS pixels (>0)",
      -                    "minimum": 1,
      -                    "type": "number"
      -                  },
      -                  "x": {
      -                    "description": "X coordinate of the top-left corner, in CSS pixels",
      -                    "type": "number"
      -                  },
      -                  "y": {
      -                    "description": "Y coordinate of the top-left corner, in CSS pixels",
      -                    "type": "number"
      -                  }
      -                },
      -                "required": [
      -                  "x",
      -                  "y",
      -                  "width",
      -                  "height"
      -                ],
      -                "type": "object"
      -              },
      -              "fullPage": {
      -                "description": "Capture the entire scrollable page (default false)",
      -                "type": "boolean"
      -              },
      -              "omitBackground": {
      -                "description": "Hide default white background for transparent screenshots",
      -                "type": "boolean"
      -              },
      -              "quality": {
      -                "description": "Image quality 0-100. Applies to jpeg/webp only.",
      -                "maximum": 100,
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "selector": {
      -                "description": "CSS selector of an element to screenshot. Mutually exclusive with fullPage/clip.",
      -                "type": "string"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              },
      -              "toDisk": {
      -                "description": "Save the screenshot to disk instead of returning it inline. You will NOT see the image; the response gives a reusable handle (local path in stdio, single-use GET URL over HTTP) exactly like a download — reuse it with uploadFile or hand it to the user. Use when you only need the file later, not to look at now (see file-transfers).",
      -                "type": "boolean"
      -              },
      -              "type": {
      -                "description": "Image format. Default \"png\". Use \"jpeg\" for smaller payloads on large pages.",
      -                "enum": [
      -                  "jpeg",
      -                  "png",
      -                  "webp"
      -                ],
      -                "type": "string"
      -              },
      -              "waitForImages": {
      -                "description": "Wait for all images on the page to load before capturing",
      -                "type": "boolean"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "uploadFile",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "files": {
      -                "description": "Files to attach. Combined decoded size is capped (server default 10MB, hard max 50MB).",
      -                "items": {
      -                  "properties": {
      -                    "content": {
      -                      "description": "Base64-encoded file content. LAST RESORT — only for tiny data you already hold inline. Do NOT read a file into the conversation, and never split/reassemble base64 by hand: use `path` (stdio) or `handle` so the server moves the bytes.",
      -                      "type": "string"
      -                    },
      -                    "handle": {
      -                      "description": "A download handle from a prior getDownloads (a path in stdio mode, a `browserless-download://` URI in HTTP mode). The MCP server reads the stored file — works in both transports and keeps the bytes out of the conversation. Use this to re-upload a file you just downloaded.",
      -                      "type": "string"
      -                    },
      -                    "mimeType": {
      -                      "description": "MIME type; inferred from the extension when omitted.",
      -                      "type": "string"
      -                    },
      -                    "name": {
      -                      "description": "Filename reported to the page. Defaults to the basename of `path`, else \"file\".",
      -                      "type": "string"
      -                    },
      -                    "path": {
      -                      "description": "Local filesystem path to read and upload. stdio (local) mode only — the MCP server reads and base64-encodes it. In HTTP mode use `handle` or `content` instead.",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "type": "object"
      -                },
      -                "minItems": 1,
      -                "type": "array"
      -              },
      -              "selector": {
      -                "description": "CSS selector of the <input type=\"file\"> element",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector",
      -              "files"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "getDownloads",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {},
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "close",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {},
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      }
      -    ]
      -  },
      -  {
      -    "properties": {
      -      "method": {
      -        "description": "The BQL method name",
      -        "type": "string"
      -      },
      -      "params": {
      -        "additionalProperties": {},
      -        "default": {},
      -        "description": "Parameters for the method",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "method"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "oneOf": [
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "goto",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "timeout": {
      +                "description": "Navigation timeout in milliseconds",
      +                "type": "number"
      +              },
      +              "url": {
      +                "description": "The URL to navigate to",
      +                "type": "string"
      +              },
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Defaults to \"domcontentloaded\". Avoid networkidle0/networkidle2 unless explicitly needed — they hang on SPAs and dynamic sites.",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "url"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "back",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Defaults to \"load\".",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "forward",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Defaults to \"load\".",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "reload",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Defaults to \"load\".",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "snapshot",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "full": {
      +                "description": "Force a complete snapshot instead of a diff. Snapshots normally return only what changed since your previous one; set full:true when you no longer have that previous snapshot in context (e.g. it was summarized away) and need the entire element list again.",
      +                "type": "boolean"
      +              },
      +              "maxElements": {
      +                "description": "Maximum number of elements to return (default 500)",
      +                "exclusiveMinimum": 0,
      +                "maximum": 9007199254740991,
      +                "type": "integer"
      +              },
      +              "targetId": {
      +                "description": "Optional tab targetId to peek at without switching the active tab. Obtain via getTabs or a prior snapshot response. Omit to snapshot the active tab.",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "getTabs",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {},
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "switchTab",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "targetId": {
      +                "description": "The targetId of the tab to make active (from getTabs).",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "targetId"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "createTab",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "activate": {
      +                "description": "If true (default), switch to the new tab. If false, open it in the background and leave the current tab active.",
      +                "type": "boolean"
      +              },
      +              "url": {
      +                "description": "URL to open in the new tab. Defaults to about:blank if omitted.",
      +                "type": "string"
      +              },
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Only applies when activate is true. Defaults to \"domcontentloaded\".",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "closeTab",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "targetId": {
      +                "description": "The targetId of the tab to close.",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "targetId"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "click",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector of the element to click",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "type",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector of the input element",
      +                "type": "string"
      +              },
      +              "text": {
      +                "description": "Text to type into the element",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector",
      +              "text"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "loadSecret",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "ref": {
      +                "description": "The credential reference/alias to inject (e.g. an op:// reference). The secret value is resolved server-side and typed into the field — you never see it. Use this for ALL passwords and usernames from a secrets vault; never put a secret value in `type`. Also accepts a mail://<item>/otp reference that resolves the newest emailed one-time code server-side (value never surfaced); trigger the send, then call loadSecret promptly.",
      +                "type": "string"
      +              },
      +              "selector": {
      +                "description": "CSS selector of the input to fill. If omitted, the secret is injected into the currently focused element (click/focus the field first).",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "ref"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "select",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector of the select element",
      +                "type": "string"
      +              },
      +              "value": {
      +                "description": "Option value to select. The snapshot lists a select's accepted values as options=[label=value, …] (bare entries have label === value) — take the value from there instead of guessing or reading the DOM with evaluate.",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector",
      +              "value"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "checkbox",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "checked": {
      +                "description": "Desired checked state (default: toggle)",
      +                "type": "boolean"
      +              },
      +              "selector": {
      +                "description": "CSS selector of the checkbox element",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "hover",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector of the element to hover over",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "scroll",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "direction": {
      +                "description": "Scroll direction. Defaults to \"down\".",
      +                "enum": [
      +                  "up",
      +                  "down",
      +                  "left",
      +                  "right"
      +                ],
      +                "type": "string"
      +              },
      +              "selector": {
      +                "description": "CSS selector of element to scroll (omit for page scroll)",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "evaluate",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "content": {
      +                "description": "JavaScript code to execute (use IIFE syntax)",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "content"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "text",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector to extract text from",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "html",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector to get HTML from",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForSelector",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector to wait for",
      +                "type": "string"
      +              },
      +              "timeout": {
      +                "description": "Timeout in milliseconds (recommend 5000-10000)",
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "selector"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForNavigation",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "timeout": {
      +                "description": "Timeout in milliseconds (default 30000)",
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForTimeout",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "time": {
      +                "description": "Time to wait in milliseconds (e.g., 3000 for 3 seconds)",
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "time"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForRequest",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "method": {
      +                "description": "HTTP method to match (e.g., \"GET\", \"POST\")",
      +                "type": "string"
      +              },
      +              "timeout": {
      +                "description": "Timeout in milliseconds (default 30000)",
      +                "type": "number"
      +              },
      +              "url": {
      +                "description": "URL pattern to match (glob-style, e.g., \"*api/results*\")",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForResponse",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "statuses": {
      +                "description": "HTTP status codes to match (e.g., [200, 201])",
      +                "items": {
      +                  "type": "number"
      +                },
      +                "type": "array"
      +              },
      +              "timeout": {
      +                "description": "Timeout in milliseconds (default 30000)",
      +                "type": "number"
      +              },
      +              "url": {
      +                "description": "URL pattern to match (glob-style, e.g., \"*api/results*\")",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "liveURL",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "interactable": {
      +                "description": "Allow interaction via the live URL",
      +                "type": "boolean"
      +              },
      +              "quality": {
      +                "description": "Image quality (1-100)",
      +                "maximum": 100,
      +                "minimum": 1,
      +                "type": "integer"
      +              },
      +              "resizable": {
      +                "description": "Allow resizing the browser viewport",
      +                "type": "boolean"
      +              },
      +              "timeout": {
      +                "description": "How long the live URL stays active (ms)",
      +                "type": "number"
      +              },
      +              "type": {
      +                "description": "Image format for the stream",
      +                "enum": [
      +                  "jpeg",
      +                  "png"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "solve",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "timeout": {
      +                "description": "How long to wait for the captcha to appear (ms). Default 30000. Does not bound the solver itself once a captcha is found.",
      +                "exclusiveMinimum": 0,
      +                "maximum": 9007199254740991,
      +                "type": "integer"
      +              },
      +              "type": {
      +                "description": "Captcha type to solve. Omit to auto-detect.",
      +                "enum": [
      +                  "cloudflare",
      +                  "hcaptcha",
      +                  "recaptcha",
      +                  "recaptchaV3",
      +                  "geetest",
      +                  "normal",
      +                  "friendlyCaptcha",
      +                  "capy",
      +                  "textCaptcha",
      +                  "amazonWaf",
      +                  "dataDome",
      +                  "akamai",
      +                  "lemin",
      +                  "mtcaptcha",
      +                  "slider"
      +                ],
      +                "type": "string"
      +              },
      +              "wait": {
      +                "description": "Wait for the captcha to appear before solving (default true). Set false if you have already verified the widget is on screen.",
      +                "type": "boolean"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "screenshot",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "clip": {
      +                "description": "Region of the page to capture. Mutually exclusive with selector/fullPage.",
      +                "properties": {
      +                  "height": {
      +                    "description": "Height of the clip, in CSS pixels (>0)",
      +                    "minimum": 1,
      +                    "type": "number"
      +                  },
      +                  "scale": {
      +                    "description": "Scale factor of the clip (default 1, >0)",
      +                    "exclusiveMinimum": 0,
      +                    "type": "number"
      +                  },
      +                  "width": {
      +                    "description": "Width of the clip, in CSS pixels (>0)",
      +                    "minimum": 1,
      +                    "type": "number"
      +                  },
      +                  "x": {
      +                    "description": "X coordinate of the top-left corner, in CSS pixels",
      +                    "type": "number"
      +                  },
      +                  "y": {
      +                    "description": "Y coordinate of the top-left corner, in CSS pixels",
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "x",
      +                  "y",
      +                  "width",
      +                  "height"
      +                ],
      +                "type": "object"
      +              },
      +              "fullPage": {
      +                "description": "Capture the entire scrollable page (default false)",
      +                "type": "boolean"
      +              },
      +              "omitBackground": {
      +                "description": "Hide default white background for transparent screenshots",
      +                "type": "boolean"
      +              },
      +              "quality": {
      +                "description": "Image quality 0-100. Applies to jpeg/webp only.",
      +                "maximum": 100,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "selector": {
      +                "description": "CSS selector of an element to screenshot. Mutually exclusive with fullPage/clip.",
      +                "type": "string"
      +              },
      +              "timeout": {
      +                "description": "Timeout in milliseconds (default 30000)",
      +                "type": "number"
      +              },
      +              "toDisk": {
      +                "description": "Save the screenshot to disk instead of returning it inline. You will NOT see the image; the response gives a reusable handle (local path in stdio, single-use GET URL over HTTP) exactly like a download — reuse it with uploadFile or hand it to the user. Use when you only need the file later, not to look at now (see file-transfers).",
      +                "type": "boolean"
      +              },
      +              "type": {
      +                "description": "Image format. Default \"png\". Use \"jpeg\" for smaller payloads on large pages.",
      +                "enum": [
      +                  "jpeg",
      +                  "png",
      +                  "webp"
      +                ],
      +                "type": "string"
      +              },
      +              "waitForImages": {
      +                "description": "Wait for all images on the page to load before capturing",
      +                "type": "boolean"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "uploadFile",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "files": {
      +                "description": "Files to attach. Combined decoded size is capped (server default 10MB, hard max 50MB).",
      +                "items": {
      +                  "properties": {
      +                    "content": {
      +                      "description": "Base64-encoded file content. LAST RESORT — only for tiny data you already hold inline. Do NOT read a file into the conversation, and never split/reassemble base64 by hand: use `path` (stdio) or `handle` so the server moves the bytes.",
      +                      "type": "string"
      +                    },
      +                    "handle": {
      +                      "description": "A download handle from a prior getDownloads (a path in stdio mode, a `browserless-download://` URI in HTTP mode). The MCP server reads the stored file — works in both transports and keeps the bytes out of the conversation. Use this to re-upload a file you just downloaded.",
      +                      "type": "string"
      +                    },
      +                    "mimeType": {
      +                      "description": "MIME type; inferred from the extension when omitted.",
      +                      "type": "string"
      +                    },
      +                    "name": {
      +                      "description": "Filename reported to the page. Defaults to the basename of `path`, else \"file\".",
      +                      "type": "string"
      +                    },
      +                    "path": {
      +                      "description": "Local filesystem path to read and upload. stdio (local) mode only — the MCP server reads and base64-encodes it. In HTTP mode use `handle` or `content` instead.",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "type": "object"
      +                },
      +                "minItems": 1,
      +                "type": "array"
      +              },
      +              "selector": {
      +                "description": "CSS selector of the <input type=\"file\"> element",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector",
      +              "files"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "getDownloads",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {},
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "close",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {},
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  {
      +    "properties": {
      +      "method": {
      +        "description": "The BQL method name",
      +        "type": "string"
      +      },
      +      "params": {
      +        "additionalProperties": {},
      +        "default": {},
      +        "description": "Parameters for the method",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "method"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / integrationId
      Added value: +{
      +  "description": "Optional 1Password integration id (e.g. \"op_int_…\") to bind to the agent session so `loadSecret` can resolve `op://vault/item/field` references. Find it via GET /integrations/onepassword. Bind it on EVERY call in a multi-call flow (like `profile`); a call that omits it runs with no vault bound and `loadSecret` returns CredentialNotResolved. Pair with `allowedDomains` to permit filling on the target sites.",
      +  "minLength": 1,
      +  "type": "string"
      +}
  11. Changed2 schema fields changedv1.20.0
    • changedInput schema / properties / commands / items / anyOf
      Previous value: -[
      -  {
      -    "oneOf": [
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "goto",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "timeout": {
      -                "description": "Navigation timeout in milliseconds",
      -                "type": "number"
      -              },
      -              "url": {
      -                "description": "The URL to navigate to",
      -                "type": "string"
      -              },
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"domcontentloaded\". Avoid networkidle0/networkidle2 unless explicitly needed — they hang on SPAs and dynamic sites.",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "url"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "back",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"load\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "forward",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"load\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "reload",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Defaults to \"load\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "snapshot",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "full": {
      -                "description": "Force a complete snapshot instead of a diff. Snapshots normally return only what changed since your previous one; set full:true when you no longer have that previous snapshot in context (e.g. it was summarized away) and need the entire element list again.",
      -                "type": "boolean"
      -              },
      -              "maxElements": {
      -                "description": "Maximum number of elements to return (default 500)",
      -                "exclusiveMinimum": 0,
      -                "maximum": 9007199254740991,
      -                "type": "integer"
      -              },
      -              "targetId": {
      -                "description": "Optional tab targetId to peek at without switching the active tab. Obtain via getTabs or a prior snapshot response. Omit to snapshot the active tab.",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "getTabs",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {},
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "switchTab",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "targetId": {
      -                "description": "The targetId of the tab to make active (from getTabs).",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "targetId"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "createTab",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "activate": {
      -                "description": "If true (default), switch to the new tab. If false, open it in the background and leave the current tab active.",
      -                "type": "boolean"
      -              },
      -              "url": {
      -                "description": "URL to open in the new tab. Defaults to about:blank if omitted.",
      -                "type": "string"
      -              },
      -              "waitUntil": {
      -                "description": "When to consider navigation complete. Only applies when activate is true. Defaults to \"domcontentloaded\".",
      -                "enum": [
      -                  "load",
      -                  "domcontentloaded",
      -                  "networkidle0",
      -                  "networkidle2"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "closeTab",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "targetId": {
      -                "description": "The targetId of the tab to close.",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "targetId"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "click",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the element to click",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "type",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the input element",
      -                "type": "string"
      -              },
      -              "text": {
      -                "description": "Text to type into the element",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector",
      -              "text"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "loadSecret",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "ref": {
      -                "description": "The credential reference/alias to inject (e.g. an op:// reference). The secret value is resolved server-side and typed into the field — you never see it. Use this for ALL passwords and usernames from a secrets vault; never put a secret value in `type`.",
      -                "type": "string"
      -              },
      -              "selector": {
      -                "description": "CSS selector of the input to fill. If omitted, the secret is injected into the currently focused element (click/focus the field first).",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "ref"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "select",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the select element",
      -                "type": "string"
      -              },
      -              "value": {
      -                "description": "Option value to select",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector",
      -              "value"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "checkbox",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "checked": {
      -                "description": "Desired checked state (default: toggle)",
      -                "type": "boolean"
      -              },
      -              "selector": {
      -                "description": "CSS selector of the checkbox element",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "hover",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector of the element to hover over",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "scroll",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "direction": {
      -                "description": "Scroll direction. Defaults to \"down\".",
      -                "enum": [
      -                  "up",
      -                  "down",
      -                  "left",
      -                  "right"
      -                ],
      -                "type": "string"
      -              },
      -              "selector": {
      -                "description": "CSS selector of element to scroll (omit for page scroll)",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "evaluate",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "content": {
      -                "description": "JavaScript code to execute (use IIFE syntax)",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "content"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "text",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector to extract text from",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "html",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector to get HTML from",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForSelector",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "selector": {
      -                "description": "CSS selector to wait for",
      -                "type": "string"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (recommend 5000-10000)",
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "selector"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForNavigation",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForTimeout",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "time": {
      -                "description": "Time to wait in milliseconds (e.g., 3000 for 3 seconds)",
      -                "type": "number"
      -              }
      -            },
      -            "required": [
      -              "time"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForRequest",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "method": {
      -                "description": "HTTP method to match (e.g., \"GET\", \"POST\")",
      -                "type": "string"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              },
      -              "url": {
      -                "description": "URL pattern to match (glob-style, e.g., \"*api/results*\")",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "waitForResponse",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "statuses": {
      -                "description": "HTTP status codes to match (e.g., [200, 201])",
      -                "items": {
      -                  "type": "number"
      -                },
      -                "type": "array"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              },
      -              "url": {
      -                "description": "URL pattern to match (glob-style, e.g., \"*api/results*\")",
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "liveURL",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "interactable": {
      -                "description": "Allow interaction via the live URL",
      -                "type": "boolean"
      -              },
      -              "quality": {
      -                "description": "Image quality (1-100)",
      -                "maximum": 100,
      -                "minimum": 1,
      -                "type": "integer"
      -              },
      -              "resizable": {
      -                "description": "Allow resizing the browser viewport",
      -                "type": "boolean"
      -              },
      -              "timeout": {
      -                "description": "How long the live URL stays active (ms)",
      -                "type": "number"
      -              },
      -              "type": {
      -                "description": "Image format for the stream",
      -                "enum": [
      -                  "jpeg",
      -                  "png"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "solve",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "timeout": {
      -                "description": "How long to wait for the captcha to appear (ms). Default 30000. Does not bound the solver itself once a captcha is found.",
      -                "exclusiveMinimum": 0,
      -                "maximum": 9007199254740991,
      -                "type": "integer"
      -              },
      -              "type": {
      -                "description": "Captcha type to solve. Omit to auto-detect.",
      -                "enum": [
      -                  "cloudflare",
      -                  "hcaptcha",
      -                  "recaptcha",
      -                  "recaptchaV3",
      -                  "geetest",
      -                  "normal",
      -                  "friendlyCaptcha",
      -                  "capy",
      -                  "textCaptcha",
      -                  "amazonWaf",
      -                  "dataDome",
      -                  "akamai",
      -                  "lemin",
      -                  "mtcaptcha",
      -                  "slider"
      -                ],
      -                "type": "string"
      -              },
      -              "wait": {
      -                "description": "Wait for the captcha to appear before solving (default true). Set false if you have already verified the widget is on screen.",
      -                "type": "boolean"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "screenshot",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "clip": {
      -                "description": "Region of the page to capture. Mutually exclusive with selector/fullPage.",
      -                "properties": {
      -                  "height": {
      -                    "description": "Height of the clip, in CSS pixels (>0)",
      -                    "minimum": 1,
      -                    "type": "number"
      -                  },
      -                  "scale": {
      -                    "description": "Scale factor of the clip (default 1, >0)",
      -                    "exclusiveMinimum": 0,
      -                    "type": "number"
      -                  },
      -                  "width": {
      -                    "description": "Width of the clip, in CSS pixels (>0)",
      -                    "minimum": 1,
      -                    "type": "number"
      -                  },
      -                  "x": {
      -                    "description": "X coordinate of the top-left corner, in CSS pixels",
      -                    "type": "number"
      -                  },
      -                  "y": {
      -                    "description": "Y coordinate of the top-left corner, in CSS pixels",
      -                    "type": "number"
      -                  }
      -                },
      -                "required": [
      -                  "x",
      -                  "y",
      -                  "width",
      -                  "height"
      -                ],
      -                "type": "object"
      -              },
      -              "fullPage": {
      -                "description": "Capture the entire scrollable page (default false)",
      -                "type": "boolean"
      -              },
      -              "omitBackground": {
      -                "description": "Hide default white background for transparent screenshots",
      -                "type": "boolean"
      -              },
      -              "quality": {
      -                "description": "Image quality 0-100. Applies to jpeg/webp only.",
      -                "maximum": 100,
      -                "minimum": 0,
      -                "type": "number"
      -              },
      -              "selector": {
      -                "description": "CSS selector of an element to screenshot. Mutually exclusive with fullPage/clip.",
      -                "type": "string"
      -              },
      -              "timeout": {
      -                "description": "Timeout in milliseconds (default 30000)",
      -                "type": "number"
      -              },
      -              "toDisk": {
      -                "description": "Save the screenshot to disk instead of returning it inline. You will NOT see the image; the response gives a reusable handle (local path in stdio, single-use GET URL over HTTP) exactly like a download — reuse it with uploadFile or hand it to the user. Use when you only need the file later, not to look at now (see file-transfers).",
      -                "type": "boolean"
      -              },
      -              "type": {
      -                "description": "Image format. Default \"png\". Use \"jpeg\" for smaller payloads on large pages.",
      -                "enum": [
      -                  "jpeg",
      -                  "png",
      -                  "webp"
      -                ],
      -                "type": "string"
      -              },
      -              "waitForImages": {
      -                "description": "Wait for all images on the page to load before capturing",
      -                "type": "boolean"
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "uploadFile",
      -            "type": "string"
      -          },
      -          "params": {
      -            "properties": {
      -              "files": {
      -                "description": "Files to attach. Combined decoded size is capped (server default 10MB, hard max 50MB).",
      -                "items": {
      -                  "properties": {
      -                    "content": {
      -                      "description": "Base64-encoded file content. LAST RESORT — only for tiny data you already hold inline. Do NOT read a file into the conversation, and never split/reassemble base64 by hand: use `path` (stdio) or `handle` so the server moves the bytes.",
      -                      "type": "string"
      -                    },
      -                    "handle": {
      -                      "description": "A download handle from a prior getDownloads (a path in stdio mode, a `browserless-download://` URI in HTTP mode). The MCP server reads the stored file — works in both transports and keeps the bytes out of the conversation. Use this to re-upload a file you just downloaded.",
      -                      "type": "string"
      -                    },
      -                    "mimeType": {
      -                      "description": "MIME type; inferred from the extension when omitted.",
      -                      "type": "string"
      -                    },
      -                    "name": {
      -                      "description": "Filename reported to the page. Defaults to the basename of `path`, else \"file\".",
      -                      "type": "string"
      -                    },
      -                    "path": {
      -                      "description": "Local filesystem path to read and upload. stdio (local) mode only — the MCP server reads and base64-encodes it. In HTTP mode use `handle` or `content` instead.",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "type": "object"
      -                },
      -                "minItems": 1,
      -                "type": "array"
      -              },
      -              "selector": {
      -                "description": "CSS selector of the <input type=\"file\"> element",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "selector",
      -              "files"
      -            ],
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method",
      -          "params"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "getDownloads",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {},
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      },
      -      {
      -        "properties": {
      -          "method": {
      -            "const": "close",
      -            "type": "string"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {},
      -            "type": "object"
      -          }
      -        },
      -        "required": [
      -          "method"
      -        ],
      -        "type": "object"
      -      }
      -    ]
      -  },
      -  {
      -    "properties": {
      -      "method": {
      -        "description": "The BQL method name",
      -        "type": "string"
      -      },
      -      "params": {
      -        "additionalProperties": {},
      -        "default": {},
      -        "description": "Parameters for the method",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "method"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "oneOf": [
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "goto",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "timeout": {
      +                "description": "Navigation timeout in milliseconds",
      +                "type": "number"
      +              },
      +              "url": {
      +                "description": "The URL to navigate to",
      +                "type": "string"
      +              },
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Defaults to \"domcontentloaded\". Avoid networkidle0/networkidle2 unless explicitly needed — they hang on SPAs and dynamic sites.",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "url"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "back",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Defaults to \"load\".",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "forward",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Defaults to \"load\".",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "reload",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Defaults to \"load\".",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "snapshot",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "full": {
      +                "description": "Force a complete snapshot instead of a diff. Snapshots normally return only what changed since your previous one; set full:true when you no longer have that previous snapshot in context (e.g. it was summarized away) and need the entire element list again.",
      +                "type": "boolean"
      +              },
      +              "maxElements": {
      +                "description": "Maximum number of elements to return (default 500)",
      +                "exclusiveMinimum": 0,
      +                "maximum": 9007199254740991,
      +                "type": "integer"
      +              },
      +              "targetId": {
      +                "description": "Optional tab targetId to peek at without switching the active tab. Obtain via getTabs or a prior snapshot response. Omit to snapshot the active tab.",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "getTabs",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {},
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "switchTab",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "targetId": {
      +                "description": "The targetId of the tab to make active (from getTabs).",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "targetId"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "createTab",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "activate": {
      +                "description": "If true (default), switch to the new tab. If false, open it in the background and leave the current tab active.",
      +                "type": "boolean"
      +              },
      +              "url": {
      +                "description": "URL to open in the new tab. Defaults to about:blank if omitted.",
      +                "type": "string"
      +              },
      +              "waitUntil": {
      +                "description": "When to consider navigation complete. Only applies when activate is true. Defaults to \"domcontentloaded\".",
      +                "enum": [
      +                  "load",
      +                  "domcontentloaded",
      +                  "networkidle0",
      +                  "networkidle2"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "closeTab",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "targetId": {
      +                "description": "The targetId of the tab to close.",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "targetId"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "click",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector of the element to click",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "type",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector of the input element",
      +                "type": "string"
      +              },
      +              "text": {
      +                "description": "Text to type into the element",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector",
      +              "text"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "loadSecret",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "ref": {
      +                "description": "The credential reference/alias to inject (e.g. an op:// reference). The secret value is resolved server-side and typed into the field — you never see it. Use this for ALL passwords and usernames from a secrets vault; never put a secret value in `type`.",
      +                "type": "string"
      +              },
      +              "selector": {
      +                "description": "CSS selector of the input to fill. If omitted, the secret is injected into the currently focused element (click/focus the field first).",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "ref"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "select",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector of the select element",
      +                "type": "string"
      +              },
      +              "value": {
      +                "description": "Option value to select. The snapshot lists a select's accepted values as options=[label=value, …] (bare entries have label === value) — take the value from there instead of guessing or reading the DOM with evaluate.",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector",
      +              "value"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "checkbox",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "checked": {
      +                "description": "Desired checked state (default: toggle)",
      +                "type": "boolean"
      +              },
      +              "selector": {
      +                "description": "CSS selector of the checkbox element",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "hover",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector of the element to hover over",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "scroll",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "direction": {
      +                "description": "Scroll direction. Defaults to \"down\".",
      +                "enum": [
      +                  "up",
      +                  "down",
      +                  "left",
      +                  "right"
      +                ],
      +                "type": "string"
      +              },
      +              "selector": {
      +                "description": "CSS selector of element to scroll (omit for page scroll)",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "evaluate",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "content": {
      +                "description": "JavaScript code to execute (use IIFE syntax)",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "content"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "text",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector to extract text from",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "html",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector to get HTML from",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForSelector",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "selector": {
      +                "description": "CSS selector to wait for",
      +                "type": "string"
      +              },
      +              "timeout": {
      +                "description": "Timeout in milliseconds (recommend 5000-10000)",
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "selector"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForNavigation",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "timeout": {
      +                "description": "Timeout in milliseconds (default 30000)",
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForTimeout",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "time": {
      +                "description": "Time to wait in milliseconds (e.g., 3000 for 3 seconds)",
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "time"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForRequest",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "method": {
      +                "description": "HTTP method to match (e.g., \"GET\", \"POST\")",
      +                "type": "string"
      +              },
      +              "timeout": {
      +                "description": "Timeout in milliseconds (default 30000)",
      +                "type": "number"
      +              },
      +              "url": {
      +                "description": "URL pattern to match (glob-style, e.g., \"*api/results*\")",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "waitForResponse",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "statuses": {
      +                "description": "HTTP status codes to match (e.g., [200, 201])",
      +                "items": {
      +                  "type": "number"
      +                },
      +                "type": "array"
      +              },
      +              "timeout": {
      +                "description": "Timeout in milliseconds (default 30000)",
      +                "type": "number"
      +              },
      +              "url": {
      +                "description": "URL pattern to match (glob-style, e.g., \"*api/results*\")",
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "liveURL",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "interactable": {
      +                "description": "Allow interaction via the live URL",
      +                "type": "boolean"
      +              },
      +              "quality": {
      +                "description": "Image quality (1-100)",
      +                "maximum": 100,
      +                "minimum": 1,
      +                "type": "integer"
      +              },
      +              "resizable": {
      +                "description": "Allow resizing the browser viewport",
      +                "type": "boolean"
      +              },
      +              "timeout": {
      +                "description": "How long the live URL stays active (ms)",
      +                "type": "number"
      +              },
      +              "type": {
      +                "description": "Image format for the stream",
      +                "enum": [
      +                  "jpeg",
      +                  "png"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "solve",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "timeout": {
      +                "description": "How long to wait for the captcha to appear (ms). Default 30000. Does not bound the solver itself once a captcha is found.",
      +                "exclusiveMinimum": 0,
      +                "maximum": 9007199254740991,
      +                "type": "integer"
      +              },
      +              "type": {
      +                "description": "Captcha type to solve. Omit to auto-detect.",
      +                "enum": [
      +                  "cloudflare",
      +                  "hcaptcha",
      +                  "recaptcha",
      +                  "recaptchaV3",
      +                  "geetest",
      +                  "normal",
      +                  "friendlyCaptcha",
      +                  "capy",
      +                  "textCaptcha",
      +                  "amazonWaf",
      +                  "dataDome",
      +                  "akamai",
      +                  "lemin",
      +                  "mtcaptcha",
      +                  "slider"
      +                ],
      +                "type": "string"
      +              },
      +              "wait": {
      +                "description": "Wait for the captcha to appear before solving (default true). Set false if you have already verified the widget is on screen.",
      +                "type": "boolean"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "screenshot",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "clip": {
      +                "description": "Region of the page to capture. Mutually exclusive with selector/fullPage.",
      +                "properties": {
      +                  "height": {
      +                    "description": "Height of the clip, in CSS pixels (>0)",
      +                    "minimum": 1,
      +                    "type": "number"
      +                  },
      +                  "scale": {
      +                    "description": "Scale factor of the clip (default 1, >0)",
      +                    "exclusiveMinimum": 0,
      +                    "type": "number"
      +                  },
      +                  "width": {
      +                    "description": "Width of the clip, in CSS pixels (>0)",
      +                    "minimum": 1,
      +                    "type": "number"
      +                  },
      +                  "x": {
      +                    "description": "X coordinate of the top-left corner, in CSS pixels",
      +                    "type": "number"
      +                  },
      +                  "y": {
      +                    "description": "Y coordinate of the top-left corner, in CSS pixels",
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "x",
      +                  "y",
      +                  "width",
      +                  "height"
      +                ],
      +                "type": "object"
      +              },
      +              "fullPage": {
      +                "description": "Capture the entire scrollable page (default false)",
      +                "type": "boolean"
      +              },
      +              "omitBackground": {
      +                "description": "Hide default white background for transparent screenshots",
      +                "type": "boolean"
      +              },
      +              "quality": {
      +                "description": "Image quality 0-100. Applies to jpeg/webp only.",
      +                "maximum": 100,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "selector": {
      +                "description": "CSS selector of an element to screenshot. Mutually exclusive with fullPage/clip.",
      +                "type": "string"
      +              },
      +              "timeout": {
      +                "description": "Timeout in milliseconds (default 30000)",
      +                "type": "number"
      +              },
      +              "toDisk": {
      +                "description": "Save the screenshot to disk instead of returning it inline. You will NOT see the image; the response gives a reusable handle (local path in stdio, single-use GET URL over HTTP) exactly like a download — reuse it with uploadFile or hand it to the user. Use when you only need the file later, not to look at now (see file-transfers).",
      +                "type": "boolean"
      +              },
      +              "type": {
      +                "description": "Image format. Default \"png\". Use \"jpeg\" for smaller payloads on large pages.",
      +                "enum": [
      +                  "jpeg",
      +                  "png",
      +                  "webp"
      +                ],
      +                "type": "string"
      +              },
      +              "waitForImages": {
      +                "description": "Wait for all images on the page to load before capturing",
      +                "type": "boolean"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "uploadFile",
      +            "type": "string"
      +          },
      +          "params": {
      +            "properties": {
      +              "files": {
      +                "description": "Files to attach. Combined decoded size is capped (server default 10MB, hard max 50MB).",
      +                "items": {
      +                  "properties": {
      +                    "content": {
      +                      "description": "Base64-encoded file content. LAST RESORT — only for tiny data you already hold inline. Do NOT read a file into the conversation, and never split/reassemble base64 by hand: use `path` (stdio) or `handle` so the server moves the bytes.",
      +                      "type": "string"
      +                    },
      +                    "handle": {
      +                      "description": "A download handle from a prior getDownloads (a path in stdio mode, a `browserless-download://` URI in HTTP mode). The MCP server reads the stored file — works in both transports and keeps the bytes out of the conversation. Use this to re-upload a file you just downloaded.",
      +                      "type": "string"
      +                    },
      +                    "mimeType": {
      +                      "description": "MIME type; inferred from the extension when omitted.",
      +                      "type": "string"
      +                    },
      +                    "name": {
      +                      "description": "Filename reported to the page. Defaults to the basename of `path`, else \"file\".",
      +                      "type": "string"
      +                    },
      +                    "path": {
      +                      "description": "Local filesystem path to read and upload. stdio (local) mode only — the MCP server reads and base64-encodes it. In HTTP mode use `handle` or `content` instead.",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "type": "object"
      +                },
      +                "minItems": 1,
      +                "type": "array"
      +              },
      +              "selector": {
      +                "description": "CSS selector of the <input type=\"file\"> element",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "selector",
      +              "files"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method",
      +          "params"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "getDownloads",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {},
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "properties": {
      +          "method": {
      +            "const": "close",
      +            "type": "string"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {},
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "method"
      +        ],
      +        "type": "object"
      +      }
      +    ]
      +  },
      +  {
      +    "properties": {
      +      "method": {
      +        "description": "The BQL method name",
      +        "type": "string"
      +      },
      +      "params": {
      +        "additionalProperties": {},
      +        "default": {},
      +        "description": "Parameters for the method",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "method"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / sessionId
      Added value: +{
      +  "description": "The `sessionId` returned by your previous browserless_agent call in this conversation. Echo it back on EVERY subsequent call — it binds this conversation to its live browser and its page state (current URL, cookies, filled forms, open tabs). Omit it only on the first call; omitting it later abandons the current browser and starts a blank one, losing everything the session had done. Only ever pass a value the server returned — never invent one.",
      +  "minLength": 1,
      +  "type": "string"
      +}
  12. First observedv1.16.0

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare readOnly=false, openWorld=true, destructive=true but add nothing about specifics; the description goes far beyond, disclosing session lifetime and slot cost, capture protection after loadSecret, read-once semantics for proxy/OS config, and human-handoff rules. It stops short of describing return payload shapes for individual methods (deferred to schema), which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core loop and ending rules, which is good structure for a complex tool, but it is extremely long and repeats content: the proxy read-once constraint appears in both prose and as a schema description, the OS persona paragraph duplicates emulationOs docs, and the outcome-reporting rules are spread across several near-duplicate passages. For a 21-parameter tool some length is justified, but redundancy costs it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description covers session lifecycle, batching strategy, selector rules, error-recovery taxonomy, file transfer in stdio mode, and auth/secret handling. Given the tool's complexity and open-world surface, an agent has essentially everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline would be 3, but the description adds procedural semantics the schema cannot convey: proxy must be set on the very first call or requires close+reopen, never emit `{method:"proxy"}` inside commands, keepSessionAlive must be decided on the first call, and reportSkillOutcome must precede close. This meaningfully supplements the parameter docs.

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?

Opens with a specific verb+resource ("Execute browser commands in an agent session") and immediately scopes the tool via the ReAct core loop. It is clearly differentiated from siblings like browserless_smartscraper, browserless_crawl, and browserless_show which do higher-level or non-interactive work.

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 explicit when-to-use guidance throughout: check site recipe first via browserless_skill, choose one-shot vs keepSessionAlive based on task shape, load autonomous-login before any sign-in mention, and pass proxy on the first call only when credible evidence exists. It names alternatives and the conditions that select them.

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