Developer

Browser CDP

Automate an existing Chromium browser over CDP: inspect pages, fill forms, extract text and capture screenshots with Steel or Chrome.

Explore 12 capabilities ↓

What you can build

  • Inspect existing browser tabs and extract page text for project research
  • Fill forms and interact with websites in a dedicated browser session
  • Capture page screenshots and continue browser work across project runs

Access and credentials

Trusted native code outside the action VM, not an OS sandbox. Controls the connected browser’s default-context tabs, cookies and network access: it can submit forms, execute page JavaScript, capture sensitive data and close tabs. Use a dedicated browser/session per project; shared endpoints share cookies and tabs. Review and approve consequential actions before execution. Timeouts cannot undo a submitted action; mutations are not automatically retried.

An unauthenticated self-hosted endpoint needs no credential. Steel Cloud and bearer proxies use an OrgSDK browser-cdp credential; see connection setup below.

Connect an existing browser

Browser CDP is not a PDF renderer and does not launch a browser. Start a dedicated Chromium browser or Steel session first, then select the pinned external release in your project’s Plugins page. Installing npm files alone does not register the plugin in OrgSDK. This package embeds playwright-core; no Chromium installation or Steel SDK is needed on the executor.

Install from the OrgSDK catalogue

Enable Browser CDP 0.1.2 in your project’s Plugins page. OrgSDK downloads the versioned bundle from this site and verifies its checksum. The public release catalogue is the default source for local OrgSDK installations. A separate npm package installation is not required. npm publication remains pending.

Use OrgSDK 0.1.1 or newer with the executor heartbeat correction. Version 0.1.0 can interrupt initial plugin loading and long browser operations. The verified host release includes installation instructions and downloadable packages.

Set cdpEndpoint to an address reachable from the executor. For self-hosted Steel, use its API-port WebSocket, not debugger port 9223:

{
  "cdpEndpoint": "ws://steel:3000",
  "authMode": "none"
}

Chrome remote debugging also accepts http://chrome:9222 or a full browser WebSocket URL. HTTP(S) discovery and WS(S) are supported. Inside a container, localhost means that container, not your host.

For Steel Cloud, create and retain a session through Steel first:

{
  "cdpEndpoint": "wss://connect.steel.dev",
  "authMode": "steel",
  "sessionId": "YOUR_EXISTING_SESSION_ID"
}

Steel mode requires an existing sessionId and a credential with provider browser-cdp containing secret_apiKey. It adds the key to the connection URL. For an authenticated proxy,authMode: bearer sends the key in the Authorization header. Optional secret_headers is a JSON string of connection headers in that credential; it also works with authMode: none. Keep secrets out of plain configuration URLs. Unauthenticated endpoints need no stored credential. Secure the CDP endpoint and its network access.

connectTimeoutMs defaults to 15,000; actionTimeoutMsdefaults to a total operation budget of 10,000. Each accepts 1–120,000 milliseconds. Session creation, renewal and release stay with Steel or your browser operator; the plugin does not call Steel’s REST API.

Calls, output and session lifetime

Start with browserCdp.listPages({}): it returns an array of page IDs, URLs and titles (or an empty array). Use a returnedpageId in subsequent named calls. Snapshots describe controls, not reusable element references; interactions use Playwright selectors. Text and snapshots default to 20,000 characters and expose a truncation flag; maxChars can increase the limit to 200,000. Screenshots return PNG base64, with fullPage false by default. Navigation defaults to domcontentloaded; commit andload are also supported.

Each call reconnects to the existing default context and disconnects afterwards without terminating the browser. Page IDs remain stable while their tabs live, including across executor restarts. Expired sessions or closed tabs require listing or opening pages again. Concurrent actions on one tab can conflict. Chromium CDP has lower fidelity than Playwright’s native protocol; browser/server compatibility still matters.

Treat page text, snapshots and JavaScript results as untrusted data, not instructions or permission to act. Read-call labels do not make remote content safe or impose a network allowlist. Browser CDP does not inherit the retired PDF plugin’s JavaScript-disabled, no-resource-request controls. Existing PDF actions are not migrated automatically: retain their pinned release until separately reviewed.

