› cavi-ai/
GitHub ↗

MCP tools

The tool catalog for agents. MCP stdio and MCP over HTTP serve the same tools after initialize (protocol 2025-11-25).

A tool appears in tools/list only when the caller holds its capability. Argument names are camelCase.

The working loop

json
{"name": "workflow_start", "arguments": {"profile": "default", "url": "https://example.com"}}

workflow_start creates a session and a page, optionally navigates, and returns a workflowHandle plus sessionId, pageId and workflowId. Pass the handle to later calls instead of the IDs.

json
{"name": "workflow_observe", "arguments": {"workflowHandle": "wf_0123456789abcdef0123456789abcdef", "goal": "Find the sign-in button", "includeForms": true}}

workflow_observe returns retained context when it can answer goal, otherwise a live accessibility tree. Pass target: {"role": "main"} to skip site navigation. includeForms: true adds a form snapshot and needs page:read. The default evidenceDetail is compact; use full to debug.

Act with click, type_text, navigate, or an intent_* tool, passing the same handle. Close the session with session_close.

If workflow_start fails, it reports pageOpenFailed, navigationFailed, workflowGenerationChanged or workflowSupervisorLost, with cleanup fields (pageClosed, sessionDeleted, cleanupErrorCode). If the response may have been lost, call session_list before retrying.

Workflow handles

  • A handle replaces sessionId and pageId on page-scoped tools. Do not send both: that is workflowBindingConflict.
  • With exactly one live handle on the connection, a page-scoped call that names no scope uses it, and the evidence records workflowHandleDefaulted.
  • page_activate with a handle and a pageId activates that page and rebinds the handle to it.
  • After click_and_wait_for_popup, the handle follows the popup. If the popup later closes, read-only calls fall back to the opener page. Mutating calls fail with popupClosed evidence, so no effect is repeated.
  • A handle is a convenience, not authority. Capability and ownership checks still apply. initialize invalidates all earlier handles. A malformed, unknown or expired handle is unknownWorkflowHandle; recover with explicit IDs.
  • Streamable HTTP shares one server per principal, so a new initialize resets every handle of that principal. Use separate principals to isolate clients.

Tools

ToolCapabilitiesPurpose
a11y_snapshotbrowser:mutateAccessibility tree with a target per actionable node
checkpoint_saverecovery:writePersist a verified workflow checkpoint
clickbrowser:mutateClick a selector or target
click_and_wait_for_downloadbrowser:mutate, file:downloadClick and wait for the download; returns digest-verified artifact evidence
click_and_wait_for_popupbrowser:mutateClick and register the window.open popup in page_list
command_executebrowser:mutateSubmit one command envelope for anything the other tools do not cover
context_askpage:readLocate a described control from retained context
context_neighborscontext:readRemembered form structure around a described control
control_actionbrowser:mutateNative action on a form control target
cookie_deletebrowser:mutateDelete cookies by URL and name
cookie_getbrowser:mutateRead cookies visible to a page
cookie_setbrowser:mutateStore cookies
dialogbrowser:mutateAccept or dismiss the next JavaScript dialog
download_urlbrowser:mutate, file:downloadDownload a URL with digest evidence
emulatebrowser:mutateViewport, mobile and geolocation overrides
evaluate_javascriptbrowser:mutate, javascript:evaluateEvaluate a JavaScript expression
events_readsession:readRead retained events after a cursor
extract_structuredbrowser:mutate, vision:assistSchema-shaped JSON read by the vision provider
form_snapshotpage:readBounded inventory of form controls and their state
inspectbrowser:mutateVisible page text, optionally scoped to one element
intent_complete_formbrowser:mutate, intent:executeFill an ordered list of named fields. Never submits
intent_detect_challengebrowser:mutate, intent:execute, vision:assistClassify a captcha or verification challenge
intent_dismiss_obstructionbrowser:mutate, intent:executeDismiss a popup, overlay or cookie banner
intent_extractbrowser:mutate, intent:executeRead named fields without changing the page
intent_fillbrowser:mutate, intent:executeFill one described control and verify the value
intent_followbrowser:mutate, intent:executeActivate a control and verify the resulting state
intent_locatebrowser:mutate, intent:executeFind an element without acting
intent_solve_challengebrowser:mutate, intent:execute, vision:assistRun the vision solve loop on a challenge
intent_submit_and_verifybrowser:mutate, intent:executeSubmit once and verify the expected state
intent_wait_for_statebrowser:mutate, intent:executeWait for a described page state
job_canceljob:cancelCancel an owned job
job_statusjob:readRead an owned job
job_submitjob:submit (+ network:egress for HTTP jobs)Submit a built-in job
navigatebrowser:mutateNavigate a page to a URL
network_logbrowser:mutateRecorded network traffic as a HAR artifact
page_activatebrowser:mutateBring a page to the front
page_closebrowser:mutateClose a page
page_listbrowser:mutateList a session's pages
page_openpage:write (+ browser:mutate with url)Open a page, optionally navigating
pdfbrowser:mutatePrint a page to a PDF artifact
recovery_statusrecovery:readRead a workflow's checkpoint and receipts
runtime_infosession:readRuntime version, active sessions, credential expiry
screenshotbrowser:mutateScreenshot artifact
session_capabilitiessession:readObserve an owned session's engine-option support, grants, policy, and connection state
session_closesession:writeClose a session and release its browser
session_createsession:writeCreate a session
session_listsession:readList the caller's sessions
toolset_selectnoneNarrow tools/list to one phase
type_textbrowser:mutateType text into a selector or target
upload_filesbrowser:mutate, file:uploadSet files on a file input
wait_forbrowser:mutateWait for a page condition
workflow_observebrowser:mutate (+ page:read with includeForms)Read page context for a goal
workflow_recoverrecovery:writeResume or restart from the last verified checkpoint
workflow_startsession:read, session:write, page:write (+ browser:mutate with url)Create session, page and workflow in one call

