AntiBrow

Give an agent persistent, isolated browser profiles: each keeps its cookies, storage and fingerprint configuration between runs and answers its own proxy inside the engine.

Documentation

Run the SDK as an MCP server and an agent gets a real, fingerprinted browser with 19 tools. Add this to your MCP client config. The MCP protocol SDK is an optional peer dependency, which is why the two -p flags are there - npx anti-detect-browser --mcp on its own exits with MCP server mode needs @modelcontextprotocol/sdk. Nothing has to be installed permanently.

{
  "mcpServers": {
    "anti-detect-browser": {
      "command": "npx",
      "args": [
        "-y", "-p", "anti-detect-browser", "-p", "@modelcontextprotocol/sdk",
        "anti-detect-browser", "--mcp"
      ],
      "env": {
        "ANTI_DETECT_BROWSER_KEY": "your-api-key"
      }
    }
  }
}

Works with any MCP client. The browser runs on your machine, so there are no browser-hours to buy.

The 16 tools below are the browser, profile, proxy and Live View tools. The server also exposes list_recipes, run_recipe and fanout_recipe - 19 in total - and those three are documented on the recipes page. If your agent is Python and you would rather own the server, pip install "antibrow[mcp]" and the package ships a worked stdio-server example covering the same launch, navigate, click, fill, read, screenshot, evaluate and close cycle - the profiles are the same either way. See the Python SDK.

The session model

This is the part worth understanding before reading the tool list. MCP tool calls are discrete: the model calls a tool, gets a result, thinks, calls another. Many browser tools start a fresh context per call, so a login performed in one call is gone by the next.

Here the browser process stays up. launch_browser returns a sessionId, and every page tool takes that id and reconnects to the same running browser. The tab you left open is the tab the next call finds. Cookies, storage and passkeys are written to the profile directory, so even a restart restores the same signed-in identity with the same fingerprint.

// 1. launch. \`profile\` is required; the profile is created if new.
launch_browser({ profile: "agent-01" })
//    -> { sessionId, profileDir, viewUrl }

// 2. every page tool takes that sessionId
navigate({ sessionId, url: "https://example.com" })
fill({ sessionId, selector: "#email", value: "me@example.com" })
click({ sessionId, selector: "button[type=submit]" })
get_content({ sessionId })

// 3. the browser stays up between tool calls, so a later turn
//    is still signed in. Close it when the task is done.
close_browser({ sessionId })

profile is required on launch_browser. There is no default. Pick a stable name per identity and reuse it, because the profile is the identity: reusing the name is what makes run 40 look like run 1 to the site.

Browser tools

Starting and stopping a browser, and finding the ones already running.

launch_browser (profile, label?, color?, tags?, proxy?, proxyId?, headless?)

Launch a browser with a spoofed fingerprint. Creates the profile if it does not exist yet.

profilestringrequiredProfile name. Also the directory name on disk.
labelstringoptionalLabel text shown in the browser window.
colorstringoptionalTheme colour in hex, for example #e74c3c.
tagsarrayoptionalTags stored with the profile.
proxystringoptionalYour own proxy URL: protocol://user:pass@host:port
proxyIdstringoptionalManaged proxy id. Activates it and meters monthly quota. Get one from list_proxies or claim_proxy.
headlessbooleanoptionalRun without a visible window.

close_browser (sessionId )

Close one browser session.

sessionIdstringrequiredThe id returned by launch_browser.

list_sessions ( )

List every browser session currently running.

Page tools

All of these act on an open session, so every one of them takes a sessionId.

navigate (sessionId, url )

Navigate to a URL.

sessionIdstringrequired
urlstringrequiredURL to navigate to.

click (sessionId, selector )

Click an element.

sessionIdstringrequired
selectorstringrequiredCSS selector of the element to click.

fill (sessionId, selector, value )

Fill a form field with text.

sessionIdstringrequired
selectorstringrequiredCSS selector of the input.
valuestringrequiredText to fill.

get_content (sessionId, selector?)

Read text content from the page, or from one element.

sessionIdstringrequired
selectorstringoptionalRestrict to one element. Omit for the whole page.

screenshot (sessionId )

Screenshot the current page.

sessionIdstringrequired

evaluate (sessionId, script )

Run JavaScript in the page context and return the result.

sessionIdstringrequired
scriptstringrequiredJavaScript to execute.

Proxy tools

Managed residential proxies come with paid plans. Claiming one is free; quota is consumed only when you launch a profile with it.

list_proxies ( )

List the managed proxies assigned to you, plus your monthly quota: limit, usedThisMonth, remaining, holdCount and holdCap.

claim_proxy ( )

Claim an available managed proxy and return it, including its id. Claiming does not consume monthly quota.

Live View tools

Stream a running session to your dashboard. Live View is a paid-plan feature.

start_live_view (sessionId, quality?)

Start streaming the session screen.

sessionIdstringrequired
qualitynumberoptionalJPEG quality, 1 to 100. Defaults to 60.

stop_live_view (sessionId )

Stop streaming.

sessionIdstringrequired

Common errors

Missing required parameter "profile" launch_browser has no default profile. Pass one, and use the same name every time for that identity.Session not found The sessionId refers to a browser that has been closed. Call list_sessions to see what is running, or launch again.Concurrency limit reached Your plan caps how many browsers run at once: 1 on Free, then 5, 20 or 100. Close a session or raise the cap. Profile count is never the limit.

Prefer writing code to using MCP tools? The same profiles are drivable from the SDK with standard Playwright.