
unbrowser by Unchained
io.github.protostatisPublished by GitHub account protostatisv0.0.21Updated Oct 24, 2026
Chrome-free MCP web access for agents with low-token page maps and browser escalation hints.
Overview
A Chrome-free, stateful web runtime that lets an assistant navigate pages, query elements, fill forms and extract structured content with low-token page maps.
- What you can do
- Navigate pages and get a structured BlockMap of titles, headings, landmarks and interactive elements
- Query elements by selector and act on stable element refs to click, type or submit
- Keep cookies, links, redirects and URL-encoded form posts within a session
- Run bounded QuickJS page scripts on request when static HTML is not enough
- Extract structured data with helpers for routes, cards, tables and main text
- Read page and challenge signals plus routing hints that recommend the next step or escalation
- When to use it
- Useful when plain HTTP fetching is too limited and a full Chrome browser is too heavy: static or server-rendered pages, link and form workflows, and agent-driven extraction that needs session state. It also tells the assistant when a page really needs a real browser.
- Requirements
- Runs locally over stdio as a native binary, installed via uvx from the pyunbrowser PyPI package, Cargo, Docker, or release archives. Python installs need Python 3.10 or newer. No authentication, environment variables or headers are declared.
Installation
In SourceWeft
- Open unbrowser by Unchained in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
unbrowser
The cheap browser pass for agents. One native binary. No Chrome.
Official MCP Registry identity: mcp-name: io.github.protostatis/unbrowser
unbrowser is a stateful, non-visual web runtime for agents. It sits between curl/WebFetch and a real browser: it retains cookies and DOM state, returns queryable element refs, handles links and HTML forms, detects challenge and SPA signals, and can run bounded QuickJS page scripts when static HTML is not enough.
Default
navigateis a fast static/SSR pass. Setexec_scripts: trueonly when you need bounded QuickJS execution. Heavy SPAs, pixels, V8 fidelity, extensions, and interactive anti-bot challenges belong in a real Chrome tier.
Try the live public-web demo before installing. It accepts only the fixed public source sets shown on the page; do not send private data, cookies, or authenticated tasks through it. A shared Streamable HTTP MCP endpoint is available at https://unchainedsky.com/unbrowser-mcp for public smoke tests; production sessions should use a local install.
Use unbrowser only on sites, accounts, and data you are permitted to access.
Challenge detection and cookie import do not grant permission to bypass access
controls or site terms. Treat session cookies as credentials: keep them local,
scope them to the authorized task, and never send them to the public demo.
Pick the right tier
Use unbrowser when HTTP alone is too dumb and a full browser is too expensive. When the page needs Chrome, the output tells the agent to escalate rather than pretending compatibility it does not have.
Quick start
Docker — Linux amd64/arm64, ~13 MiB pull
The image is distroless and runs as non-root: no shell, package manager, or persistent state. Pin :vX.Y.Z or an image digest in production.
Python
On macOS, /usr/bin/python3 is 3.9 and cannot install the wheel; use pipx or a Homebrew Python. The PyPI distribution is pyunbrowser, while the import and executable remain unbrowser.
MCP
Minimal surface: add "--mcp-profile", "minimal" to expose only navigate/query/extract/help and let the agent discover the rest via help(topic). The Python wrapper ships a 3-tool smart server (search/open/help) as the unbrowser-smart console script.
Docker MCP configuration
See installation and interface reference for Cargo, release archives, source builds, persistent shell sessions, raw JSON-RPC, and all MCP options.
What an agent gets
navigatereturns a BlockMap: page title, landmarks, headings, interactives, density signals, and an ASCII outline. Its size is page-dependent; it is structured for planning rather than a fixed-token promise.- Stable element refs (
e:142): query an element once, thenclick,type, orsubmitit without re-parsing HTML. - Stateful cookies and forms: cookie jar, GET and URL-encoded POST form submission, links, and redirects persist within a session.
- Page and challenge signals:
density.likely_js_filled,thin_shell, andchallenge.providertell an agent whether to run scripts, inspect embedded data, stop, or escalate to an authorized browser session. - Routing aids on every result:
micro_hint(the single next concrete step),next_tools(ranked candidates),avoid(tools with nothing to act on), and a stableescalationtaxonomy (challenge,thin_shell,partial_result, …) with retryable/severity/evidence — recommendations never contradictavoid. - Structured helpers: route discovery, card extraction, table normalization,
text_main, and selector debugging cover common extraction workflows.
Script mode and escalation
With exec_scripts: true, inline and external scripts run in QuickJS under a bounded watchdog. This can materialize light hydration and fetch-visible data; it is not V8 or a rendering engine. Heavy React/Vue/Ember apps may still leave an empty shell.
Escalate to unchainedsky-cli or Unchained when a permitted task needs real pixels, Canvas/WebGL, Workers, browser extensions, V8 compatibility, an authenticated profile, or human confirmation. When the user has already established an authorized session in Chrome, cookies_set can import the required session cookie locally until it expires; it is not a license to circumvent a site's controls.
Documentation
License
Apache-2.0 — see LICENSE.
Source: README.md at commit b2f0d74
Tools
0Version history
1- v0.0.21LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts