Skip to main content
Glama

Auto Browser

MCP Toplist

CI PyPI License: MIT MCP Server Local First Open in GitHub Codespaces

Auto Browser demo

Give your AI agent a real browser, with a human in the loop.

Auto Browser is an MCP-native browser control plane for authorized workflows. It gives MCP clients, LLM agents, and operators a shared Playwright browser with human takeover, reusable auth profiles, approvals, audit trails, and local-first deployment.

Works with:

  • Claude Desktop

  • Cursor

  • any MCP client that can talk HTTP or stdio

  • direct REST callers when you want curl-first control

Why Auto Browser

  • MCP-native from day one. The browser surface is already packaged as an MCP server instead of bolted on after the fact.

  • Human takeover when the web gets brittle. noVNC keeps the same live session available when a person needs to step in.

  • Login once, reuse later. Save named auth profiles and reopen fresh sessions that are already signed in.

  • Local-first by default. Run the full stack on your own box with Docker Compose, or use Codespaces for a quick hosted demo.

  • Safety rails built in. Approvals, operator identity, PII scrubbing, Witness receipts, and policy presets are all part of the product surface.

  • Evidence you can hand to someone else. Witness receipt chains are Ed25519-signed, and an exported bundle verifies with scripts/verify_witness_bundle.py — which imports nothing from this project, so a recipient need not run or trust this controller to check it.

  • We audit ourselves in public. docs/audits/2026-08-execution-audit.md documents an adversarial audit of this repo that found safety controls which reported success while doing nothing, with reproductions, the fixes, and the gates that close the class.

  • Governed skill induction. Verified browser traces can become staged skill candidates with provenance that is signed when a mesh identity is configured — and checked on read, not just produced — plus verifier adapters and review-only graduation — agents that prove they can repeat themselves correctly, not just act once.

Related MCP server: Browser-Use MCP Server

Release Highlights (v1.5.0)

  • Read a page without paying for pixels. The new text observation preset returns the accessibility outline, extracted text, and interactables with no screenshot and no OCR — the cheapest way for an agent to read a page. Set PERCEPTION_PRESET_DEFAULT=text to make it a deployment-wide default.

  • Find a string on the page in one call. browser.find_elements now takes a query (plain text or regex, case-insensitive) instead of a CSS selector and returns each match with surrounding context — no full observe needed to check one value.

  • Errors agents can act on. Invalid tool arguments report field-level details, handler messages pass through instead of a generic failure, and the MCP bridge's cold-start error now says exactly how to start the controller.

  • Any OpenAI-compatible model can drive the browser. A single generic adapter serves every model reachable over an OpenAI /chat/completions endpoint. New providers: openrouter (one key → ~every frontier model), xai (Grok), deepseek, minimax, and openai_compatible (custom base URL for self-hosted Ollama / vLLM / LM Studio, Azure, Together, Groq, Fireworks, …). Vision + function-calling with a content-parse fallback for endpoints that ignore tool_choice.

  • browser://audit/events MCP resource. List and read recent audit events across sessions directly over MCP.

  • Playwright pin parity enforced in CI. The controller (pip) and browser-node (npm) Playwright versions must match exactly — a single-side bump can no longer merge and crash-loop compose deployments.

  • On PyPI. pip install auto-browser-client for the SDK, pip install auto-browser-langchain for the LangChain/LangGraph/CrewAI adapters, and uvx auto-browser-mcp to run the MCP stdio bridge with zero setup. Releases publish via PyPI trusted publishing (OIDC) on tag push.

Since v1.3.0

  • browser_manager.py is now a pure facade + composition root (1,284 → 769 lines), with domain logic extracted into app/browser/services/.

  • Fork state exports are encrypted at rest and shadow-browse state never touches disk.

  • Download capture tasks can no longer be garbage-collected mid-flight, shadow-browse failures roll back cleanly, and page listeners survive object-id reuse.

  • Release gates in CI enforce dependency audits, fixture evals, client tests, Python wheel builds, and the 80% controller coverage gate on Python 3.11 and 3.14.

See CHANGELOG.md for the full release history.

