superpowers-chrome
This server provides a single use_browser tool for controlling a persistent Chrome browser via the Chrome DevTools Protocol, with automatic capture of page content after each DOM-changing action. Capabilities include:
Browser & Session Management: Launch, close, restart, show/hide Chrome; switch between headed/headless modes; set, get, or switch browser profiles.
Navigation: Navigate to URLs (
navigate), go back/forward (back,forward); open, close, list, and switch tabs (new_tab,close_tab,list_tabs,switch_tab).Interaction: Click (single, double, right), type, select, hover, drag and drop, mouse move, scroll, keyboard press, file upload, and more.
Data Extraction: Extract page text, HTML, or markdown; get element attributes; evaluate JavaScript; take screenshots (full page, viewport, or element).
Waiting & Synchronization: Wait for an element to appear (
await_element) or specific text to appear (await_text).Dialog Handling: Interact with JavaScript dialogs, permission prompts, auth challenges, and device choosers via special selectors (
dialog::accept,dialog::dismiss,dialog::prompt, etc.).Console Logging: Enable, retrieve, and clear console messages.
Viewport & Cookies: Set, clear, or get viewport dimensions; clear cookies.
Profile Management: Set or get browser profile for persistent/shared sessions.
Help: Access full documentation of all actions and payloads via
action='help'.Automatic Capture: After any DOM-changing action, the server saves a viewport screenshot (
.png), page markdown (.md), rendered HTML (.html), and console logs (-console.txt) to a session directory.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@superpowers-chromenavigate to example.com and extract the content"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Superpowers Chrome - Claude Code Plugin
Direct browser control via Chrome DevTools Protocol. Two modes available:
Skill Mode - CLI tool for Claude Code agents (
browsingskill)MCP Mode - Ultra-lightweight MCP server for any MCP client
Features
Zero dependencies - Built-in WebSocket, no npm install needed
Idiotproof API - Tab index syntax (
0,1,2) instead of WebSocket URLsPlatform-agnostic -
chrome-ws startworks on macOS, Linux, Windows17 commands covering all browser automation needs
Complete documentation with real-world examples
Related MCP server: Real Browser MCP
Installation
/plugin marketplace add obra/superpowers-marketplace
/plugin install superpowers-chrome@superpowers-marketplaceQuick Start
# Find your plugin installation path (varies by marketplace and version)
# Common locations:
# ~/.claude/plugins/cache/superpowers-marketplace/superpowers-chrome/<version>/skills/browsing
# ~/.claude/plugins/cache/superpowers-chrome/skills/browsing
cd ~/.claude/plugins/cache/superpowers-marketplace/superpowers-chrome/*/skills/browsing
./chrome-ws start # Launch Chrome
./chrome-ws new "https://example.com" # Create tab
./chrome-ws navigate 0 "https://google.com"
./chrome-ws fill 0 "textarea[name=q]" "test"
./chrome-ws click 0 "button[name=btnK]"Port allocation: Chrome gets a dynamically allocated port (range 9222-12111) to avoid conflicts. Port assignment is persisted per profile in ~/.cache/superpowers/browser-profiles/{name}.meta.json. Override with --port=N flag or CHROME_WS_PORT env var. Multiple profiles can run in parallel on different ports.
Parallel MCPs on one host (3.0+): the bridge auto-disambiguates the default profile. The first MCP claims superpowers-chrome:9222, the next silently falls through to superpowers-chrome-2:9223, then -3:9224, etc., each driving its own Chrome with its own profile dir. To intentionally share a Chrome between processes (e.g., a chrome-ws CLI session + a Claude MCP attaching to it), set a fixed profile via CHROME_WS_PROFILE=name (env var) or call {action: "set_profile", payload: "name"} at runtime — explicit profiles share rather than disambiguate.
Windows tip: The tooling defaults to 127.0.0.1 for DevTools traffic. Override via CHROME_WS_HOST / CHROME_WS_PORT or --port=N if you forward Chrome elsewhere.
Linux/WSL2 tip: For headed mode (visible browser), the MCP server needs the DISPLAY environment variable. If show_browser doesn't work, configure "env": {"DISPLAY": ":0"} in your MCP server config. See mcp/README.md for details. Running as root or inside a container is detected automatically and disables Chrome's sandbox; on a headless box add CHROME_EXTRA_ARGS="--headless=new --disable-gpu".
Custom Chrome flags: Set CHROME_EXTRA_ARGS to a whitespace-separated list of flags that will be appended to the Chrome command line on launch. Useful for headless containers that need software WebGL:
CHROME_EXTRA_ARGS="--use-gl=angle --use-angle=swiftshader-webgl --enable-unsafe-swiftshader"Windows Verification (November 7, 2025)
node skills/browsing/chrome-ws startlaunched Chrome with remote debugging enabled on a fresh Windows 11 Pro install.node skills/browsing/chrome-ws tabsandnode skills/browsing/chrome-ws navigate 0 https://example.comconfirmed CLI control with the IPv4 default binding.codex exec -c "mcp_servers.superpowers-chrome.enabled=true" "List Chrome tabs via MCP to verify the Windows override patch."listed the Example Domain tab through the MCP server, demonstrating that the overrides also work through Codex.
Commands
Setup:
start(auto-detects platform)Tab management:
tabs,new,closeNavigation:
navigate,wait-for,wait-textInteraction:
click,fill,selectExtraction:
eval,extract,attr,htmlExport:
screenshot,markdownRaw protocol:
raw(full CDP access)
Dialog Handling
Pages that open JavaScript dialogs (alert, confirm, prompt, beforeunload), WebUSB/Bluetooth/Serial/HID device choosers, HTTP basic-auth challenges, or permission prompts (camera, microphone, notifications, geolocation, clipboard) no longer wedge the connection. The dialog is surfaced as a synthetic page response and the agent interacts with it using the existing click and type actions against a small dialog::* selector grammar.
What an agent sees
While a dialog is open, any page-targeted action (extract, screenshot, eval, attr, click <real-selector>, etc.) returns a clear refusal with the dialog content and instructions:
Page is behind a dialog. Handle dialog::accept or dialog::dismiss first.
# Dialog: confirm
Tab origin: https://example.com
> Are you sure you want to leave?
Buttons:
- dialog::accept (OK)
- dialog::dismiss (Cancel)
To interact:
click selector="dialog::accept"
click selector="dialog::dismiss"Browser-targeted actions (list_tabs, new_tab, close_tab, etc.) pass through unaffected.
Selector grammar
Selector | Purpose |
| OK / Grant / Provide credentials, depending on dialog kind |
| Cancel / Deny |
| Stage prompt text; commit on |
| Pick a device in the chooser (USB, BT, Serial, HID) |
| Basic-auth credentials |
Worked example
# 1. Page on load: alert('Saved!')
extract payload=text
# → refused with synthetic dialog markdown
# 2. Dismiss
click selector="dialog::accept"
# 3. Page is interactive again
extract payload=text
# → returns the page textPermission prompts (getUserMedia, Notification.requestPermission, geolocation, clipboard) are caught by a document_start JS-API shim and surfaced through the same flow.
See docs/superpowers/specs/2026-05-13-dialog-handling-design.md for the full design.
MCP Server Mode
Ultra-lightweight MCP server with a single use_browser tool. Perfect for minimal context usage with automatic page captures.
Installation Options
Option 1: NPX from GitHub (Recommended)
{
"mcpServers": {
"chrome": {
"command": "npx",
"args": [
"github:obra/superpowers-chrome"
]
}
}
}Option 1b: NPX with Headless Mode
{
"mcpServers": {
"chrome": {
"command": "npx",
"args": [
"github:obra/superpowers-chrome",
"--headless"
]
}
}
}Option 2: Git Clone + Local Path (Current)
git clone https://github.com/obra/superpowers-chrome.git
cd superpowers-chrome/mcp && npm install && npm run build{
"mcpServers": {
"chrome": {
"command": "node",
"args": [
"/path/to/superpowers-chrome/mcp/dist/index.js"
]
}
}
}Auto-Capture Features
DOM-changing actions (navigate, click, type, select, eval) automatically capture:
Page HTML: Full rendered DOM state
Page Markdown: Structured content extraction
Screenshot: Visual page state
DOM Summary: Token-efficient page structure
Session Organization: Time-ordered captures in temp directory
Response format:
→ https://example.com (capture #001)
Size: 1200×765
Snapshot: /tmp/chrome-session-123/001-navigate-456/
Resources: page.html, page.md, screenshot.png, console-log.txt
DOM:
Example Domain
Interactive: 0 buttons, 0 inputs, 1 links
Layout: bodyUsage
{
"action": "navigate",
"payload": "https://example.com"
}Get help: {"action": "help"} - Returns complete documentation
See mcp/README.md for complete documentation.
When to Use
Use Skill Mode when:
Working with Claude Code agents
Need full CLI control with 17 commands
Use MCP Mode when:
Using Claude Desktop or other MCP clients
Want minimal context usage (single tool)
Use Playwright MCP when:
Need fresh browser instances
Complex automation with screenshots/PDFs
Prefer higher-level abstractions
Documentation
SKILL.md - Complete skill guide
EXAMPLES.md - Real-world examples
chrome-ws README - Tool documentation
License
MIT
Available Tools
1 tooluse_browserA
Control persistent Chrome browser with automatic page capture.
Every DOM action (navigate, click, type, select, eval) auto-captures to the session dir:
{prefix}.png — viewport screenshot
{prefix}.md — page content as structured markdown
{prefix}.html — full rendered DOM
{prefix}-console.txt — browser console messages
Prefer reading these files to using 'extract' or 'screenshot' whenever possible.
Schema: 4 parameters — action, selector (CSS/XPath or null), payload (string or object), timeout (ms). selector targets a DOM element (null/omit for navigation, eval, tab management, etc.). payload is a string for simple actions (navigate=URL, type=text, eval=JS, keyboard_press=key). payload is an object for structured actions (set_viewport={width,height}, drag_drop={target}, etc.) — a JSON-encoded string of the same object works too. Tabs are tracked as sticky state; use switch_tab to change the active tab. Use action='help' for full per-action payload shapes.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform. action='help' lists all actions with payload shapes. | |
| payload | No | Extra data for the action. Both a plain object and an equivalent JSON-encoded string are accepted for every structured shape below (e.g. set_viewport accepts either {width:390,height:844} or '{"width":390,"height":844}'). Literal string for code/free-text actions, taken as-is and never JSON-parsed even if it happens to look like JSON (eval=JS source, type=literal text, await_text=literal text to wait for, select=literal option value). String or object for simple cases (navigate=URL, set_profile=name, new_tab=URL, attr=attribute name or {selector,attr}). Structured object (or its JSON-string equivalent) for the rest: set_viewport={width,height,mobile?} (no bare-string form), keyboard_press=key string or {key,modifiers:{shift?,ctrl?,alt?,meta?}}, extract=format string or {format:'text'|'html'|'markdown',selector?}, screenshot=path string or {path,fullpage?,selector?}, scroll=direction string or {deltaX?,deltaY?,selector?}, drag_drop=target selector string, {x,y} target coords, or {source,target}, mouse_move={x,y,steps?,fromX?,fromY?} (no bare-string form), file_upload=path string, JSON array-of-paths string, or {selector,files:[...]}, get_console_messages={since:epochMs} or a bare epoch-ms timestamp, switch_tab=tab index/url-substring/title-substring). See action='help' for per-action payload shapes. | |
| timeout | No | Timeout in ms for await_element / await_text actions. | |
| selector | No | CSS or XPath selector — what to act on. Null/omitted for actions that don't target an element (navigate, eval, list_tabs, etc.). XPath must start with / or //. dialog::accept and dialog::dismiss are special selectors for handling open dialogs. | |
| tab_index | No | Legacy: behaves like switch_tab. Sets the active tab to this index before running the action. Prefer the switch_tab action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint false, openWorldHint true, etc.), the description discloses the automatic capture mechanism with specific artifact filenames, the sticky tab state, payload parsing rules (literal strings vs. JSON), special selector syntax (e.g., dialog::accept, XPath prefix), and the existence of action='help' for exhaustive shapes. This is far richer than the boolean hints alone and fully describes the tool's behavioral traits.
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 lengthy but well-structured: it starts with the core purpose, presents capture artifacts in a bulleted list, then explains parameter semantics. Every sentence contributes useful information; however, the payload paragraph is dense and could be split or trimmed without losing value. Overall, it earns a 4 for being appropriately organized and front-loaded, but not maximally concise.
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 complexity (38 actions) and lack of an output schema, the description is highly complete: it explains what the tool produces (captured files), how to use the primary mechanisms (reading files, tab switching), and directs to action='help' for exhaustive payload shapes. It compensates for the absence of an output schema by describing the file artifacts and their contents, making the tool's behavior predictable.
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?
Although the schema already documents all parameters (100% coverage), the description adds significant meaning: it explains when selector is null/omitted, how payload varies between string and object forms with examples, which actions take which payload types, and the legacy role of tab_index. This practical guidance goes beyond the schema's property descriptions and materially helps the agent choose correct parameter values.
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 opens with 'Control persistent Chrome browser with automatic page capture,' which clearly identifies the resource (Chrome browser) and the core capability (control with page capture). This is further refined by enumerating the available actions (navigate, click, type, etc.), making the tool's scope unmistakable even in the absence of sibling tools.
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 gives explicit internal usage guidance, such as 'Prefer reading these files to using 'extract' or 'screenshot' whenever possible' and 'use switch_tab to change the active tab.' It does not name alternatives since no sibling tools are provided, but it clearly directs users on when to use the file-based workflow versus direct actions. A statement about when not to use the tool at all is missing, preventing a 5.
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 tool update
v3.0.4- Changed
use_browser1 field changed- changed
Input schema / properties / payload / descriptionPrevious value: -"Extra data for the action. String for simple cases (navigate=URL, type=text, eval=JS, keyboard_press=key, set_profile=name, new_tab=URL). Object for structured cases (set_viewport={width,height,mobile?}, keyboard_press={key,modifiers:{shift?,ctrl?,alt?,meta?}}, extract={format:'text'|'html'|'markdown'}, screenshot={path?,fullpage?}, scroll={deltaX?,deltaY?} or direction string, drag_drop={x,y} or selector string for target, mouse_move={x,y,steps?,fromX?,fromY?}, file_upload={files:[...]}, get_console_messages={since:epochMs}, await_text=text string or {text,timeout?}, switch_tab=tab index/url-substring/title-substring). See action='help' for per-action payload shapes."New value: +"Extra data for the action. Both a plain object and an equivalent JSON-encoded string are accepted for every structured shape below (e.g. set_viewport accepts either {width:390,height:844} or '{\"width\":390,\"height\":844}'). Literal string for code/free-text actions, taken as-is and never JSON-parsed even if it happens to look like JSON (eval=JS source, type=literal text, await_text=literal text to wait for, select=literal option value). String or object for simple cases (navigate=URL, set_profile=name, new_tab=URL, attr=attribute name or {selector,attr}). Structured object (or its JSON-string equivalent) for the rest: set_viewport={width,height,mobile?} (no bare-string form), keyboard_press=key string or {key,modifiers:{shift?,ctrl?,alt?,meta?}}, extract=format string or {format:'text'|'html'|'markdown',selector?}, screenshot=path string or {path,fullpage?,selector?}, scroll=direction string or {deltaX?,deltaY?,selector?}, drag_drop=target selector string, {x,y} target coords, or {source,target}, mouse_move={x,y,steps?,fromX?,fromY?} (no bare-string form), file_upload=path string, JSON array-of-paths string, or {selector,files:[...]}, get_console_messages={since:epochMs} or a bare epoch-ms timestamp, switch_tab=tab index/url-substring/title-substring). See action='help' for per-action payload shapes."
1 tool update
v3.0.1- First observed
use_browser
TDQS
With only a single tool, there is no possibility of confusing it with another tool. The tool's internal actions are clearly defined and mutually exclusive via the 'action' parameter.
The single tool name 'use_browser' follows a clear verb_noun pattern, which is consistent even if there is only one tool in the set.
Having just one tool is thin, but the tool is not trivial—it provides a full browser control interface with many actions. It is borderline appropriate, as a single all-in-one tool can be coherent for this purpose.
The tool covers navigation, interaction, evaluation, tab management, viewport control, and automatic page capture, providing comprehensive coverage for browser automation. No obvious gaps are apparent for the stated purpose.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Live browser debugging for AI assistants — DOM, console, network via MCP.
A paid remote MCP for AI agent browser DevTools MCP, built to return verdicts, receipts, usage logs,
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceLets AI coding agents control and inspect a live Chrome browser via MCP, providing Chrome DevTools capabilities for automation, debugging, and performance analysis.17Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables browser automation over MCP using a real Chrome browser with existing profile, supporting real tabs, downloads, cookies, and RPA workflows.104MIT
- AlicenseNot gradedqualityBmaintenanceLets coding agents control and inspect a live Chrome browser via MCP, providing Chrome DevTools capabilities for automation, debugging, and performance analysis.3,288,165Apache 2.0
- AlicenseAqualityAmaintenanceControls a running Chrome/Chromium browser via the Chrome DevTools Protocol, enabling navigation, JavaScript evaluation, tab management, and raw CDP commands through MCP tools.5MIT
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/obra/superpowers-chrome'
If you have feedback or need assistance with the MCP directory API, please join our Discord server