@vibebrowser/mcp 0.2.5 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/docs/eval.md CHANGED
@@ -7,7 +7,7 @@ This document tracks the current validation matrix for the `vibebrowser-mcp` and
7
7
  - published npm validation (`@vibebrowser/mcp@latest`)
8
8
  - real-extension browser evals versus fake-extension protocol evals
9
9
 
10
- Evaluation date: **March 25, 2026 (America/Los_Angeles)**.
10
+ Evaluation date: **March 26, 2026 (America/Los_Angeles)**.
11
11
 
12
12
  ## Coverage Matrix
13
13
 
@@ -16,6 +16,7 @@ Evaluation date: **March 25, 2026 (America/Los_Angeles)**.
16
16
  | Relay race regression | `npm run test:e2e:relay-race` | local | fake extension socket | relay preserves in-flight tool calls across extension reconnects |
17
17
  | HTTP MCP transport | `npm run test:e2e:http` | local | fake extension socket | streamable HTTP MCP path works end to end |
18
18
  | OpenClaw-compatible browser CLI | `npm run test:e2e:browser-cli` | `local`, `pack`, `npm` | fake extension socket | `vibebrowser-cli` command shape, JSON output, and tool routing work end to end |
19
+ | Live browser CLI regression | `npm run test:e2e:browser-cli-live` | local | real extension session | validates `open`/`snapshot` behavior on a real URL against the connected Vibe extension |
19
20
  | Codex + OpenCode MCP bridge | `npm run test:e2e:agents` | `local`, `pack`, `npm` | real extension session | packaged `vibebrowser-mcp` can be launched by Codex/OpenCode tooling and route MCP traffic to a real Vibe-connected browser |
20
21
  | OpenCode financial eval (`../vibe`) | `node tests/mcp-eval.test.js --skip-build --model github-copilot/gpt-4.1 --mcp-source ...` | `auto`, `local`, `pack`, `npm` | harness-managed browser + extension | full OpenCode browser task execution against the Vibe extension |
21
22
 
@@ -119,7 +120,22 @@ Pass signal:
119
120
  - `vibebrowser-mcp --help` prints the branded CLI
120
121
  - `vibebrowser-cli --help` prints the standalone OpenClaw-compatible CLI
121
122
 
122
- ### 4. Real-extension agent eval
123
+ ### 4. Published npm CLI validation
124
+
125
+ ```bash
126
+ cd /Users/engineer/workspace/vibebrowser/vibe-mcp
127
+ npx -y --package @vibebrowser/mcp@latest vibebrowser-mcp --version
128
+ npx -y --package @vibebrowser/mcp@latest vibe-mcp --version
129
+ npx -y --package @vibebrowser/mcp@latest vibebrowser-cli --version
130
+ E2E_BROWSER_CLI_SOURCE=npm node scripts/e2e-browser-cli.mjs
131
+ ```
132
+
133
+ Pass signal:
134
+
135
+ - all three binaries print the published version
136
+ - `browser cli e2e ok` proves `vibebrowser-cli` works from the npm registry package, not only from a local tarball
137
+
138
+ ### 5. Real-extension agent eval
123
139
 
