Unbrowse

Runs web tasks by replaying a site's own backend API calls, with a recorded cloud browser as fallback

By Unbrowse JavaScript Remote (hosted) · Streamable HTTPLocal · stdio Browser automation

50 popularity score ★ 908 ↓ 295/wk

Connect your client

Remote (hosted)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude Codeterminal
claude mcp add --transport http unbrowse https://unbrowse.ai/mcp
Codexterminal
codex mcp add unbrowse --url https://unbrowse.ai/mcp && codex mcp login unbrowse
Claude (desktop and web)Settings → Connectors → Add custom connector
https://unbrowse.ai/mcp
ChatGPTDeveloper mode, then add an MCP app with OAuth
https://unbrowse.ai/mcp
Gemini CLIterminal
gemini extensions install https://github.com/unbrowse-ai/unbrowse
Local (npm)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

FirstTerminal
npx -y unbrowse login
Claude CodeTerminal
claude mcp add unbrowse -- npx -y unbrowse mcp
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "unbrowse": {
      "command": "npx",
      "args": [
        "-y",
        "unbrowse",
        "mcp"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "unbrowse": {
      "command": "npx",
      "args": [
        "-y",
        "unbrowse",
        "mcp"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "unbrowse": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "unbrowse",
        "mcp"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.unbrowse]
command = "npx"
args = ["-y", "unbrowse", "mcp"]
Gemini CLITerminal
gemini mcp add --scope user unbrowse npx -- -y unbrowse mcp

Settings 6

UNBROWSE_API_KEY secret Optional: API key (ub_live_…) from unbrowse.ai/app. Needed unless you signed in with `npx unbrowse login`, and wins over a stored sign-in.
UNBROWSE_EGRESS Optional: Set to client to send the proxy's unbrowse_run site requests from this machine (same as --from-here). Unset, they go from Unbrowse. For unbrowse_run.
UNBROWSE_MCP_URL Optional: Hosted MCP address the proxy forwards to (same as --url). Default https://unbrowse.ai/api/mcp.
UNBROWSE_BASE_URL Optional: Unbrowse origin for sign-in and the REST API. Default https://unbrowse.ai.
UNBROWSE_END_USER Optional: End-user id sent as X-Unbrowse-End-User when using an org key (same as --end-user).
UNBROWSE_ACCOUNT Optional: Which of several signed-in Unbrowse accounts to use.

What it does

Unbrowse is a hosted MCP server. Most browser agents render a page for every step. Unbrowse first looks for a stored capability instead: a set of the website's own first-party HTTP requests, compiled into one callable tool. When one fits, it replays those requests and only hands back a result it has verified. When none fits, the agent does the task once in Unbrowse's recorded cloud browser (the unbrowse_browse_* tools) or you upload two HAR recordings, and Unbrowse turns that into a new capability so the next run needs no browser.

It looks in your own private space first and then in a public registry of sites other people have already compiled. It can also read one page as markdown, map a site's URLs or index a whole site in the background. Site logins live in its own password manager. When a run needs one, the person gets a one-time link to save it, so passwords stay out of the chat. You can also attach other apps' MCP servers, or any remote MCP by URL, to your account.

Most people connect to https://unbrowse.ai/mcp and sign in with OAuth. The MIT-licensed npm package `unbrowse` is a CLI whose `unbrowse mcp` command runs a local stdio proxy to the hosted server. The proxy answers one tool by itself, unbrowse_local_mcps, which lists the MCP servers in this machine's agent configs. The tool list the repository ships at v12.5.0 (skill/references/tools.json) holds 26 hosted tools, including plain `search` and `fetch` tools for ChatGPT-style connectors, so the proxy offers 27.

The README now opens with `npx -y unbrowse setup`, which writes skills and an always-use rule into every agent it finds and registers the proxy with Claude Code and Codex. That command is on the main branch only. The published CLI's cli.ts at v12.5.0 has no setup command, so until the next release the skill installer (`npx skills add unbrowse-ai/unbrowse --skill unbrowse`) and `unbrowse mcp add` do that work.

What it needs

To run it yourselfNode.js 18.17+
Runs onmacOS, Windows, Linux
UnbrowseFree tierEvery call needs an account (OAuth or API key). A monthly free allowance, then paid credit packs at $0.001 per verified call

Sign in through your client's OAuth window for the hosted endpoint. Node is only needed for the local proxy, which uses the CLI's sign-in: run `npx -y unbrowse login` once, or set UNBROWSE_API_KEY to a key from unbrowse.ai/app. Codex also needs `codex mcp login unbrowse` after adding the server. On Grok Business and Enterprise an admin has to add the connector before users can.

Limits

  • Not covered The npm package is only a client and proxy: learning, replay, the cloud browser and the password manager run on Unbrowse's hosted service
  • Cost Verified calls are metered in credits (1 credit = $0.001) after the monthly free allowance. Failed, refused and input_required runs are not billed
  • Limit With no matching capability, a task has to be done once in the cloud browser or from HAR files before it can be replayed. How well learning works varies by site
  • Early release `npx -y unbrowse setup`, the README's main install line, is not in the published v12.5.0 CLI (cli.ts has no setup command). It exists only on the main branch so far
  • Not covered The proxy's --from-here (UNBROWSE_EGRESS=client) covers unbrowse_run only. Every other tool goes through the hosted server, and `select` is not applied locally
  • Limit A --from-here run goes out signed out. A run that needs a kept site sign-in is sent through Unbrowse instead
  • Limit Without an interactive terminal (no TTY or CI set), CLI commands that need an account exit with code 3 and `login` falls back to a device code to approve elsewhere
  • Size cap unbrowse_index_status and unbrowse_credentials_status wait 20 seconds by default and 50 at most. Proxy results from --from-here runs are cut at 40,000 characters

The work runs on Unbrowse's hosted service; the npm package is only a client and proxy. How well learning works depends on the site. Run unbrowse_run with no matching capability and the agent has to browse the site once first. The proxy's --from-here mode covers only unbrowse_run; every other tool still goes through the hosted server, and `select` is not applied locally. In a shell with no terminal and no credentials, the CLI exits with code 3 instead of signing in. The OAuth link from `login --no-open` returns to 127.0.0.1, so it has to be opened on the same machine. unbrowse_index_status waits 20 seconds by default and 50 at most.

Who it suits

Suits agents that repeat tasks on the same websites, such as searches, listings and prices, where replaying a site's own API calls is cheaper than rendering pages each time, and teams willing to send that traffic and their saved logins through a paid hosted service. If you want a browser running entirely on your own machine with no account, pick a local browser automation server instead. For one site at a time, the same vendor's per-site servers (unbrowse-ai/sites) expose a single site's tools.

Tools 27

13 only read, 13 change things, 1 can delete or overwrite. A ? marks an optional parameter.

unbrowse_run changes
Start a run from a capability id or a plain-language task, with its inputscapability?: stringtask?: stringtargetUrl?: stringinput?: objectaccountRefs?: arrayallowedDestinations?: arrayinteractionMode?: enumidempotencyKey?: stringselect?: arraydeadlineMs?: integer
unbrowse_inspect
Get a run's status, open questions, verified result and known effectsrunId: stringselect?: array
unbrowse_resume changes
Answer what a run asked for and carry on with the same runrunId: stringanswers?: objectexpectedStateRevision?: numberidempotencyKey?: stringselect?: arrayresponses?: array
unbrowse_cancel changes
Stop a run from sending any more requestsrunId: string
unbrowse_discover
Search your own capabilities, then the public registry, for one that fits a taskquery: stringminVersion?: string
unbrowse_sites
Show what the workspace knows per site: access, kept session, saved login, learned tools, bot checkssite?: string
unbrowse_learn changes
Compile two or more browser traces or HAR files into a one-call capabilitytraces?: arrayhar?: anygoal?: stringtitle?: string
unbrowse_forget deletes
Delete one of your learned capabilities, or unpin a public onecapability: string
unbrowse_browse_open changes
Open a page in the recorded cloud browser, optionally from a chosen countryurl: stringtask?: stringcountry?: string
unbrowse_browse_snapshot
Capture the current cloud browser page with element refssessionId: stringtextOffset?: integer
unbrowse_browse_act changes
Click, fill, select, check, press, wait or autofill a login from the password managersessionId: stringaction: enumref?: stringvalue?: stringname?: stringvault?: enumcredential?: stringkey?: stringms?: number
unbrowse_browse_finish changes
End a recorded session and have it compiled into a capabilitysessionId: stringtitle?: stringgoal?: string
unbrowse_browse_close changes
Close a cloud browser session, still indexed unless discard is setsessionId: stringdiscard?: boolean
unbrowse_scrape
Read one page, document or JSON API URL as markdown, rendering it when neededurl: stringformats?: arrayonlyMainContent?: booleanrender?: enumcountry?: stringheaders?: objectdeadlineMs?: number
unbrowse_map
List a site's own URLs from its sitemaps and page linksurl: stringsearch?: stringlimit?: number
unbrowse_index changes
Have Unbrowse explore a site in the background and compile its read-only flows into toolsurl: stringfocus?: stringmaxCapabilities?: numberpublic?: boolean
unbrowse_index_status
Check an index job's progress and tools, or list recent jobsjobId?: stringwaitSeconds?: number
unbrowse_credentials_list
List saved logins with masked hintsorigin?: stringquery?: stringlimit?: numbercursor?: string
unbrowse_credentials_request changes
Get a one-time link where the person saves a login for a siteorigin: stringfields?: arrayreason?: string
unbrowse_credentials_status
Check, or wait for, whether a requested login has been savedrequestId: stringwaitSeconds?: number
unbrowse_connect changes
Find, connect or disconnect another app's MCP server or any remote MCP by URLapp?: stringurl?: stringname?: stringsearch?: stringdisconnect?: boolean
unbrowse_import_mcps changes
Bring MCP servers the agent already has into Unbrowse, without their keysservers: arraydryRun?: boolean
unbrowse_credits
Show free and paid credit balances and history, or a checkout link for a packpack?: enum
unbrowse_usage
Report this month's verified calls, rendered runs, passthrough cost and remaining quota
search
Search Unbrowse's site tools and pages for a query, returning ids to read with fetchquery: string
fetch
Read one search result in full: a page's main text or a tool's inputsid: string
unbrowse_local_mcps changes
Local proxy only: list MCP servers in this machine's agent configs, optionally importing themimport?: booleandryRun?: booleannames?: array

Similar servers