Skip to content

Response envelope

Every tool returns one of two envelope shapes, with additive operation metadata. Tool-reference examples omit that shared metadata for readability. Argument-validation errors also include metadata while preserving MCP isError.

Success

{
  "status": "success",
  "instance": "<instance-name> | null",
  "data": {}
}

Error

{
  "status": "error",
  "instance": "<instance-name> | null",
  "error_type": "<type>",
  "message": "<human-readable description>"
}

instance is null for server-level tools (browser_list_instances, browser_health) that are not scoped to a specific instance.

error_type values

error_type Meaning
instance_not_found No instance with the given name exists; call browser_create_instance first.
instance_already_exists That name is reserved by a live instance, launch, or unfinished teardown.
instance_limit_exceeded The BROWSER_MCP_MAX_INSTANCES cap has been reached; destroy an existing instance first.
instance_crashed The browser disconnected; cleanup is scheduled. Check health and wait for its reservation to be released before recreating it.
profile_dir_in_use The requested profile is reserved by another live, launching, or closing instance.
binary_not_found The latest Camoufox release could not be resolved, prepared, or verified.
element_not_found The element could not be found in the page's accessibility tree.
stale_ref The ref was valid in a previous snapshot but is no longer in the current accessibility tree.
navigation_failed A network error, invalid URL, or page crash prevented navigation.
navigation_timeout The page did not finish loading within the timeout.
wait_timeout A text or state wait condition did not resolve in time.
dialog_not_present Reserved error type; current tools use modal_state_blocked when no matching modal is pending.
evaluation_failed A JavaScript expression or Python code snippet raised an exception.
verification_failed A verification tool found the element or text was not in the expected state.
invalid_params A parameter value was invalid or an incompatible combination was supplied.
modal_state_blocked A pending modal blocks the operation, or a dialog/upload handler was called without its matching pending modal.
internal_error An unexpected tool or framework error without a more specific mapping.
operation_timeout A cooperative operation, including its lock wait, exceeded the server deadline.
result_too_large The structured result exceeded the configured byte limit; the action may already have completed.
unsupported_capability The active browser backend cannot perform this operation (currently PDF rendering).
page_not_found The requested page is not live in this instance.
frame_not_found The requested frame is detached or belongs to a different page.
observation_timeout The action completed but its requested condition did not match before the deadline.
download_not_found The download ID is foreign, evicted, or no longer retained.
download_failed Download saving failed; a partial file may remain.

Operation metadata

Every application envelope carries the same metadata object:

{
  "operation": {
    "id": "request-uuid",
    "tool": "browser_navigate",
    "instance_id": "launch-uuid",
    "page_id": "tab-uuid",
    "frame_id": null,
    "started_at": "2026-09-12T10:00:00+00:00",
    "finished_at": "2026-09-12T10:00:00.250000+00:00",
    "duration_ms": 250.0,
    "outcome": "completed",
    "retry": "not_needed",
    "artifacts": []
  }
}

IDs are nullable when there is no target or it was not yet allocated. A recreated instance and a new page always have new IDs. duration_ms includes queue waiting and uses monotonic time; timestamps are UTC. The ID correlates a call, not a persistent job or an idempotency key.

Field value Meaning
outcome: completed The tool returned success; a later size-limit error can still prevent delivery of its data.
outcome: not_started The request was rejected before entering the instance operation.
outcome: unknown Execution began and failed; side effects may have happened.
retry: not_needed The result succeeded.
retry: after_correction Correct the request or target state before retrying.
retry: read_only The failed tool reads state; its next result can differ if the page changes.
retry: inspect_state Inspect state before repeating a potentially completed action.

The classification is conservative: entering the operation can mark an eventual validation failure as unknown even if the browser was not changed. No mutation is automatically retried. A cancelled call may have no response; server logs record the operation ID and whether execution had started. After cancellation or reconnecting a client, inspect the page before repeating a mutation. Repeated calls are not deduplicated, and logs are not a durable record of your workflow.

artifacts lists returned server-side path/saved_to references. These are not uploads or integrity guarantees. If oversized references themselves prevent a bounded error response, references_omitted: true is set, artifacts is empty, and the display instance name is null; an oversized unknown tool name can also be omitted. Stable target IDs are preserved.

BROWSER_MCP_MAX_RESULT_BYTES bounds the serialized structured envelope including metadata. Large results return result_too_large; use smaller queries, event pagination, or explicit file output. See event pagination and export for collecting console and network records. Check operation.outcome before repeating an action whose result was too large to return.