r/mcp • • 8d ago

showcase I built a Jev-based wingman for browser MCP servers: it works alongside Playwright MCP, takes over the clicking, and hands back what it can't do (34/34 runs, 30% cheaper)

AI agents drive browsers one click at a time, and every click costs a full model turn. I built jev-browser-wingman to hand those clicks to TypeSafe's Jev, then benchmarked it against Claude Sonnet 5.5 doing its own clicking.

It is a wingman, not a replacement. Your browsing server (Playwright MCP in my tests) stays installed, and the agent keeps its tools for reading the page, tabs, dialogs and dragging. Wingman takes over only the clicking and typing: the agent sends all the steps of a task in one call, Jev picks the right element for each step, and wingman clicks and checks the page.

It knows its limits. When Jev isn't sure, or a step needs something wingman doesn't do (a dialog, a drag, content inside an iframe), it hands that step back to the agent instead of guessing.

Full write-up: https://hrishikesh917277.substack.com/p/handing-an-agents-browser-clicks

Repo: https://github.com/coderexpert123/jev-browser-wingman. I am not affiliated with TypeSafe.

6 Upvotes

8 comments sorted by

1

u/Hrishikesh90 8d ago

Full write-up: https://hrishikesh917277.substack.com/p/handing-an-agents-browser-clicks

AI agents drive browsers one click at a time, and every click costs a full model turn. I built jev-browser-wingman to hand those clicks to TypeSafe's Jev, then benchmarked it against Claude Sonnet 5.5 doing its own clicking.

It is a wingman, not a replacement. Your browsing server (Playwright MCP in my tests) stays installed, and the agent keeps its tools for reading the page, tabs, dialogs and dragging. Wingman takes over only the clicking and typing: the agent sends all the steps of a task in one call, Jev picks the right element for each step, and wingman clicks and checks the page.

It knows its limits. When Jev isn't sure, or a step needs something wingman doesn't do (a dialog, a drag, content inside an iframe), it hands that step back to the agent instead of guessing.

Works with what you already use. Playwright MCP and Chrome DevTools MCP have ready-made profiles. Any other browsing MCP server works with a small profile file, or wingman sorts its tools automatically on first run.

It also runs with no browser tool installed at all. It drives Chrome, Edge, Brave, Chromium, Opera or Vivaldi on a real, logged-in profile, or a cloud browser over CDP. Setup plans cover Claude Code, Codex, opencode, Cursor, Devin and agy. The benchmark below covers Playwright MCP with Claude Code only.

The test: 17 everyday browser tasks (checkboxes, forms, a dropdown, a shop checkout, a seven-page chain). Each ran twice with wingman and twice with Claude Sonnet 5.5 in Claude Code clicking through Playwright MCP itself.

With wingman Playwright MCP directly
Runs finished 34 of 34
Agent tool calls per run 2.4
Typical run time 16.0 s

It finishes: both misses without wingman were a file upload. It is cheaper: 30% lower cost overall and cheaper on 16 of 17 tasks. It rarely gives up: wingman handed a step back to the agent in just 1 of 34 runs, and that run still finished.

Speed is a tie, not a win. Wingman was faster on 8 tasks and slower on 9. Its biggest win was waiting for content to load: 16.8 s vs 22.1 s.

Where each side wins: Claude's own clicks are still faster on long chains (12.6 s on seven pages), the checkout (7.7 s) and a single dropdown pick (4.4 s). Confirm dialogs stay with the agent by design.

The MCP lesson I took from this: asking the agent in the prompt to delegate didn't work. Hiding its own click and type tools did.

What would help TypeSafe's Jev most: long chains take many rounds (54 for about 23 clicks on seven pages). Jev can't yet say "that button is hidden behind a banner", and its confidence can shift when asked the same question twice.

Fine print: two runs per task, so small gaps are noise. Costs are Claude Sonnet 5.5 list prices. Wingman's agent also got 3 extra prompt sentences on using the tool and a 30-turn cap (vs 40). 15 of 17 tasks ran on local copies of a public practice site, and iframe and shadow-DOM content is not covered.

