Technical reference for the OpenClaw framework. Real-time synchronization with the official documentation engine.
Use this file to discover all available pages before exploring further.
Browser (OpenClaw-managed)
OpenClaw can run a dedicated Chrome/Brave/Edge/Chromium profile that the agent controls.
It is isolated from your personal browser and is managed through a small local
control service inside the Gateway (loopback only).
Beginner view:
Think of it as a separate, agent-only browser.
The
text
openclaw
profile does not touch your personal browser profile.
The agent can open tabs, read pages, click, and type in a safe lane.
The built-in
text
user
profile attaches to your real signed-in Chrome session via Chrome MCP.
What you get
A separate browser profile named openclaw (orange accent by default).
Deterministic tab control (list/open/focus/close).
alone is not enough because sub-agent
policy is applied after profile filtering.
The browser plugin ships two levels of agent guidance:
The
text
browser
tool description carries the compact always-on contract: pick
the right profile, keep refs on the same tab, use
text
tabId
/labels for tab
targeting, and load the browser skill for multi-step work.
The bundled
text
browser-automation
skill carries the longer operating loop:
check status/tabs first, label task tabs, snapshot before acting, resnapshot
after UI changes, recover stale refs once, and report login/2FA/captcha or
camera/microphone blockers as manual action instead of guessing.
Plugin-bundled skills are listed in the agent's available skills when the
plugin is enabled. The full skill instructions are loaded on demand, so routine
turns do not pay the full token cost.
Missing browser command or tool
If
text
openclaw browser
is unknown after an upgrade,
text
browser.request
is missing, or the agent reports the browser tool as unavailable, the usual cause is a
text
plugins.allow
list that omits
text
browser
and no root
text
browser
config block exists. Add it:
json5
{
plugins: {
allow: ["telegram", "browser"],
},
}
An explicit root
text
browser
block, for example
text
browser.enabled=true
or
text
browser.profiles.<name>
, activates the bundled browser plugin even under a restrictive
text
plugins.allow
, matching channel config behavior.
text
plugins.entries.browser.enabled=true
and
text
tools.alsoAllow: ["browser"]
do not substitute for allowlist membership by themselves. Removing
text
plugins.allow
entirely also restores the default.
Profiles:
text
openclaw
vs
text
user
text
openclaw
: managed, isolated browser (no extension required).
text
user
: built-in Chrome MCP attach profile for your real signed-in Chrome
session.
For agent browser tool calls:
Default: use the isolated
text
openclaw
browser.
Prefer
text
profile="user"
when existing logged-in sessions matter and the user
is at the computer to click/approve any attach prompt.
text
profile
is the explicit override when you want a specific browser mode.
only affects local managed profiles that OpenClaw
launches.
text
existing-session
profiles attach to an already-running browser
instead, and remote CDP profiles use the browser behind
text
cdpUrl
.
Local vs remote control
Local control (default): the Gateway starts the loopback control service and can launch a local browser.
Remote control (node host): run a node host on the machine that has the browser; the Gateway proxies browser actions to it.
Remote CDP: set
text
browser.profiles.<name>.cdpUrl
(or
text
browser.cdpUrl
) to
attach to a remote Chromium-based browser. In this case, OpenClaw will not launch a local browser.
For externally managed CDP services on loopback (for example Browserless in
Docker published to
text
127.0.0.1
), also set
text
attachOnly: true
. Loopback CDP
without
text
attachOnly
is treated as a local OpenClaw-managed browser profile.
text
headless
only affects local managed profiles that OpenClaw launches. It does not restart or change existing-session or remote CDP browsers.
text
executablePath
follows the same local managed profile rule. Changing it on a
running local managed profile marks that profile for restart/reconcile so the
next launch uses the new binary.
Stopping behavior differs by profile mode:
local managed profiles:
text
openclaw browser stop
stops the browser process that
OpenClaw launched
attach-only and remote CDP profiles:
text
openclaw browser stop
closes the active
control session and releases Playwright/CDP emulation overrides (viewport,
color scheme, locale, timezone, offline mode, and similar state), even
though no browser process was launched by OpenClaw
Remote CDP URLs can include auth:
Query tokens (e.g.,
text
https://provider.example?token=<token>
)
HTTP Basic auth (e.g.,
text
https://user:pass@provider.example
)
OpenClaw preserves the auth when calling
text
/json/*
endpoints and when connecting
to the CDP WebSocket. Prefer environment variables or secrets managers for
tokens instead of committing them to config files.
Node browser proxy (zero-config default)
If you run a node host on the machine that has your browser, OpenClaw can
auto-route browser tool calls to that node without any extra browser config.
This is the default path for remote gateways.
Notes:
The node host exposes its local browser control server via a proxy command.
Profiles come from the node’s own
text
browser.profiles
config (same as local).
text
nodeHost.browserProxy.allowProfiles
is optional. Leave it empty for the legacy/default behavior: all configured profiles remain reachable through the proxy, including profile create/delete routes.
If you set
text
nodeHost.browserProxy.allowProfiles
, OpenClaw treats it as a least-privilege boundary: only allowlisted profiles can be targeted, and persistent profile create/delete routes are blocked on the proxy surface.
Disable if you don’t want it:
On the node:
text
nodeHost.browserProxy.enabled=false
On the gateway:
text
gateway.nodes.browser.mode="off"
Browserless (hosted remote CDP)
Browserless is a hosted Chromium service that exposes
CDP connection URLs over HTTPS and WebSocket. OpenClaw can use either form, but
for a remote browser profile the simplest option is the direct WebSocket URL
from Browserless' connection docs.
it is used, otherwise OpenClaw
falls back to a direct WebSocket handshake at the bare root. If the advertised
WebSocket endpoint rejects the CDP handshake but the configured bare root
accepts it, OpenClaw falls back to that root as well. This lets a bare
text
ws://
pointed at a local Chrome still connect, since Chrome only accepts WebSocket
upgrades on the specific per-target path from
text
/json/version
, while hosted
providers can still use their root WebSocket endpoint when their discovery
endpoint advertises a short-lived URL that is not suitable for Playwright CDP.
Browserbase
Browserbase is a cloud platform for running
headless browsers with built-in CAPTCHA solving, stealth mode, and residential
proxies.
Browserbase auto-creates a browser session on WebSocket connect, so no
manual session creation step is needed.
The free tier allows one concurrent session and one browser hour per month.
See pricing for paid plan limits.
See the Browserbase docs for full API
reference, SDK guides, and integration examples.
Security
Key ideas:
Browser control is loopback-only; access flows through the Gateway’s auth or node pairing.
The standalone loopback browser HTTP API uses shared-secret auth only:
gateway token bearer auth,
text
x-openclaw-password
, or HTTP Basic auth with the
configured gateway password.
Tailscale Serve identity headers and
text
gateway.auth.mode: "trusted-proxy"
do
not authenticate this standalone loopback browser API.
If browser control is enabled and no shared-secret auth is configured, OpenClaw
auto-generates
text
gateway.auth.token
on startup and persists it to config.
OpenClaw does not auto-generate that token when
text
gateway.auth.mode
is
already
text
password
,
text
none
, or
text
trusted-proxy
.
Keep the Gateway and any node hosts on a private network (Tailscale); avoid public exposure.
Treat remote CDP URLs/tokens as secrets; prefer env vars or a secrets manager.
Remote CDP tips:
Prefer encrypted endpoints (HTTPS or WSS) and short-lived tokens where possible.
Avoid embedding long-lived tokens directly in config files.
Profiles (multi-browser)
OpenClaw supports multiple named profiles (routing configs). Profiles can be:
openclaw-managed: a dedicated Chromium-based browser instance with its own user data directory + CDP port
remote: an explicit CDP URL (Chromium-based browser running elsewhere)
existing session: your existing Chrome profile via Chrome DevTools MCP auto-connect
Defaults:
The
text
openclaw
profile is auto-created if missing.
The
text
user
profile is built-in for Chrome MCP existing-session attach.
Existing-session profiles are opt-in beyond
text
user
; create them with
text
--driver existing-session
.
Local CDP ports allocate from 18800–18899 by default.
Deleting a profile moves its local data directory to Trash.
All control endpoints accept
text
?profile=<name>
; the CLI uses
text
--browser-profile
.
Existing session via Chrome DevTools MCP
OpenClaw can also attach to a running Chromium-based browser profile through the
official Chrome DevTools MCP server. This reuses the tabs and login state
already open in that browser profile.
Open that browser's inspect page for remote debugging.
Enable remote debugging.
Keep the browser running and approve the connection prompt when OpenClaw attaches.
Common inspect pages:
Chrome:
text
chrome://inspect/#remote-debugging
Brave:
text
brave://inspect/#remote-debugging
Edge:
text
edge://inspect/#remote-debugging
Live attach smoke test:
bash
openclaw browser --browser-profile user start
openclaw browser --browser-profile user status
openclaw browser --browser-profile user tabs
openclaw browser --browser-profile user snapshot --format ai
What success looks like:
text
status
shows
text
driver: existing-session
text
status
shows
text
transport: chrome-mcp
text
status
shows
text
running: true
text
tabs
lists your already-open browser tabs
text
snapshot
returns refs from the selected live tab
What to check if attach does not work:
the target Chromium-based browser is version
text
144+
remote debugging is enabled in that browser's inspect page
the browser showed and you accepted the attach consent prompt
text
openclaw doctor
migrates old extension-based browser config and checks that
Chrome is installed locally for default auto-connect profiles, but it cannot
enable browser-side remote debugging for you
Agent use:
Use
text
profile="user"
when you need the user’s logged-in browser state.
If you use a custom existing-session profile, pass that explicit profile name.
Only choose this mode when the user is at the computer to approve the attach
prompt.
the Gateway or node host can spawn
text
npx chrome-devtools-mcp@latest --autoConnect
Notes:
This path is higher-risk than the isolated
text
openclaw
profile because it can
act inside your signed-in browser session.
OpenClaw does not launch the browser for this driver; it only attaches.
OpenClaw uses the official Chrome DevTools MCP
text
--autoConnect
flow here. If
text
userDataDir
is set, it is passed through to target that user data directory.
Existing-session can attach on the selected host or through a connected
browser node. If Chrome lives elsewhere and no browser node is connected, use
remote CDP or a node host instead.
Custom Chrome MCP launch
Override the spawned Chrome DevTools MCP server per profile when the default
text
npx chrome-devtools-mcp@latest
flow is not what you want (offline hosts,
pinned versions, vendored binaries):
Field
What it does
text
mcpCommand
Executable to spawn instead of
text
npx
. Resolved as-is; absolute paths are honored.
text
mcpArgs
Argument array passed verbatim to
text
mcpCommand
. Replaces the default
text
chrome-devtools-mcp@latest --autoConnect
arguments.
When
text
cdpUrl
is set on an existing-session profile, OpenClaw skips
text
--autoConnect
and forwards the endpoint to Chrome MCP automatically:
text
http(s)://...
→
text
--browserUrl <url>
(DevTools HTTP discovery endpoint).
text
ws(s)://...
→
text
--wsEndpoint <url>
(direct CDP WebSocket).
Endpoint flags and
text
userDataDir
cannot be combined: when
text
cdpUrl
is set,
text
userDataDir
is ignored for Chrome MCP launch, since Chrome MCP attaches to
the running browser behind the endpoint rather than opening a profile
directory.