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.
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, nostorage_state. The profile already keeps its cookies, storage and logins between starts. Astorage_stateis 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,
ProxySettingscan 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.
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 page | Each following step | |
|---|---|---|
| Hacker News, Scalebrowser | 4,309 | 462 |
| Hacker News, browser-use | 18,097 | 18,087 |
| Wikipedia article, Scalebrowser | 2,771 | 2,147 |
| Wikipedia article, browser-use | 8,369 | 9,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
- MCP server: the tool set, the page map and how an agent sees a page.
- Tool reference: every tool an agent can be given.
- Migrate overview: the two steps, and what maps to what.