Parameters

Sessions and pages

ToolParameters
session_create, workflow_startprofile (required), proxy, executionPolicy, zigzagzig; workflow_start also takes url
page_opensessionId (required), url. With url the result includes navigationOutcome
page_list, page_close, page_activatesessionId, pageId or workflowHandle
toolset_selecttoolset: explore, act, intent, verify or full

executionPolicy flags are all off by default: javascriptEvaluation, visionAssist, fingerprint, humanize. visionNode names the vision node the session escalates to. zigzagzig: true creates a session with every flag on and automatic recovery; it is advertised only to principals holding browser:fingerprint and browser:humanize.

Reading a page

ToolParameters
a11y_snapshotmaxNodes 1 to 2048 (default 256), target to scope. See Accessibility snapshot
form_snapshotmaxControls 1 to 512. Passwords are redacted
inspectselector or target, includeHtml
screenshotmode: viewport, full page or element
pdflandscape, printBackground, scale 0.1 to 2.0, pageRanges
network_logclear. Recording starts at the first call; clear: false keeps the buffer
context_ask, context_neighborsdescription (required, up to 256 bytes)
wait_forcondition and timeoutMs (both required)
extract_structuredschema (required), purpose. Needs executionPolicy.visionAssist

wait_for conditions are objects with a kind:

kindFields
elementtarget, state
text, valuetarget, matcher
urlmatcher
documentready
networkQuietidleMs, maxInFlight, optional ignoreUrlSubstrings, ignoreResourceTypes, ignoreLongLived

matcher is {"kind": "exact" | "contains" | "regex", "value": "..."}.

Acting on a page

ToolParameters
navigateurl (required), waitUntil: commit, domContentLoaded, interactive or networkIdle; timeoutMs
clickselector or target; modifiers from shift, ctrl, alt, meta; expectedUrl
click_and_wait_for_popup, click_and_wait_for_downloadselector or target, timeoutMs, autoCheckpoint
type_textvalue (required), selector or target, clearFirst, expectedUrl
control_actiontarget, action: setText, setChecked, selectOne, selectMany, setFiles, clear or activate
upload_filespaths (required, up to 16), and selector, target or a form-snapshot controlId
download_urlurl, maxBytes (both required), saveAs, expectedContentType
dialogaction: accept or dismiss; timeoutMs
emulateviewport, mobile, geolocation
cookie_get, cookie_deleteurls (up to 64); cookie_delete also names
cookie_setcookies (up to 128)
evaluate_javascriptexpression (required), timeoutMs, awaitPromise. Needs executionPolicy.javascriptEvaluation
command_executeenvelope (required), idempotencyKey

