Atlas / MCP servers / nexibeo / jev-browser-control

jev-browser-controlCAUTION

mcp/nexibeo/jev-browser-control

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.

Verdict
CAUTION
Grade
B
Trust score
87 /100
Exposed tools
21 19r · 2w · 0d
Transport
—
License
NOASSERTION
Stars
5
01

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

Read from source at commit ed5c6b7d3951OBSERVED · 2026-10-11
02

Connect

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-code
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]
claude-desktop
{
  "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}"
      }
    }
  }
}
03

Exposed tools (21)

19 read · 2 write · 0 destructive.

ToolRiskDescription
browser_backreadGoes back in the tab\
browser_clickreadClicks 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_clipboardreadReturns the text the page last copied, for example after a
browser_close_tabreadCloses tab tabId. Anything not saved on that page, such as a half-filled form, is lost.
browser_hoverreadMoves 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_navigatereadOpens a URL in the current tab, or in a new tab with newTab: true, and returns the page\
browser_press_keyreadPresses a key or combination in the page: Enter, Tab, Escape, ArrowDown, PageDown, Backspace, a letter, or combinations like
browser_readreadReturns 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_recordreadStarts 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_screenshotreadReturns a JPEG screenshot of the visible part of the page.
browser_scrollreadScrolls the page (or the scroll area under the middle of the page) up or down by about one screen, or by
browser_selectreadChooses
browser_snapshotreadReturns the current page as numbered interactive elements ([n] role
browser_statuswriteReports 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_tabsreadLists the open tabs (id, title, URL), or with action
browser_typereadReplaces the text in field [ref] with
browser_waitreadWaits until
jev_checkreadAsks Jev how likely a statement about the current page is true (
jev_findreadAsks Jev which visible element best matches a description (
jev_stopwriteStops every running Jev task in the browser.
jev_taskreadRuns a multi-step browser task with Jev, TypeSafe\
04

Trust audit

CAUTIONgrade B · trust 87/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (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)

MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
extension/lib/bridge.js:68
const res = await fetch(`http://127.0.0.1:${this.port}/health`, { signal: AbortSignal.timeout(1500) });
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
mcp/lib/hub.mjs:93
const url = new URL(req.url, 'http://127.0.0.1');
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
mcp/lib/ws.mjs:24
const accept = createHash('sha1').update(key + GUID).digest('base64');
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
mcp/lib/ws.mjs:48
const expected = createHash('sha1').update(key + GUID).digest('base64');
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/bridge.test.mjs:34
const health = await (await fetch(`http://127.0.0.1:${port}/health`)).json();
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/e2e/browser-mode.mjs:24
const SITE = `http://127.0.0.1:${site.address().port}`;
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/e2e/remote.mjs:36
const SITE = `http://127.0.0.1:${site.address().port}`;
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
mcp/package.json
playwright-core
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
playwright-core
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
README.md:80
**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
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
extension/options.html:87
<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=
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
mcp/README.md:38
- **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
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
mcp/README.md:39
- **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,
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
mcp/agents/jev-browser.md:14
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
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha ed5c6b7d3951full audit observations/trust-audit/mcp-server/nexibeo__jev-browser-control.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-11ed5c6b7d3951CAUTIONB87first audit
06

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.

Advertisement