YaviControl MCP Server
Provides browser automation for Google Chrome, enabling AI agents to navigate, click, type, screenshot, evaluate JavaScript, and manage tabs in the user's existing Chrome profile, including signed-in sessions.
Click on "Install 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., "@YaviControl MCP ServerOpen my work dashboard and export this week's sales report."
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.
YaviControl
Let Claude Code and Codex drive the Chrome you're already signed into.
Most browser-automation tooling for AI agents launches its own clean browser — no cookies, no sessions, no logins. That's the right default for CI, and the wrong one when you want an agent to read your Gmail, post from your LinkedIn, pull a report out of a dashboard behind SSO, or check something on a site you authenticated into six months ago.
YaviControl is a Manifest V3 extension plus a small local bridge. Load the extension into your everyday Chrome profile and your agent works the browser you already use — logged in, extensions and all. Load it into the managed profile instead when you want isolation. Same tool, your choice.
Claude Code ─stdio(MCP)─▶ mcp/server.js ─HTTP─┐
├─▶ bridge/server.js ─WS─▶ YaviControl extension ─▶ Chrome
Codex / CLI ─HTTP POST────── tools/yavi.js ───┘ (hub: HTTP + WS, dependency-free)Everything is loopback-only and dependency-free apart from the MCP SDK.
Why not Playwright MCP or Chrome DevTools MCP?
Use those when you want a disposable, reproducible browser — they're excellent at it, and they're maintained by Microsoft and Google respectively.
Reach for YaviControl when the session is the point:
Playwright MCP / Chrome DevTools MCP | YaviControl | |
Browser used | Spawns its own instance by default | Whichever profile you load the extension into |
Your logins | Absent — fresh profile | Present, if you use your everyday profile |
Setup |
| Load an unpacked extension once |
Raw CDP | Partial | Full |
Trusted input | Varies | CDP clicks/keys that work on reCAPTCHA, Stripe, Turnstile |
Best for | Tests, scraping public pages, CI | Anything behind a login you already have |
They are not mutually exclusive — plenty of people run both and pick per task.
Related MCP server: Tabrix
Requirements
Google Chrome 116 or newer
Node.js 18 or newer
Quick start
git clone https://github.com/Yavinesh2025/YaviControl.git
cd YaviControl
npm --prefix mcp installThen pick how you want the extension to run.
Option A — your everyday Chrome (keeps your logins)
Open
chrome://extensionsEnable Developer mode
Load unpacked → select the
extension/folderStart the bridge:
npm start(or double-clickstart-bridge.cmd)
The toolbar badge shows ON in green once connected. This is the mode that gives an agent access to your signed-in sessions — see Security notes before you use it, because it means exactly what it sounds like.
Option B — managed profile (isolated, no logins)
node tools/launch-chrome.jsOne command: starts the bridge, opens Chrome with a dedicated profile at
%LOCALAPPDATA%\YaviControl\ChromeProfile, loads the extension over CDP
(Extensions.loadUnpacked, which still works on Chrome 137+ after branded
Chrome dropped --load-extension), and verifies the handshake.
It also passes --silent-debugger-extension-api, --no-default-browser-check,
and --hide-crash-restore-bubble, so the debugger infobar never shifts page
geometry — which keeps trusted click coordinates accurate — and startup bubbles
never cover the page.
Windows shortcut: double-click start-yavichrome.cmd, or npm run chrome.
Confirm it works
node tools/yavi.js doctor[READY] Browser control is available. means the bridge and the extension are
both connected.
Use it from Claude Code (MCP)
claude mcp add --transport stdio yavicontrol -- node "$PWD/mcp/server.js"Or add it to ~/.claude.json with an absolute path:
{
"mcpServers": {
"yavicontrol": {
"type": "stdio",
"command": "node",
"args": ["C:/path/to/YaviControl/mcp/server.js"]
}
}
}Restart Claude Code, run /mcp to confirm yavicontrol is connected, then ask
for something like "Go to news.ycombinator.com and list the top 5 story
titles."
The MCP server starts the hub automatically. If no extension is connected it
will also launch the managed profile for you — set YAVICONTROL_AUTOLAUNCH=0 to
disable that, which you want if you're using Option A.
Tools: browser_navigate, browser_screenshot, browser_get_content,
browser_click, browser_type, browser_press_key, browser_evaluate,
browser_wait_for, browser_scroll, browser_list_tabs, browser_switch_tab,
browser_back, browser_forward.
Use it from Codex or the terminal (HTTP + CLI)
Start the hub if nothing else has:
node bridge/server.js # or: npm startChange the port with YAVICONTROL_PORT=32200 (then save the matching URL in the
extension popup).
node tools/yavi.js health
node tools/yavi.js commands
node tools/yavi.js open https://example.com
node tools/yavi.js command tabs.query '{"active":true,"currentWindow":true}'
node tools/yavi.js command browser_click '{"selector":"#submit"}'
node tools/yavi.js command browser_type '{"selector":"[contenteditable]","text":"hello"}'
node tools/yavi.js eval active "document.title"
node tools/yavi.js cdp 123 Runtime.evaluate '{"expression":"location.href","returnByValue":true}'
node tools/yavi.js screenshot active screenshot.pngHTTP API
POST /command:
{ "command": "tabs.query", "params": { "active": true, "currentWindow": true } }{ "id": "cmd-...", "type": "response", "ok": true, "result": [] }If more than one Chrome profile is connected, GET /health lists each
extension.sessions[].sessionId. Pass that sessionId in the command body, or
set YAVICONTROL_SESSION_ID, so commands can't silently hit the wrong profile.
Both front-ends converge on the same hub, so Claude Code and Codex can share one running browser.
Control surface
High-level browser_* tools — shadow-DOM-piercing selectors, wait and
scroll helpers, plus:
browser_clickis trusted by default (mode"auto"): a real CDP click that works on reCAPTCHA, Stripe, and Turnstile, with a synthetic fallback.x/yare CSS pixels, matching screenshot pixels 1:1.browser_press_keysends trusted CDP key presses (Enter, Tab, arrows, …).browser_typehandles regular inputs and contenteditable rich editors (Gmail, Notion, Docs-style).browser_screenshotauto-scales the PNG so 1 image pixel = 1 CSS pixel, fixing the Windows DPI/zoom "clicked in the wrong place" problem.
Low-level Chrome + CDP:
tabs.*/windows.*— navigation and window controlscripting.execute— injected script functionsdebugger.*— raw Chrome DevTools Protocolinput.click/input.type— via the debugger protocolcookies.getAll,history.search,downloads.download,storage.*chrome.call— call any available Chrome extension API by path
node tools/yavi.js commands prints the live list.
Extension popup
The toolbar action shows live bridge state, a manual Reconnect, and the
WebSocket URL. The URL is deliberately restricted to ws://127.0.0.1:<port>/ws
or ws://localhost:<port>/ws.
Extension ID
Pinned to:
kjgcjhjkedeiliffkaajbmbaenifdcnaChrome normally derives an unpacked extension's ID from its install path, so it
would otherwise differ per machine and change whenever the folder moves. The
key field in extension/manifest.json holds the public half of an RSA
keypair, and Chrome derives the ID from that instead. node tools/validate.js
re-derives it and fails if the two ever drift apart.
The private key is not in this repository. It's needed only to sign a .crx —
the pinned ID survives without it:
chrome.exe --pack-extension=extension --pack-extension-key=yavicontrol-key.pemTroubleshooting
Start with node tools/yavi.js doctor.
Symptom | Recovery |
Bridge is not reachable | Run |
Bridge running, Chrome not connected | Confirm the unpacked extension is enabled, or open the managed profile with |
Popup says auto reconnect is paused | Choose Reconnect, or re-enable Auto reconnect and save. |
More than one Chrome session connected | Run |
Port already in use | Reuse the running bridge, or set |
Extension updated while popup was open | Close and reopen the popup so it binds to the new service worker. |
A Chrome internal page won't respond | Navigate to a normal |
Validate
node tools/validate.js # static checks: manifest, icons, pinned ID, command coverage
node tools/smoke.js # isolated bridge + request-protection checks
node tools/test.js # popup / reconnect / bridge regression tests
node tools/launch-chrome.js --temp-profile --exit-after-verify # full handshakeSecurity notes
This is authorised local browser automation for a single operator. It requests broad Chrome permissions and exposes raw CDP on purpose. Read this section before using Option A.
Running in your everyday profile means an agent can act as you on every site you're signed into — read mail, send messages, move money. That is the feature, and it is also the risk. Use the managed profile if you aren't comfortable with that.
Any local process that can reach the bridge can drive your browser. The bridge refuses non-loopback hosts, requires
Content-Type: application/json, and rejects browserOriginheaders, so a drive-by web page can't send commands. WebSocket clients must present achrome-extension://<id>origin. But there is no per-caller authentication — run only software you trust.browser_evaluate,scripting.execute, anddebugger.evalrun arbitrary JavaScript in the page by design.browser_evaluateruns in the page's MAIN world and can be blocked by a strict page CSP; usedebugger.evalthere. Only send code you trust.Chrome shows a "debugging this browser" banner while a debugger-based command is attached. Expected. The managed profile suppresses it with
--silent-debugger-extension-apiso it can't shift page geometry; a manually loaded extension will still show it.Not distributable via the Chrome Web Store. Runtime evaluation of externally supplied code violates the store's Remote Code policy. Install by loading the extension unpacked.
Licence
MIT — see LICENSE.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityFmaintenanceEnables AI agents to directly control your real Chrome browser with full context including login sessions, cookies, and open tabs. It provides tools for page scanning, JavaScript execution, CDP control, screenshots, and physical mouse/keyboard input for authentic browser automation.Last updated20239MIT
- Alicense-qualityBmaintenanceEnables MCP clients to control and interact with the user's real Chrome browser session, leveraging existing logins, cookies, and extensions for AI-driven automation.Last updated5MIT
- Alicense-qualityBmaintenanceLets AI coding agents control and inspect a live Chrome browser via MCP, providing Chrome DevTools capabilities for automation, debugging, and performance analysis.Last updated95Apache 2.0
- Flicense-qualityDmaintenanceEnables AI to control browsers via natural language for web automation, testing, and data scraping. Supports Chrome-based browsers and integrates with any MCP-compatible AI tool.Last updated2
Related MCP Connectors
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Live browser debugging for AI assistants — DOM, console, network via MCP.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Yavinesh2025/YaviControl'
If you have feedback or need assistance with the MCP directory API, please join our Discord server