Docs / Clients & integrations

Clients & Integrations

Two kinds of surface: integrations (how an agent drives the browser) and control surfaces (how a human manages accounts, permissions, billing, and approves vault requests).

Integrations (agent-facing)

All drive the same engine; exact tool and verb availability differs by transport.

IntegrationStatusNotes
MCP server (gb-mcp)✅ builtstdio JSON-RPC and Streamable HTTP; registered and driving real Chrome. The binary itself cross-compiles clean for windows/amd64 as well as macOS/Linux — real Chrome process-tree supervision via Windows Job Objects (internal/browser/procgroup_windows.go), not just a stub. Tool count/coverage: see docs/conformance/compatibility-matrix.md.
Claude Code skill✅ builtInstalls and teaches the local gb-mcp workflow. Local secrets come only from GB_SECRETS; this path does not call the hosted approval broker.
Claude Desktop extension✅ built, macOS-only by designDeterministic macOS Intel/Apple-Silicon .mcpb bundles around local gb-mcp; optional local secrets file and display configuration. macOS-only is a deliberate packaging-format scope (internal/mcpbpack.Target.releaseSupported), not a build limitation — gb-mcp itself is cross-platform (see above). On Windows/Linux, register gb-mcp directly with Claude Code or Codex instead of a Desktop bundle (see Claude Code / Codex CLI below).
Claude Code / Codex CLI (any OS)✅ builtBoth read a plain MCP-server registration (claude mcp add ... -- /path/to/gb-mcp; Codex via a [mcp_servers.*] block in ~/.codex/config.toml) rather than a packaged bundle, so they work on Windows/Linux/macOS alike. scripts/patch-codex-goodbrowser-mcp.sh prints the exact Codex block for a machine's existing registration (dry-run by default; --apply writes it) — the script never writes ~/.codex/config.toml itself unattended, since that file is the operator's own live engine config. See integrations/README.md for the full install steps on each surface.
GPT plugin / Actions✅ builtOpenAPI contract over the hosted REST session API. Source and website copies are kept byte-identical; publishing the website remains a separate deployment step.
REST API + Python SDK✅ builthttps://app.getagentbrowser.com — hosted sessions, verbs, recordings, jobs, and webhooks.
TypeScript/JavaScript SDK (sdk/js)✅ built, not yet publishedZero-runtime-dependency Node client (fetch-based) mirroring the Python SDK's full surface — session/act plus ~20 typed verbs, recordings, artifacts, webhooks, jobs. Builds, typechecks (tsc --strict), and its node --test suite passes against real local HTTP servers. Package name agentbrowser is unclaimed on the npm registry; publishing needs a maintainer's own npm token and has not been done.