124
140
  ```bash
125
141
  cd /Users/engineer/workspace/vibebrowser/vibe-mcp
@@ -136,8 +152,69 @@ Hard requirement:
136
152
 
137
153
  - a live Vibe extension session must already be connected or connectable on the relay path
138
154
  - this harness does **not** prove anything if the extension is absent
155
+ - default Codex settings are tuned for current CLI compatibility:
156
+ - `E2E_CODEX_MODEL=gpt-5`
157
+ - `E2E_CODEX_REASONING_EFFORT=low`
158
+ - `E2E_CODEX_TIMEOUT_MS=480000`
159
+
160
+ ### 5a. Live browser CLI regression (real extension)
161
+
162
+ ```bash
163
+ cd /Users/engineer/workspace/vibebrowser/vibe-mcp
164
+ npm run test:e2e:browser-cli-live
165
+ ```
166
+
167
+ Optional env overrides:
168
+
169
+ - `BROWSER_LIVE_URL` (default: X search URL from issue repro)
170
+ - `BROWSER_LIVE_TIMEOUT_MS` (default: `60000`)
171
+ - `BROWSER_LIVE_MIN_CONTENT_CHARS` (default: `200`)
172
+
173
+ Pass signal:
174
+
175
+ - output contains `live browser cli e2e ok`
176
+ - output prints measured `open latency`, content lengths, and matched `pageId`
177
+ - test proves real-extension `open` + page-content + `snapshot --page-id` flow (not mocked)
178
+
179
+ ### 5b. Latest built extension eval via Chrome for Testing
180
+
181
+ Build the dev extension first:
182
+
183
+ ```bash
184
+ cd /Users/engineer/workspace/vibebrowser/vibe
185
+ npm run build:extension:dev
186
+ ```
187
+
188
+ Use the direct script form when debugging the isolated path, especially from a detached worktree where `../vibe` discovery may not point at the intended sibling repo:
189
+
190
+ ```bash
191
+ cd /Users/engineer/workspace/vibebrowser/vibe-mcp
192
+ E2E_DEBUG=1 \
193
+ E2E_TEST_BROWSER=1 \
194
+ E2E_VIBE_REPO_ROOT=/Users/engineer/workspace/vibebrowser/vibe \
195
+ E2E_TEST_EXTENSION_PATH=/Users/engineer/workspace/vibebrowser/vibe/dist/extension/dev \
196
+ E2E_MCP_SOURCE=npm \
197
+ node scripts/e2e-mcp-agents.mjs
198
+ ```
199
+
200
+ Use the package-script entrypoint for the canonical repo-level check:
201
+
202
+ ```bash
203
+ cd /Users/engineer/workspace/vibebrowser/vibe-mcp
204
+ E2E_TEST_BROWSER=1 \
205
+ E2E_VIBE_REPO_ROOT=/Users/engineer/workspace/vibebrowser/vibe \
206
+ E2E_TEST_EXTENSION_PATH=/Users/engineer/workspace/vibebrowser/vibe/dist/extension/dev \
207
+ E2E_MCP_SOURCE=npm \
208
+ npm run test:e2e:agents
209
+ ```
210
+
211
+ Pass signal:
212
+
213
+ - output contains `e2e ok`
214
+ - the eval launches a separate Chrome for Testing instance
215
+ - the loaded extension comes from `../vibe/dist/extension/dev`, not the user’s daily Chrome profile
139
216
 
140
- ### 5. Full OpenCode browser eval in sibling repo
217
+ ### 6. Full OpenCode browser eval in sibling repo
141
218
 
142
219
  ```bash
143
220
  cd /Users/engineer/workspace/vibebrowser/vibe
@@ -169,10 +246,18 @@ Commands executed in this session:
169
246
  | `npm pack --json --pack-destination <tmp>` | PASS | tarball includes both `dist/cli.js` and `dist/browser-main.js` plus docs/openclaw skill files |
170
247
  | `npx -y --package <local-tarball> vibebrowser-mcp --help` | PASS | branded `vibebrowser-mcp` binary available from package artifact |
171
248
  | `npx -y --package <local-tarball> vibebrowser-cli --help` | PASS | standalone `vibebrowser-cli` binary available from package artifact |
