Skip to main content
Glama
FileXego

opencode-browser-control

by FileXego
README.md
# opencode-browser-control

> Playwright-powered browser automation MCP server for [OpenCode](https://opencode.ai).  
> Controls Chrome/Edge with ARIA accessibility snapshots and numbered element refs — no CSS selectors, no guessing.

## Quick Start

### 1. Install dependencies

```bash
npm install -g playwright-core
npx playwright install chromium
```

### 2. Configure OpenCode

Add to `~/.config/opencode/opencode.json`:

```json
{
  "mcp": {
    "browser-control": {
      "type": "local",
      "command": ["npx", "-y", "opencode-browser-control"],
      "enabled": true
    }
  }
}
```

### 3. Restart OpenCode

The `browser`, `browser_snapshot`, `browser_click`, and `browser_type` tools will be available.

## Tools

### `browser(action, ...)` — Multiplexed Tool

| Action | Description | Key Params |
|--------|-------------|------------|
| `start` | Launch browser | `headed` (default: true) |
| `stop` | Close browser | — |
| `navigate` | Open URL | `url`, `page_id` |
| `snapshot` | ARIA snapshot with element refs | `page_id` |
| `click` | Click element by ref | `ref` (e.g. `e42`) |
| `type` | Type into input by ref | `ref`, `text`, `submit` |
| `evaluate` | Execute JavaScript | `code` |
| `screenshot` | Full-page screenshot | `page_id` |
| `tabs` | List all tabs | — |
| `close_tab` | Close a tab | `page_id` |
| `back` / `forward` | Navigate history | — |

### Shortcut Tools

| Tool | Description |
|------|-------------|
| `browser_snapshot` | Get ARIA snapshot with `e1, e2, e3...` refs |
| `browser_click(ref)` | Click element by snapshot ref |
| `browser_type(ref, text)` | Type into element by snapshot ref |

### Typical Workflow

```
1. browser(action="navigate", url="https://example.com")
2. browser_snapshot()            → returns e1: button "Login", e2: textbox "Email", ...
3. browser_type(ref="e2", text="user@example.com")
4. browser_click(ref="e1")
5. browser_snapshot()            → verify result
```

## Browser Support

Auto-detects in priority order:

| OS | Priority |
|----|----------|
| Windows | Edge → Chrome |
| macOS | Chrome → Edge |
| Linux | Chrome → Edge → Chromium |

Falls back to Playwright's bundled Chromium if no system browser is found.

### Persistent Profile

A persistent profile is stored at `~/.opencode/browser-profile/{browser}/`. Login state, cookies, and local storage persist across sessions. The profile is isolated from your normal browser — it won't interfere with your daily browsing.

## Architecture

```
OpenCode ──MCP(stdio)──▶ index.mjs ──Playwright──▶ Edge/Chrome
```

Single-file Node.js MCP server. No HTTP middle layer, no browser extensions, no CDP port configuration. Playwright manages the browser lifecycle automatically.

## Troubleshooting

| Problem | Solution |
|---------|----------|
| "playwright-core not found" | `npm install -g playwright-core` |
| Browser doesn't launch | Install Chromium: `npx playwright install chromium` |
| SPA navigation breaks refs | Re-run `browser_snapshot()` after navigation — refs are invalidated on page change |
| Elements not clickable | The snapshot only finds visible elements. Use `browser_evaluate` to scroll or interact with hidden elements |

## License

MIT

TDQS

A3.7/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: browser for general control, snapshot for getting ARIA references, click for clicking elements, and type for typing text. No overlap in functionality.

Naming Consistency4/5

All tools use the 'browser_' prefix, providing a consistent pattern. The main tool is simply 'browser', which deviates slightly from the verb_noun pattern but is still clear and predictable.

Tool Count5/5

With 4 tools covering core browser control (navigation, snapshot, click, type), the count is well-scoped and appropriate for the domain.

Completeness4/5

The tool set covers essential browser interactions, but lacks explicit support for scrolling, keyboard actions, or file handling. Minor gaps that can be worked around.

Maintenance

ActivityInactive
ResponsivenessNo issues