The full MCP tool surface (built) lives in cmd/gb-mcp/tools.go and is no longer hand-duplicated here — a hand-maintained list drifted stale exactly once already (this section under-listed the real tool set, caught while building P2-210's capability-manifest conformance check). docs/conformance/compatibility-matrix.md is the current, generated, per-verb picture instead; regenerate it with go run ./internal/conformance/gen after any tool change.

Structured action responses are bounded before they are written to the node connection: snapshot/read/extract/extract_all/evaluate/cookies are capped at 1 MiB of final JSON, screenshot/mark at 32 MiB, and PDF at 64 MiB. An oversized response returns HTTP 422 with code: "action_output_too_large", the verb, and limit_bytes; it is never silently truncated. Heavy outputs also use one node-wide fail-fast slot, so a stalled or oversized request cannot queue an unbounded set of concurrent screenshot/PDF/cookie operations. Raw CDP remains the separate frame-preserving, policy-filtered tunnel with its 256 MiB frame backstop.

On a hosted session, screenshot and pdf accept an opt-in as_artifact:true (P1-114): instead of the normal inline png_base64/ pdf_base64 response, the control plane persists the result through the same durable artifact store recordings use and returns {artifact_id, kind, size, checksum, content_type, download_url} — useful when the caller doesn't want a large payload in the act response itself. The default (omitted or false) is unchanged. platform.Artifact now carries a kind ("recording" for every pre-existing row, "screenshot", or "pdf") and a checksum (SHA-256 hex); GET /api/artifacts and GET/DELETE /api/artifacts/{id} already worked generically across kinds and needed no changes.

record_stop becomes successful only after every requested media/DOM producer has stopped and the bundle is assembled. A teardown or assembly failure retains the spool for a retry and records degradation evidence instead of advertising an incomplete bundle as successful. Stop first pauses ordinary WAL fanout at the capture boundary. If teardown degrades, its marker and WAL detach share one terminal publication boundary, so later actions or watcher events cannot enter a retained spool. Both normal and degraded final drains and fsyncs use a five-second cleanup context independent of caller cancellation; a timeout retains the spool for the next record_stop, and no bundle manifest is exposed before that finish succeeds.

The node also enforces transient recording budgets: the WAL defaults to 256 MiB and video to 768 MiB. WAL overflow emits recording_degraded with phase:"wal_capacity" when the reserved terminal tail fits, then closes the subscriber. Video uses ffmpeg -fs and emits phase:"video_capacity" when the final file reaches its limit. In either case the node serializes browser teardown after the writer/encoder has exited and retains the bounded partial evidence as READY; it does not continue a browser session without its recording producer.

Control surfaces (human-facing)

Same backend (control-plane API); four front-ends.

Web console — https://app.getagentbrowser.com/app

Electron desktop app

iOS & Android apps — ✅ built & proven live

Shared API contract

The control plane has three explicit authentication classes. Human clients use a session cookie or the bearer token returned by POST /api/auth/login; passing {"signup":true} to that route creates an account. Agent clients use a scoped gbk_ workspace API key. Render nodes use the unique credential configured for that exact node identity and endpoint.

AuthMethod and routePurpose
PublicPOST /api/auth/loginSign in, or create an account with signup:true; returns a human bearer session.
HumanGET /api/meRead the current user, workspace, and plan.
HumanPOST /api/keysMint a scoped workspace API key.
HumanPOST /api/secretsRegister an origin-bound vault secret.
HumanGET /api/pendingList credential-injection requests awaiting a decision.
HumanPOST /api/pending/{id}/approve or /denyResolve one pending request.
HumanGET /api/usageRead usage and free-tier state.
HumanGET /api/nodesList the safe, public render-node status fields.
AgentPOST /api/sessionsAllocate a hosted session; cdp:true (raw CDP) or playwright:true (native Playwright protocol, self-hosted nodes only — see below) each also return a scoped connection ticket.
AgentPOST /api/sessions/{id}/actDrive a hosted session with one structured verb.
AgentGET /api/sessions/{id}/stream?transport=ndjsonReplay and follow the event stream as NDJSON. Use transport=sse for EventSource or transport=ws for WebSocket frames.
AgentGET /api/sessions/{id}/playwright?ticket=...playwright:true sessions only: the native Playwright protocol tunnel — chromium.connect(), not connectOverCDP(). Higher fidelity than raw CDP for upload/download/context/page behavior Playwright's own docs call out as weaker over CDP, at the cost of self-hosted-only support today (see cmd/gb-noded/playwrightproxy.go's package doc for why).
AgentDELETE /api/sessions/{id}Close the session, finalize requested recording persistence, and return billed seconds.
AgentGET /api/v1/recordingsList recording artifacts through the versioned programmatic API.
NodePOST /api/nodes/register and /api/nodes/heartbeatRegister and report capacity for the authenticated node.
AgentPOST /api/usage/ingestSubmit allowlisted client diagnostics with a gbk_ key carrying usage:write; node credentials are rejected.
HumanPOST /api/auth/logoutRevoke exactly the presented human bearer session.

The browser-session stream is one route with three transports; it is not a separate, unqualified WebSocket endpoint. Node registration is also distinct from session allocation: clients never create an “instance” through an /api/instances route.