249
+ | `gh workflow run "Publish to npm" --ref release/vibebrowser-cli-0.2.5` | PASS | GitHub publish workflow completed successfully |
250
+ | `npm view @vibebrowser/mcp version dist-tags.latest bin --json` | PASS | npm `latest` is now `0.2.5` and includes `vibebrowser-mcp`, `vibe-mcp`, and `vibebrowser-cli` |
251
+ | `npx -y --package @vibebrowser/mcp@latest vibebrowser-mcp --version` | PASS | published npm binary resolves to `0.2.5` |
252
+ | `npx -y --package @vibebrowser/mcp@latest vibe-mcp --version` | PASS | legacy alias still resolves to `0.2.5` |
253
+ | `npm run test:e2e:agents` | PASS | local `dist/cli.js` path completed all three MiniWoB tasks with Codex + OpenCode against the live extension session |
254
+ | `E2E_MCP_SOURCE=npm npm run test:e2e:agents` | PASS | published npm binary path completed the same three MiniWoB tasks end to end |
255
+ | `E2E_DEBUG=1 E2E_TEST_BROWSER=1 E2E_VIBE_REPO_ROOT=/Users/engineer/workspace/vibebrowser/vibe E2E_TEST_EXTENSION_PATH=/Users/engineer/workspace/vibebrowser/vibe/dist/extension/dev E2E_MCP_SOURCE=npm node scripts/e2e-mcp-agents.mjs` | PASS | debug run against a separate Chrome for Testing instance with the unpacked extension build |
256
+ | `E2E_TEST_BROWSER=1 E2E_VIBE_REPO_ROOT=/Users/engineer/workspace/vibebrowser/vibe E2E_TEST_EXTENSION_PATH=/Users/engineer/workspace/vibebrowser/vibe/dist/extension/dev E2E_MCP_SOURCE=npm npm run test:e2e:agents` | PASS | canonical repo entrypoint passed against the latest built extension in isolated browser mode |
257
+ | `npx -y --package @vibebrowser/mcp@latest vibebrowser-cli --version` | PASS | standalone CLI is now available from npm `latest` |
258
+ | `E2E_BROWSER_CLI_SOURCE=npm node scripts/e2e-browser-cli.mjs` | PASS | npm-installed `vibebrowser-cli` passed end to end |
259
+ | `npm run test:e2e:browser-cli-live` | PASS | real extension run against X search URL; reported open latency `60718ms`, open content `9119` chars, snapshot content `9564` chars |
172
260
  | `E2E_MCP_SOURCE=pack node scripts/e2e-mcp-agents.mjs` | FAIL (environment) | timed out waiting for a live Vibe extension connection on the relay path |
173
- | `npx -y --package @vibebrowser/mcp@latest vibebrowser-mcp --help` | PASS, but stale | published npm has the `vibebrowser-mcp` alias, but not the full new standalone CLI release shape |
174
- | `npx -y --package @vibebrowser/mcp@latest vibebrowser-cli --help` | FAIL | `vibebrowser-cli` is not present in the current npm `latest` release |
175
- | `npm whoami` | FAIL | `ENEEDAUTH`; publish from this machine is currently blocked |
176
261
 
177
262
  Observed real-extension agent failure:
178
263
 
@@ -184,26 +269,26 @@ Interpretation:
184
269
 
185
270
  - packaged artifacts are valid locally
186
271
  - the standalone CLI branding and binaries are correct in the tarball
187
- - published npm `latest` is **not yet** updated to the new branded binaries
272
+ - published npm `latest` is now updated to `0.2.5` with all intended binaries
188
273
  - real-agent validation currently depends on a live extension session and was not satisfiable in this shell session
189
274
 
190
275
  ## Publish Reality
191
276
 
192
277
  Current npm state:
193
278
 
194
- - `npm view @vibebrowser/mcp version dist-tags.latest --json` returned `0.2.4`
195
- - `@latest` still resolves to a partial older package surface
196
- - `npm whoami` failed with `ENEEDAUTH`
279
+ - `npm view @vibebrowser/mcp version dist-tags.latest bin --json` returns `0.2.5`
280
+ - `@latest` now includes:
281
+ - `vibebrowser-mcp`
282
+ - `vibe-mcp`
283
+ - `vibebrowser-cli`
284
+ - publish succeeded via GitHub Actions workflow `Publish to npm`
197
285
 
198
286
  Consequences:
199
287
 
