Better Browser MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BROWSER_MCP_BIND | No | Bind address. Never set to 0.0.0.0 — exposes browser automation to the network. | 127.0.0.1 |
| BROWSER_MCP_PORT | No | WebSocket port to bind. Use different ports for different agents. | 9009 |
| BROWSER_MCP_AGENT_ID | No | Agent identifier. Used in the WS path (/ws/<id>) so the extension can route tab bindings. | default |
| BROWSER_MCP_AUTH_TOKEN | No | Optional shared secret. If set, the extension must send {type:'auth', token:'...'} as its first WS message, else the connection is closed with 4401. | |
| BROWSER_MCP_WS_PATH_PREFIX | No | Path prefix for the WS endpoint. Default /ws means the agent's endpoint is at /ws/<agentId>. | /ws |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
| resources | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| browser_navigateC | Navigate to a URL |
| browser_go_backB | Go back to the previous page |
| browser_go_forwardC | Go forward to the next page |
| browser_snapshotA | Capture accessibility snapshot of the current page. Use this for getting references to elements to interact with. The snapshot also lists all bound tabs so the LLM can pick a different tab via tabId on subsequent calls. |
| browser_clickC | Perform click on a web page |
| browser_hoverB | Hover over element on page |
| browser_typeC | Type text into editable element |
| browser_select_optionC | Select an option in a dropdown |
| browser_press_keyC | Press a key on the keyboard |
| browser_waitB | Wait for a specified time in seconds |
| browser_get_console_logsB | Get the console logs from the browser |
| browser_screenshotB | Take a screenshot of the current page |
| browser_list_tabsA | List all browser tabs bound to this agent. Returns tabId, label, URL, title, and which one is the agent's active tab. Use this to discover what's available before issuing tool calls that need a specific tab. |
| browser_open_tabA | Open a new browser tab and bind it to this agent. Optionally provide a URL (will navigate after open) and a human-readable label (the LLM uses the label to refer to the tab in subsequent calls). The new tab is set as the agent's active tab. |
| browser_close_tabA | Close a browser tab previously bound to this agent. The tab's binding is automatically removed. |
| browser_rename_tabA | Set a human-readable label on a bound tab. The label is what the LLM uses to refer to the tab in conversation and in browser_list_tabs output. |
| browser_set_active_tabA | Set which bound tab is the agent's active tab. Tool calls that don't specify a tabId route to the active tab. Use this to switch the agent's focus between bound tabs. |
| browser_copy_to_clipboardA | Click a 'Click to copy' button on the page and return the value the page wrote to the clipboard. Use this for Stripe's publishable key / secret key copy buttons, GitHub PAT copy buttons, AWS access key copy buttons, and any other 'click to copy' UI patterns. The content script patches navigator.clipboard.writeText to capture the value as it is written, then returns it to the LLM. The returned value is plain text (the literal content of the copy button). For secret material, the LLM should pipe it to the user's PQC secrets store (e.g. via the pqc-secrets CLI) rather than persisting it in chat history or unencrypted state. |
| browser_paste_textA | Paste text into a focused element on the page. If |
| browser_wait_for_textA | Wait for a specific text to appear anywhere in the page DOM (case-insensitive substring match). Polls every 500ms until the text is found or the timeout elapses. Replaces blind |
| browser_get_attributeA | Read a single HTML attribute from an element referenced by snapshot ref. Use |
| browser_extract_textA | Extract the |
| browser_evaluateA | Run an arbitrary JavaScript expression in the page's main frame context. Returns the JSON-serializable result. Escape hatch for when ARIA snapshots cannot introspect something — React/Vue component state, computed styles, custom data attributes, third-party widget internals, hidden DOM the snapshot can't reach. The result must be JSON-serializable and is capped at 10KB. The expression runs in the page's global scope via indirect eval (sees |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 23 tools
Each tool targets a distinct browser action or data type: navigation, tab management, user interaction, page introspection, and utility functions are clearly separated. Even the three read-ish tools (snapshot, extract_text, get_attribute) are distinguished by use case: full snapshot with refs vs. targeted text/attribute retrieval.
All 23 tools share the consistent 'browser_' prefix and use snake_case throughout. While some names are single verbs (navigate, click, wait) and others are verb phrases (go_back, wait_for_text, copy_to_clipboard), the pattern is uniform and predictable, with no mixed conventions or style breaks.
At 23 tools, the count falls into the 'heavy' range (16–25) per the rubric. Each tool is legitimately distinct and useful for browser automation, but the sheer number may add selection overhead and suggests the surface could potentially be consolidated (e.g., merging extract_text and get_attribute into a single read tool).
The tool surface covers the full browser automation lifecycle: tab management (open, close, list, set active, rename), navigation (navigate, back, forward), interaction (click, hover, type, select, press key), page inspection (snapshot, screenshot, attributes, text), waiting (wait, wait_for_text), console logs, clipboard, and arbitrary JS evaluation. There are no obvious dead ends for common browser workflows.