# sh6drack/zen-mcp [Health: Active]

**Category:** 📂 Browser Automation  
**Repository:** https://github.com/sh6drack/zen-mcp  
**GitHub Stars:** 18  
**Views:** 2  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/sh6drack-zen-mcp

## Description
Zen Browser automation via WebDriver BiDi. 20 tools for navigation, form filling, screenshots, and JavaScript evaluation. No Selenium or Playwright required.

## Claude Desktop Quick Installation
Heuristic fallback — verify the package name and runner against the repository README before running it. Uses `npx` (confidence: low):

```json
"mcpServers": {
  "zen-mcp": {
    "command": "npx",
    "args": ["-y","sh6drack-zen-mcp"],
    "env": {
      "ZEN_DEBUG_PORT": ""
    }
  }
}
```

**Requires environment variables:** `ZEN_DEBUG_PORT` — the values above are empty placeholders; fill in real credentials before running (see the repository for what each one is for).

## Documentation & README

# zen-mcp

The first MCP server for **Zen Browser**. Automate Zen from Claude Code, Cursor, or any MCP client.

No Selenium. No Playwright. No browser drivers. Just WebSocket.

## Setup (2 minutes)

### 1. Start Zen with remote debugging

```bash
/Applications/Zen.app/Contents/MacOS/zen --remote-debugging-port 9222
```

> **Pro tip**: Add `alias zen='open /Applications/Zen.app --args --remote-debugging-port 9222'` to your shell config. Then just run `zen`.

### 2. Add to Claude Code

```bash
# Option A: npm (recommended)
npm install -g zen-mcp

# Option B: Clone
git clone https://github.com/sh6drack/zen-mcp.git && cd zen-mcp && npm install
```

Add to `~/.claude/mcp_servers.json`:

```json
{
  "mcpServers": {
    "zen-browser": {
      "command": "zen-mcp"
    }
  }
}
```

> If you cloned instead of npm install, use `"command": "node", "args": ["/absolute/path/to/zen-mcp/server.mjs"]`

Add to `~/.claude/settings.json`:

```json
{
  "permissions": {
    "allow": ["mcp__zen-browser__*"]
  }
}
```

**That's it.** Start a new Claude Code session and the `zen_*` tools are available.

## 20 Tools

### Browse

| Tool | What it does |
|------|-------------|
| `zen_navigate` | Go to a URL |
| `zen_list_pages` | List all open tabs |
| `zen_select_page` | Switch to a tab |
| `zen_new_tab` | Open a new tab |
| `zen_close_tab` | Close a tab |

### See

| Tool | What it does |
|------|-------------|
| `zen_snapshot` | Page structure with selectors (filter: all/interactive/form) |
| `zen_screenshot` | Capture a screenshot |
| `zen_get_page_text` | Get page title, URL, and text |
| `zen_get_form_fields` | List all form fields with labels and values |

### Interact

| Tool | What it does |
|------|-------------|
| `zen_click` | Click an element |
| `zen_fill` | Type into an input or textarea |
| `zen_select_option` | Pick a dropdown option |
| `zen_check` | Toggle a checkbox or radio |
| `zen_press_key` | Keyboard input (Enter, Tab, Ctrl+A, etc.) |
| `zen_fill_form` | Fill multiple fields at once |
| `zen_scroll` | Scroll the page or to an element |

### Utility

| Tool | What it does |
|------|-------------|
| `zen_evaluate` | Run JavaScript in the page |
| `zen_wait` | Wait N milliseconds |
| `zen_wait_for` | Wait for text or element to appear |
| `zen_reconnect` | Force reconnect to Zen |

## How It Works

```
Claude Code  ──stdio/MCP──>  zen-mcp  ──WebSocket/BiDi──>  Zen Browser
```

zen-mcp speaks **WebDriver BiDi** (W3C standard) directly over WebSocket. Form filling uses native value setters with `input`/`change` event dispatch so React, Vue, and Angular apps work correctly.

### What Works Well

- **Navigation, clicking, form filling** — rock solid, handles React/Vue/Angular
- **Screenshots and page reads** — reliable content extraction
- **Tab management** — open, close, switch between tabs
- **JavaScript evaluation** — run any code in the page context
- **Keyboard input** — shortcuts, Enter, Tab, modifier combos

### Known Limitations

- Zen inherits Firefox's WebDriver BiDi implementation, which is still maturing. Some advanced BiDi commands that work in Chrome may not be available yet.
- Zombie sessions can only be cleared by restarting Zen (BiDi session.end is connection-scoped). zen-mcp detects this and tells you what to do.
- No file upload or drag-and-drop support (BiDi spec limitation).

### Built-in Reliability

- **Auto-reconnect** with exponential backoff if WebSocket drops
- **Zombie session recovery** when a previous client crashed
- **Connection retry** (3 attempts with backoff)
- **Clean shutdown** on SIGINT/SIGTERM to prevent orphaned sessions

## Troubleshooting

| Problem | Fix |
|---------|-----|
| "Cannot connect to Zen Browser" | Start Zen with `--remote-debugging-port 9222` |
| "Maximum number of active sessions" | Restart Zen: `killall zen && zen` |
| Connection keeps dropping | Use `zen_reconnect` to force a fresh connection |

## Config

| Env Variable | Default | Description |
|-------------|---------|-------------|
| `ZEN_DEBUG_PORT` | `9222` | Zen's remote debugging port |

## Requirements

- [Zen Browser](https://zen-browser.app/)
- Node.js 20+

## Test

```bash
node test-e2e.mjs   # 21 tests, needs Zen running
```

## License

MIT