200
- - the new `vibebrowser-mcp` / `vibebrowser-cli` binaries are verified in a local tarball artifact
201
- - they are **not yet published** to npm from this machine
202
- - do not claim npm end-to-end availability until:
203
- - a new version is cut
204
- - publish auth is configured
205
- - `npx -y --package @vibebrowser/mcp@<new-version> vibebrowser-cli --help` succeeds
288
+ - the new `vibebrowser-mcp` / `vibebrowser-cli` binaries are published to npm and verified from the registry
289
+ - the remaining non-green item is the real-extension agent eval, which still requires a live Vibe extension session on the relay path
206
290
 
207
291
  ## Tracking
208
292
 
209
293
  - Tracking issue: `VibeTechnologies/vibe-mcp#22`
294
+ - Release PR: `VibeTechnologies/vibe-mcp#23`
@@ -59,56 +59,91 @@ So the missing piece was a streamable HTTP MCP transport.
59
59
 
60
60
  That is what `vibebrowser-mcp start --transport http` now provides.
61
61
 
62
- ## What to install
62
+ ## Prerequisites
63
+
64
+ You need:
65
+
66
+ 1. **Node.js 18+** - `vibebrowser-mcp` requires Node.js
67
+ 2. **Chrome/Brave/Chromium** with the Vibe extension installed
68
+ 3. **OpenClaw** configured with an MCP server URL
69
+
70
+ ## What gets installed
63
71
 
64
72
  The user needs three pieces:
65
73
 
66
74
  1. the Vibe Co-Pilot browser extension
67
75
  2. `vibebrowser-mcp` on the same machine as the browser
68
- 3. an OpenClaw MCP server entry pointing at the local `vibebrowser-mcp` HTTP endpoint
69
-
70
- ## Step 1: install the Vibe extension
76
+ 3. an OpenClaw MCP server entry pointing to the local `vibebrowser-mcp` HTTP endpoint
71
77
 
72
- Install the Vibe Co-Pilot extension from `https://vibebrowser.app`.
78
+ ## Step 1: Install the Vibe extension
73
79
 
