Skip to main content
Glama

Remote Browser

PyPI

Remote Browser is an open-source, self-hosted browser orchestration system for AI agent harness engineering.

It launches and manages multiple isolated, containerized Chrome instances with CDP (Chrome Devtools Protocol) support for scalable web automation. Remote Browser is designed to integrate with AI agent runtimes and browser tools, and works with OpenClaw, Hermes Agent, etc.

It also bundles an MCP server for extracting personal data from many services: Amazon order history, Garmin activity stats, Zillow favorites, and more. This MCP server works with Claude Code, LM Studio, Gemini CLI, and many more.

Screenshot of Claude Code using Remote Browser MCP

Quickstart

Remote Browser is a Python app. To run it, you need uv and Podman:

uvx remotebrowser

Then open http://localhost:23456.

Related MCP server: web-scraper-server

MCP

Standard config works with most tools:

{
  "mcpServers": {
    "remotebrowser-mcp": {
      "url": "http://127.0.0.1:23456/mcp"
    }
  }
}

Use the Claude Code CLI to add the MCP server:

claude mcp add --transport http remotebrowser-mcp http://localhost:23456/mcp

Follow the MCP install guide, use the standard config above.

Follow the MCP install guide, use the standard config above.

Go to Program in the right sidebar -> Install -> Edit mcp.json. Use the standard config above.

Follow the MCP install guide, use the standard config above.

API

Start a new browser

POST /api/v1/browsers/{browser_id} creates a new browser with the specified browser_id. The browser runs in a container. If the browser_id is omitted, POST /api/v1/browsers creates a new browser with an automatically generated name.

Example: curl -X POST localhost:8300/api/v1/browsers/xyz123 creates a container named chromium-xyz123 and returns:

{ "container_name": "chromium-xyz123", "status": "created" }

Stop a browser

DELETE /api/v1/browsers/{browser_id} terminates the browser with the specified browser_id and returns the container name. Returns HTTP 404 if the browser ID is not found.

Example: curl -X DELETE localhost:8300/api/v1/browsers/xyz123 terminates the container named chromium-xyz123 and returns:

{ "container_name": "chromium-xyz123", "status": "deleted" }

Query a browser

GET /api/v1/browsers/{browser_id} returns information about the browser with the specified browser_id. Returns HTTP 404 if the browser is not found.

Example: curl localhost:8300/api/v1/browsers/xyz123 returns:

{ "last_activity_timestamp": 1772069081 }

List all browsers

GET /api/v1/browsers returns a JSON array of all running browser IDs.

Example: curl localhost:8300/api/v1/browsers returns:

["xyz123", "abc234"]

List pages of a browser

GET /api/v1/browsers/{browser_id}/pages returns a JSON array of page identifiers (CDP target IDs) for all open pages in the specified browser. Returns HTTP 404 if the browser is not found.

Example: curl localhost:23456/api/v1/browsers/test/pages returns:

["96FDE4162B8EEEBF98E26756D21CF0C5"]

Get page HTML

GET /api/v1/browsers/{browser_id}/pages/{page_id}/html returns the raw HTML of the specified page. Returns HTTP 404 if the browser or page is not found.

Example: curl localhost:23456/api/v1/browsers/test/pages/96FDE4162B8EEEBF98E26756D21CF0C5/html

Navigate a page

POST or GET /api/v1/browsers/{browser_id}/pages/{page_id}/navigate navigates the specified page to a URL taken from the request's query string. The url query parameter is preferred if present; otherwise the entire raw query string is used as the URL. Returns HTTP 400 if no URL is provided, HTTP 404 if the browser or page is not found, and HTTP 502 if the navigation fails.

Example: curl -X POST 'localhost:23456/api/v1/browsers/test/pages/96FDE4162B8EEEBF98E26756D21CF0C5/navigate?url=https://text.npr.org/' returns:

{ "status": "success" }

Get distilled page JSON

GET /api/v1/browsers/{browser_id}/pages/{page_id}/distilled returns the distilled JSON representation of the specified page, produced by matching the page against distillation patterns. Returns HTTP 404 if the browser or page is not found.