Good Fits

  • internal dashboards and admin tools

  • operator-assisted QA and browser debugging

  • login-once, reuse-later account workflows

  • brittle sites where a human may need to recover the flow

  • MCP-powered agent workflows that need a real browser, not just HTML fetches

Not the Goal

  • CAPTCHA solving

  • unauthorized scraping or account automation

  • deceptive identity shaping or bypass tooling

What You Get

Browser Control

Operator Safety

Deployment and Integration

Playwright-backed sessions with screenshots, DOM summaries, OCR excerpts, tab controls, downloads, and network inspection

approval gates, operator identity headers, audit events, PII scrubbing, Witness receipts, and protection profiles

MCP over HTTP, bundled stdio bridge, REST API, Docker Compose, Codespaces, auth profiles, and optional per-session isolation

Quickstart

git clone https://github.com/LvcidPsyche/auto-browser.git
cd auto-browser
docker compose up --build

That is enough for local development with the default settings.

Optional:

cp .env.example .env
make doctor

Run make doctor from a normal terminal with local Docker access and permission to open localhost sockets.

Open:

  • API docs: http://127.0.0.1:8000/docs

  • Operator dashboard: http://127.0.0.1:8000/dashboard

  • Visual takeover: http://127.0.0.1:6080/vnc.html?autoconnect=true&resize=scale

All published ports bind to 127.0.0.1 by default.

Try It in Codespaces

Open in GitHub Codespaces

Codespaces provisions the stack automatically. The dashboard and noVNC tabs are usually ready in about 90 seconds.

First Useful Demo

The highest-signal flow in this repo is:

  1. create a session

  2. log in manually if the site needs a human

  3. save the session as a named auth profile

  4. open a new session from that auth profile

  5. continue work without reauthing

Start here:

Minimal session creation:

curl -s http://127.0.0.1:8000/sessions \
  -X POST \
  -H 'content-type: application/json' \
  -d '{"name":"demo","start_url":"https://example.com"}' | jq

Minimal observation:

curl -s http://127.0.0.1:8000/sessions/<session-id>/observe | jq

MCP Clients

Auto Browser exposes:

  • an HTTP MCP endpoint at http://127.0.0.1:8000/mcp

  • convenience endpoints at http://127.0.0.1:8000/mcp/tools and http://127.0.0.1:8000/mcp/tools/call

  • a stdio bridge: uvx auto-browser-mcp from PyPI, or scripts/mcp_stdio_bridge.py in a repo checkout

The default MCP tool profile is curated, which keeps the browser surface compact for better tool selection. If you want the full internal tool surface, set:

MCP_TOOL_PROFILE=full

Raw tool-call example:

curl -s http://127.0.0.1:8000/mcp/tools/call \
  -X POST \
  -H 'content-type: application/json' \
  -d '{
    "name":"browser.create_session",
    "arguments":{
      "name":"demo",
      "start_url":"https://example.com"
    }
  }' | jq

Client setup guides:

For resource listing, resource reads, and subscription-style update examples, see docs/mcp-clients.md#resources-and-subscriptions.

Convergence Harness

Auto Browser ships a Stage 0 convergence harness for Agent Skill Induction. It runs a structured task contract, records tamper-checked traces, verifies completion, and writes a staged skill candidate carrying provenance. With a mesh identity configured that provenance is signed, and the registry verifies the signature before serving a candidate — a candidate that fails the check, or that was dropped into the staging directory unsigned, is refused. Candidates induced from a mock run are marked simulated so they cannot pass as converged. Generated skills are staged only — promotion stays explicit and reviewed.

Read-only inspection tools (harness.list_runs, harness.get_status, harness.get_trace) are exposed in the default curated MCP tool profile so agents can introspect harness state without elevated access. Convergence runs, drift checks, candidate management, and graduation require MCP_TOOL_PROFILE=full, or can be invoked directly over REST.

Start with docs/convergence-harness.md. A deterministic local smoke is:

python -m controller.harness.run --contract evals/contracts/example_read.json --mock-final-url https://example.com --mock-final-text "Example Domain"

For MCP clients, set MCP_TOOL_PROFILE=full to expose the harness.* tools.

Security and Compliance

