cursor-jev
Provides tools for automating Google Chrome, including running click loops, typing text, waiting for page content, and managing browser tabs.
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., "@cursor-jevOpen google.com, search for MCP servers, and click the first result."
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.
cursor-jev
MCP server for Cursor Desktop. It runs the jev-browser-use click loop in Google Chrome. Cursor supplies the task, types text, and checks the result. Jev chooses the next click.
This repository does not copy or fork that skill. The server imports an installed bridge.mjs. The skill is MIT-licensed. This project is a separate Cursor adapter, not an official part of the skill.
Setup
Install jev-browser-use and Google Chrome. Then add this server in the project .cursor/mcp.json:
{
"mcpServers": {
"cursor-jev": {
"command": "node",
"args": ["/absolute/path/to/cursor-jev-mcp/src/server.mjs"]
}
}
}Open the folder in Cursor and enable cursor-jev.
By default the server loads ~/.agents/skills/jev-browser-use/bridge.mjs. Override it with JEV_BRIDGE_PATH.
Related MCP server: ultrabrowse
Tools
jev_browser_runopens Chrome and runs one Jev chunk.jev_host_typetypes text supplied by Cursor. The reply contains the length andsession_id, not the text.jev_waitwaits until the open page contains the requested strings. It does not ask Jev for a new decision.jev_user_tabsandjev_claim_tabclaim an already open tab throughcodex-browser-bridge. That program is Windows-only. On other systems, passurltojev_browser_runinstead.
What one call does
jev_browser_run with url launches the installed Google Chrome in the background. It does not use the personal Chrome profile. One chunk is 12 steps and at most 45 seconds. Chrome stays open.
If the status is step_limit or budget, Cursor looks at the screenshot and, when the task is still valid, calls the tool again with the same session_id and no url. needs_verification is not a pass. Cursor checks the screenshot and stops.
Set JEV_CHROME_HEADLESS=0 to show the window. If ~/.config/jev-browser-use/config.json sets browser.allowedOrigins or browser.allowedActors, the server honors them. The actor comes from JEV_BROWSER_ACTOR.
Limits
Jev does not type. Safe keys are Enter, Escape, Tab, Shift+Tab, PageUp, PageDown, Home, and End. A targeted scroll uses a snapshot index or a point supplied by Cursor. Names such as send, delete, pay, and password are rejected. Existing tabs of normal Chrome, frames, drag-and-drop, and uploads are not supported.
License
This adapter is MIT, copyright Pioneer113. The click loop belongs to jev-browser-use, which has its own MIT license. This repository is not endorsed by that project.
Check
npm test
node scripts/live-example.mjsAvailable Tools
5 toolsjev_browser_runA
Run one Jev chunk in background Google Chrome. Default 12 steps, maximum 30, and 45 seconds. Pass url to open a page. Chrome stays open and the same Jev history is kept. Safe keys are Enter, Escape, Tab, Shift+Tab, PageUp, PageDown, Home, and End. If status is step_limit or budget, inspect the screenshot and call again with the same session_id and goal, without url, only when the task is still valid. If status is needs_verification, stop and verify the screenshot yourself. That status is not a pass. Jev does not type.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| goal | Yes | ||
| policy | No | ||
| tab_id | No | ||
| controls | No | ||
| max_steps | No | ||
| session_id | No | ||
| min_confidence | No | ||
| allowed_origins | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses many behaviors: background operation, default/max steps, timeout, Chrome persistence, safe keys, status handling, and the limitation 'Jev does not type.' It also warns that needs_verification is not a pass. This is extensive, though it omits details like response format and side effects beyond staying open.
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 dense but efficient, with each sentence adding a distinct piece of information. It is front-loaded with purpose, then proceeds to limits, url, persistence, safe keys, and status handling. No redundancy; it reads as a tight operational spec.
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?
Given the complexity (9 params, nested objects, no output schema, no annotations), the description covers core invocation details and re-call logic. It fails to explain several parameters and does not describe the response structure beyond statuses. It is adequate for basic use but leaves gaps for advanced configuration.
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 coverage is 0%, so the description must compensate. It explains url ('Pass url to open a page'), max_steps (default 12, max 30), session_id and goal (used in re-call instructions). However, it does not explain policy, controls, tab_id, min_confidence, or allowed_origins, which are nested or non-obvious. Compensation is partial, so a middle score 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 states a specific verb and resource: 'Run one Jev chunk in background Google Chrome.' It clearly distinguishes from siblings like jev_claim_tab (tab claiming) and jev_wait (waiting). The phrase 'Pass url to open a page' further clarifies an action. However, it assumes knowledge of what a 'Jev chunk' is, which is not defined, slightly reducing clarity.
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 provides operational guidance on when to re-call the tool based on statuses (step_limit, budget, needs_verification) and conditions (task still valid). It also notes that Chrome stays open and history is kept, which helps context. However, it does not explicitly contrast with alternatives or state when not to use this tool, leaving some selection ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jev_claim_tabB
Claim one existing browser tab for bounded Jev operation.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. 'Claim' implies taking ownership or locking a tab, but the description does not say whether the claim is exclusive, reversible, idempotent, or what happens if the tab_id does not exist. No side effects, failure modes, or lifecycle details 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?
The description is a single front-loaded sentence with no filler or repetition. It loses a point because 'bounded Jev operation' is unexplained jargon that could have been replaced with more concrete behavior, but the structure itself is appropriately tight.
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 tool is simple but has no annotations, no output schema, and a single undocumented parameter. The description does not explain what 'claim' actually does, what the operation returns, what prerequisites exist, or how this tool relates to siblings. It is not enough for an agent to invoke it confidently in a real workflow.
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 schema has one required string parameter, tab_id, with 0% description coverage. The description adds the meaning that the tab must already exist ('one existing browser tab'), but it does not explicitly say that tab_id identifies that tab, where to obtain it, or any format expectations. This is minimal but non-trivial compensation for the schema 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 names a specific action and resource: 'Claim one existing browser tab...' and gives a purpose ('for bounded Jev operation'). It is distinguishable from siblings like jev_user_tabs and jev_browser_run, though it does not explicitly contrast itself with them. The phrase 'bounded Jev operation' is vague but does not hide the core action.
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 the tool is used when a bounded Jev operation requires an existing browser tab, but it does not state when to prefer this over siblings or provide exclusions. No alternatives are named, so the guidance is only implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jev_host_typeA
Type text supplied by the host into the open Chrome session. Jev never chooses this text. Pass field to click that text field first. The typed text is not returned. Then resume with jev_browser_run and the same session_id.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| field | No | ||
| session_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It discloses that the tool may click a field first, that the typed text is not returned, and that execution should resume with jev_browser_run. It does not describe error cases or behavior when field is omitted, but the important side effects and workflow constraints are surfaced.
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?
Four short sentences front-load the main action and then efficiently add the prerequisite, the output caveat, and the follow-up step. Every sentence adds necessary operational information with no filler or repetition of schema fields.
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 3-parameter tool with no annotations and no output schema, the description provides enough operational context to make the call and continue the workflow. The main missing detail is explicit guidance on the optional field parameter and what counts as a valid value, but the overall flow is well covered.
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, and it does name all three parameters: text is host-supplied, field is the field to click first, and session_id is reused with jev_browser_run. However, it does not clarify that field is optional (though the schema marks it optional) nor describe acceptable formats or selector syntax, leaving some ambiguity.
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 opens with a specific, actionable purpose: 'Type text supplied by the host into the open Chrome session.' It clearly identifies the action, the target, and the source of the text. It doesn't explicitly contrast itself with sibling tools, though it references jev_browser_run as a follow-up, which helps locate its role.
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 communicates when to use the tool: when the host has supplied text for Jev to type, and it warns 'Jev never chooses this text.' It also provides a prerequisite ('Pass field to click that text field first') and a required continuation ('resume with jev_browser_run and the same session_id'). It does not spell out when-not-to-use or alternatives, but the intended workflow is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jev_user_tabsA
List existing browser tabs available to claim.
| 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 must carry the behavioral disclosure burden. 'List' clearly signals a read-only operation and the phrase 'available to claim' adds context about tab state, but it does not describe the output format, error behavior, or whether IDs are returned for later use with jev_claim_tab.
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 with no wasted words. It states the action, target, and relevant scope ('available to claim') compactly and clearly.
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, simple listing tool, the description provides adequate context by naming the resource and the claim-related purpose. It is slightly incomplete because there is no output schema and the description does not specify what fields or identifiers the returned tabs include, but the low complexity keeps this from being a major gap.
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 has zero parameters, so there is nothing for the description to document beyond what the schema shows. The baseline of 4 applies because no parameter clarification is needed at all.
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 ('List') and a clear resource ('existing browser tabs available to claim'). The phrase 'available to claim' distinguishes this listing tool from the sibling jev_claim_tab and other browser tools, so an agent can clearly identify its purpose.
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 usage: it lists tabs that can later be claimed, which suggests using it before jev_claim_tab. However, it does not explicitly state when to use it versus alternatives or mention any exclusions, leaving the usage context implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jev_waitB
Wait until the open Chrome session accessibility text includes every string in includes and none in excludes. Does not start a Jev decision. Requires session_id.
| Name | Required | Description | Default |
|---|---|---|---|
| poll_ms | No | ||
| excludes | No | ||
| includes | No | ||
| session_id | Yes | ||
| timeout_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden. It discloses the core wait behavior, that no Jev decision is started, and the session_id requirement. However, it omits critical behavior for a polling tool: what happens on timeout (error vs. false return) and what the tool returns on success. This is a meaningful gap given the zero annotation coverage.
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 short sentences with no filler; the core behavior is front-loaded. The negative qualifier and prerequisite are each given their own clause, making the description easy to parse. Slightly dense sentence structure in the first line, but economical overall.
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 wait/polling tool with no output schema and no annotations, the essentials are missing: the agent is never told what the tool returns, how it signals a timeout, or what the polling semantics are. These are exactly the things a caller needs to invoke it correctly, and the description is silent on them.
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 coverage is 0%, so the description must compensate. It does define the two core filtering parameters (`includes` and `excludes`) inline. But it does not explain the timing parameters `poll_ms` and `timeout_ms`, nor clarify the role of `session_id` beyond 'requires it'. For a five-parameter tool with no schema descriptions, this is only partial compensation.
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 verb ('Wait until') plus a concrete resource ('open Chrome session accessibility text') and a precise condition (includes every string in `includes`, none in `excludes`). The clause 'Does not start a Jev decision' helps separate it from decision-triggering siblings like jev_browser_run. It is clear but stops short of fully enumerating what distinguishes it from every sibling.
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 when to use it (when you need to await a content condition on an open Chrome session) and gives a negative signal ('Does not start a Jev decision') plus a prerequisite ('Requires session_id'). However, it never names an alternative tool or states a when-not-to-use condition, leaving sibling selection to the agent's inference.
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.
5 tool updates
v0.1.0- First observed
jev_browser_run - First observed
jev_claim_tab - First observed
jev_host_type - First observed
jev_user_tabs - First observed
jev_wait
TDQS
Scored across 5 tools
Each tool addresses a distinct step in the Jev browser workflow: enumerate tabs, claim a tab, run a chunk, wait for state, and inject host text. No two tools compete for the same responsibility, and the run/wait/type split is clearly delineated.
All names share the jev_ prefix and snake_case, but the internal pattern is inconsistent: claim_tab is verb_noun, user_tabs is a noun phrase, browser_run reverses the order, wait is verb-only, and host_type is ambiguous. Still readable and semantically tied to the domain, so moderately coherent.
Five tools is a focused, appropriate size for a specialized Jev browser automation server. Each tool supports a distinct part of the workflow without redundancy.
The core loop is covered: list tabs, claim one, run bounded Jev chunks, wait for accessibility text, and type host-supplied text. Minor gaps exist such as no explicit release/stop tool and the resume path after needs_verification is left to the caller, but the main operation can be completed.
Maintenance
Related MCP Connectors
Real Chrome for agents: start a browser, read pages as numbered markdown, click, type, hand off.
Run multi-step tasks in a real Chrome browser: persistent environments, live view, human takeover.
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients to drive a live Chrome or Brave browser over stdio, with tools for navigation, clicking, typing, screenshots, and executing automation goals.3MIT
- AlicenseAqualityCmaintenanceEnables AI agents to delegate complex web browsing goals to a real Chrome instance driven by Jev, completing tasks end-to-end in ~300ms per decision and returning only the final result.111MIT
- FlicenseNot gradedqualityBmaintenanceEnables Claude Code and Claude Desktop to control your own Chrome browser, with Jev deciding each click, keystroke, and scroll.2-
- AlicenseAqualityBmaintenanceEnables agents to delegate browser exploration to Jev by providing natural-language objectives, receiving compact evidence and source context, and continuing the same live browser session through supervisor handoffs.6Apache 2.0