click, type_text and upload_files take either a CSS selector or a target of the form {role, accessibleName, ordinal}. Pass snapshot targets unchanged.

download_url saves under the configured downloads directory. saveAs is relative to it or an absolute path inside it. The result echoes savedTo and a sha256, which is the proof of the saved bytes. maxBytes must be between 1 and the advertised maximum ([http].max_download_bytes). Text-like downloads also return downloadPreviews of up to 4 KiB.

selectOne and selectMany match an option's value first, then its visible label.

Boundary tools (click_and_wait_for_*, intent_follow with boundary, intent_submit_and_verify) accept autoCheckpoint to checkpoint around a page-changing step. click and the click_and_wait_for_* tools accept pinned commandId and attemptId.

Intents

Intent tools find controls by purpose and verify the result. Behavior and parameters are in Intent commands. All of them accept an optional idempotencyKey.

Recovery, events and jobs

ToolParameters
checkpoint_savecheckpoint (required), evidenceRefs
recovery_statusExactly one of workflowId or sessionId; limit
workflow_recoverworkflowId
events_readlimit (required), cursor
job_submitname (required), payload, priority, maxRetries, timeoutMs. Built-in names: echo, sleep, http_probe, http_wait, http_fetch
job_status, job_canceljobId

See Events and recovery.

Toolsets

tools/list starts with the explore set to keep the handshake small. Hidden tools are still callable.

ToolsetAdvertises
exploreObservation, lifecycle, navigation, click, type, upload, intent_complete_form, intent_submit_and_verify
actPage-changing tools, command_execute, evaluate_javascript, jobs
intentThe intent_* family
verifyEvidence, checkpoints, recovery, jobs
fullEverything the caller may use

Choose the starting set with [mcp] startup_toolset or BOBBY_MCP_TOOLSET. Session and page lifecycle tools and toolset_select appear in every set.

Results and errors

A command whose outcome is not completed returns isError: true; check it before continuing. Failures carry a repair hint, error.repair for command failures and error.data.repair for protocol rejections, as {action, doc}. Every error message ends with the repair text.

An invalid call returns -32602 with data.reason:

reasonMeaning
schemaViolationpointer and constraint name the offending argument and the schema keyword
malformedArgumentsPassed the schema but could not be parsed
deadlineOutOfRangecommand_execute deadline is past or more than five minutes ahead
invalidIdempotencyKeyKey is not 1 to 128 printable ASCII characters
workflowBindingConflictA handle was sent together with explicit scope IDs
unknownWorkflowHandleHandle is malformed, unknown, evicted or from an earlier connection
hintsPerFieldintent_complete_form: top-level hints needs exactly one field without its own hints
controlIdNotFoundupload_files: controlId is not on the current form snapshot
exactlyOneOfWorkflowIdOrSessionIdrecovery_status needs exactly one of the two

Tool annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) let hosts gate calls. intent_submit_and_verify, intent_follow, session_close, page_close and cookie_delete are marked destructive.

Resources, prompts and notifications

ResourceContents
bobby://capabilitiesWhat each capability gates
bobby://failure-taxonomyError codes and repair actions
bobby://intentsThe intent tools, their preconditions and verification
bobby://primitivesThe flat tools and the commands they create
bobby://job-handlersBuilt-in job names and payloads

Screenshots and downloads are readable as artifact://<id> resources when the caller holds artifact:capture. Screenshot results also include the image inline.

Prompts: start_browsing (optional url), fill_and_submit_form, extract_from_page and recover_workflow. The last three take sessionId and pageId; recover_workflow also takes workflowId.

After initialize the server pushes notifications/bobby/event for each runtime event of the caller and notifications/tools/list_changed when the caller's capabilities change. Over HTTP they arrive on the GET /v1/mcp stream.