jevbridge
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@jevbridgeOpen my inbox and show unread emails."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Let Claude Code drive your real, logged-in Chrome — the way the Claude-in-Chrome extension does, but open source and yours.
JevBridge pairs a tiny MCP server with a Chrome MV3 extension. The extension uses
Chrome's built-in chrome.debugger (CDP) to read and act on your actual tabs — your
profile, your logins, your open pages — with no remote-debug port and no relaunch. The
page is read as a compact, numbered element table (jev-style), not screenshots.
The calling agent (Claude) is the policy. There is no second model and no API key. Page snapshots flow up to Claude as ordinary tool results; nothing is sent to any third party.
Claude Code ──stdio(MCP)──▶ mcp/server.mjs ──ws://127.0.0.1:10577──▶ Chrome extension ──CDP──▶ your tabsWhy this instead of the alternatives
Claude-in-Chrome | jev launch/attach | JevBridge | |
Runs in your real logged-in Chrome | ✅ | ❌ (own profile / debug port) | ✅ ( |
Decision model | Claude | jev's model (paid, per-click) | Claude (you), no key |
Perception | screenshots + DOM | element table | element table |
Open source / self-owned | ❌ | partial | ✅ MIT |
Page data to a third party | no | yes (to the model API) | no |
Related MCP server: chrome-mcp
Install (developer / unpacked)
Load the extension
Chrome →
chrome://extensions→ toggle Developer mode (top right).Load unpacked → select the
extension/folder.Copy the extension's ID (shown on its card).
Open its Details → Extension options to confirm the bridge port (default
10577).
Register the MCP server with Claude Code (user scope):
claude mcp add --scope user jevbridge -- node /ABS/PATH/jevbridge/mcp/server.mjs(Optional:
--env JEVBRIDGE_PORT=10577to change the port; set the same in the extension options.)Restart Claude Code so the new tools load. The extension badge turns green (●) when it reaches the bridge.
Tools
browser_status— connection + attached-tab diagnostics (call this first if something's off).browser_tabs— list open tabs (id,title,url,active).browser_navigate—{ url, tabId? }→ element table after load.browser_observe—{ tabId? }→ the element table.browser_act—{ ops: [...], tabId? }→ runs ops, returns a fresh table.browser_assert—{ contains? | url_includes? | ref_visible?, tabId? }→ pass/fail.
Ops for browser_act:
{op:"click",ref:"e12"}, {op:"type",ref:"e7",text:"..."}, {op:"select",ref:"e8",value:"..."},
{op:"key",key:"Enter"}, {op:"scroll",dy:600}, {op:"wait",ms:500}.
Element table line: e12 btn "Sign in" · e7 inp "Email" ▸ "current value" ·
e9 chk✓ "Remember me" · ⊘ = disabled · (off-screen) = outside the viewport.
Refs (e12) stay stable across observations of the same page.
Notes & limits
Attaching the debugger shows Chrome's "JevBridge is debugging this browser" banner — expected.
One debugger client per tab: a tab with DevTools open (or driven by another extension) can't be attached; switch tabs or close DevTools.
chrome://, the Web Store, and other browser pages can't be driven.No cross-origin iframe traversal, canvas, or file uploads yet.
The bridge binds to
127.0.0.1only.
Security
The extension holds debugger + <all_urls> — the power to read and act on any page in your
profile. That is the same capability class as any real-browser agent; use it deliberately.
Everything here is auditable: the MCP server is one zero-dependency file (mcp/server.mjs),
the extension is plain JS under extension/.
Contributing
Contributions are welcome. See CONTRIBUTING.md for the dev setup, how to run the tests, and the PR process. By participating you agree to the Code of Conduct.
Security
The extension holds powerful permissions, so security reports matter. Please do not open a public issue for vulnerabilities — see SECURITY.md for private reporting.
Support
Questions or trouble? See SUPPORT.md.
License
MIT © jevbridge contributors.
Available Tools
6 toolsbrowser_actA
Run a list of operations on the target tab in order, then return the fresh element table. ops: [{op:"click",ref:"e12"} | {op:"type",ref:"e7",text:"..."} | {op:"select",ref:"e8",value:"..."} | {op:"key",key:"Enter"} | {op:"scroll",dy:600} | {op:"wait",ms:500}].
| Name | Required | Description | Default |
|---|---|---|---|
| ops | Yes | ||
| tabId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It clearly discloses that operations execute in order, enumerates the supported operation shapes, and states that a fresh element table is returned. It does not cover partial-failure behavior or whether a click can cause navigation, but the core side effects are visible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that states the behavior first and then provides a compact, unambiguous grammar for the operations array. There is no filler or repetition of schema field names.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers the core mechanics and the return value, but it leaves some operational context implicit: element refs presumably come from a prior observation, tabId semantics are unspecified, and error or partial-failure behavior is not addressed. An agent can likely call it correctly in simple cases, but must infer these assumptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates by defining the required `ops` parameter as a precise union of six operation shapes. The optional `tabId` is only implied by 'target tab' and left undocumented, which is a minor gap given its straightforward meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (run a list of operations), a target (the tab), an ordering constraint, and a concrete outcome (return the fresh element table). The enumerated operation types make it clearly distinct from the sibling tools like browser_observe and browser_navigate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for batching tab interactions, but it never explicitly states when to use it over alternatives or what prerequisites exist (e.g., an already-open tab or a prior element observation). No exclusions or when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_assertA
Prove an outcome instead of inferring it. Provide one of: contains (page text includes string), url_includes (current url contains string), ref_visible (a ref is present and visible). Returns pass/fail.
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | No | ||
| contains | No | ||
| ref_visible | No | ||
| url_includes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It explains what each assertion does and states that the tool returns pass/fail, which covers the core behavior. But it does not disclose side effects, what a 'ref' refers to, how tabId affects the current tab, or behavior if multiple modes are provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: a purpose statement, a compact list of modes with inline explanations, and a return-type note. No filler, and the key usage rule is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a simple assertion tool: it names the modes and the pass/fail return value. It falls short on operational details an agent would need, such as what 'ref' means, whether tabId is required, and what happens when assertions fail (exception vs. false).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaningful semantics for contains, url_includes, and ref_visible, and clarifies that they are alternatives. However, tabId is left unexplained, and the 'provide one of' rule is not enforced in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's job: prove an outcome rather than infer it, and lists three concrete assertion types (contains, url_includes, ref_visible). This is a specific verb plus resource, and the contrast with 'inferring' hints at the sibling browser_observe, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Prove an outcome instead of inferring it' gives clear context for when to use this tool rather than an observational tool like browser_observe. 'Provide one of' also instructs the agent to supply exactly one assertion mode. However, it does not explicitly mention alternatives or discuss when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_observeA
Read the target tab as an element table: one numbered, actionable control per line (e12 btn "Sign in"). Refs (e12) stay stable across observations of the same page. Read this, then act on the refs.
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing behavior. It explains the output shape (numbered, actionable controls), gives an example format, and notes that refs stay stable across observations. It does not cover failure modes, but for a read-only observation tool this is meaningful behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the most essential information: what the tool reads, what the output looks like, and how refs should be used. Every sentence earns its place with no redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool, the description covers the output format and ref stability well. However, it leaves tab selection ambiguous and does not describe what happens when tabId is omitted or invalid. The absence of an output schema makes the lack of explicit return-value details more noticeable, though the example format helps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It mentions 'the target tab' but never explicitly explains the tabId parameter, its optionality, or how it is resolved. Given that tabId is not required according to the schema, the missing default behavior is a notable gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Read the target tab as an element table.' It also differentiates itself from siblings by framing the output as actionable controls and referencing a follow-up action ('then act on the refs'), which distinguishes it from browser_act, browser_navigate, and browser_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear workflow context: read the tab, then act on the returned refs. It does not explicitly name alternatives or exclusion conditions, but the 'read then act' instruction makes the intended position relative to sibling tools reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_statusA
Report bridge + extension connection state and the currently targeted tab. Call this first if anything behaves unexpectedly: it distinguishes "no extension connected" from "no tab attached".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It clearly states what the tool reports and that it differentiates two failure modes. It does not describe output format or side effects, but for a zero-parameter status tool this is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose and followed immediately by practical usage guidance. Every sentence earns its place; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, no-output-schema diagnostic tool, the description is complete: it states what is reported, when to call it, and why the diagnostic distinction matters. Nothing needed for selecting or invoking the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema is empty with zero parametersainer, and schema coverage is 100%, so the baseline is 4. The description adds no parameter details because none exist, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Report') and a precise set of resources: bridge + extension connection state and the currently targeted tab. It also distinguishes this tool from navigation, observation, action, and assertion siblings by focusing purely on status/diagnostics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit situational guidance: 'Call this first if anything behaves unexpectedly.' It also explains the diagnostic value by distinguishing 'no extension connected' from 'no tab attached.' It does not name alternative tools or when-not conditions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_tabsA
List open tabs in the real browser (id, title, url, active). Use a tab id with the other tools to target a specific tab; omit to use the active tab.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. The word 'List' signals a read-only operation, and the description clarifies what data is returned and that the active tab is the default target for later tools. It could be more explicit about having no side effects, but 'list' sufficiently implies that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The core function is front-loaded, and the second sentence immediately provides actionable usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with no output schema, this description is complete: it states the return fields and exactly how to apply the result with sibling tools. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the empty input schema fully covers parameter semantics. The description adds useful cross-tool context about tab ids, even though those ids are consumed by sibling tools rather than by this one.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('List open tabs in the real browser') and names the exact returned fields (id, title, url, active). This clearly separates it from the navigation, observation, and assertion siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains how to use the returned tab ids with other tools and the active-tab fallback, which is the main usage context. It doesn't explicitly say when not to use this tool, but the listing role is obvious and no sibling is an alternative for listing tabs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
browser_act - First observed
browser_assert - First observed
browser_navigate - First observed
browser_observe - First observed
browser_status - First observed
browser_tabs
TDQS
Scored across 6 tools
Each tool targets a distinct concern: listing tabs, checking connection/target state, navigating, reading the page, acting on the page, and asserting outcomes. The descriptions clearly separate browser_status from browser_tabs by emphasizing connection state versus the full tab list.
All tools share a consistent browser_ prefix and lowercase style, which makes the set predictable. However, the second part mixes nouns (tabs, status) with verbs (navigate, observe, act, assert), so the pattern is not perfectly uniform.
Six tools is a well-scoped size for browser automation. Each tool covers a necessary phase of the workflow without redundancy or bloat.
The core browser automation lifecycle is covered: list tabs, target, navigate, observe, act, and assert. Minor gaps exist around tab lifecycle operations like creating or closing tabs, but these don't prevent typical automation workflows.
Maintenance
Related MCP Connectors
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Real Chrome for agents: start a browser, read pages as numbered markdown, click, type, hand off.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables Claude Code to control a real browser using AI for web scraping, competitive intelligence, and UX auditing through the MCP protocol.-
- AlicenseBqualityAmaintenanceEnables controlling a real Chrome browser from MCP hosts like Claude, with extension-based or CDP fallback, supporting tabs, navigation, interaction, and page reading tools.401,043 npm6MIT
- FlicenseNot gradedqualityDmaintenanceEnables browser automation (navigate, screenshot, click, type, etc.) for Claude Code via MCP protocol, with a Chrome extension for configuration.2-
- AlicenseNot gradedqualityBmaintenanceChrome extension + MCP bridge that gives Claude control over your real browser via CDP, enabling navigation, clicking, typing, scrolling, screenshots, and JS execution with a visible cursor and tab-bring-to-front.1MIT