jev-browser-controlCAUTION
Let Claude code, chatgpt codex or control your own Chrome. Chrome extension + MCP server: Jev, TypeSafe's decision model, picks each click in ~0.5 s for a fraction of a cent. MIT, bring your own OpenRouter key.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
Let Claude or Codex drive a real Chrome. You ask in plain words; Claude plans, and Jev, TypeSafe's decision model, picks each click, keystroke and scroll in about half a second for a fraction of a cent.
Created by Jeroen Erne (nexibeo.com · completeaitraining.com), built together with Claude.
Measured 27 to 198 times cheaper, and more than twice as fast, than letting Claude's or Codex's own model do the clicking (same tasks, same loop; results).
Website: jevbrowsercontrol.com · Docs: jevbrowsercontrol.com/docs · License: MIT
What you can ask
Five everyday tasks, run live in Claude Code on September 26, 2026:
Costs are at the jevbrowsercontrol.com credits price (5× OpenRouter's); with your own OpenRouter key they are a fifth of th
ed5c6b7d3951OBSERVED · 2026-10-11Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add jev-browser-control --env JBC_API_KEY=${JBC_API_KEY} --env JBC_CLOUD_KEY=${JBC_CLOUD_KEY} --env JBC_REMOTE_KEY=${JBC_REMOTE_KEY} --env OPENROUTER_API_KEY=${OPENROUTER_API_KEY} -- npx -y [email protected]{
"mcpServers": {
"jev-browser-control": {
"command": "npx",
"args": [
"-y",
"[email protected]"
],
"env": {
"JBC_API_KEY": "${JBC_API_KEY}",
"JBC_CLOUD_KEY": "${JBC_CLOUD_KEY}",
"JBC_REMOTE_KEY": "${JBC_REMOTE_KEY}",
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}"
}
}
}
}Exposed tools (21)
19 read · 2 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
browser_back | read | Goes back in the tab\ |
browser_click | read | Clicks element [ref] from the latest snapshot with a real mouse click and returns the updated visible elements. Depending on the page, a click can submit a form, send a message, post, buy or delete. |
browser_clipboard | read | Returns the text the page last copied, for example after a |
browser_close_tab | read | Closes tab tabId. Anything not saved on that page, such as a half-filled form, is lost. |
browser_hover | read | Moves the mouse onto element [ref] without clicking, which opens menus that appear on hover (reaction pickers, navigation menus, tooltips). Returns the updated visible elements, including what the hover revealed. |
browser_navigate | read | Opens a URL in the current tab, or in a new tab with newTab: true, and returns the page\ |
browser_press_key | read | Presses a key or combination in the page: Enter, Tab, Escape, ArrowDown, PageDown, Backspace, a letter, or combinations like |
browser_read | read | Returns the whole page as markdown (headings, links, lists), plain text, or a list of links. Long pages come in parts; offset continues where the last part ended. |
browser_record | read | Starts or stops a screen recording of the browser (the current tab, following tab switches). stop saves an MP4 file on this computer and returns its path. |
browser_screenshot | read | Returns a JPEG screenshot of the visible part of the page. |
browser_scroll | read | Scrolls the page (or the scroll area under the middle of the page) up or down by about one screen, or by |
browser_select | read | Chooses |
browser_snapshot | read | Returns the current page as numbered interactive elements ([n] role |
browser_status | write | Reports whether the browser is ready, which tab is current, and how Jev is set up: whether a key is set, the models, the limits per task and whether irreversible clicks stop for confirmation. |
browser_tabs | read | Lists the open tabs (id, title, URL), or with action |
browser_type | read | Replaces the text in field [ref] with |
browser_wait | read | Waits until |
jev_check | read | Asks Jev how likely a statement about the current page is true ( |
jev_find | read | Asks Jev which visible element best matches a description ( |
jev_stop | write | Stops every running Jev task in the browser. |
jev_task | read | Runs a multi-step browser task with Jev, TypeSafe\ |
Trust audit
CAUTIONgrade B · trust 87/100 Install with care. The audit found things worth knowing before you trust its output.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- none-observed
- Network
- declared (7 observation(s))
- Shell
- declared (1 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (14)
const res = await fetch(`http://127.0.0.1:${this.port}/health`, { signal: AbortSignal.timeout(1500) });const url = new URL(req.url, 'http://127.0.0.1');
const accept = createHash('sha1').update(key + GUID).digest('base64');const expected = createHash('sha1').update(key + GUID).digest('base64');const health = await (await fetch(`http://127.0.0.1:${port}/health`)).json();const SITE = `http://127.0.0.1:${site.address().port}`;const SITE = `http://127.0.0.1:${site.address().port}`;playwright-core
playwright-core
**Grok Bot, ChatGPT, claude.ai and other cloud apps.** They can't start a local program, so jevbrowsercontrol.com offers the same tools as a remote MCP server at `https://jevbrowsercontrol.com/mcp`. c
<p class="hint">Anyone with this key can control this browser while remote control is on, so keep it secret and revoke it in your <a href="https://jevbrowsercontrol.com/dashboard" target="_blank" rel=
- **Local only.** The server listens on `127.0.0.1:10523`, so several Claude Code or Codex sessions share one Chrome window. It accepts other Jev Browser Control processes on your computer that hold t
- **What is sent.** The `browser_*` tools send nothing anywhere; Chrome loads the pages you ask for as usual. When `jev_task`, `jev_find` or `jev_check` run, the server sends the page's visible text,
1. Start with `browser_status`; in browser mode the first call opens the window. If it reports an error, or in extension mode that the extension isn't connected, stop and report the message (for the e
Gates applied: no_behavioural_pass.
ed5c6b7d3951full audit observations/trust-audit/mcp-server/nexibeo__jev-browser-control.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-11 | ed5c6b7d3951 | CAUTION | B | 87 | first audit |
Questions
What is the jev-browser-control MCP server?
Let Claude code, chatgpt codex or control your own Chrome. Chrome extension + MCP server: Jev, TypeSafe's decision model, picks each click in ~0.5 s for a fraction of a cent. MIT, bring your own OpenRouter key.
What tools does jev-browser-control expose?
21 in total: 19 read-only, 2 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.
Is jev-browser-control safe to connect to an agent?
With care. The audit graded it B (87/100) and found 14 things worth knowing before you trust this server, listed below with the exact line each was found on.
What credentials does jev-browser-control need?
It reads JBC_API_KEY, JBC_CLOUD_KEY, JBC_REMOTE_KEY and OPENROUTER_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How current is this page?
The grade is for one exact copy of the source (ed5c6b7d3951), read on 2026-10-11. The repository is watched and re-audited when it changes.