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
browserCdp.listPages
Read callList 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 }[]>
browserCdp.openPage
Write actionOpen a tab in the existing browser context, preserving its cookies.
Parameters and return value
| Parameter | Type | Details |
|---|---|---|
urlOptional | string | — |
waitUntilOptional | "commit" | "domcontentloaded" | "load" | — |
Returns Promise<{ pageId: string; url: string; title: string }>
browserCdp.navigate
Write actionNavigate an existing tab to an HTTP(S) URL.
Parameters and return value
| Parameter | Type | Details |
|---|---|---|
pageId | string | Stable CDP page ID returned by listPages or openPage. |
url | string | — |
waitUntilOptional | "commit" | "domcontentloaded" | "load" | — |
Returns Promise<{ url: string; title: string; status: number | null }>
browserCdp.snapshot
Read callRead the accessibility tree to discover controls. Use selectors for subsequent interactions.
Parameters and return value
| Parameter | Type | Details |
|---|---|---|
pageId | string | Stable CDP page ID returned by listPages or openPage. |
selectorOptional | string | Playwright selector, for example #email, text=Continue or role=button[name=Submit]. |
maxCharsOptional | number | — |
Returns Promise<{ snapshot: string; truncated: boolean }>
browserCdp.readText
Read callRead rendered text from a page or matching element.
Parameters and return value
| Parameter | Type | Details |
|---|---|---|
pageId | string | Stable CDP page ID returned by listPages or openPage. |
selectorOptional | string | Playwright selector, for example #email, text=Continue or role=button[name=Submit]. |
maxCharsOptional | number | — |
Returns Promise<{ text: string; truncated: boolean }>
browserCdp.click
Write actionClick a matching element. May submit forms or cause external changes.
Parameters and return value
| Parameter | Type | Details |
|---|---|---|
pageId | string | Stable CDP page ID returned by listPages or openPage. |
selector | string | Playwright selector, for example #email, text=Continue or role=button[name=Submit]. |
Returns Promise<void>
browserCdp.fill
Write actionReplace the value of a matching input or textarea.
Parameters and return value
| Parameter | Type | Details |
|---|---|---|
pageId | string | Stable CDP page ID returned by listPages or openPage. |
selector | string | Playwright selector, for example #email, text=Continue or role=button[name=Submit]. |
value | string | — |
Returns Promise<void>
browserCdp.press
Write actionPress a key or shortcut on a matching element (for example Enter or Control+A).
Parameters and return value
| Parameter | Type | Details |
|---|---|---|
pageId | string | Stable CDP page ID returned by listPages or openPage. |
selector | string | Playwright selector, for example #email, text=Continue or role=button[name=Submit]. |
key | string | — |
Returns Promise<void>
browserCdp.selectOption
Write actionSelect values in a matching select element.
Parameters and return value
| Parameter | Type | Details |
|---|---|---|
pageId | string | Stable CDP page ID returned by listPages or openPage. |
selector | string | Playwright selector, for example #email, text=Continue or role=button[name=Submit]. |
values | string[] | — |
Returns Promise<string[]>
browserCdp.screenshot
Read callCapture a PNG screenshot as base64; no remote filesystem path is required.
Parameters and return value
| Parameter | Type | Details |
|---|---|---|
pageId | string | Stable CDP page ID returned by listPages or openPage. |
fullPageOptional | boolean | — |
Returns Promise<{ mimeType: "image/png"; base64: string }>
browserCdp.evaluate
Write actionEvaluate a JavaScript expression in the page and return a serializable value. May change the page or call its APIs.
Parameters and return value
| Parameter | Type | Details |
|---|---|---|
pageId | string | Stable CDP page ID returned by listPages or openPage. |
expression | string | — |
Returns Promise<unknown>
browserCdp.closePage
Write actionClose only the explicitly selected tab. The browser session stays running.
Parameters and return value
| Parameter | Type | Details |
|---|---|---|
pageId | string | Stable CDP page ID returned by listPages or openPage. |
Returns Promise<void>
