ScalebrowserDOCS

Migrate from browser-use

Run a browser-use agent in a Scalebrowser profile by its CDP address, or hand the browser to your coding agent over MCP and let it do the driving.

browser-use is an agent loop around a browser: your task, your language model, and a Chromium it drives over CDP. It can attach to a browser that is already running, and a Scalebrowser profile is one, so the first step changes one line. The second option drops the separate loop and lets the agent you already use, Claude Code, Codex, Cursor or another MCP client, drive the profile itself.

Keep browser-use, give it a profile

Browser takes a cdp_url, and the cdp_ws of a started profile is exactly that. Verified against browser-use 0.13.10.

python
import asyncio
import os

from browser_use import Agent, Browser, ChatOpenAI
from scalebrowser import AsyncScalebrowserClient

PROFILE_ID = "prf_7d2a…"   # an existing profile

async def main():
    sb = AsyncScalebrowserClient(base_url="http://127.0.0.1:8787", token=os.environ["SCALEBROWSER_TOKEN"])
    started = await sb.start_profile(PROFILE_ID)
    try:
        browser = Browser(cdp_url=started.cdp_ws, highlight_elements=False)
        agent = Agent(
            task="Find the number of stars of the browser-use repository",
            llm=ChatOpenAI(model="gpt-5.5"),
            browser=browser,
        )
        await agent.run()
    finally:
        await sb.stop_profile(PROFILE_ID)
        await sb.aclose()

asyncio.run(main())

Four settings behave differently on an attached profile:

  • highlight_elements=False. By default browser-use adds its own container element to the page to mark what it can click, and the page can see it.
  • No user_data_dir, no storage_state. The profile already keeps its cookies, storage and logins between starts. A storage_state is replayed into every new document by script, which is something the profile does not need.
  • The proxy goes on the profile. On an attached browser, ProxySettings can only answer a proxy's password prompt; the address itself is a launch option. Store the proxy once and assign it; see Proxies & exits.
  • Stopping the agent does not stop the browser. browser-use leaves a browser it did not launch running. Stop the profile through the daemon, as above.

Or let your coding agent drive

If the goal is an agent working a website, you may not need a second agent loop at all. The daemon's MCP server gives any MCP client a small tool set over the same profile: it leases the profile, reads the page as a text map, and every click and keystroke goes through the human input layer. The model is whichever one your client already runs, and there is no separate API key to manage.

bash
claude mcp add --transport http scalebrowser http://127.0.0.1:8787/v1/mcp \
  --header "Authorization: Bearer $SCALEBROWSER_TOKEN"

Then give it the same task in plain words:

Open github.com/browser-use/browser-use in a Scalebrowser profile and tell me how many stars it has.

Every other client is one entry in its configuration: Cursor, Codex, GitHub Copilot, Antigravity.

What a step costs

Measured on 2026-09-08 against browser-use 0.13.10, on the same live pages, in cl100k_base tokens:

Seeing the pageEach following step
Hacker News, Scalebrowser4,309462
Hacker News, browser-use18,09718,087
Wikipedia article, Scalebrowser2,7712,147
Wikipedia article, browser-use8,3699,661

The gap per step comes from one design choice: after an action the MCP server answers with what changed on the page, not with the whole page again. A conversation carries every earlier answer into each new request, so the difference grows with the length of the task.

Next