Skip to main content
Glama
README.md
# browser-mcp β€” beri AI agent Anda browser sungguhan πŸŒπŸ€–

MCP server **standalone** yang memberi AI agent (opencode, Claude Code/Desktop, Cursor, Cline, dsb) kemampuan browser penuh via **Chromium lokal + CDP**:

- πŸ‘οΈ **Lihat halaman** β€” snapshot DOM compact (mata utama AI), screenshot, visual grounding (x,y), combined view
- πŸ–±οΈ **Aksi manusiawi** β€” klik/type/keys/scroll + hover/move/dblclick/rightclick/drag (easing+jitter, lolos slider GeeTest)
- πŸ•·οΈ **Recon otonom** β€” spider BFS in-scope, ekstraktor API/GraphQL ala LinkFinder, HAR-lite, console hook, probe introspeksi GraphQL
- πŸ” **Auth 2-akun** β€” vault attacker/victim untuk differential testing (IDOR/priv-esc), password ter-redact di audit
- πŸ› οΈ **Burp-like first-class** β€” intercept (request+response), repeater, intruder sniper, match-replace, scope allowlist, collaborator OOB
- πŸ›‘οΈ **Aman by default** β€” scope check di semua navigasi/HTTP keluar, audit `audit.jsonl` dengan redact kredensial
- πŸ“¦ **Zero-deployment hell** β€” 1 repo, stdlib + `websocket-client` saja, backend CDP di-vendor (`vendor_browser_local.py`), tanpa binary global

> 47 tools. 1 perintah install. Browser tetap di mesin Anda β€” tidak ada cloud, tidak ada data keluar.

---

## Demo 30 detik

```bash
git clone https://github.com/eye-fox/browser-mcp.git
cd browser-mcp
./install.sh
# restart opencode / AI client Anda, lalu suruh agent:
# "launch browser-mcp session demo, scope ke example.com, navigate, snapshot"
python3 examples/quickstart.py   # tanpa LLM: bukti end-to-end lewat stdio
```

## Cara kerja

```mermaid
flowchart LR
    Agent["AI agent"] -- "MCP stdio<br/>JSON-RPC" --> Server["server.py"]
    Server -- "subprocess" --> Vendor["vendor_browser_local.py"]
    Vendor -- "CDP ws://" --> Chrome["Chromium lokal"]
    Server --- Scope["scope.json<br/>allowlist/blocklist"]
    Server --- Audit["audit.jsonl<br/>redacted"]
    Server --- Vault["auth_vault.json<br/>2 akun, 600"]
    Server --- Sessions["sessions.json<br/>sessionId β†’ cdp_url"]
```

## Syarat

| Kebutuhan | Versi | Cek |
|---|---|---|
| Python | β‰₯ 3.9 | `python3 --version` |
| websocket-client | β‰₯ 1.8.0 | `python3 -c "import websocket"` (auto-install via `install.sh`) |
| Chromium/Chrome | baru | `which chromium` (Debian: `sudo apt install chromium`) |

## Install

```bash
./install.sh
```

Script melakukan: cek python β†’ install `websocket-client` β†’ deteksi chromium (auto-patch `BROWSER` di vendor) β†’ `chmod +x` β†’ init `scope.json` / `auth_vault.json` (600) / `sessions.json` / `audit.jsonl` dari `.example` β†’ **auto-register ke `~/.config/opencode/opencode.json`** β†’ smoke test `tools/list` (harus β‰₯40 tools).

Opsi:

```bash
./uninstall.sh   # hapus entri MCP + matikan daemon, repo tidak dihapus
```

## Config manual (non-opencode)

**Claude Desktop / Cursor / Cline (`mcp.json` / `claude_desktop_config.json`):**

```json
{
  "mcpServers": {
    "browser-mcp": {
      "command": "python3",
      "args": ["/ABSOLUTE/PATH/browser-mcp/server.py"]
    }
  }
}
```

Template siap copy: [`mcp.json.example`](mcp.json.example). Untuk opencode mentah: [`opencode.json.snippet`](opencode.json.snippet).

## Struktur repo

```text
browser-mcp/
β”œβ”€β”€ install.sh              # setup full: deps + chromium detect + opencode register + smoke test
β”œβ”€β”€ uninstall.sh            # cabut entri MCP + kill daemon
β”œβ”€β”€ server.py               # MCP stdio server (47 tools, scope+audit+redact)
β”œβ”€β”€ vendor_browser_local.py # backend CDP Chromium (stealth, intercept, cookies, dsb) β€” di-vendor
β”œβ”€β”€ requirements.txt        # websocket-client saja
β”œβ”€β”€ SKILL.md                # instruksi agent (copy ke skill-dir bila perlu)
β”œβ”€β”€ scope.json.example      # -> scope.json (allowlist; default disabled)
β”œβ”€β”€ auth_vault.json.example # -> auth_vault.json (chmod 600)
β”œβ”€β”€ opencode.json.snippet   # referensi config opencode
β”œβ”€β”€ mcp.json.example        # referensi config generik MCP
β”œβ”€β”€ examples/quickstart.py  # e2e tanpa LLM: launchβ†’scopeβ†’navigateβ†’snapshotβ†’close
β”œβ”€β”€ scripts/smoke_test.py   # initialize + tools/list, exit 0 bila β‰₯40 tools
β”œβ”€β”€ LICENSE (MIT)
└── .gitignore (melindungi audit/sessions/vault asli)
```