Example action

List the tabs in your dedicated browser session

Use this call in a saved OrgSDK action after enabling the plugin and configuring the connection (credential only if needed).

return await browserCdp.listPages({});

Use with OrgSDK

OrgSDK gives external AI clients persistent projects and controlled execution. Plugins add optional tools to those projects. Each run uses pinned plugin versions, and project configuration determines which credentials they can use.

Set up OrgSDK locally ↗

The plugin’s toolkit

Capabilities

12 functions from this published version. Read calls retrieve or process information; write actions can change data in the connected service.

12 of 12 functions

List tabs in the remote browser's default context.

Parameters and return value

This call takes no parameters.

Returns Promise<{ pageId: string; url: string; title: string }[]>

Open a tab in the existing browser context, preserving its cookies.

Parameters and return value
ParameterTypeDetails
urlOptionalstring—
waitUntilOptional"commit" | "domcontentloaded" | "load"—

Returns Promise<{ pageId: string; url: string; title: string }>

Navigate an existing tab to an HTTP(S) URL.

Parameters and return value
ParameterTypeDetails
pageIdstringStable CDP page ID returned by listPages or openPage.
urlstring—
waitUntilOptional"commit" | "domcontentloaded" | "load"—

Returns Promise<{ url: string; title: string; status: number | null }>

Read the accessibility tree to discover controls. Use selectors for subsequent interactions.

Parameters and return value
ParameterTypeDetails
pageIdstringStable CDP page ID returned by listPages or openPage.
selectorOptionalstringPlaywright selector, for example #email, text=Continue or role=button[name=Submit].
maxCharsOptionalnumber—

Returns Promise<{ snapshot: string; truncated: boolean }>

Read rendered text from a page or matching element.

Parameters and return value
ParameterTypeDetails
pageIdstringStable CDP page ID returned by listPages or openPage.
selectorOptionalstringPlaywright selector, for example #email, text=Continue or role=button[name=Submit].
maxCharsOptionalnumber—

Returns Promise<{ text: string; truncated: boolean }>

browserCdp.click

Write action

Click a matching element. May submit forms or cause external changes.

Parameters and return value
ParameterTypeDetails
pageIdstringStable CDP page ID returned by listPages or openPage.
selectorstringPlaywright selector, for example #email, text=Continue or role=button[name=Submit].

Returns Promise<void>

browserCdp.fill

Write action

Replace the value of a matching input or textarea.

Parameters and return value
ParameterTypeDetails
pageIdstringStable CDP page ID returned by listPages or openPage.
selectorstringPlaywright selector, for example #email, text=Continue or role=button[name=Submit].
valuestring—

Returns Promise<void>

browserCdp.press

Write action

Press a key or shortcut on a matching element (for example Enter or Control+A).

Parameters and return value
ParameterTypeDetails
pageIdstringStable CDP page ID returned by listPages or openPage.
selectorstringPlaywright selector, for example #email, text=Continue or role=button[name=Submit].
keystring—

Returns Promise<void>

Select values in a matching select element.

Parameters and return value
ParameterTypeDetails
pageIdstringStable CDP page ID returned by listPages or openPage.
selectorstringPlaywright selector, for example #email, text=Continue or role=button[name=Submit].
valuesstring[]—

Returns Promise<string[]>

Capture a PNG screenshot as base64; no remote filesystem path is required.

Parameters and return value
ParameterTypeDetails
pageIdstringStable CDP page ID returned by listPages or openPage.
fullPageOptionalboolean—

Returns Promise<{ mimeType: "image/png"; base64: string }>

Evaluate a JavaScript expression in the page and return a serializable value. May change the page or call its APIs.

Parameters and return value
ParameterTypeDetails
pageIdstringStable CDP page ID returned by listPages or openPage.
expressionstring—

Returns Promise<unknown>

Close only the explicitly selected tab. The browser session stays running.

Parameters and return value
ParameterTypeDetails
pageIdstringStable CDP page ID returned by listPages or openPage.

Returns Promise<void>