unbrowse
unbrowse-ai/unbrowseCapture once, replay everywhere — Unbrowse turns websites into reusable API routes for agents. Resolve an intent + URL to a ranked endpoint shortlist, execute the chosen one for real data, or open a managed browser when capture is needed. Available as an MCP server, CLI, and SDK.
SKILL.md
name: unbrowse description: Capture once, replay everywhere — Unbrowse turns websites into reusable API routes for agents. Resolve an intent + URL to a ranked endpoint shortlist, execute the chosen one for real data, or open a managed browser when capture is needed. Available as an MCP server, CLI, and SDK. metadata: type: integration origin: unbrowse-ai/unbrowse
Unbrowse
Unbrowse turns websites into reusable API routes for agents. Teach a route once, store sanitized metadata, replay it on later calls — typically 30× faster and 90× cheaper than a fresh browser session (peer-reviewed benchmark across 94 live domains: 3.6× mean speedup, 40× fewer tokens — arXiv:2604.00694).
This skill installs the instructions. The runtime (CLI binary + MCP server) comes from the unbrowse npm package — get it with npx -y unbrowse.
Surfaces
| Surface | Reach for it when |
|---|---|
| MCP server | An MCP-host agent (Claude Code, Claude Desktop, Cursor, Codex, Windsurf). Tools like unbrowse_resolve, unbrowse_execute, unbrowse_go appear in the host. |
CLI (unbrowse) |
A shell or script that wants the same surface without an MCP host. |
SDK (unbrowse/sdk) |
A TypeScript program embedding Unbrowse; the SDK spawns its own local binary. |
The workflow
Two tools, never one and never three:
- resolve — "is there an indexed route for this intent + URL?" Returns a ranked shortlist, or a hard handoff to a browser session.
- execute — pick one endpoint from the shortlist and run it. Returns the real data.
- browse-session — when the API is too dynamic to predict, open a managed browser; local capture indexes the route metadata for next time.
Quickstart
Wire the MCP server into an MCP host:
{
"mcpServers": {
"unbrowse": {
"command": "npx",
"args": ["-y", "unbrowse", "mcp"]
}
}
}
Then once:
npx unbrowse setup
From a shell:
unbrowse resolve --intent "search hacker news for openai" --url https://news.ycombinator.com
unbrowse execute --skill-id <id-from-resolve> --endpoint-id <id-from-shortlist>
From Node:
npm i unbrowse
import { Unbrowse } from 'unbrowse/sdk';
const client = new Unbrowse({ apiKey: process.env.UNBROWSE_API_KEY });
const resolved = await client.resolve({ intent: 'search hn for openai', url: 'https://news.ycombinator.com' });
const result = await client.execute({ endpoint_id: resolved.available_operations![0].endpoint_id, params: { q: 'agents' } });
Passive parallel indexing
While you browse, Unbrowse reverse-engineers the page's API traffic and indexes
it to publish — in the background, in parallel, so browsing stays fast. This is
on by default; each sync checkpoint returns immediately instead of blocking
on the page's network settle. Opt out per machine to index inline (slower
checkpoints, complete endpoints before each returns):
unbrowse settings --passive-index off # opt out; back on with: --passive-index on
Agents can toggle the same flag via the unbrowse_settings tool
(passive_index: true|false).