For a real private deployment, set at least:

APP_ENV=production
API_BIND_SCOPE=exposed
API_BEARER_TOKEN=<strong-random-secret>
REQUIRE_OPERATOR_ID=true
AUTH_STATE_ENCRYPTION_KEY=<44-char-fernet-key>
REQUIRE_AUTH_STATE_ENCRYPTION=true
REQUEST_RATE_LIMIT_ENABLED=true
METRICS_ENABLED=true
STEALTH_ENABLED=false

COMPLIANCE_TEMPLATE can apply a preconfigured posture at startup:

Preset

Auth Encryption

Operator ID

PII Scrub

Isolation

Max Session Age

strict

required

required

all layers

docker_ephemeral

4h

balanced

-

required

network + text

shared

24h

Both presets require upload approvals and enable Witness receipts. Startup writes the applied policy to /data/compliance-manifest.json. The legacy names (HIPAA, SOC2, GDPR, PCI-DSS) still work as deprecated aliases and emit a warning at startup.

Example:

COMPLIANCE_TEMPLATE=strict docker compose up

For deployment details, hosted Witness notes, CLI auth modes, and reverse-SSH guidance, see:

Architecture at a Glance

flowchart LR
    User[Human operator] -->|watch / takeover| noVNC[noVNC]
    LLM[Any model: OpenAI / Claude / Gemini / OpenRouter / Grok / DeepSeek / MiniMax / local] -->|shared tools| Controller[Controller API]
    Controller -->|Playwright protocol| Browser[Browser node]
    noVNC --> Browser
    Browser --> Artifacts[(screenshots / traces / auth state)]
    Controller --> Artifacts
    Controller --> Policy[Allowlist + approval gates]

Model providers

First-class adapters for OpenAI, Claude, and Gemini (API or CLI). Beyond those, a single generic OpenAI-compatible adapter drives any model reachable over an OpenAI /chat/completions endpoint — set an API key to enable it:

Provider

Reaches

openrouter

one key → ~every frontier model (Claude, GPT, Gemini, Grok, DeepSeek, Llama, Mistral, Qwen, …)

xai

Grok

deepseek

DeepSeek (text-only; driven from the DOM/accessibility outline)

minimax

MiniMax

openai_compatible

any custom base URL — self-hosted Ollama / vLLM / LM Studio, Azure OpenAI, Together, Groq, Fireworks, …

Vision (screenshots) is used for every provider except text-only ones. See .env.example for the *_API_KEY / *_BASE_URL / *_MODEL settings.

Core components:

  • browser-node/ runs Chromium, Xvfb, x11vnc, and noVNC

  • controller/ exposes the FastAPI controller, MCP transport, policy rails, and orchestration endpoints

  • data/ holds runtime artifacts, auth state, approvals, audit logs, and optional CLI caches

  • scripts/ contains local helpers for doctor, smoke tests, bridges, and release checks

Repo Guide

Path

What It Contains

controller/

controller API, MCP transport, tests, and packaging

browser-node/

browser runtime and Playwright connection layer

examples/

copy-paste flows and MCP client setup

integrations/langchain/

LangChain, LangGraph, and CrewAI adapters

docs/

architecture, deployment, hardening, and launch docs

scripts/

doctor, smoke harnesses, stdio bridge, and auth helpers

ops/

supporting service templates and operational assets

Common Commands

Command

Purpose

make help

list available repo commands

make lint

run Ruff checks on app, tests, and helper scripts

make test

run controller tests in Docker

make test-local

run controller tests on host Python 3.10+

make eval

run deterministic provider/profile eval scoring

make doctor

run the local readiness smoke

make release-audit

run the fuller release-validation pass

make smoke-isolation

verify per-session Docker isolation

make smoke-reverse-ssh

verify reverse-SSH remote access

Documentation Map

If You Want To...

Start Here

understand the system shape

docs/architecture.md

connect Claude Desktop or Cursor

docs/mcp-clients.md

run the curl-first examples

examples/README.md

deploy on a trusted host

docs/deployment.md

review production constraints

docs/production-hardening.md

run the convergence harness

docs/convergence-harness.md

inspect release history