Example: curl localhost:23456/api/v1/browsers/test/pages/96FDE4162B8EEEBF98E26756D21CF0C5/distilled

Submit distilled page form

POST /api/v1/browsers/{browser_id}/pages/{page_id}/distill submits form field values for the specified page and continues the distillation loop, returning the next rendered distilled HTML form. The request body is form-encoded (application/x-www-form-urlencoded or multipart/form-data); each field is mapped by its name to the corresponding form input. Returns HTTP 404 if the browser or page is not found.

Example: curl -X POST localhost:23456/api/v1/browsers/test/pages/96FDE4162B8EEEBF98E26756D21CF0C5/distill -d 'email=user@example.com&password=secret' returns the next distilled HTML page.

List all patterns

GET /api/v1/patterns returns a JSON array of all pattern filenames (sorted alphabetically), including the extension (.html or .json).

Example: curl localhost:8300/api/v1/patterns returns:

["amazon_signin.html", "amazon_signin.json", "goodreads_signin.html"]

Get a pattern

GET /api/v1/patterns/{pattern_name} returns the content of the named pattern. Accepts an optional ext query parameter (html or json, defaults to html). Returns HTTP 404 if the pattern is not found, HTTP 400 if the name contains invalid characters or the extension is unsupported.

Example: curl localhost:8300/api/v1/patterns/amazon_signin returns the raw HTML of amazon_signin.html.

Example: curl localhost:8300/api/v1/patterns/amazon_signin?ext=json returns the JSON content of amazon_signin.json.

Create or update a pattern

POST /api/v1/patterns/{pattern_name} writes content to the named pattern file, creating it if it does not exist. Accepts an optional ext query parameter (html or json, defaults to html). Returns HTTP 400 if the name contains invalid characters or the extension is unsupported.

Example: curl -X POST localhost:8300/api/v1/patterns/amazon_signin -H 'Content-Type: application/json' -d '{"content": "<div gg-match=\"...\">"}' returns:

{ "pattern_name": "amazon_signin", "status": "created" }

On subsequent calls the status field is "updated".

Example (JSON): curl -X POST 'localhost:8300/api/v1/patterns/amazon_signin?ext=json' -H 'Content-Type: application/json' -d '{"content": "{\"rows\": \"tr\"}"}'

Delete a pattern

DELETE /api/v1/patterns/{pattern_name} removes the named pattern file. Accepts an optional ext query parameter (html or json, defaults to html). Returns HTTP 404 if the pattern is not found, HTTP 400 if the name contains invalid characters or the extension is unsupported.

Example: curl -X DELETE localhost:8300/api/v1/patterns/amazon_signin returns:

{ "pattern_name": "amazon_signin", "status": "deleted" }

Example (JSON): curl -X DELETE 'localhost:8300/api/v1/patterns/amazon_signin?ext=json'

Backends

The browser API runs on one of three backends, selected at startup:

Backend

Selected by

Browser runs as

CDP reached via

Podman (default)

(default)

local podman container

local mapped port

Daytona

BROWSER_BACKEND=daytona

on-demand Daytona sandbox

a signed HTTPS preview URL

External Fleet

CHROMEFLEET_URL set

upstream Chrome Fleet

the upstream fleet's /cdp

Podman is the default and needs no extra setup. Daytona is an on-demand sandbox provider: install the extra (uv sync --extra daytona) and set DAYTONA_API_KEY and DAYTONA_SNAPSHOT, plus DAYTONA_API_URL for a self-hosted Daytona. Setting CHROMEFLEET_URL takes precedence and proxies the browser API to an external Chrome Fleet. Because Daytona is reached over a signed HTTPS preview URL rather than a local port, the VNC live view (/live, /websockify) and the residential-proxy / geo-IP features are podman only.

Development

To run the development version, clone this repository and run:

uv run -m uvicorn getgather.main:app --port 23456

Deployment

Supported deployment:

A
license - permissive license
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity
Issues opened vs closed

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/remotebrowser/remotebrowser'

If you have feedback or need assistance with the MCP directory API, please join our Discord server