Auto-Browser
Auto-Browser is an open-source, MCP-native browser automation server that gives AI agents full control over a real Chromium browser, with human intervention support, auth profile reuse, and rich web interaction capabilities.
Session Management
Create, list, get, and close browser sessions (with optional URL, user agent, auth profile, proxy, TOTP, or storage state)
Fork sessions to clone cookies/storage into a new independent session
Manage tabs: list, activate, and close
Resize viewport programmatically
Observation & Data Capture
Full page observation: screenshot, interactable elements, DOM outline, accessibility tree, OCR, and console errors
Lightweight screenshot capture
Retrieve page HTML/plain text (full page or viewport)
Find elements by CSS selector (text, href, value, bounding box, visibility)
Vision-grounded element targeting via natural language using Claude Vision
Console logs, uncaught page errors, failed network requests, and detailed network logs (with PII scrubbing)
List downloaded files; finalize Playwright traces for debugging
Browser Automation
Execute actions: navigate, click, type, hover, press, scroll, select option, drag-and-drop, reload, go back/forward, upload
Run arbitrary JavaScript in page context
Wait for CSS selectors to reach specific states (visible, hidden, attached, detached)
Authentication & Security
Save, list, and reuse named auth profiles ("login once, reuse later")
TOTP authentication support
Encrypted auth state at rest
Policy rails: host allowlists, upload approval, PII scrubbing, proxy partitioning, API bearer tokens, rate limiting
Human-in-the-Loop
Request human takeover via noVNC without losing session state
Shadow Browsing: dynamically switch between headless and headed modes for live debugging
Approval workflows for sensitive agent actions (uploads, posts, payments, destructive actions)
Social Media Helpers
Login to X/Twitter, Instagram, LinkedIn, Outlook/Microsoft with TOTP support
Extract feed posts and profile info (username, bio, followers, avatar)
Submit search queries
Approval-gated write actions (post, comment, like, follow, DM, etc.)
Integration & Deployment
Native MCP JSON-RPC (
/mcp) and REST endpoints for AI agent integration (OpenAI, Claude, Gemini)Background agent job queuing with persistence across restarts
Cron and webhook triggers for scheduled browser jobs
Docker-based per-session browser isolation for parallel workflows
Prometheus-style metrics, audit trails, and automated cleanup
Secure remote access via Tailscale/Cloudflare Access or reverse-SSH tunneling
Auto Browser

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.mddocuments 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
textobservation 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. SetPERCEPTION_PRESET_DEFAULT=textto make it a deployment-wide default.Find a string on the page in one call.
browser.find_elementsnow takes aquery(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/completionsendpoint. New providers:openrouter(one key → ~every frontier model),xai(Grok),deepseek,minimax, andopenai_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 ignoretool_choice.browser://audit/eventsMCP 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-clientfor the SDK,pip install auto-browser-langchainfor the LangChain/LangGraph/CrewAI adapters, anduvx auto-browser-mcpto run the MCP stdio bridge with zero setup. Releases publish via PyPI trusted publishing (OIDC) on tag push.
Since v1.3.0
browser_manager.pyis now a pure facade + composition root (1,284 → 769 lines), with domain logic extracted intoapp/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 --buildThat is enough for local development with the default settings.
Optional:
cp .env.example .env
make doctorRun 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/docsOperator dashboard:
http://127.0.0.1:8000/dashboardVisual 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
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:
create a session
log in manually if the site needs a human
save the session as a named auth profile
open a new session from that auth profile
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"}' | jqMinimal observation:
curl -s http://127.0.0.1:8000/sessions/<session-id>/observe | jqMCP Clients
Auto Browser exposes:
an HTTP MCP endpoint at
http://127.0.0.1:8000/mcpconvenience endpoints at
http://127.0.0.1:8000/mcp/toolsandhttp://127.0.0.1:8000/mcp/tools/calla stdio bridge:
uvx auto-browser-mcpfrom PyPI, orscripts/mcp_stdio_bridge.pyin 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=fullRaw 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"
}
}' | jqClient 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=falseCOMPLIANCE_TEMPLATE can apply a preconfigured posture at startup:
Preset | Auth Encryption | Operator ID | PII Scrub | Isolation | Max Session Age |
| required | required | all layers |
| 4h |
| - | 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 upFor 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 |
| one key → ~every frontier model (Claude, GPT, Gemini, Grok, DeepSeek, Llama, Mistral, Qwen, …) |
| Grok |
| DeepSeek (text-only; driven from the DOM/accessibility outline) |
| MiniMax |
| 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 noVNCcontroller/exposes the FastAPI controller, MCP transport, policy rails, and orchestration endpointsdata/holds runtime artifacts, auth state, approvals, audit logs, and optional CLI cachesscripts/contains local helpers for doctor, smoke tests, bridges, and release checks
Repo Guide
Path | What It Contains |
controller API, MCP transport, tests, and packaging | |
browser runtime and Playwright connection layer | |
copy-paste flows and MCP client setup | |
LangChain, LangGraph, and CrewAI adapters | |
architecture, deployment, hardening, and launch docs | |
doctor, smoke harnesses, stdio bridge, and auth helpers | |
supporting service templates and operational assets |
Common Commands
Command | Purpose |
| list available repo commands |
| run Ruff checks on app, tests, and helper scripts |
| run controller tests in Docker |
| run controller tests on host Python 3.10+ |
| run deterministic provider/profile eval scoring |
| run the local readiness smoke |
| run the fuller release-validation pass |
| verify per-session Docker isolation |
| verify reverse-SSH remote access |
Documentation Map
If You Want To... | Start Here |
understand the system shape | |
connect Claude Desktop or Cursor | |
run the curl-first examples | |
deploy on a trusted host | |
review production constraints | |
run the convergence harness | |
inspect release history | |
see where the project is headed |
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 toolsbrowser.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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| selector | Yes | ||
| session_id | Yes | ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions. |
TDQS
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.
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.
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.
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.
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.
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_profilesARead-onlyIdempotent
List all saved memory profiles.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
13 tool updates
v1.4.2- Removed
browser.activate_tab - Removed
browser.close_session - Removed
browser.close_tab - Removed
browser.eval_js - Removed
browser.execute_action - Added
browser.find_elements - Removed
browser.get_auth_profile - Removed
browser.get_console - Removed
browser.get_session - Removed
browser.list_sessions - Removed
browser.observe - Removed
browser.save_auth_profile - Removed
harness.get_status
33 tool updates
v1.4.2- Changed
browser.activate_tab2 fields changed- added
Input schema / properties / index / descriptionAdded value: +"Zero-based index of the target tab, as reported by browser.list_tabs." - added
Input schema / properties / session_id / descriptionAdded value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
- Changed
browser.close_session1 field changed- added
Input schema / properties / session_id / descriptionAdded value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
- Changed
browser.close_tab2 fields changed- added
Input schema / properties / index / descriptionAdded value: +"Zero-based index of the target tab, as reported by browser.list_tabs." - added
Input schema / properties / session_id / descriptionAdded value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
- Removed
browser.create_session - Removed
browser.drag_drop - Changed
browser.eval_js1 field changed- added
Input schema / properties / session_id / descriptionAdded value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
- Changed
browser.execute_action3 fields changed- added
Input schema / properties / action / descriptionAdded 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." - added
Input schema / properties / approval_id / descriptionAdded value: +"ID of a granted approval that authorizes this action when the active policy requires one. Omit when the action does not need approval." - added
Input schema / properties / session_id / descriptionAdded value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
- Removed
browser.find_elements - Removed
browser.fork_session - Changed
browser.get_auth_profile1 field changed- added
Input schema / properties / profile_name / descriptionAdded value: +"Name of the saved auth profile to inspect, as listed by browser.list_auth_profiles."
- Changed
browser.get_console1 field changed- added
Input schema / properties / session_id / descriptionAdded value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
- Removed
browser.get_html - Removed
browser.get_memory_profile - Removed
browser.get_network_log - Removed
browser.get_page_errors - Removed
browser.get_request_failures - Changed
browser.get_session1 field changed- added
Input schema / properties / session_id / descriptionAdded value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
- Removed
browser.list_auth_profiles - Removed
browser.list_downloads - Removed
browser.list_tabs - Changed
browser.observe1 field changed- added
Input schema / properties / session_id / descriptionAdded value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
- Removed
browser.readiness_check - Removed
browser.request_human_takeover - Changed
browser.save_auth_profile1 field changed- added
Input schema / properties / session_id / descriptionAdded value: +"ID of the target browser session, as returned by browser.create_session or listed by browser.list_sessions."
- Removed
browser.save_memory_profile - Removed
browser.screenshot - Removed
browser.set_viewport - Removed
browser.stop_trace - Removed
browser.verify_witness - Removed
browser.wait_for_selector - Changed
harness.get_status1 field changed- added
Input schema / properties / run_id / descriptionAdded value: +"ID of the convergence run, as returned by harness.start_convergence or listed by harness.list_runs."
- Removed
harness.get_trace - Removed
harness.list_runs
1 tool update
v1.3.1- Added
browser.verify_witness
3 tool updates
v1.1.1- Added
harness.get_status - Added
harness.get_trace - Added
harness.list_runs
5 tool updates
v1.0.5- Changed
browser.execute_action1 field changed- changed
Input schema / $defs / BrowserActionDecision / properties / action / enumPrevious 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" +]
- Removed
social.extract_posts - Removed
social.extract_profile - Removed
social.login - Removed
social.search
36 tool updates
v1.0.3- Changed
browser.activate_tab3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.close_session3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.close_tab3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.create_session13 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / auth_profile / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 120, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / memory_profileAdded value: +{ + "anyOf": [ + { + "maxLength": 120, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Load a named memory profile into this session.", + "title": "Memory Profile" +} - changed
Input schema / properties / name / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / protection_modeAdded value: +{ + "anyOf": [ + { + "enum": [ + "normal", + "confidential" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Protection Mode" +} - changed
Input schema / properties / proxy_password / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 500, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / proxy_personaAdded value: +{ + "anyOf": [ + { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Proxy Persona" +} - changed
Input schema / properties / proxy_server / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / proxy_username / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 200, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / start_url / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / storage_state_path / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / totp_secret / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 500, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / user_agent / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +]
- Changed
browser.drag_drop3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.eval_js3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.execute_action14 fields changed- changed
Input schema / $defs / BrowserActionDecision / properties / element_id / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / BrowserActionDecision / properties / file_path / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / BrowserActionDecision / properties / key / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 120, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / BrowserActionDecision / properties / label / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 1000, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / BrowserActionDecision / properties / platform / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 120, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / BrowserActionDecision / properties / recipient / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / BrowserActionDecision / properties / selector / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / BrowserActionDecision / properties / text / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 5000, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / BrowserActionDecision / properties / url / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / BrowserActionDecision / properties / username / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / BrowserActionDecision / properties / value / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 1000, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Removed
browser.find_by_vision - Changed
browser.find_elements3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.fork_session3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.get_auth_profile1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
browser.get_console3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.get_html3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Added
browser.get_memory_profile - Changed
browser.get_network_log3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.get_page_errors3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.get_request_failures3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.get_session3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.list_auth_profiles1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
browser.list_downloads3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Added
browser.list_memory_profiles - Changed
browser.list_sessions1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
browser.list_tabs3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.observe5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +200 - added
Input schema / properties / presetAdded value: +{ + "default": "normal", + "enum": [ + "fast", + "normal", + "rich" + ], + "title": "Preset", + "type": "string" +} - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Added
browser.readiness_check - Changed
browser.request_human_takeover3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.save_auth_profile3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Added
browser.save_memory_profile - Changed
browser.screenshot3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.set_viewport3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.stop_trace3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
browser.wait_for_selector3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
social.extract_posts3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
social.extract_profile3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
social.login3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
- Changed
social.search3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / session_id / maxLengthAdded value: +120 - added
Input schema / properties / session_id / minLengthAdded value: +1
32 tool updates
v0.5.0- First observed
browser.activate_tab - First observed
browser.close_session - First observed
browser.close_tab - First observed
browser.create_session - First observed
browser.drag_drop - First observed
browser.eval_js - First observed
browser.execute_action - First observed
browser.find_by_vision - First observed
browser.find_elements - First observed
browser.fork_session - First observed
browser.get_auth_profile - First observed
browser.get_console - First observed
browser.get_html - First observed
browser.get_network_log - First observed
browser.get_page_errors - First observed
browser.get_request_failures - First observed
browser.get_session - First observed
browser.list_auth_profiles - First observed
browser.list_downloads - First observed
browser.list_sessions - First observed
browser.list_tabs - First observed
browser.observe - First observed
browser.request_human_takeover - First observed
browser.save_auth_profile - First observed
browser.screenshot - First observed
browser.set_viewport - First observed
browser.stop_trace - First observed
browser.wait_for_selector - First observed
social.extract_posts - First observed
social.extract_profile - First observed
social.login - First observed
social.search
TDQS
The two tools serve completely different purposes: one lists saved profiles, the other finds DOM elements. There is no overlap or ambiguity.
Both tools consistently use the 'browser.' prefix followed by a verb_noun pattern in snake_case (list_memory_profiles, find_elements).
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.
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
Related MCP Connectors
Run multi-step tasks in a real Chrome browser: persistent environments, live view, human takeover.
Human-in-the-loop API for AI agents. CAPTCHA, OTP, KYC, and approvals by real humans.
Automate any website: discover, run and create browser scripts that work behind logins.
Human-in-the-loop approval for agent actions, with verifiable action-bound receipts.
Related MCP Servers
- -licenseNot gradedqualityFmaintenanceThis 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,3333,406MIT
- AlicenseNot gradedqualityFmaintenanceFacilitates browser automation with custom capabilities and agent-based interactions, integrated through the browser-use library.1957MIT
- AlicenseAqualityBmaintenanceEnables 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.1654MIT

gotoHuman MCPofficial
AlicenseAqualityFmaintenanceAdd human approval steps to your AI agents and automations with gotoHuman.36952MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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