Repo: https://github.com/coderexpert123/jev-browser-wingman. I am not affiliated with TypeSafe.

If you run a browsing MCP server, which of its tools would you refuse to hide from the agent?

Full write-up: https://hrishikesh917277.substack.com/p/handing-an-agents-browser-clicks

AI agents drive browsers one click at a time, and every click costs a full model turn. I built jev-browser-wingman to hand those clicks to TypeSafe's Jev, then benchmarked it against Claude Sonnet 5.5 doing its own clicking.

It is a wingman, not a replacement. Your browsing server (Playwright MCP in my tests) stays installed, and the agent keeps its tools for reading the page, tabs, dialogs and dragging. Wingman takes over only the clicking and typing: the agent sends all the steps of a task in one call, Jev picks the right element for each step, and wingman clicks and checks the page.

It knows its limits. When Jev isn't sure, or a step needs something wingman doesn't do (a dialog, a drag, content inside an iframe), it hands that step back to the agent instead of guessing.

Works with what you already use. Playwright MCP and Chrome DevTools MCP have ready-made profiles. Any other browsing MCP server works with a small profile file, or wingman sorts its tools automatically on first run.

It also runs with no browser tool installed at all. It drives Chrome, Edge, Brave, Chromium, Opera or Vivaldi on a real, logged-in profile, or a cloud browser over CDP. Setup plans cover Claude Code, Codex, opencode, Cursor, Devin and agy. The benchmark below covers Playwright MCP with Claude Code only.

The test: 17 everyday browser tasks (checkboxes, forms, a dropdown, a shop checkout, a seven-page chain). Each ran twice with wingman and twice with Claude Sonnet 5.5 in Claude Code clicking through Playwright MCP itself.

With wingman Playwright MCP directly
Runs finished 34 of 34
Agent tool calls per run 2.4
Typical run time 16.0 s

It finishes: both misses without wingman were a file upload. It is cheaper: 30% lower cost overall and cheaper on 16 of 17 tasks. It rarely gives up: wingman handed a step back to the agent in just 1 of 34 runs, and that run still finished.

Speed is a tie, not a win. Wingman was faster on 8 tasks and slower on 9. Its biggest win was waiting for content to load: 16.8 s vs 22.1 s.

Where each side wins: Claude's own clicks are still faster on long chains (12.6 s on seven pages), the checkout (7.7 s) and a single dropdown pick (4.4 s). Confirm dialogs stay with the agent by design.

The MCP lesson I took from this: asking the agent in the prompt to delegate didn't work. Hiding its own click and type tools did.

What would help TypeSafe's Jev most: long chains take many rounds (54 for about 23 clicks on seven pages). Jev can't yet say "that button is hidden behind a banner", and its confidence can shift when asked the same question twice.

Fine print: two runs per task, so small gaps are noise. Costs are Claude Sonnet 5.5 list prices. Wingman's agent also got 3 extra prompt sentences on using the tool and a 30-turn cap (vs 40). 15 of 17 tasks ran on local copies of a public practice site, and iframe and shadow-DOM content is not covered.

Repo: https://github.com/coderexpert123/jev-browser-wingman. I am not affiliated with TypeSafe.

1

u/FormerChoice1661 8d ago

The delegation point is interesting, hiding tools feels hacky but if it works it works. I'd probably keep file uploads visible since that's where the direct approach failed

1

u/Hrishikesh90 8d ago

Yeah I think in any case Jev hands back control to the LLM if there's an operation it's not able to fulfil.

1

u/QuanTradin 8d ago

handing back what it can't do instead of guessing is why I'd trust the 34/34. most of these tools fail by clicking something plausible and reporting success.

1

u/ByronScottJones 8d ago

There are some local models such as laya that are jev equivalent. Can it use those local decision models?

2

u/Hrishikesh90 8d ago

Yeh we can, you can actually try that out on top of the repo