A local CDP browser runtime for AI agents.
It gives Codex, Claude, OpenClaw, or a custom agent SDK a browser it can operate through simple tools:
- create a named browser profile,
- navigate, click, type, evaluate JavaScript, snapshot, and screenshot,
- capture profile-scoped network traffic,
- route the same
browser_*calls to either a managed browser or the user's authorized Personal Chrome tab, - keep evidence under that profile's directory,
- reuse an existing CDP browser when one is already open.
The OpenClaw plugin adapter is included, but the main product is now framework-neutral: agents call a small browser_* facade first, then drill into the unified devtools_* API only when they need exact F12 evidence. Backend-specific names are kept for debugging and compatibility.
Agents should not need to reason about Chrome DevTools Protocol target ids, tab ids, ports, body stores, or browser internals.
The user-facing model is deliberately small:
- Personal Profile: inspect the Chrome profile the user is already using.
- Agent Browser: start a browser for agents; use
defaultfor simple work, or create extra profiles for separate roles, targets, and identities.
Both modes expose the same browser_* facade and the same devtools_* tool names. Profiles, ports, browser processes, and extension details are routing choices underneath that tool layer.
Current product shape:
- Managed Browser (
http://127.0.0.1:17335): the main professional path for clean profiles, repeatable F12 evidence, HAR/trace/artifact generation, and target-scoped browser identities. - Personal Chrome (
http://127.0.0.1:17337behind the same facade): optional operator-authorized bridge for the user's already-open Chrome tab, useful when the user says "my Chrome", "current tab", or an authenticated flow only works in their real browser. - Unified facade: agents can call the main worker and choose
backend: "managed"orbackend: "personal"without learning separate ports or extension internals.
In product terms, a profile is an agent-facing operating space. It can mean a role, a target, or an identity:
defaultresearchershop-buyershop-sellertarget-a-tester
Each profile owns:
- one browser tab,
- one evidence directory,
- one traffic journal,
- one event journal,
- its own screenshots and snapshots.
By default everything runs through one local CDP endpoint, usually http://127.0.0.1:9222. The profile layer is product-level separation on top of that endpoint. Stronger process-level isolation with multiple browser ports can be added later.
- Not a stealth browser or anti-bot bypass toolkit.
- Not a vulnerability scanner.
- Not a hosted dashboard.
- Not a replacement for Burp Suite.
- Not for inspecting accounts, targets, or traffic you are not authorized to access.
Browser profiles can contain live authentication state. Treat screenshots, cookies, headers, bodies, and script sources as sensitive evidence.
Use this runtime only with browser profiles, accounts, and targets you are
authorized to inspect. Public demos should use Managed Browser mode with
example.com or local fixtures. Personal Chrome mode is for explicit local
operator-authorized debugging of the user's own browser state.
npm install
npm run build
npm run testManaged Browser mode is the safest public demo path because it uses a fresh agent-owned browser profile instead of the user's daily Chrome profile.
For professional AppSec work the default Managed Browser is headful: it opens a visible Edge/Chrome window so the operator can watch the agent interact with the page. This is closer to a human F12 workflow and is better for real target validation, WebRTC/media flows, UI state, and anti-automation edge cases.
Headless mode is reserved for CI, local smoke tests, and non-interactive
regression runs. Set CDP_BROWSER_HEADLESS=1 only when you explicitly want that
test mode.
$env:CDP_LAUNCH_BROWSER="1"
npm run agent:serverIn another terminal:
npm run research:pack -- --url https://example.com --profile researcherThe command prints local artifact paths for the HAR, Application export, trace, manifest, correlation graph, and evidence bundle when those artifacts are available.
For agent operators, start with docs/agent-operator-runbook.md. For the
complete product contract, read docs/agent-devtools-api.md.
For a Codex-first operating manual, read docs/codex-agent-manual.md.
For cross-agent and SDK integration, read docs/browser-worker-integration.md.
For bug reports and capability gaps, read docs/feedback-and-gaps.md.
For Personal Chrome setup, read docs/personal-chrome-quickstart.md.
For a compact project summary, read docs/project-overview.md. For the current
public work-in-progress status, read docs/public-release-notes.md. Safety
boundaries are documented in docs/safety-boundaries.md.
Run all local checks:
npm run check
npm run contract:devtools
npm run smoke:product
npm run smoke:server
npm run smoke:f12
npm run smoke:browserProfessional evidence-runtime gate:
npm run check:professionalThis gate runs the build, schema tests, CLI handoff smoke, DevTools contract, F12 smoke, professional workflow smoke, and runnable example smoke.
Professional capability scorecard:
npm run professional:scorecardThis starts a temporary Managed Browser and returns a machine-readable F12 AppSec scorecard: panel coverage, facade-first route status, evidence-pack route status, objective-boundary status, and the remaining intentional browser boundaries. It is a tool maturity check, not a vulnerability scanner.
Open-source readiness gate:
npm run release:readinessStart a visible Edge/Chrome browser if no CDP browser is already listening:
CDP_LAUNCH_BROWSER=1 npm run agent:serverWindows PowerShell:
$env:CDP_LAUNCH_BROWSER="1"
npm run agent:serverThe server listens on http://127.0.0.1:17335 by default.
Health check:
curl http://127.0.0.1:17335/healthMCP server for Claude/Codex/Cursor-style clients:
npm run build
npm run mcp:serverExample MCP host config:
{
"mcpServers": {
"agent-browser-runtime": {
"command": "node",
"args": ["<agent-browser-runtime>/dist/mcp-server/index.js"],
"env": {
"AGENT_BROWSER_RUNTIME_URL": "http://127.0.0.1:17335"
}
}
}
}The worker still exposes the full HTTP catalog at /tools, but the stdio MCP
server filters tools/list by default so agents are not flooded with hundreds
of low-level DevTools aliases.
Default tier is core. It exposes the facade-first operating set:
browser_worker_doctor, browser_backend_status, profile_list, profile_resume,
browser_tabs, browser_open, browser_navigate, browser_snapshot, browser_text,
browser_find, browser_click, browser_type, browser_scroll, browser_screenshot,
browser_capture, browser_inspect, browser_security_pack, browser_feedback,
browser_raw
Switch tiers before starting the MCP server:
AGENT_BROWSER_MCP_TIER=extended npm run mcp:server # core + common evidence facade tools
AGENT_BROWSER_MCP_TIER=all npm run mcp:server # full worker catalog
AGENT_BROWSER_MCP_TOOLS=browser_open,browser_raw npm run mcp:serverIf a hidden low-level devtools_* tool is needed, keep the MCP tier small and
call it through browser_raw. This preserves the escape hatch without making
the model choose from the entire low-level catalog on every session start.
Local dashboard:
http://127.0.0.1:17335/panel
The panel is intentionally simple: it shows human-readable profile names and a
page diagnostics summary. It hides CDP target ids and tab ids from the first
screen. Agents and SDKs should still use the devtools_* tools for automation.
Local feedback page:
http://127.0.0.1:17335/feedback
Agents should use browser_feedback when a Browser Runtime tool is broken,
confusing, or missing a needed F12/AppSec evidence route. The tool writes a
local feedback/*.md note that is ignored by git until a human reviews and
redacts it.
Expose these facade tools to agents by default:
| Tool | Use it for |
|---|---|
browser_open |
Open/switch a page and get diagnostics. |
browser_act |
Click, type, scroll, eval, screenshot, or snapshot. |
browser_inspect |
Ask for overview, network, storage, console, dom, sources, performance, search, evidence, or debug without choosing low-level tools. |
browser_capture |
Start, stop, clear, inspect, or reload F12-style recording. |
browser_security_pack |
Generate an objective local evidence pack with artifact paths. |
browser_auth_boundary |
Collect auth/cookie/storage/request boundary evidence without judging impact. |
browser_diff |
Compare before/after evidence or captured traffic. |
browser_replay |
Replay one captured request or a batch of variants. |
browser_feedback |
Record a local bug, capability gap, docs issue, product friction, or idea. |
browser_raw |
Advanced escape hatch for one exact devtools_* tool. |
Default professional workflow:
browser_open -> browser_capture -> browser_inspect -> browser_security_pack -> drilldownPlan
Use devtools_workflow_guide with task="professional-appsec" to get this path
as machine-readable steps and exit criteria. The detailed devtools_* tools are
still available for drill-down and parity with DevTools panels, but they are not
the first interface. Use browser_raw only when the facade cannot express the
required F12 operation.
Use devtools_professional_readiness when an agent needs to check whether the
workflow, F12 parity map, capture status, artifact inventory, and evidence
timeline are mechanically ready before continuing. It returns next tool calls;
it does not classify vulnerabilities.
When evidence already exists, read routeSummary first. It compresses the
handoff path into the first step, latest handoff inspect/read commands, first
concrete drilldown, and evidence entrypoint count. This is the fastest way for a
new agent to resume work without scanning every tool or artifact.
browser_inspect / agent_inspect also return this professional workflow
summary, so a first-screen agent call can route itself without scanning the full
tool catalog.
Example tool calls:
curl -X POST http://127.0.0.1:17335/tool/profile_create \
-H "content-type: application/json" \
-d "{\"profile\":\"researcher\"}"
curl -X POST http://127.0.0.1:17335/tool/browser_capture \
-H "content-type: application/json" \
-d "{\"profile\":\"researcher\",\"action\":\"start\",\"label\":\"first-capture\"}"
curl -X POST http://127.0.0.1:17335/tool/browser_open \
-H "content-type: application/json" \
-d "{\"profile\":\"researcher\",\"url\":\"https://example.com\"}"
curl -X POST http://127.0.0.1:17335/tool/browser_act \
-H "content-type: application/json" \
-d "{\"profile\":\"researcher\",\"action\":\"snapshot\"}"
curl -X POST http://127.0.0.1:17335/tool/browser_act \
-H "content-type: application/json" \
-d "{\"profile\":\"researcher\",\"action\":\"type\",\"selector\":\"input[name=email]\",\"text\":\"user@example.com\",\"inputMode\":\"keyboard\"}"
curl -X POST http://127.0.0.1:17335/tool/profile_traffic_query \
-H "content-type: application/json" \
-d "{\"profile\":\"researcher\",\"limit\":20}"
curl -X POST http://127.0.0.1:17335/tool/devtools_save_har \
-H "content-type: application/json" \
-d "{\"profile\":\"researcher\",\"includeBodies\":true,\"maxBodyBytes\":200000}"
curl -X POST http://127.0.0.1:17335/tool/devtools_request_replay \
-H "content-type: application/json" \
-d "{\"profile\":\"researcher\",\"requestId\":\"<request-id>\",\"form\":{\"role\":\"tester\"},\"headers\":{\"Host\":\"example.invalid\",\"Content-Type\":null}}"If profile is omitted, browser tools use the server default profile. The default is default, or CDP_AGENT_PROFILE if set.
Network, Console, Frame, and Security evidence recording is an explicit switch.
Use devtools_capture_start before the activity you want to record, or use
devtools_hard_reload when you want a clean F12-style reload capture. If capture
is off, browser action tools still work, but they do not write a traffic journal.
Agent router:
curl -X POST http://127.0.0.1:17335/tool/agent_inspect \
-H "content-type: application/json" \
-d "{\"profile\":\"researcher\",\"focus\":\"overview\",\"limit\":10}"agent_inspect is the agent-facing router. It does not replace the low-level
F12 tools; it chooses the first useful evidence set for overview, network,
storage, console, dom, sources, performance, search, evidence, or
debug, then returns nextTools and a toolPlan for drill-down. It is
intentionally objective: it organizes browser evidence but does not decide
whether something is a vulnerability.
One-call security research evidence pack:
curl -X POST http://127.0.0.1:17335/tool/devtools_security_research_pack \
-H "content-type: application/json" \
-d "{\"profile\":\"researcher\",\"url\":\"https://example.com\",\"includeHar\":true,\"includeTrace\":true,\"includeApplicationExport\":true}"This starts a capture window, hard reloads the page, collects the first-pass
F12 evidence areas, and returns saved HAR, Application export, Chrome trace, and
evidence bundle paths. See docs/security-research-pack.md.
CLI shortcut:
npm run research:pack -- --url https://example.com --profile researcherThe CLI prints key artifact paths plus the professional workflow, agent entry
route, handoff readiness, artifact coverage, professional readiness, capture
status, artifact kind counts, route summary, F12 request-detail navigation, and
route artifacts for direct devtools_artifact_inspect /
devtools_artifact_read follow-up. It also prints the first F12 request-detail
section summary plus handoff read/inspect commands. The readiness summary also
prints routeArtifactCount and routeArtifactNames, so an agent can decide
whether artifact routes exist before expanding the full map. Use --json when
an agent or script needs the full response.
Runnable example:
node examples/security-research-pack.mjs https://example.comThe example prints pre/post professional readiness, handoff paths, artifact coverage, F12 request-detail navigation, and first drill-down routes.
Example smoke:
npm run smoke:examplenpm run check:professional includes this example smoke so the public agent
workflow stays executable, not just documented.
agent_inspectdevtools_tool_catalogdevtools_tool_helpdevtools_capability_mapdevtools_f12_parity_matrixdevtools_workflow_guidedevtools_professional_readiness
The devtools_tool_*, capability, parity, workflow, and readiness tools are for usability:
they help agents choose a tool, inspect one tool's parameters, and follow a
deterministic workflow without guessing across the full tool list.
devtools_tool_catalog also returns agentEntryPoints, a compressed facade-first
route for agents that should not scan the full devtools_* surface before acting.
These names are the product-level contract. They are available in both Personal Chrome Extension Mode and Managed Browser Mode:
devtools_tabsdevtools_extension_reloaddevtools_snapshotdevtools_screenshotdevtools_clickdevtools_typedevtools_scrolldevtools_evaldevtools_tool_catalogdevtools_tool_helpdevtools_capability_mapdevtools_f12_parity_matrixdevtools_workflow_guidedevtools_professional_readinessdevtools_attachdevtools_detachdevtools_statusdevtools_backend_capabilitiesdevtools_protocol_schemadevtools_browser_cdp_commanddevtools_browser_versiondevtools_browser_targetsdevtools_system_infodevtools_capture_startdevtools_capture_stopdevtools_capture_cleardevtools_capture_statusdevtools_capture_bisectdevtools_network_logdevtools_network_summarydevtools_network_timelinedevtools_export_hardevtools_save_hardevtools_har_completenessdevtools_request_bodydevtools_request_detaildevtools_request_payloaddevtools_request_replaydevtools_request_replay_batchdevtools_console_logdevtools_console_source_contextdevtools_security_summarydevtools_page_diagnosticsdevtools_signal_summarydevtools_issues_logdevtools_accessibility_snapshotdevtools_frame_treedevtools_hard_reloaddevtools_storage_snapshotdevtools_storage_origin_summarydevtools_cookie_summarydevtools_service_worker_summarydevtools_service_worker_detaildevtools_application_exportdevtools_indexeddb_readdevtools_cache_entry_getdevtools_elements_snapshotdevtools_dom_snapshotdevtools_dom_searchdevtools_event_listenersdevtools_css_stylesdevtools_dom_mutation_watchdevtools_cdp_commanddevtools_debugger_controldevtools_token_flow_tracedevtools_memory_snapshotdevtools_sources_listdevtools_source_getdevtools_source_pretty_printdevtools_source_map_metadatadevtools_source_map_sourcesdevtools_source_map_source_getdevtools_global_searchdevtools_evidence_bundledevtools_evidence_manifestdevtools_artifact_inspectdevtools_artifact_indexdevtools_artifact_searchdevtools_artifact_readdevtools_evidence_timelinedevtools_request_correlation_graphdevtools_capture_diffdevtools_auth_boundary_reportdevtools_worker_frame_deep_divedevtools_security_research_packdevtools_sources_searchdevtools_performance_tracedevtools_performance_insightsdevtools_performance_observerdevtools_chrome_tracedevtools_trace_querydevtools_trace_comparedevtools_cpu_profiledevtools_coverage_snapshotdevtools_coverage_detaildevtools_token_scan
See docs/agent-devtools-api.md.
For an F12-to-tool lookup table, see docs/devtools-panel-map.md.
For the one-call research workflow, see docs/security-research-pack.md.
For public release readiness, see docs/open-source-release-checklist.md.
For native MCP clients, run npm run mcp:server.
For a minimal custom-adapter sketch, see examples/mcp-adapter-sketch.mjs.
The main worker on http://127.0.0.1:17335 is the product entrypoint. It can
route the facade tools to either backend:
{ "tool": "browser_backend_status", "params": {} }Managed browser, clean profile:
{
"tool": "browser_open",
"params": {
"backend": "managed",
"profile": "demo-fixture",
"url": "https://example.com",
"waitMs": 1000
}
}Personal Chrome, current authorized tab:
{
"tool": "browser_inspect",
"params": {
"backend": "personal",
"mode": "overview",
"limit": 10
}
}Shortcuts:
backend: "personal"routes through the Personal Chrome extension bridge.currentTab: trueroutes to Personal Chrome's active tab.backend: "auto"routes to Personal Chrome only when the request explicitly asks for the current/personal tab; otherwise it stays on Managed Browser.
If the Personal Chrome bridge is not running, the facade returns a structured
personal_bridge_unavailable response with the next startup steps instead of
silently failing or making the agent guess.
- Managed Browser uses direct CDP and is the preferred backend for repeatable target work, clean profiles, raw CDP discovery, and artifact generation.
- Personal Chrome uses a local extension bridge and
chrome.debugger. It is best when the user wants the agent to inspect the browser state they are already seeing. - If the user says "my Chrome", "current tab", "already logged in", or managed
login is blocked, call the main worker with
backend: "personal"orcurrentTab: true. Do not try to retrofit CDP onto an already-running ordinary Chrome process, and do not copy cookies/profiles as the first product path when the extension bridge is available. - The two modes expose the same
devtools_*contract, but Chrome may expose more browser-process CDP data to Managed Browser than to Personal Chrome. - Capture is explicit. If recording was not enabled before an action, neither humans nor agents can recover network events Chrome did not retain.
- Tools return objective evidence, signals, paths, and completeness boundaries. They do not decide whether something is a vulnerability.
Backend/debug tools:
These are lower-level aliases used by the local server and older integrations.
New agents and SDKs should prefer the devtools_* names above.
profile_createprofile_listprofile_deleteprofile_traffic_queryprofile_traffic_getbrowser_tabsbrowser_navigatebrowser_clickbrowser_typebrowser_screenshotbrowser_snapshotbrowser_eval
OpenClaw-compatible CDP evidence tools:
cdp_querycdp_getcdp_cookiescdp_fetch_interceptcdp_statscdp_self_testregister_browser_profileacquire_browser_profile
This project can attach to an existing browser only if that browser already exposes a CDP endpoint.
That means the browser must be launched with a flag such as:
& "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" `
--remote-debugging-port=9222 `
--remote-allow-origins=* `
--user-data-dir="$env:USERPROFILE\.agent-browser-runtime\personal-edge" `
--no-first-run `
--no-default-browser-checkThen start the server without launching another browser:
npm run agent:serverThere is also a helper:
npm run personal:browser
npm run agent:serverThe health endpoint will report:
browserAttachMode: "attached-existing-cdp"when it reused an already-running CDP browser,browserAttachMode: "launched-managed-browser"when it launched a browser itself.
Important boundary: a normal browser that was started without remote debugging cannot usually be "taken over" through CDP afterward. For the operator's already-open daily Chrome, use Personal Chrome Extension Mode below instead of asking the operator to close Chrome, clone a profile, export cookies, or inject credentials.
See docs/personal-browser-mode.md for the dedicated workflow and safety notes.
If you want the agent to inspect the Chrome window you are already using, use the extension bridge instead of CDP port attach:
npm run personal:chromeThen load the unpacked extension from:
extension/
The bridge exposes tools at http://127.0.0.1:17337, including:
Preferred agent entry is the unified facade:
{
"tool": "browser_inspect",
"params": {
"backend": "personal",
"currentTab": true,
"focus": "overview"
}
}Read docs/personal-chrome-quickstart.md before using this mode. Personal
Chrome is for explicit operator-authorized personal/ad hoc tasks, not target
research or public demos.
personal_chrome_tabspersonal_chrome_active_tab_snapshotpersonal_chrome_screenshotpersonal_chrome_clickpersonal_chrome_typepersonal_chrome_scrollpersonal_chrome_evalpersonal_chrome_devtools_attachpersonal_chrome_devtools_statuspersonal_chrome_network_logpersonal_chrome_network_summarypersonal_chrome_network_timelinepersonal_chrome_export_harpersonal_chrome_save_harpersonal_chrome_request_bodypersonal_chrome_request_detailpersonal_chrome_request_payloadpersonal_chrome_request_replaypersonal_chrome_console_logpersonal_chrome_console_source_contextpersonal_chrome_security_summarypersonal_chrome_page_diagnosticspersonal_chrome_signal_summarypersonal_chrome_issues_logpersonal_chrome_accessibility_snapshotpersonal_chrome_frame_treepersonal_chrome_hard_reloadpersonal_chrome_storage_snapshotpersonal_chrome_storage_origin_summarypersonal_chrome_cookie_summarypersonal_chrome_service_worker_summarypersonal_chrome_service_worker_detailpersonal_chrome_application_exportpersonal_chrome_indexeddb_readpersonal_chrome_cache_entry_getpersonal_chrome_elements_snapshotpersonal_chrome_dom_snapshotpersonal_chrome_dom_searchpersonal_chrome_event_listenerspersonal_chrome_css_stylespersonal_chrome_dom_mutation_watchpersonal_chrome_cdp_commandpersonal_chrome_debugger_controlpersonal_chrome_memory_snapshotpersonal_chrome_sources_listpersonal_chrome_source_getpersonal_chrome_source_pretty_printpersonal_chrome_source_map_metadatapersonal_chrome_source_map_sourcespersonal_chrome_source_map_source_getpersonal_chrome_global_searchpersonal_chrome_evidence_bundlepersonal_chrome_evidence_manifestpersonal_chrome_artifact_inspectpersonal_chrome_artifact_indexpersonal_chrome_artifact_searchpersonal_chrome_artifact_readpersonal_chrome_evidence_timelinepersonal_chrome_request_correlation_graphpersonal_chrome_capture_diffpersonal_chrome_auth_boundary_reportpersonal_chrome_worker_frame_deep_divepersonal_chrome_sources_searchpersonal_chrome_performance_tracepersonal_chrome_chrome_tracepersonal_chrome_cpu_profilepersonal_chrome_coverage_snapshotpersonal_chrome_coverage_detailpersonal_chrome_token_scan
See docs/personal-chrome-extension.md.
An SDK only needs to call local HTTP tools:
const baseUrl = "http://127.0.0.1:17335";
async function callTool(name: string, params: unknown) {
const response = await fetch(`${baseUrl}/tool/${name}`, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify(params),
});
if (!response.ok) throw new Error(await response.text());
return await response.json();
}
await callTool("devtools_capture_start", {
profile: "researcher",
label: "investigation",
});
await callTool("browser_navigate", {
profile: "researcher",
url: "https://example.com",
});
const snapshot = await callTool("browser_snapshot", {
profile: "researcher",
});
const traffic = await callTool("profile_traffic_query", {
profile: "researcher",
limit: 20,
});The SDK does not need to know CDP target ids, tab ids, browser ports, or evidence paths. It chooses a profile name and calls tools.
Build first:
npm run buildThen add the built plugin entrypoints to OpenClaw:
{
"plugins": {
"load": {
"paths": [
"C:/path/to/agent-browser-runtime/dist/plugins/cdp-traffic-capture/index.js",
"C:/path/to/agent-browser-runtime/dist/plugins/browser-profile-pool/index.js"
]
}
}
}See examples/openclaw.config.example.json.
| Variable | Purpose | Default |
|---|---|---|
CDP_AGENT_SERVER_PORT |
Local HTTP tool server port. | 17335 |
CDP_AGENT_PROFILE |
Default profile used when tool calls omit profile. |
default |
CDP_BROWSER_PORT |
Browser CDP port. | 9222 |
CDP_LAUNCH_BROWSER |
Launch Edge/Chrome if no CDP browser is available. | unset |
CDP_BROWSER_EXECUTABLE |
Explicit Edge/Chrome executable path. | auto-detected |
CDP_BROWSER_USER_DATA_DIR |
Browser user-data directory when launching a browser. | $CDP_SECURITY_DATA_DIR/browser-identities/$CDP_AGENT_PROFILE |
CDP_BROWSER_HEADLESS |
Use headless mode for CI/test runs. Professional/manual validation should leave this unset so the Managed Browser is visible. | unset / headful |
CDP_BROWSER_EXTRA_ARGS |
Extra Chrome/Edge launch flags for target-specific browser conditions. Accepts a JSON array or shell-friendly --flag --flag=value string. |
unset |
CDP_SECURITY_DATA_DIR |
Base data directory for captured bodies, events, profiles, and logs. | ~/.agent-browser-runtime |
CDP_PROFILE_REGISTRY_FILE |
Standalone server profile registry. | $CDP_SECURITY_DATA_DIR/profiles.json |
CDP_SECURITY_BODY_STORE_DIR |
Response body storage directory for CDP evidence tools. | $CDP_SECURITY_DATA_DIR/cdp-traffic |
CDP_SECURITY_SPOOL_DIR |
Ring-buffer eviction spool directory. | $CDP_SECURITY_DATA_DIR/cdp-spool |
CDP_SECURITY_ERROR_LOG_DIR |
Tool validation/internal error log directory. | $CDP_SECURITY_DATA_DIR/cdp-traffic/_errors |
CDP_SECURITY_LEASE_FILE |
Local browser profile lease store for the OpenClaw adapter. | $CDP_SECURITY_DATA_DIR/profile-leases.json |
OPENCLAW_CONFIG_PATH |
OpenClaw config path for adapter mode. | standalone generated config |
BROWSER_BRIDGE_URL |
OpenClaw browser bridge endpoint used by profile registration. | http://127.0.0.1:9302 |
BROWSER_BRIDGE_TOKEN |
Explicit browser bridge token. | unset |
OPENCLAW_GATEWAY_TOKEN |
Fallback browser bridge token. | unset |
PERSONAL_CHROME_HTTP_PORT |
Local HTTP bridge for real Chrome extension mode. | 17337 |
PERSONAL_CHROME_WS_PORT |
WebSocket port used by the extension. | 17336 |
Use 127.0.0.1, not localhost, when you care about deterministic endpoint ownership. Some systems resolve localhost to IPv6 ::1, which can confuse agents and make it look like two different browsers are using the same numeric port.
By default evidence is stored under:
~/.agent-browser-runtime/
profiles/
<profile>/
events/events.jsonl
traffic/traffic.jsonl
screenshots/*.png
Do not commit captured evidence from real targets unless it has been reviewed and sanitized.
Working now:
- standalone local HTTP tool server,
- unified backend router for Managed Browser and Personal Chrome facade calls,
- profile-scoped browser operations,
- profile-scoped screenshots and traffic journals,
- operator-assisted auth bootstrap for login flows with password, 2FA, passkeys, SSO, or anti-abuse scoring,
- durable profile resume and live-tab adoption diagnostics,
- objective security research packs with local artifact handoff,
- clean local build without the original OpenClaw checkout,
- OpenClaw adapter compatibility,
- product smoke tests, server smoke tests, feedback smoke tests, and CI checks.
Next likely steps:
- extract the CDP capture internals into a smaller framework-neutral library,
- improve the human review panel for profiles, artifacts, and feedback,
- add stronger process-level isolation through multiple browser ports,
- add an SDK client package.