CHANGELOG.md

see where the project is headed

ROADMAP.md

Contributing

If you want to help, start with:

If Auto Browser is useful, a star helps other people find it. Sponsorship and tip options live in TIPS.md.

Available Tools

2 tools
browser.find_elementsA

Find all elements matching a CSS selector and return their text, href, value, bounding box, and visibility. Useful before clicking or scraping multiple items.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
selectorYes
session_idYesID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false and destructiveHint=false, but the description does not elaborate on behavioral traits beyond returning element data. It does not clarify whether the tool modifies browser state (e.g., scrolling) or has side effects. Given that annotations already cover some aspects, the description adds minimal extra transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two concise sentences: the first states functionality and return data, the second provides usage context. There is no redundant information, and every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with three parameters and no output schema. The description covers the main purpose and return data, which is sufficient for basic usage. However, it omits details like error handling, performance considerations for large selectors, or the exact format of the bounding box. Still, given the low complexity, it is adequately complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 33% description coverage; only session_id has a description. The tool description does not explain the 'limit' parameter (default 20, max 100) or the 'selector' parameter (CSS format). It mentions returning 'all elements' but does not clarify the effect of the limit, which could mislead an agent into expecting unlimited results.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool finds all elements matching a CSS selector and returns specific properties (text, href, etc.). The verb 'find' and resource 'elements' are unambiguous, and it distinguishes itself from the sibling tool 'browser.list_memory_profiles' which has a completely different purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a usage hint 'Useful before clicking or scraping multiple items,' providing context for when to use the tool. However, it does not explicitly mention when not to use it or alternative tools for similar tasks, but the sibling tool is unrelated, so differentiation is not critical.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser.list_memory_profilesA
Read-onlyIdempotent

