navigateLABSCO SUMMARY
Cursors instead of selectors, and every dangerous thing behind its own flag.
Two things make this feel built by someone who has watched agents break browsers. Snapshots hand back revision-scoped cursors, so a follow-up click targets the node that was actually seen rather than a CSS selector that may now match something else — and the cursors expire on navigation, which forces a re-read instead of a silent mis-click. And the risky operations each carry their own gate: arbitrary JavaScript, unusual URL schemes, closing an unmanaged tab. Screenshots go further by refusing caller-chosen output paths entirely.
What it is
A local-first browser automation MCP server written in Rust, built on the Chrome DevTools Protocol. It either attaches to a Chrome you already have open on a DevTools port or launches a dedicated session, and exposes high-level tools for navigation, reading, tab management, screenshots and interaction. It is a browser control layer for agents, not an end-to-end test runner.
What you get
- Navigation with a scheme gate:
http:,https:,about:and same-origin relative paths are allowed by default, anything else needs an explicit unsafe flag —navigate,go_back,go_forward,wait - Bounded interaction rather than arbitrary scripting —
click,input,select,hover,press_key,scroll,set_viewport - Tab lifecycle, with destructive operations gated behind a confirmation flag —
new_tab,tab_list,switch_tab,close_tab,close - Reading a page four ways: a structured snapshot of actionable nodes, focused node inspection, markdown extraction and a link inventory —
snapshot,inspect_node,get_markdown,extract,read_links - Snapshot modes for how much to re-read:
viewportfor the visible scope,deltafor what changed since a compatible earlier snapshot,fullfor an exhaustive page-wide read - Revision-scoped
cursorhandles from a snapshot, used instead of CSS selectors for follow-up actions — targets take aselectoror acursorobject - Managed PNG capture where the caller does not choose an output path: modes for viewport, full page, element or region, returning artifact metadata with dimensions, device pixel ratio and byte count —
screenshot - An escape hatch that has to be asked for:
evaluateruns JavaScript in the active page and requiresconfirm_unsafe = trueon every call
Requirements
Rust 1.88 or newer to install or build with Cargo — cargo install chromewright, a Homebrew formula, or a prebuilt archive from releases. Chrome, Chromium or another CDP-compatible browser. Attach mode expects DevTools at http://127.0.0.1:9222 by default and can be pointed elsewhere with --ws-endpoint; passing any launch flag such as --headless, --user-data-dir or --executable-path starts a browser instead. chromewright alone serves MCP over stdio; chromewright serve serves streamable HTTP at http://127.0.0.1:3000/mcp, with --port and --http-path to move it. Attach mode can see the tabs, cookies and authenticated state of the profile you connect to — use a dedicated profile for agent work.
Setup effort
Follow the published steps — cargo install chromewright
USE CASES
Letting an agent read a page it cannot fetch
Attach to a browser that is already logged in, snapshot the page and pull it as markdown, instead of fighting an HTTP client.
Filling in a form without guessing selectors
Take a snapshot, target the fields by the cursors it returned, and re-snapshot after the DOM changes.
Checking a layout at another screen size
Emulate the viewport through CDP, then capture a managed screenshot of the page or one element.
Keeping agent browsing out of your own session
Launch a dedicated profile with its own user data directory so automation never touches your logged-in browser.
23 tools
Listed in project docs. Your client may show a different list.
go_backgo_forwardwaitclickinputselecthoverpress_keyscrollset_viewportnew_tabtab_listswitch_tabclose_tabclosesnapshotinspect_nodeget_markdownextractread_linksscreenshotevaluateBEFORE YOU INSTALL
What to know first
Tools you get
23 tools named in the project's documentation. Running chromewright tui adds a second endpoint with eight more tui_* coordination tools.
Requires
- Chrome, Chromium, or another CDP-compatible browser
- chromewright on your PATH
- An MCP client that supports streamable HTTP or stdio servers
INSTALLATION
Connect your client
Server setup
Rust 1.88 or newer is required when installing or building with Cargo.
Install from crates.io:
cargo install chromewrightOr install with Homebrew:
brew install bnomei/chromewright/chromewrightOr install from source:
git clone https://github.com/bnomei/chromewright.git
cd chromewright
cargo install --path .Or download a prebuilt archive from https://github.com/bnomei/chromewright/releases and place the chromewright binary on your PATH.
Start a browser with DevTools enabled, e.g. on macOS:
open -na "Google Chrome" --args --remote-debugging-port=9222 --user-data-dir="$HOME/.chromewright-agent-profile"Start Chromewright over streamable HTTP:
chromewright serveIt serves MCP at http://127.0.0.1:3000/mcp. Plain chromewright with no subcommand serves over stdio instead.
Register it in your MCP client with one of the client configurations on this page: the JSON block for streamable HTTP, or a Codex TOML block.
MCP Clients
Codex — stdio
[mcp_servers.chromewright]
command = "<YOUR_PATH_TO_CHROMEWRIGHT>"
enabled = trueCodex — HTTP
[mcp_servers.chromewright]
url = "http://127.0.0.1:3000/mcp"
enabled = trueAny MCP client — HTTP
{
"mcpServers": {
"chromewright": {
"type": "http",
"url": "http://127.0.0.1:3000/mcp"
}
}
}