Browser agents and stealth cloud browsers for AI: run web tasks, fill forms, extract data.
com.browser-use/browser-use MCP Server
The com.browser-use/browser-use Model Context Protocol (MCP) server controls a real Chrome browser to complete tasks. It is used to perform actions such as filling forms and extracting data, with examples including booking flights. The server is associated with browser automation workflows.
🛠️ Key Features
Controls a real Chrome browser
Completes tasks via browser interaction
Supports form filling
Supports data extraction
Uses browser automation tooling
🚀 Use Cases
Fill forms
Extract data
Book flights
⚡ Developer Benefits
Integrates with LLM-based and AI-agent workflows
Fits AI tools and automation pipelines
Related to Python-based development and Playwright-style browser automation
⚠️ Limitations
Described capabilities focus on Chrome browser control and task execution through it
Create a new browser agent session and run a task. This uses the v3 sandbox-based agent that supports long-running sessions, workspaces, and keep-alive. After creating a session, call get_session to poll for status and output. For tasks requiring authentication, use list_browser_profiles first to get a profile_id.
Parameters7
task
string
required
Detailed instructions for what you want the browser agent to do.
model
string
optional
Agent model to use. When omitted, an account-appropriate default is selected. Available: gemini-3-flash, claude-sonnet-5, claude-opus-4.6, claude-opus-4.7, claude-opus-4.8, gpt-5.4-mini, glm-5.2, minimax-m3, grok-4.6, glm-5.3-flash, deepseek-v4-flash-vision.
profile_id
string
optional
UUID of the cloud profile to use for authenticated tasks. Get this from list_browser_profiles.
workspace_id
string
optional
UUID of the workspace for file persistence across sessions.
keep_alive
boolean
optional
If true, the session stays idle after the task finishes, ready for follow-up tasks via send_task. Default is false (session auto-stops).
output_schema
object
optional
JSON schema for structured output. The agent will return data matching this schema.
proxy_country
any
optional
ISO 3166-1 alpha-2 country code for the proxy location (e.g. "us", "gb", "de", "jp", "br"). Defaults to "us" if not specified. Set to null to disable the proxy.
Raw schema
{
"type": "object",
"properties": {
"task": {
"type": "string",
"description": "Detailed instructions for what you want the browser agent to do.",
"minLength": 1,
"maxLength": 50000
},
"model": {
"type": "string",
"description": "Agent model to use. When omitted, an account-appropriate default is selected. Available: gemini-3-flash, claude-sonnet-5, claude-opus-4.6, claude-opus-4.7, claude-opus-4.8, gpt-5.4-mini, glm-5.2, minimax-m3, grok-4.6, glm-5.3-flash, deepseek-v4-flash-vision.",
"enum": [
"gemini-3-flash",
"claude-sonnet-5",
"claude-opus-4.6",
"claude-opus-4.7",
"claude-opus-4.8",
"gpt-5.4-mini",
"glm-5.2",
"minimax-m3",
"grok-4.6",
"glm-5.3-flash",
"deepseek-v4-flash-vision"
]
},
"profile_id": {
"type": "string",
"description": "UUID of the cloud profile to use for authenticated tasks. Get this from list_browser_profiles."
},
"workspace_id": {
"type": "string",
"description": "UUID of the workspace for file persistence across sessions."
},
"keep_alive": {
"type": "boolean",
"description": "If true, the session stays idle after the task finishes, ready for follow-up tasks via send_task. Default is false (session auto-stops).",
"default": false
},
"output_schema": {
"type": "object",
"description": "JSON schema for structured output. The agent will return data matching this schema."
},
"proxy_country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "ISO 3166-1 alpha-2 country code for the proxy location (e.g. \"us\", \"gb\", \"de\", \"jp\", \"br\"). Defaults to \"us\" if not specified. Set to null to disable the proxy.",
"default": "us"
}
},
"required": [
"task"
]
}
send_task
Send a follow-up task to an existing keep-alive session. The session must be in idle status. Use this for multi-turn interactions where you want to reuse the same browser context.
Parameters4
session_id
string
required
UUID of an existing idle session (from run_session with keep_alive=true).
task
string
required
The follow-up task instructions.
keep_alive
boolean
optional
If true, session stays idle after this task too. Default is false.
output_schema
object
optional
JSON schema for structured output.
Raw schema
{
"type": "object",
"properties": {
"session_id": {
"type": "string",
"description": "UUID of an existing idle session (from run_session with keep_alive=true)."
},
"task": {
"type": "string",
"description": "The follow-up task instructions.",
"minLength": 1,
"maxLength": 50000
},
"keep_alive": {
"type": "boolean",
"description": "If true, session stays idle after this task too. Default is false.",
"default": false
},
"output_schema": {
"type": "object",
"description": "JSON schema for structured output."
}
},
"required": [
"session_id",
"task"
]
}
get_session
Get current status and output of a session. Call this repeatedly to poll for task completion. Returns status (created, idle, running, stopped, timed_out, error), step count, output, cost breakdown, and live URL.
Parameters1
session_id
string
required
UUID of the session to check.
Raw schema
{
"type": "object",
"properties": {
"session_id": {
"type": "string",
"description": "UUID of the session to check."
}
},
"required": [
"session_id"
]
}
get_session_messages
Get the agent messages/steps for a session. Shows what the agent is doing including browser actions, reasoning, and results. Use after= parameter for pagination to get new messages since your last check.
Parameters3
session_id
string
required
UUID of the session.
after
string
optional
Return messages after this message ID (cursor-based pagination). Omit for initial fetch.
limit
integer
optional
Max number of messages to return.
Raw schema
{
"type": "object",
"properties": {
"session_id": {
"type": "string",
"description": "UUID of the session."
},
"after": {
"type": "string",
"description": "Return messages after this message ID (cursor-based pagination). Omit for initial fetch."
},
"limit": {
"type": "integer",
"description": "Max number of messages to return.",
"default": 50,
"minimum": 1,
"maximum": 100
}
},
"required": [
"session_id"
]
}
stop_session
Stop a running session. Use strategy "task" to stop only the current task (session stays idle for follow-ups), or "session" (default) to destroy the sandbox entirely.
Parameters2
session_id
string
required
UUID of the session to stop.
strategy
string
optional
Stop strategy: "task" stops the current task only, "session" destroys the sandbox.
Raw schema
{
"type": "object",
"properties": {
"session_id": {
"type": "string",
"description": "UUID of the session to stop."
},
"strategy": {
"type": "string",
"enum": [
"task",
"session"
],
"description": "Stop strategy: \"task\" stops the current task only, \"session\" destroys the sandbox.",
"default": "session"
}
},
"required": [
"session_id"
]
}
list_sessions
List recent sessions for the authenticated project, with status and cost info.
List all available cloud browser profiles for the authenticated project. Profiles store persistent authentication (cookies, sessions) for websites requiring login. Use this BEFORE attempting any authenticated tasks. Show profiles to the user and let them choose, then pass the selected profile_id to run_session.
Shows a black Browser Use Logo in light color mode and a white one in dark color mode.
The AI browser agent.
imageimageimageimageimageimageimage
The open-source browser agent. Run it locally with any LLM, or on Browser Use Cloud: stealth browsers from $0.02/hour, top score (90.5%) on Stealth Bench V2.
Navigate the web like a human does.
Find an available slot, pick a date and time, handle the CAPTCHA, and book a driving test.
AI agents and crawlers: read browser-use.com/llms.txt for the product map (open source, Browser Harness, Cloud browsers, Agents API, pricing) and docs.browser-use.com/llms.txt for the documentation index. Browser Use is the open-source browser agent (Python and TypeScript), a $0.02 per browser-hour cloud browser with stealth, CAPTCHA solving and residential proxies, and a hosted agent API.
New Google, GitHub, or Microsoft signups get $1 cloud credit.
Path 2: CLI
Paste this prompt into Claude Code, Codex, Hermes, OpenClaw, or your favorite agent.
text
Install or upgrade browser-use to the latest stable version with uv using Python 3.12, run `browser-use skill install` to register the skill, and connect it to my browser. If setup or connection fails, follow https://github.com/browser-use/browser-harness/blob/main/install.md.
Path 3: Python Library
Run the Browser Use agent locally from Python, with your choice of model and a local or cloud browser:
1. Install Browser Use (Python >= 3.11):
With uv installed, run uv init --python 3.12 first if you're starting a new project.
import asyncio
from browser_use import Agent, Browser, ChatBrowserUse, ChatOpenAI
from dotenv import load_dotenv
load_dotenv()
asyncdefmain():
llm = ChatOpenAI(model='gpt-5.6-luna', reasoning_effort='xhigh')
# llm = ChatBrowserUse(model='bu-2-0') # Use BU2 instead; requires BROWSER_USE_API_KEY
agent = Agent(
task="Find the number of stars of the browser-use repo",
llm=llm,
# browser=Browser(use_cloud=True), # Use a cloud browser; requires BROWSER_USE_API_KEY
)
history = await agent.run()
print(history.final_result())
if __name__ == "__main__":
asyncio.run(main())
To use BU2, replace the ChatOpenAI line with the commented ChatBrowserUse line. The cloud-browser option works with either model.
4. Run it:
bash
uv run agent.py
The agent opens a browser, looks up the repository, and prints its answer.
5. Run the same agent on a cloud browser (no Chrome to install; works in Docker, CI, and serverless):
Set BROWSER_USE_API_KEY (get a key), then uncomment the browser= line in agent.py and run it again:
python
agent = Agent(
task="Find the number of stars of the browser-use repo",
llm=llm,
browser=Browser(use_cloud=True),
)
Cloud browsers cost $0.02 per browser-hour plus network traffic (pricing), and add stealth, residential proxies, CAPTCHA solving, and a live view URL. Same code, no other changes.
Maintained by Browser Use. Compatible with Claude.
Use Claude's browser toolset with Browser Use as the driver. Browser Use
implements all 31 browser actions and can control a local browser, a Browser
Use Cloud browser, or an existing remote browser over CDP.
Bash is included in the Browser Use integration for processing data and writing files.
Requires an Anthropic SDK version that includes anthropic.tools.browser.
Bash requires a Linux or macOS host with /bin/bash; use WSL on Windows.
The snippet below runs inside an async function; see the quickstart for a complete script.
python
import os
from anthropic import AsyncAnthropic
from browser_use.integrations.toolsets_for_claude import Bash, BrowserUse
task = 'Open example.com and report its page title.'
driver = BrowserUse() # Or BrowserUse(use_cloud=True)
bash = Bash(output_dir='outputs')
asyncwith driver, AsyncAnthropic() as client:
runner = client.beta.messages.tool_runner(
model=os.environ['ANTHROPIC_MODEL'],
max_tokens=32_768,
max_iterations=100,
tools=[driver, bash],
messages=[{'role': 'user', 'content': task}],
)
result = await runner.until_done()
This very hard benchmark targets the hardest browser tasks. On easier tasks, even smaller models can achieve very high success rates. Results shown are from a 60-task subset of BU Bench V2.
Integrations, hosting, custom tools, MCP, and more on our Docs ↗
FAQ
Should I use the fully hosted cloud, CLI, or Python library?
Fully Hosted Cloud: Send tasks through the API and let Browser Use run the agent, browser, and infrastructure.
CLI: Give an existing agent (Claude Code, Codex, Hermes, OpenClaw, Pi, Cursor, etc.) browser access. You can use it interactively or in scripts.
Python Library: Run the open source agent in your own application, with custom tools, structured output, and your choice of model.
The CLI and Python library can each connect to a local or cloud browser. A cloud browser hosts the browser; the fully hosted API runs the agent as well.
What's the best model to use?
We recommend BU2, our model optimized for browser automation: ChatBrowserUse(model='bu-2-0'). It uses BROWSER_USE_API_KEY; ChatBrowserUse() currently selects the same model.
Can I use Claude / GPT / Gemini through ChatBrowserUse?
Yes. ChatBrowserUse accepts provider-prefixed model IDs through the Browser Use gateway, using BROWSER_USE_API_KEY:
python
from browser_use import Agent, ChatBrowserUse
llm = ChatBrowserUse(model='anthropic/claude-sonnet-4-6') # or 'google/gemini-3-pro'
agent = Agent(task='...', llm=llm)
You can also use providers directly through wrappers such as ChatOpenAI, ChatAnthropic, and ChatGoogle, with each provider's own API key. See supported models.
Do I need to provide a system prompt?
No. Agent(...) supplies the Browser Use system prompt automatically, including when you change models. Put your task in task=. Use extend_system_message to add instructions or override_system_message to replace the default prompt when you need custom behavior.
Yes. Register a function with Tools and pass it to the agent. This example adds a tool for the current UTC time and uses BROWSER_USE_API_KEY from .env:
python
import asyncio
from datetime import datetime, timezone
from browser_use import ActionResult, Agent, ChatBrowserUse, Tools
from dotenv import load_dotenv
load_dotenv()
tools = Tools()
@tools.action(description='Get the current date and time in UTC.')defget_current_time() -> ActionResult:
return ActionResult(extracted_content=datetime.now(timezone.utc).isoformat())
asyncdefmain():
agent = Agent(
task="What is the current UTC time?",
llm=ChatBrowserUse(model='bu-2-0'),
tools=tools,
)
history = await agent.run()
print(history.final_result())
if __name__ == "__main__":
asyncio.run(main())
Can I use this for free?
The Python library is free and MIT-licensed. Model inference and hosted browsers are separate: API providers, including ChatBrowserUse, and Browser Use Cloud charge for usage. You can also use a local browser and a local model through Ollama, subject to your hardware and model requirements.
Terms of Service
This open-source library is licensed under the MIT License. For Browser Use services & data policy, see our Terms of Service and Privacy Policy.
How do I handle authentication?
Local browser: Use Browser.from_system_chrome() to reuse a Chrome profile. See the real-browser guide and example.
Cloud browser: Follow the profile sync guide, then use Browser(use_cloud=True, cloud_profile_id='your-profile-id').
Profile sync transfers cookies, not local storage, IndexedDB, or extensions. Some sites may require you to sign in again.
How do I solve CAPTCHAs?
Browser Use Cloud provides stealth browsers and proxies designed to reduce bot detection and CAPTCHA challenges. With the Python library, enable a cloud browser with Browser(use_cloud=True) and set BROWSER_USE_API_KEY.
Results depend on the site and challenge; no browser configuration guarantees that every CAPTCHA can be avoided or solved.
How do I go into production?
Choose how much you want to manage:
Keep your agent code: Connect the CLI or Python library to cloud browsers for managed browser infrastructure, stealth, profiles, and recordings.
Have us run the agent too: Use the fully hosted Cloud API to submit tasks and retrieve results.
You can also host the Python library and browsers on your own infrastructure.
Can I rerun a task without calling the model on every step?
Yes. Save a successful run, then replay its clicks and typing with new values. The snippet below runs inside an async function:
python
from browser_use import Agent, ChatBrowserUse
llm = ChatBrowserUse()
agent = Agent(task='Open https://example.com/billing and request an invoice copy for Ada Lovelace, ada@example.com', llm=llm)
await agent.run()
agent.save_history('invoice_run.json')
print(agent.detect_variables()) # names come from the form's fields, e.g. 'name' and 'email'# Later: the same clicks and typing with new values, no model call per step
results = await Agent(task='', llm=llm).load_and_rerun(
'invoice_run.json', variables={'name': 'Grace Hopper', 'email': 'grace@example.com'}, skip_failures=False
)
Use the variable names detect_variables() prints. An unknown name is skipped with a warning, and the recorded value is typed instead.
Extract steps and the closing summary still call the model.
If the page changed, the replay raises RuntimeError at the first step it cannot match. The steps before it already ran, so check whether the form was sent before you run the agent again.
Keep the saved file private. With sensitive_data, typed secrets are saved as <secret>key</secret> placeholders, but page snapshots and results are saved as they were and can still contain them. Give the replaying agent the same sensitive_data; without it, the placeholder text is typed.
Explore browser tasks and compare agent performance.
Citation
If you use Browser Use in your research or project, please cite:
bibtex
@software{browser_use2024,
author = {Müller, Magnus and Žunič, Gregor},
title = {Browser Use: Enable AI to control your browser},
year = {2024},
publisher = {GitHub},
url = {https://github.com/browser-use/browser-use}
}
Tell your computer what to do, and it gets it done.