List all saved memory profiles.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description adds no additional behavioral context beyond confirming the read-only nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence with no unnecessary words, achieving maximum conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, straightforward purpose) and strong annotations, the description adequately covers the context, though it lacks return format details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters and 100% schema coverage, the baseline of 3 applies as the description adds no parameter-specific meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (list) and resource (all saved memory profiles), accurately distinguishing it from related tools like get_memory_profile and save_memory_profile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing saved profiles but does not explicitly discuss when to use this tool over alternatives or provide any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 13 tool updatesv1.4.2
    • Removedbrowser.activate_tab
    • Removedbrowser.close_session
    • Removedbrowser.close_tab
    • Removedbrowser.eval_js
    • Removedbrowser.execute_action
    • Addedbrowser.find_elements
    • Removedbrowser.get_auth_profile
    • Removedbrowser.get_console
    • Removedbrowser.get_session
    • Removedbrowser.list_sessions
    • Removedbrowser.observe
    • Removedbrowser.save_auth_profile
    • Removedharness.get_status
  2. 33 tool updatesv1.4.2
    • Changedbrowser.activate_tab2 fields changed
      • addedInput schema / properties / index / description
        Added value: +"Zero-based index of the target tab, as reported by browser.list_tabs."
      • addedInput schema / properties / session_id / description
        Added value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
    • Changedbrowser.close_session1 field changed
      • addedInput schema / properties / session_id / description
        Added value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
    • Changedbrowser.close_tab2 fields changed
      • addedInput schema / properties / index / description
        Added value: +"Zero-based index of the target tab, as reported by browser.list_tabs."
      • addedInput schema / properties / session_id / description
        Added value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
    • Removedbrowser.create_session
    • Removedbrowser.drag_drop
    • Changedbrowser.eval_js1 field changed
      • addedInput schema / properties / session_id / description
        Added value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
    • Changedbrowser.execute_action3 fields changed
      • addedInput schema / properties / action / description
        Added value: +"The browser action to execute, in the shared action schema: an action type (navigate, click, type, scroll, wait, done, …) plus its arguments, e.g. a URL for navigate or an element selector/index for click and type."
      • addedInput schema / properties / approval_id / description
        Added value: +"ID of a granted approval that authorizes this action when the active policy requires one. Omit when the action does not need approval."
      • addedInput schema / properties / session_id / description
        Added value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
    • Removedbrowser.find_elements
    • Removedbrowser.fork_session
    • Changedbrowser.get_auth_profile1 field changed
      • addedInput schema / properties / profile_name / description
        Added value: +"Name of the saved auth profile to inspect, as listed by browser.list_auth_profiles."
    • Changedbrowser.get_console1 field changed
      • addedInput schema / properties / session_id / description
        Added value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
    • Removedbrowser.get_html
    • Removedbrowser.get_memory_profile
    • Removedbrowser.get_network_log
    • Removedbrowser.get_page_errors
    • Removedbrowser.get_request_failures
    • Changedbrowser.get_session1 field changed
      • addedInput schema / properties / session_id / description
        Added value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
    • Removedbrowser.list_auth_profiles
    • Removedbrowser.list_downloads
    • Removedbrowser.list_tabs
    • Changedbrowser.observe1 field changed
      • addedInput schema / properties / session_id / description
        Added value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
    • Removedbrowser.readiness_check
    • Removedbrowser.request_human_takeover
    • Changedbrowser.save_auth_profile1 field changed
      • addedInput schema / properties / session_id / description
        Added value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
    • Removedbrowser.save_memory_profile
    • Removedbrowser.screenshot
    • Removedbrowser.set_viewport
    • Removedbrowser.stop_trace
    • Removedbrowser.verify_witness
    • Removedbrowser.wait_for_selector
    • Changedharness.get_status1 field changed
      • addedInput schema / properties / run_id / description
        Added value: +"ID of the convergence run, as returned by harness.start_convergence or listed by harness.list_runs."
    • Removedharness.get_trace
    • Removedharness.list_runs
  3. 1 tool updatev1.3.1
    • Addedbrowser.verify_witness
  4. 3 tool updatesv1.1.1
    • Addedharness.get_status
    • Addedharness.get_trace
    • Addedharness.list_runs
  5. 5 tool updatesv1.0.5
    • Changedbrowser.execute_action1 field changed
      • changedInput schema / $defs / BrowserActionDecision / properties / action / enum
        Previous value: -[
        -  "navigate",
        -  "click",
        -  "hover",
        -  "select_option",
        -  "type",
        -  "press",
        -  "scroll",
        -  "wait",
        -  "reload",
        -  "go_back",
        -  "go_forward",
        -  "upload",
        -  "social_login",
        -  "social_post",
        -  "social_comment",
        -  "social_like",
        -  "social_follow",
        -  "social_unfollow",
        -  "social_repost",
        -  "social_dm",
        -  "request_human_takeover",
        -  "done"
        -]New value: +[
        +  "navigate",
        +  "click",
        +  "hover",
        +  "select_option",
        +  "type",
        +  "press",
        +  "scroll",
        +  "wait",
        +  "reload",
        +  "go_back",
        +  "go_forward",
        +  "upload",
        +  "request_human_takeover",
        +  "done"
        +]
    • Removedsocial.extract_posts
    • Removedsocial.extract_profile
    • Removedsocial.login
    • Removedsocial.search
  6. 36 tool updatesv1.0.3
    • Changedbrowser.activate_tab3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.close_session3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.close_tab3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.create_session13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / auth_profile / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 120,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / memory_profile
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 120,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Load a named memory profile into this session.",
        +  "title": "Memory Profile"
        +}
      • changedInput schema / properties / name / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 200,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / protection_mode
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "normal",
        +        "confidential"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Protection Mode"
        +}
      • changedInput schema / properties / proxy_password / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 500,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / proxy_persona
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Proxy Persona"
        +}
      • changedInput schema / properties / proxy_server / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 500,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / proxy_username / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 200,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / start_url / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 2000,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / storage_state_path / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 500,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / totp_secret / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 500,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / user_agent / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 2000,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedbrowser.drag_drop3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.eval_js3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.execute_action14 fields changed
      • changedInput schema / $defs / BrowserActionDecision / properties / element_id / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 500,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / BrowserActionDecision / properties / file_path / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 500,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / BrowserActionDecision / properties / key / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 120,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / BrowserActionDecision / properties / label / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 1000,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / BrowserActionDecision / properties / platform / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 120,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / BrowserActionDecision / properties / recipient / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 200,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / BrowserActionDecision / properties / selector / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 2000,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / BrowserActionDecision / properties / text / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 5000,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / BrowserActionDecision / properties / url / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 2000,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / BrowserActionDecision / properties / username / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 500,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / $defs / BrowserActionDecision / properties / value / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 1000,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Removedbrowser.find_by_vision
    • Changedbrowser.find_elements3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.fork_session3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.get_auth_profile1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedbrowser.get_console3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.get_html3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Addedbrowser.get_memory_profile
    • Changedbrowser.get_network_log3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.get_page_errors3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.get_request_failures3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.get_session3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.list_auth_profiles1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedbrowser.list_downloads3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Addedbrowser.list_memory_profiles
    • Changedbrowser.list_sessions1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedbrowser.list_tabs3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.observe5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +200
      • addedInput schema / properties / preset
        Added value: +{
        +  "default": "normal",
        +  "enum": [
        +    "fast",
        +    "normal",
        +    "rich"
        +  ],
        +  "title": "Preset",
        +  "type": "string"
        +}
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Addedbrowser.readiness_check
    • Changedbrowser.request_human_takeover3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.save_auth_profile3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Addedbrowser.save_memory_profile
    • Changedbrowser.screenshot3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.set_viewport3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.stop_trace3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedbrowser.wait_for_selector3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedsocial.extract_posts3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedsocial.extract_profile3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedsocial.login3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
    • Changedsocial.search3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / session_id / maxLength
        Added value: +120
      • addedInput schema / properties / session_id / minLength
        Added value: +1
  7. 32 tool updatesv0.5.0
    • First observedbrowser.activate_tab
    • First observedbrowser.close_session
    • First observedbrowser.close_tab
    • First observedbrowser.create_session
    • First observedbrowser.drag_drop
    • First observedbrowser.eval_js
    • First observedbrowser.execute_action
    • First observedbrowser.find_by_vision
    • First observedbrowser.find_elements
    • First observedbrowser.fork_session
    • First observedbrowser.get_auth_profile
    • First observedbrowser.get_console
    • First observedbrowser.get_html
    • First observedbrowser.get_network_log
    • First observedbrowser.get_page_errors
    • First observedbrowser.get_request_failures
    • First observedbrowser.get_session
    • First observedbrowser.list_auth_profiles
    • First observedbrowser.list_downloads
    • First observedbrowser.list_sessions
    • First observedbrowser.list_tabs
    • First observedbrowser.observe
    • First observedbrowser.request_human_takeover
    • First observedbrowser.save_auth_profile
    • First observedbrowser.screenshot
    • First observedbrowser.set_viewport
    • First observedbrowser.stop_trace
    • First observedbrowser.wait_for_selector
    • First observedsocial.extract_posts
    • First observedsocial.extract_profile
    • First observedsocial.login
    • First observedsocial.search

TDQS

A3.6/5.0
Disambiguation5/5

The two tools serve completely different purposes: one lists saved profiles, the other finds DOM elements. There is no overlap or ambiguity.

Naming Consistency5/5

Both tools consistently use the 'browser.' prefix followed by a verb_noun pattern in snake_case (list_memory_profiles, find_elements).

Tool Count1/5

Only 2 tools for a browser automation server is far too few. Essential operations like navigation, clicking, input, and scraping are missing, making the tool set feel incomplete for its stated domain.

Completeness1/5

The tool surface is severely incomplete. There is no way to navigate, interact with elements, or scrape content, leaving agents unable to perform basic browser automation tasks.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    F
    maintenance
    This server provides cloud browser automation capabilities using Browserbase, Puppeteer, and Stagehand. This server enables LLMs to interact with web pages, take screenshots, and execute JavaScript in a cloud browser environment.
    5,333
    3,406
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables LLMs like Claude to navigate the web through Puppeteer-based tools and Steel. Based on the Web Voyager framework, it provides tools for all the standard web actions click clicking/scrolling/typing/etc and taking screenshots.
    16
    54
    MIT

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/LvcidPsyche/auto-browser'

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