> `scope.json`, `auth_vault.json`, `sessions.json`, `audit.jsonl` adalah **runtime** β€” tidak ikut ke git (lihat `.gitignore`). Yang dipublish hanya `.example`.

## Pakai di agent (pola baku)

1. `mcp_browser_launch {"sessionId":"s1"}` β†’ simpan `sessionId`
2. `mcp_scope_set {"allowed":["target.com"],"enabled":true}`
3. `mcp_browser_spider {"sessionId":"s1","startUrl":"https://target.com","maxPages":20,"depth":2}`
4. Per halaman menarik: `mcp_browser_js_endpoints` + `mcp_browser_console` + `mcp_browser_network_har`
5. `mcp_browser_snapshot` β†’ `mcp_browser_click/type (wait:"idle")` β†’ snapshot lagi β†’ `mcp_browser_eval` verifikasi value
6. Auth differential: `mcp_auth_vault set victim/attacker`, `switch` bergantian
7. Intercept **hanya saat tahu momennya**: `mcp_intercept_set(pattern)` β†’ aksi pemicu β†’ `mcp_intercept_poll` **langsung** β†’ `mcp_intercept_continue` (`forward|drop|modify|fulfill`, `id:"all"` untuk lepas semua)
8. `mcp_repeater_send` (replay tanpa browser) β†’ `mcp_intruder_fuzz` (wordlist inline, auto URL-encode) β†’ `mcp_browser_graphql` probe β†’ `mcp_collaborator_start/poll` untuk OOB
9. `mcp_history_list` + HAR review β†’ `mcp_browser_close`

Aturan detail + 47 tools: lihat [`SKILL.md`](SKILL.md).

### Tips anti-nyangkut (dari pengalaman)

- Tombol tak ada di elements β†’ `mcp_browser_submit(formId)` atau `keys Enter`.
- CAPTCHA gambar/checkbox β†’ `mcp_browser_ground`, klik via `x,y` dari gambar.
- Slider GeeTest / canvas β†’ `mcp_browser_view` lalu `mcp_browser_drag(x1,y1,x2,y2)`.
- Session `Connection refused` / hang setelah intercept β†’ `mcp_browser_recover` atau attach `sessionId` baru, jangan retry session yang wedge.
- `poll` harus **langsung** setelah trigger β€” `eval`-fetch yang menunggu = wedge.

## Keamanan

- Scope allowlist ditegakkan di `navigate`, `repeater_send`, `intruder_fuzz`, `graphql`. Default `scope.json.example` = disabled agar demo jalan; **aktifkan sebelum hunting target nyata**.
- `audit.jsonl`: key sensitif (`password/token/secret/cookie/api-key/bearer`) di-redact + body dipotong 500 char. Jangan commit file runtime.
- Vault 600. Jangan taruh kredensial asli di `.example`.
- Hanya pakai terhadap target yang Anda punya izin uji.

## Publish ke GitHub (checklist)

```bash
cd browser-mcp
# pastikan tidak ada secret bocor:
grep -ri "password\|token\|api.key\|bearer" --include="*.py" --include="*.md" --include="*.json" --include="*.sh" . | grep -v example | grep -v REDACT || echo "bersih"
git init && git add . && git commit -m "browser-mcp standalone v0.4.0" && git branch -M main
gh repo create browser-mcp --public --source=. --push
```

## Troubleshooting

| Gejala | Obat |
|---|---|
| `websocket` import error | `pip3 install websocket-client` |
| chromium not found | `sudo apt install chromium` / `brew install --cask chromium`, lalu `./install.sh` ulang |
| MCP tidak muncul di client | restart client; pastikan path `server.py` absolut; `python3 scripts/smoke_test.py` harus PASS |
| `Connection refused` / session wedged | `mcp_browser_recover` atau launch `reuse:false` / attach sessionId baru |
| stop intercept hang | server sudah auto-lepas paused + timeout 10 dtk; bila wedge, attach session baru dan abandon lama |

## Lisensi

MIT β€” lihat [LICENSE](LICENSE).

Maintenance

ActivityMaintained
ResponsivenessNo issues