74
- Then open the extension settings and enable `MCP External`.
80
+ 1. Install the Vibe Co-Pilot extension from [Chrome Web Store](https://chromewebstore.google.com/detail/vibe-ai-browser-co-pilot/djodpgokbmobeclicaicnnidccoinado)
81
+ 2. Open Chrome and click the Vibe extension icon
82
+ 3. Go to **Settings** (gear icon)
83
+ 4. Find **MCP External** (or "MCP External Control")
84
+ 5. Enable it and select **Remote** mode
85
+ 6. Copy the **Extension UUID** shown - you'll need this for the next step
75
86
 
76
- For cloud OpenClaw, choose **Remote** mode and copy the **Extension UUID**.
87
+ > **Note**: The Extension UUID is a unique identifier that allows `vibebrowser-mcp` to connect to your specific browser session through the Vibe relay.
77
88
 
78
- ## Step 2: start the local HTTP bridge
89
+ ## Step 2: Start the local HTTP bridge
79
90
 
80
91
  On the same machine where the browser extension is installed, run:
81
92
 
93
+ **Option A: Using the helper command (recommended)**
94
+
82
95
  ```bash
83
- npx -y --package @vibebrowser/mcp vibebrowser-mcp start --transport http --remote <extension-uuid>
96
+ npx -y --package @vibebrowser/mcp vibebrowser-mcp openclaw --remote <extension-uuid>
84
97
  ```
85
98
 
86
- By default this starts a local MCP endpoint at:
99
+ This prints the exact commands and MCP URL you need.
87
100
 
88
- ```text
89
- http://127.0.0.1:8788/mcp
101
+ If OpenClaw is running on another machine (for example in the cloud), provide a reachable URL:
102
+
103
+ ```bash
104
+ npx -y --package @vibebrowser/mcp vibebrowser-mcp openclaw --remote <extension-uuid> --public-url https://<reachable-host>/mcp
90
105
  ```
91
106
 
92
- If you want the exact OpenClaw-friendly snippet, you can also run:
107
+ **Option B: Manual command**
93
108
 
94
109
  ```bash
95
- npx -y --package @vibebrowser/mcp vibebrowser-mcp openclaw --remote <extension-uuid>
110
+ npx -y --package @vibebrowser/mcp vibebrowser-mcp start --transport http --remote <extension-uuid>
96
111
  ```
97
112
 
98
- That prints:
113
+ By default this starts a local MCP endpoint at:
99
114
 
100
- - the bridge command
101
- - the MCP URL to register in OpenClaw
102
- - a JSON snippet you can paste into config
115
+ ```
116
+ http://127.0.0.1:8788/mcp
117
+ ```
118
+
119
+ That loopback URL only works when OpenClaw can reach the same machine. For cloud OpenClaw, register a reachable URL (`--public-url`) instead.
120
+
121
+ Keep this terminal open - the bridge must stay running for OpenClaw to connect.
103
122
 
104
123
  For operator workflows and OpenClaw skills, you can also use the OpenClaw-compatible browser CLI surface directly:
105
124
 
106
125
  ```bash
126
+ npx -y --package @vibebrowser/mcp vibebrowser-cli sessions
107
127
  npx -y --package @vibebrowser/mcp vibebrowser-cli --remote <extension-uuid> status
108
128
  npx -y --package @vibebrowser/mcp vibebrowser-cli --remote <extension-uuid> tabs
109
129
  npx -y --package @vibebrowser/mcp vibebrowser-cli --remote <extension-uuid> snapshot --json
110
130
  ```
111
131
 
132
+ `snapshot` in `vibebrowser-cli` is tool-only and maps directly to extension snapshot tools:
133
+
134
+ - default (`--format ai`) -> `take_md_snapshot`
135
+ - ARIA (`--format aria`) -> `take_a11y_snapshot`
136
+
137
+ Use `--page-id <id>` (or `--pageId <id>`) to target a specific tab without switching user focus.
138
+
139
+ For local relay mode with multiple connected browsers/profiles:
140
+
141
+ - run `vibebrowser-cli sessions` to list available local session IDs
142
+ - pass `--session <id>` to target one explicitly
143
+ - if omitted, the CLI uses the first connected local session
144
+
145
+ `open` and `navigate` responses include extracted page content in JSON output (`pageContent`) when page state is modified, so agents can continue without an immediate extra snapshot call.
146
+
112
147
  That CLI accepts the same style of verbs and flags OpenClaw operators expect, but it still targets the Vibe real-browser path rather than an isolated OpenClaw-managed browser profile.
113
148
 
114
149
  ## Step 3: add the MCP server to OpenClaw
@@ -125,8 +160,47 @@ Register the bridge URL in OpenClaw:
125
160
  }
126
161
  ```
127
162
 
163
+ Use that loopback URL only for same-machine setups. For cloud OpenClaw, set `"url"` to the reachable value you passed through `--public-url`.
164
+
128
165
  Once that is configured, the cloud OpenClaw agent can use the Vibe browser tools through the local bridge.
129
166
 
167
+ ## Optional: Use the OpenClaw skill for local agents
168
+
169
+ For OpenClaw agents running locally (not in the cloud) that need access to your real browser, you can use the Vibe skill instead of configuring an MCP server URL.
170
+
171
+ ### Install the skill
172
+
173
+ Copy `openclaw/vibebrowser/SKILL.md` from this package to your OpenClaw skills directory. The skill provides OpenClaw-compatible CLI commands that target your Vibe-connected browser.
174
+
175
+ ### Configure environment
176
+
177
+ Set the extension UUID in your shell:
178
+
179
+ ```bash
180
+ export VIBE_EXTENSION_UUID="<your-extension-uuid>"
181
+ ```
182
+
183
+ ### Available commands
184
+
185
+ ```bash
186
+ # Check status
187
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json status
188
+
189
+ # List tabs
190
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json tabs
191
+
192
+ # Open a page
193
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json open https://example.com
194
+
195
+ # Click element by index
196
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json click 12
197
+
198
+ # Type into element
199
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json type 23 "hello"
200
+ ```
201
+
202
+ See [`openclaw/vibebrowser/SKILL.md`](../openclaw/vibebrowser/SKILL.md) for the full command reference.
203
+
130
204
  ## When to use this setup
131
205
 
132
206
  This architecture is the right fit when the agent needs the **user's own browser context**, for example:
@@ -171,3 +245,30 @@ That is a much better fit than asking users to move their life into a fresh clou
171
245
  The end result is simple:
172
246
 
173
247
  **OpenClaw stays in the cloud. The browser stays local. Vibe MCP connects them cleanly.**
248
+
249
+ ## Troubleshooting
250
+
251
+ ### "Extension UUID not found"
252
+
253
+ Make sure you've enabled **Remote** mode in the Vibe extension settings. The UUID only appears when Remote mode is active.
254
+
255
+ ### "Connection refused" errors
256
+
257
+ 1. Ensure the `vibebrowser-mcp` process is still running
258
+ 2. Check the terminal for error messages
259
+ 3. Verify the MCP URL matches exactly (including the `/mcp` path) and is reachable from OpenClaw (not `127.0.0.1` for cloud-hosted OpenClaw)
260
+
261
+ ### "No extension connected"
262
+
263
+ 1. Open Chrome and click the Vibe extension icon
264
+ 2. Verify MCP External is enabled in Settings
265
+ 3. Check the extension shows "Connected" status
266
+
267
+ ### MCP URL format
268
+
269
+ The correct format is:
270
+ ```
271
+ http://127.0.0.1:8788/mcp
272
+ ```
273
+
274
+ Not `http://127.0.0.1:8788` (missing `/mcp` path).
@@ -0,0 +1,219 @@
1
+ ---
2
+ name: vibebrowser
3
+ description: Control the user's local browser through the Vibe Browser CLI bridge. Use this when the task must run against the user's real Vibe-connected browser session, tabs, cookies, or installed extensions.
4
+ metadata:
5
+ {
6
+ "openclaw":
7
+ {
8
+ "emoji": "🌐",
9
+ "requires":
10
+ {
11
+ "bins": ["npx"],
12
+ "env": ["VIBE_EXTENSION_UUID"],
13
+ },
14
+ },
15
+ }
16
+ ---
17
+
18
+ # Vibe Local Browser
19
+
20
+ ## Installation
21
+
22
+ 1. **Get the Extension UUID**:
23
+ - Install the Vibe extension in Chrome
24
+ - Open extension Settings → MCP External
25
+ - Enable Remote mode and copy the Extension UUID
26
+
27
+ 2. **Set environment variable**:
28
+ ```bash
29
+ export VIBE_EXTENSION_UUID="<your-extension-uuid>"
30
+ ```
31
+
32
+ 3. **Install the skill**:
33
+ Copy this file to your OpenClaw skills directory (typically `~/.openclaw/skills/` or your project's `openclaw/skills/` folder).
34
+
35
+ Use the `vibebrowser-cli` command when the user wants OpenClaw to drive their real local browser through the Vibe extension.
36
+
37
+ Prefer this skill when the task depends on:
38
+
39
+ - the user's real browser profile
40
+ - existing logged-in sessions
41
+ - local tabs already open on the user's machine
42
+ - browser extensions or stored site state
43
+
44
+ Do not use this skill for OpenClaw tenant cloud browsing.
45
+
46
+ ## Required environment
47
+
48
+ The shell running OpenClaw must have:
49
+
50
+ ```bash
51
+ export VIBE_EXTENSION_UUID="<extension-uuid>"
52
+
53
+ # Optional if you use a custom relay URL.
54
+ # export VIBE_REMOTE_RELAY_URL="wss://relay.api.vibebrowser.app"
55
+ # export VIBE_RELAY_URL="wss://relay.api.vibebrowser.app" # legacy alias
56
+
57
+ # Optional compatibility label. Vibe always targets the real local browser path.
58
+ # export VIBE_BROWSER_PROFILE="user"
59
+ ```
60
+
61
+ ## Command form
62
+
63
+ Prefer this exact command pattern:
64
+
65
+ ```bash
66
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json <subcommand> ...
67
+ ```
68
+
69
+ If the package is already installed locally, you can use:
70
+
71
+ ```bash
72
+ vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json <subcommand> ...
73
+ ```
74
+
75
+ If you set `VIBE_RELAY_URL`, append:
76
+
77
+ ```bash
78
+ --relay-url "$VIBE_RELAY_URL"
79
+ ```
80
+
81
+ If you set `VIBE_REMOTE_RELAY_URL`, use:
82
+
83
+ ```bash
84
+ --relay-url "$VIBE_REMOTE_RELAY_URL"
85
+ ```
86
+
87
+ ## Deterministic runbook (default)
88
+
89
+ Use this sequence when the task needs reliable, repeatable control:
90
+
91
+ 1. Verify connection:
92
+ ```bash
93
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json status --wait-for-extension --wait-timeout 10000
94
+ ```
95
+ 2. Resolve a target page id without changing focus:
96
+ ```bash
97
+ PAGE_ID="$(
98
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json tabs \
99
+ | jq -r '.pages[] | select(.active == true) | .id' \
100
+ | head -n1
101
+ )"
102
+ ```
103
+ 3. Snapshot that page before acting:
104
+ ```bash
105
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json --page-id "$PAGE_ID" snapshot --format aria --interactive
106
+ ```
107
+ If the aria snapshot is too verbose, try the default first and fall back:
108
+ ```bash
109
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json --page-id "$PAGE_ID" snapshot
110
+ # If empty or only title returned, retry with aria:
111
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json --page-id "$PAGE_ID" snapshot --format aria --interactive
112
+ ```
113
+ 4. Perform action on the same page id:
114
+ ```bash
115
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json --page-id "$PAGE_ID" click 12
116
+ ```
117
+
118
+ If `jq` is unavailable, parse `.pages` from `tabs --json` directly and still pass `--page-id <id>` on every action.
119
+
120
+ ## Safe operating rules
121
+
122
+ - **Never use `focus` or `tab select` unless explicitly asked.** The user may be actively working in the browser — switching their active tab is disruptive. Instead, pass `--page-id <id>` (or `--pageId <id>`) to target a specific tab without switching focus. Get the page ID from `tabs` output, then use it on any command:
123
+ ```bash
124
+ vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json --page-id 2 snapshot
125
+ vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json --page-id 2 click 7
126
+ ```
127
+ - Prefer `tabs` or `snapshot` before acting.
128
+ - `snapshot` is tool-only and maps to extension snapshot tools (`take_md_snapshot` by default, `take_a11y_snapshot` for `--format aria`).
129
+ - Use `open <url>` to create a fresh page when possible.
130
+ - Use `evaluate --fn ...` only for simple compatibility-safe expressions such as:
131
+ - `() => 21 + 21`
132
+ - `() => document.title`
133
+ - `() => location.href`
134
+ - `() => location.hostname`
135
+ - `() => location.origin`
136
+ - Avoid destructive actions unless the user explicitly asks.
137
+ - If the CLI returns a connection error, report it clearly and stop guessing.
138
+ - The OpenClaw-compatible `--browser-profile` flag is accepted by the CLI, but Vibe always targets the user's real browser path rather than an isolated managed browser.
139
+
140
+ ## Common commands
141
+
142
+ Status:
143
+
144
+ ```bash
145
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json status
146
+ ```
147
+
148
+ List pages:
149
+
150
+ ```bash
151
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json tabs
152
+ ```
153
+
154
+ Open a new page:
155
+
156
+ ```bash
157
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json open https://example.com
158
+ ```
159
+
160
+ Take the default AI snapshot:
161
+
162
+ ```bash
163
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json snapshot
164
+ ```
165
+
166
+ Take the ARIA / interactive snapshot:
167
+
168
+ ```bash
169
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json snapshot --format aria --interactive
170
+ ```
171
+
172
+ Click and type using OpenClaw-style refs:
173
+
174
+ ```bash
175
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json click 12
176
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json type 23 "hello" --submit
177
+ ```
178
+
179
+ Evaluate JavaScript:
180
+
181
+ ```bash
182
+ npx -y --package @vibebrowser/mcp vibebrowser-cli --remote "$VIBE_EXTENSION_UUID" --json evaluate --fn '() => document.title'
183
+ ```
184
+
185
+ ## Snapshot format: `ai` vs `aria`
186
+
187
+ The `snapshot` command supports two extraction formats:
188
+
189
+ | Format | Flag | Engine | Best for |
190
+ |--------|------|--------|----------|
191
+ | `ai` (default) | `--format ai` | Content script (in-page JS) | Simple pages, articles, search results |
192
+ | `aria` | `--format aria` | CDP accessibility tree | **SPAs, background tabs, Notion, Gmail, complex apps** |
193
+
194
+ **When the default `--format ai` returns only the page title or empty content**, switch to `--format aria`:
195
+
196
+ ```bash
197
+ # Default — may return empty for background tabs or SPAs like Notion
198
+ vibebrowser-cli ... snapshot
199
+
200
+ # Reliable fallback — uses Chrome DevTools Protocol directly, works on background tabs
201
+ vibebrowser-cli ... snapshot --format aria --interactive
202
+ ```
203
+
204
+ **Known limitations of `--format ai`:**
205
+ - Returns empty for **background tabs** (content script not injected or `getBoundingClientRect` returns 0x0)
206
+ - Returns `"Could not establish connection"` when the content script is unreachable
207
+ - May miss content behind `aria-hidden` containers in SPAs like Notion
208
+
209
+ **Rule of thumb:** If `snapshot` returns suspiciously little content, retry with `--format aria --interactive` before reporting failure.
210
+
211
+ ## Success criteria
212
+
213
+ A successful run usually looks like:
214
+
215
+ 1. confirm the relay is reachable
216
+ 2. list current tabs or create a fresh one
217
+ 3. navigate or snapshot if needed
218
+ 4. evaluate `document.title` or `location.href` to verify the result
219
+ 5. summarize what happened for the user
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibebrowser/mcp",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "type": "module",
5
5
  "description": "MCP server for browser automation - the only solution supporting multiple AI agents (Claude, Cursor, VS Code) simultaneously controlling your Chrome browser",
6
6
  "main": "dist/index.js",
@@ -18,10 +18,14 @@
18
18
  "dev": "tsc --watch",
19
19
  "start": "node dist/cli.js",
20
20
  "prepublishOnly": "npm run build",
21
- "test": "npm run test:e2e:relay-race && npm run test:e2e:http && npm run test:e2e:browser-cli",
21
+ "test": "npm run test:e2e:relay-race && npm run test:e2e:relay-roundtrip && npm run test:e2e:cli-relay && npm run test:e2e:http && npm run test:e2e:browser-cli",
22
22
  "test:e2e:browser-cli": "node scripts/e2e-browser-cli.mjs",
23
+ "test:e2e:cli-relay": "node scripts/e2e-cli-relay.mjs",
23
24
  "test:e2e:http": "node scripts/e2e-http-streamable.mjs",
25
+ "test:e2e:devtools-flag": "node scripts/e2e-devtools-flag.mjs",
26
+ "test:e2e:browser-cli-live": "node scripts/e2e-browser-cli-live.mjs",
24
27
  "test:e2e:relay-race": "node scripts/e2e-relay-fake-extension-race.mjs",
28
+ "test:e2e:relay-roundtrip": "node scripts/e2e-relay-roundtrip.mjs",
25
29
  "test:e2e:agents": "node scripts/e2e-mcp-agents.mjs"
26
30
  },
27
31
  "keywords": [
@@ -64,6 +68,9 @@
64
68
  "commander": "^12.0.0",
65
69
  "ws": "^8.18.0"
66
70
  },
71
+ "optionalDependencies": {
72
+ "chrome-devtools-mcp": "^0.21.0"
73
+ },
67
74
  "devDependencies": {
68
75
  "@types/node": "^20.0.0",
69
76
  "@types/ws": "^8.5.0",