navigateLABSCO SUMMARY
It tells you when to escalate instead of returning a broken page.
Default navigation is a fast static pass; exec_scripts: true opts into bounded QuickJS, which can materialise light hydration but is not V8 and will still leave a heavy React or Vue app as an empty shell. What makes that workable is honesty in the output — density.likely_js_filled, thin_shell and challenge.provider say which case you are in, so an agent stops or escalates rather than reporting an empty page as the answer. Script evaluation is bounded by UNBROWSER_SCRIPT_EVAL_BUDGET_MS, default 5000.
What it is
A non-visual web runtime for agents. It keeps cookies and DOM state across calls, returns queryable element references, follows links and submits HTML forms, and tells the caller when a page genuinely needs Chrome instead of pretending it can handle it.
What you get
navigatefetches a page and returns a BlockMap — title, landmarks, headings, interactives, density signals and an ASCII outline — plus status, headers and challenge detectionqueryandquery_debugrun CSS selectors and return stable refs likee:142, with sample matches and hints when a selector missesclick,typeandsubmitact on those refs; GET and URL-encoded POST forms are supported, multipart is nottextandtext_mainread a node or the likely article subtree;extract_cards,extract_tableandtable_to_jsonnormalise repeated listings and tablesdiscoverfinds DOM, form and network routes and ranks them against an information goalevalruns JavaScript in the embedded QuickJS runtime;cookies_set,cookies_getandcookies_clearmanage the jar- Every result carries routing aids:
micro_hintfor the single next step,next_toolsranked,avoidfor tools with nothing to act on - Selectors cover tags, IDs, classes, attribute operators, all four combinators,
:not()and:has()
Requirements
One binary, no Chrome. Install the PyPI wheel pyunbrowser 0.0.21 with pipx (Python 3.10+), cargo install unbrowser, a release archive, or the distroless Docker image ghcr.io/protostatis/unbrowser — a roughly 13 MiB pull that runs as non-root. Start it with --mcp. No account or key.
Setup effort
One command — pipx install pyunbrowser
USE CASES
Reading a page properly without paying for a browser
Get structure instead of raw HTML — headings, landmarks and the main article text.
Filling in and submitting a form
Query the fields once, then type and submit against stable refs with the cookie jar carried along.
Pulling a product or listing grid into rows
Normalise repeated cards or an HTML table into headers and rows instead of parsing markup by hand.
Knowing when a page is out of reach
Challenge and thin-shell signals say to stop or move to an authorised browser session, with the provider and status attached.
33 tools
Listed in project code.
queryquery_debugtexttext_maintext_cleanfind_texttext_aroundquery_textblockmappage_modelroute_discoverdiscovernetwork_extractextractextract_tabletable_to_jsonextract_listextract_cardssettleclickactivatetypesubmitbodyevalcookies_setcookies_getcookies_clearreport_outcomenetwork_storesnetwork_stores_clearhelpBEFORE YOU INSTALL
What to know first
Tools you get
The project says 32; its source registers 33.
Requires
unbrowser on PATH
Where it runs
Both documented setups run the server on your machine.
INSTALLATION
Connect your client
Server setup
pipx install pyunbrowserMCP Clients
Any MCP client — binary
{
"mcpServers": {
"unbrowser": {
"command": "unbrowser",
"args": [
"--mcp"
]
}
}
}Any MCP client — Docker
{
"mcpServers": {
"unbrowser": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"ghcr.io/protostatis/unbrowser:latest"
]
}
}
}