Skip to main content

Type-safe Pydantic wrapper around Vercel's agent-browser CLI

Project description

agent-browser

A type-safe Python wrapper around Vercel's agent-browser CLI.

The convenience API is mapped against the complete 151-tool MCP inventory in agent-browser 0.31.1, with one additional documented CLI extension for runtime init scripts.

Install

Install agent-browser and its browser once:

npm install -g agent-browser
agent-browser install

Then install this package:

pip install vercel-agent-browser

Python 3.10+ and Pydantic 2 are supported.

Quick start

from agent_browser import AgentBrowser, Direction, LoadState

browser = AgentBrowser()

browser.open("https://example.com")
browser.wait_for_load(LoadState.NETWORK_IDLE)

snapshot = browser.snapshot(interactive=True).data
print(snapshot.snapshot)
print(snapshot.refs["e1"].role)

browser.click("@e1")
browser.scroll(Direction.DOWN, 500)

title: str = browser.get_title().data.value
url: str = browser.get_url().data.value

browser.close()

The browser remains stateful between calls because agent-browser manages a persistent daemon. A context manager closes the current session on exit:

from agent_browser import AgentBrowser, ClientConfig, GlobalOptions

config = ClientConfig(
    timeout=60,
    options=GlobalOptions(
        session="research",
        headed=True,
        allowed_domains=("example.com", "*.example.com"),
    ),
)

with AgentBrowser(config) as browser:
    browser.open("https://example.com")
    print(browser.read().data.value)

Clone a configured client when one process needs to address multiple isolated browser sessions explicitly:

research = browser.for_session("research", namespace="my-application")
checkout = browser.for_session("checkout", namespace="my-application")

research.open("https://example.com/docs")
checkout.open("https://example.com/store")

Complete 0.31.1 surface

The wrapper includes authentication vaults, persisted state, cookie-file imports, tracing and recording, page diffs, React diagnostics, mobile gestures, streaming, session discovery, confirmations, and trusted CLI administration. For example:

from agent_browser import ColorScheme, Direction, ReducedMotion

# Passwords are sent over stdin and never placed in argv.
browser.auth_save(
    "example",
    url="https://example.com/login",
    username="person@example.com",
    password="secret",
)
browser.auth_login("example")

browser.state_save("state.json")
browser.trace_start()
browser.swipe(Direction.UP, 400)
trace = browser.trace_stop("trace.json").data.path

browser.set_media(
    ColorScheme.NO_PREFERENCE,
    reduced_motion=ReducedMotion.NO_PREFERENCE,
)

Administrative methods such as plugin_add(), doctor(), install(), upgrade(), and chat() are available to trusted Python callers. They are deliberately absent from the agent-facing registry described below.

The versioned inventory and exposure tier for every MCP tool are available from agent_browser.inventory. AgentBrowser.tools_profiles() returns typed local metadata for the MCP-only startup-profile tool without inventing a nonexistent CLI command.

Typed results

Every JSON-mode call returns CommandResult[T]. Its data is a Pydantic model specific to that operation, while its other fields preserve useful process metadata:

result = browser.get_box("@e1")

print(result.data.x, result.data.y)
print(result.command)
print(result.stderr)
print(result.duration_seconds)

Common typed payloads include:

  • SnapshotData and SnapshotRef
  • StringData, BooleanData, and IntegerData
  • BoundingBox and PathData
  • JsonData for successful commands whose payload is command-specific

Pydantic validates both outgoing configuration and incoming structured data.

Errors

CLI failures raise AgentBrowserCommandError. The exception retains the subprocess exit code, arguments, stdout/stderr, warning, and normalized Pydantic error model:

from agent_browser import AgentBrowserCommandError

try:
    browser.click("@missing")
except AgentBrowserCommandError as exc:
    print(exc.error.message)
    print(exc.error.code)
    print(exc.returncode)

The package also distinguishes an unavailable executable, subprocess timeout, and invalid CLI response with AgentBrowserNotFoundError, AgentBrowserTimeoutError, and AgentBrowserResponseError.

Custom and future commands

Use run() for CLI commands not yet represented by a convenience method. Pass an argument sequence—not a shell string:

result = browser.run(["console", "--clear"])
print(result.data.root)

You can supply your own Pydantic model for a command's data payload:

from pydantic import BaseModel

class StreamStatus(BaseModel):
    enabled: bool
    port: int | None = None

status = browser.run(["stream", "status"], StreamStatus).data

For compact human-readable CLI output, use run_text():

text = browser.run_text(["snapshot", "-i"]).stdout

run() always requests JSON output and parses the standard {"success": ..., "data": ...} envelope. It also accepts raw JSON payloads for commands such as batch that emit an array directly.

Compatibility note

The encoded inventory and argument contract target agent-browser 0.31.1. That release's version-matched documentation advertises a runtime addinitscript command, so this package exposes add_init_script() alongside remove_init_script(). The installed 0.31.1 native binary currently rejects addinitscript as unknown_command; the wrapper preserves that structured CLI error rather than silently substituting the different launch-time --init-script <file> option.

Executable and environment configuration

If agent-browser is not on PATH, point to it explicitly:

from pathlib import Path
from agent_browser import AgentBrowser, ClientConfig

browser = AgentBrowser(
    ClientConfig(
        executable=Path("/opt/homebrew/bin/agent-browser"),
        env={"AGENT_BROWSER_ENCRYPTION_KEY": "..."},
    )
)

Environment values are merged onto the current process environment. Arguments are passed directly to subprocess.run(..., shell=False); no selector, URL, JavaScript, password, or other input is interpreted by a shell.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vercel_agent_browser-0.1.3.tar.gz (28.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vercel_agent_browser-0.1.3-py3-none-any.whl (22.8 kB view details)

Uploaded Python 3

File details

Details for the file vercel_agent_browser-0.1.3.tar.gz.

File metadata

  • Download URL: vercel_agent_browser-0.1.3.tar.gz
  • Upload date:
  • Size: 28.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for vercel_agent_browser-0.1.3.tar.gz
Algorithm Hash digest
SHA256 6aeaabba3d875d02622da059216d70c91510d280bbe20633b6f9c50d2e390ccc
MD5 c02e837d89bc43631ed4191dc34fdc0b
BLAKE2b-256 648999cc0791149da223963549bb67e465a6f336fa3d1b727d7d53ca6a494704

See more details on using hashes here.

File details

Details for the file vercel_agent_browser-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: vercel_agent_browser-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 22.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for vercel_agent_browser-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 40db03277139548891e504f66c275095b81c0809a82d9bfdab1b0b904eb605db
MD5 c75f2311ac1ffbf8a1d7881119e8b591
BLAKE2b-256 972a3a8e159d56356d9cc07ad4a459917c65028f9f8658c7f79942fc6fc617d4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page