unbrowser by Unchained
Navegador MCP leve para agentes LLM: sem Chrome, BlockMaps de baixo token, sessões com estado, execução de JavaScript, formulários, cookies e dicas de escalonamento.
Documentação
unbrowser
O passe de navegador barato para agentes. Um único binário nativo. Sem Chrome.
Identidade oficial do Registro MCP: mcp-name: io.github.protostatis/unbrowser
unbrowser é um runtime web sem interface visual e com estado, projetado para agentes. Ele fica entre curl/WebFetch e um navegador real: mantém cookies e estado do DOM, retorna referências de elementos consultáveis, lida com links e formulários HTML, detecta sinais de desafios e SPAs, e pode executar scripts QuickJS limitados quando o HTML estático não é suficiente.
O
navigatepadrão é uma passagem rápida estática/SSR. Definaexec_scripts: trueapenas quando precisar de execução QuickJS limitada. SPAs pesados, pixels, fidelidade V8, extensões e desafios interativos anti-bot pertencem a um nível real de Chrome.
Experimente a demo pública ao vivo na web antes de instalar. Ela aceita apenas os conjuntos fixos de fontes públicas mostrados na página; não envie dados privados, cookies ou tarefas autenticadas por ela. Um endpoint MCP compartilhado via Streamable HTTP está disponível em https://unchainedsky.com/unbrowser-mcp para testes públicos de fumaça; sessões de produção devem usar uma instalação local.
Use unbrowser apenas em sites, contas e dados aos quais você tem permissão de acesso.
A detecção de desafios e a importação de cookies não concedem permissão para contornar
controles de acesso ou termos do site. Trate cookies de sessão como credenciais: mantenha-os locais,
escopados à tarefa autorizada, e nunca os envie para a demo pública.
Escolha o nível certo
| Necessidade | curl / WebFetch | unbrowser | Chrome real |
|---|---|---|---|
| HTML estático / SSR | resposta bruta | BlockMap estruturado + consultas de DOM | navegador completo |
| Cookies, links, formulários HTML | faça você mesmo | integrado | integrado |
| Scripts de página no lado do cliente | ❌ | QuickJS limitado, opt-in | V8 |
| Pixels, Canvas, WebGL, Workers, extensões | ❌ | ❌ | ✅ |
| Saída orientada a agentes | parsing manual | referências de elementos, sinais de página, extração estruturada | CDP / parsing de DOM manual |
| Desafio de acesso interativo | ❌ | detectar + parar ou escalar | navegador autorizado / confirmação humana |
Use unbrowser quando HTTP sozinho for limitado demais e um navegador completo for caro demais. Quando a página precisar de Chrome, a saída instrui o agente a escalar em vez de fingir uma compatibilidade que não existe.
Início rápido
Docker — Linux amd64/arm64, pull de ~13 MiB
docker pull ghcr.io/protostatis/unbrowser:latest
# One-shot navigation
docker run --rm ghcr.io/protostatis/unbrowser:latest \
navigate https://example.com --json
# Default mode: MCP over stdio
docker run --rm -i ghcr.io/protostatis/unbrowser:latest
A imagem é distroless e roda como não-root: sem shell, gerenciador de pacotes ou estado persistente. Fixe :vX.Y.Z ou um digest de imagem em produção.
Python
pipx install pyunbrowser # recommended on macOS / modern Linux
# or, inside a Python 3.10+ virtual environment:
pip install pyunbrowser
from unbrowser import Client
with Client() as ub:
ub.navigate("https://news.ycombinator.com")
for link in ub.query(".titleline > a")[:3]:
print(link["text"], link["attrs"]["href"])
No macOS, /usr/bin/python3 é 3.9 e não consegue instalar a wheel; use pipx ou um Python do Homebrew. A distribuição no PyPI é pyunbrowser, enquanto o import e o executável permanecem como unbrowser.
MCP
{
"mcpServers": {
"unbrowser": {
"command": "unbrowser",
"args": ["--mcp"]
}
}
}
Superfície mínima: adicione "--mcp-profile", "minimal" para expor apenas navigate/query/extract/help e deixe o agente descobrir o restante via help(topic). O wrapper Python inclui um servidor inteligente de 3 ferramentas (search/open/help) como o script de console unbrowser-smart.
Configuração MCP do Docker
{
"mcpServers": {
"unbrowser": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"ghcr.io/protostatis/unbrowser:latest"
]
}
}
}
Consulte a referência de instalação e interface para Cargo, arquivos de release, builds a partir do código-fonte, sessões de shell persistentes, JSON-RPC bruto e todas as opções de MCP.
O que um agente recebe
navigateretorna um BlockMap: título da página, landmarks, cabeçalhos, elementos interativos, sinais de densidade e um esboço ASCII. Seu tamanho depende da página; é estruturado para planejamento, não uma promessa de tokens fixos.- Referências de elementos estáveis (
e:142): consulte um elemento uma vez e depois useclick,typeousubmitsem reanalisar o HTML. - Cookies e formulários com estado: jar de cookies, envio de formulários GET e POST codificado em URL, links e redirecionamentos persistem dentro de uma sessão.
- Sinais de página e desafios:
density.likely_js_filled,thin_shellechallenge.providerinformam ao agente se deve executar scripts, inspecionar dados embutidos, parar ou escalar para uma sessão de navegador autorizada. - Auxílios de roteamento em cada resultado:
micro_hint(o próximo passo concreto único),next_tools(candidatos ranqueados),avoid(ferramentas sem nada para agir) e uma taxonomia estávelescalation(challenge,thin_shell,partial_result, …) com retryable/severidade/evidência — as recomendações nunca contradizemavoid. - Auxiliares estruturados: descoberta de rotas, extração de cards, normalização de tabelas,
text_maine depuração de seletores cobrem fluxos comuns de extração.
Modo de script e escalada
{"id":1,"method":"navigate","params":{"url":"https://example.com","exec_scripts":true}}
Com exec_scripts: true, scripts inline e externos são executados em QuickJS sob um watchdog limitado. Isso pode materializar hidratação leve e dados visíveis via fetch; não é V8 nem um motor de renderização. Aplicações React/Vue/Ember pesadas ainda podem deixar um shell vazio.
Escale para unchainedsky-cli ou Unchained quando uma tarefa permitida precisar de pixels reais, Canvas/WebGL, Workers, extensões de navegador, compatibilidade V8, um perfil autenticado ou confirmação humana. Quando o usuário já tiver uma sessão autorizada no Chrome, cookies_set pode importar o cookie de sessão necessário localmente até expirar; isso não é uma licença para contornar os controles de um site.
Documentação
| Necessidade | Leia |
|---|---|
| Caminhos de instalação, CLI de sessão, CLI de uso único, RPC bruto, MCP, shims, tabela RPC completa | Referência de uso |
| Compatibilidade de scripts, sinais de SPA, tratamento de desafios, handoff autorizado de cookies, escalada | Compatibilidade e escalada |
| Distribuição e listagens de diretórios suportadas | Notas de distribuição |
| Compilar o binário nativo | Instruções de build |
Licença
Apache-2.0 — veja LICENSE.