AginxBrowser

Servidor de navegador agente-first: um único binário Rust com V8, sem Chromium. 14 ferramentas MCP (fetch/search/click/screenshot/download + sessões persistentes), impressões digitais TLS furtivas.

Documentação

AginxBrowser

O navegador para Agentes de IA. Veja a web ao vivo. Interaja com ela.

skills.sh License MCP Hosted

English | 中文文档

Um navegador construído para agentes desde a primeira linha de código — não um navegador humano adaptado para automação. Veja o mundo, leia-o, pesquise-o e aja sobre ele: um único binário Rust com V8 embutido, sem necessidade de Chromium.

Humanos têm Chrome. Agentes têm AginxBrowser.

Um binário, zero dependências, serviço instantâneo. API HTTP + MCP nativo — agentes conectam e funcionam.

Páginas reais renderizadas pelo mecanismo diting do AginxBrowser (sem Chromium) — Wikipedia, este repositório, Rust. Tire um screenshot você mesmo →

AginxBrowser rendering real pages

Por que Agentes Precisam de Seu Próprio Navegador

Medido contra Chrome headless nas mesmas 20 páginas, mesma rede (benchmark, 2026-08-28): 7,6× mais rápido para texto utilizável por agente (p50 532 ms vs 4 053 ms), ~10× menos memória (227 MB para o processo inteiro vs ~2,1 GB por página do Chrome) e 0 falhas graves onde o --dump-dom do Chrome não produziu DOM em 5 de 40 carregamentos. O custo total de um agente é eficiência do navegador × eficiência do modelo — esta é a metade do navegador.

A "automação de navegador" existente foi construída para humanos ou para raspagem de uma única execução — não para agentes:

AginxBrowserPuppeteer/PlaywrightFirecrawlBrowser-use
Projetado paraAgentes primeiroDepuração humanaServiço de raspagemWrapper de LLM
DependênciasBinário único, sem ChromiumChromium ~500MBDocker ~1GBChromium
Vê (screenshots)✅ mecanismo de renderização diting embutidoPrecisa de ChromiumPrecisa de Chromium
markdown + js_extractFaça você mesmomarkdownFaça você mesmo
Encontra (busca)✅ meta-busca de 5 mecanismos
Ageinteração de sessão indexadaAPI DevToolsDirigido por LLM
ProtocoloHTTP + MCP nativoAPI NodeHTTPPython
Impressões digitais TLS✅ Chrome/Firefox/SafariPlugin necessário
Resolução de CAPTCHA✅ automáticaFaça você mesmo
Sessões interativas✅ persistentes

Um agente precisa de cinco coisas de um navegador: ver, ler, encontrar, agir, implantar. Um único binário cobre todas — amigável ao systemd, nativo MCP para Claude/Cursor, zero dependências.

Vantagem principal: sem Chromium. O AginxBrowser incorpora um mecanismo de navegador completo (V8 + pilha HTTP Rust + nosso próprio mecanismo de renderização CSS/layout/pintura diting, com a linhagem Blitz/Stylo/Taffy como implementação de referência). Sem Puppeteer, sem Chrome, sem Docker. Um binário Rust sob systemd é sua infraestrutura de navegação para agentes.

Três Coisas que Renderizadores Sem Estado Não Conseguem Fazer

A maioria dos novos "navegadores para agentes" são renderizadores de uma única execução, sem estado e sem impressão digital — bons para páginas públicas, mortos à chegada contra Cloudflare ou fluxos de login. O AginxBrowser vai na direção oposta:

  • 🔐 Impressões digitais TLS reais — o modo furtivo replica os handshakes TLS completos do Chrome145 / Firefox133 / Safari / Edge via BoringSSL (não apenas uma string de UA), alternável por requisição; desafios Cloudflare Turnstile aguardam automaticamente por cf_clearance. Mecanismos sem impressão digital recebem 403s — nós passamos.
  • 🤝 Sessões interativas com estado — sessões persistentes (keep-alive de 8 minutos ocioso), estado de login injetável e exportável (session_create(cookies=...)session_cookies), sobrevivendo à paginação e fluxos de múltiplas etapas. Mecanismos de uma única execução descartam o estado.
  • 🔌 MCP nativo — 15 ferramentas como cidadãos de primeira classe (não um shim de CDP). Claude Code / Cursor / Claude Desktop conectam em uma linha. Protocolo duplo HTTP + MCP.

Ponto de referência: o Kitesurf da Cloudflare explicitamente não oferece negociação de impressão digital TLS real nem sessões de autenticação persistentes — território anti-bot e de login é exatamente onde o AginxBrowser atua.

Código aberto Apache-2.0, binário único — auto-hospedado hoje, sem dependência de nuvem.

Capacidades

  • Renderização em camadas: páginas estáticas via HTTP simples (~100ms); V8 inicia apenas quando a renderização JS é necessária (~1-2s) — 90% do conjunto de páginas do benchmark servido sem iniciar o V8; cada resposta informa qual camada a serviu (campo tier)
  • Meta-busca multi-mecanismo: web geral (Baidu / Bing / Sogou / WeChat / Google), notícias (Bing News), código (Stack Overflow, GitHub), pacotes (npm, PyPI), acadêmico (arXiv), modelos de IA (Hugging Face) — consultados simultaneamente, mesclados e deduplicados. Operadores podem conectar um índice Meilisearch privado ao mesmo /search. Busca → leitura em uma única etapa
  • Busca de imagens: categories=images acessa os índices de imagens do Baidu/Bing e retorna links binários diretos de image_url (baixáveis diretamente para jpg/png) além de proveniência source_url
  • Sessões interativas: sessões de navegador persistentes com interação indexada (state/click/input/scroll/eval) — agentes navegam como humanos
  • Resolução automática de CAPTCHA: detecção de tipo com integração opcional com 2captcha — a busca nunca para em páginas de verificação
  • Extração de dados JS: js_extract extrai window.__INITIAL_STATE__ e outros dados estruturados de SPAs
  • Renderização de screenshots: endpoint /screenshot (opt-in --features screenshot) pinta o DOM renderizado por JS com nosso próprio mecanismo de renderização diting — CPU pura, sem Chromium — para PNG. Entrada visual para agentes
  • Espera automática Cloudflare: detecta páginas de desafio "Just a moment..." e aguarda cf_clearance
  • Spoofing de impressão digital TLS: o modo furtivo imita Chrome145/Firefox133/Safari/Edge, alternável por requisição
  • Servidor MCP: o modo --mcp expõe 15 ferramentas (fetch/eval/click/search/download + 10 ferramentas de sessão) — Claude Code / Claude Desktop / Cursor as chamam diretamente
  • Compatível com Firecrawl: endpoint /v1/scrape — clientes Firecrawl existentes migram alterando a URL base
  • Proteção contra rebinding de DNS: guarda SSRF embutida + validação de IP pós-resolução

Para Que Serve

Não demonstrações — trabalhos reais que navegadores para agentes fazem hoje:

  • Atravessar consoles administrativos — AWS / App Store Connect / Google Play, dezenas de camadas de menu por tarefa. Deixe o agente clicar; ele volta apenas quando autorização é necessária.
  • Ações em lote atrás de login — preencher carrinhos, vasculhar histórico de pedidos, verificar páginas que só renderizam logado. Injetar cookies, operar, exportar para reutilização.
  • Atravessar muros anti-bot — proteção Cloudflare, desafios Turnstile, verificações de impressão digital TLS. O modo furtivo avança em vez de recuar no 403.
  • A internet chinesa — meta-busca Baidu / Sogou / WeChat em 5 mecanismos, renderização correta de páginas chinesas. Não apenas web em inglês.
  • Scripts no momento — o agente lê a página, escreve JS, executa: tabelas de comparação destacadas, conteúdo refluído, filtros de produto em parâmetros ocultos. GreaseMonkey turbinado.
  • Visão multimodal — screenshots como entrada visual para fluxos de olhar-e-julgar: escolher assentos, reconhecer layouts, verificar renderização.

Início Rápido

Experimente a instância hospedada primeiro: https://browser.aginx.net/

Instalação completa em um comando (superfície de gatilho SKILL.md + ferramentas MCP + verificação):

# Download -> inspect the contents -> run only after review (never blind-run network scripts)
curl -fsSL https://raw.githubusercontent.com/yinnho/aginxbrowser/main/skill.sh -o skill.sh
less skill.sh
bash skill.sh

Registrar apenas MCP:

claude mcp add aginxbrowser --transport http https://browser.aginx.net/mcp

Instalar a superfície de gatilho da skill via skills.sh:

npx skills add yinnho/aginxbrowser

Auto-hospedagem:

# macOS / Linux via Homebrew
brew install yinnho/aginxbrowser/aginxbrowser
aginxbrowser doctor   # features + fonts + egress self-check

# Docker (Docker Hub, mirrored on GHCR)
docker run -p 8089:8089 yinnho/aginxbrowser:latest
# (or ghcr.io/yinnho/aginxbrowser:latest)

# Or the prebuilt binary (platform detect + sha256 + mirror fallback + doctor self-check)
# Cautious: download -> inspect -> run (never blind-run network scripts)
curl -fsSL https://browser.aginx.net/install.sh -o install.sh
less install.sh && bash install.sh
# Or straight in, if you trust the repo:
#   curl -fsSL https://browser.aginx.net/install.sh | sh
# GitHub slow/blocked? AGINXBROWSER_GH_PROXY=https://ghfast.top/ bash install.sh
aginxbrowser doctor   # features + fonts + egress self-check

# Or build from source (--features stealth,screenshot or you lose both)
cargo build --release --features stealth,screenshot

# Start the service
./target/release/aginxbrowser
# → Listening on 0.0.0.0:8089

# Verify
curl http://127.0.0.1:8089/health
# → {"status":"ok","engine":"diting"}

# Fetch a page
curl -sS -X POST http://127.0.0.1:8089/fetch \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}'

# Search
curl -sS -X POST http://127.0.0.1:8089/search \
  -H "Content-Type: application/json" \
  -d '{"q":"macbook price","max_results":5}'

# Create an interactive session
curl -sS -X POST http://127.0.0.1:8089/session/create \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}'
# → {"session_id":"s_1","url":"https://example.com/"}

# MCP mode (for AI agents)
./target/release/aginxbrowser --mcp

Estrutura do Projeto

aginxbrowser/
├── Cargo.toml
├── build.rs              # V8 snapshot generation
├── js/
│   └── bootstrap.js      # V8 bootstrap script
├── README.md
├── docs/
│   └── API.md            # Full API reference (HTTP + MCP)
├── bench/                # Benchmark harness + results (vs headless Chrome)
│   ├── README.md         #   methodology + numbers
│   ├── pages.txt         #   fixed 20-page set
│   ├── run.py            #   harness
│   ├── summarize.py      #   TSV → results table
│   └── results/          #   raw run data
└── src/
    ├── main.rs              # HTTP service entry & routing
    ├── server.rs            # Business layer (fetch/click/eval/search)
    ├── session.rs           # Interactive browser sessions
    ├── captcha.rs           # CAPTCHA detection & auto-solve
    ├── render.rs            # Tiered rendering (HTTP direct → diting browser engine)
    ├── mcp.rs               # MCP server (15 tools)
    ├── firecrawl_compat.rs  # Firecrawl-compatible /v1/scrape endpoint
    ├── browser.rs           # Top-level API: Browser, BrowserBuilder
    ├── page.rs              # Top-level API: Page, Element
    ├── config.rs            # BrowserConfig
    ├── cookie.rs            # CookieStore
    ├── error.rs             # Error types
    ├── search/              # Native search engines
    │   ├── mod.rs           #   SearchEngine trait, Registry, merge/dedupe, progressive backoff
    │   ├── baidu.rs         #   Baidu (JSON API, wreq stealth)
    │   ├── bing.rs          #   Bing (HTML parsing, plain reqwest)
    │   ├── sogou.rs         #   Sogou web (HTML parsing, plain reqwest)
    │   ├── sogou_wechat.rs  #   Sogou WeChat (HTML parsing + /link resolution)
    │   ├── google.rs        #   Google (HTML parsing, wreq stealth + proxy)
    │   ├── stackexchange.rs #   Stack Overflow (SE API v2.3, code category)
    │   ├── github_repos.rs  #   GitHub repos (api.github.com, code category)
    │   ├── arxiv.rs         #   arXiv (Atom API, academic category)
    │   ├── bing_news.rs     #   Bing News RSS (news category; proxy-first)
    │   ├── huggingface.rs   #   HF Hub models/datasets/spaces (ai category)
    │   ├── npm.rs           #   npm packages (npms.io API, packages category)
    │   ├── pypi.rs          #   PyPI name resolution (JSON API, packages)
    │   └── meilisearch.rs   #   Private-index adapter (env-configured)
    │
    ├── diting_dom/          # HTML parsing, DOM tree, CSS selectors
    ├── diting_net/          # HTTP client, cookies, encoding, proxies
    ├── diting_js/           # V8 runtime, JS ops, module loading
    └── diting_browser/      # Page navigation, lifecycle, browser context

Build

# Standard build (no stealth; TLS fingerprint features inactive)
cargo build --release

# With stealth (requires go + cmake + C++ toolchain; enables TLS fingerprint spoofing)
cargo build --release --features stealth

# With screenshot rendering (enables /screenshot; adds the rendering stack, +30-40MB)
cargo build --release --features screenshot

# Full featured (recommended for production)
cargo build --release --features stealth,screenshot

Requisitos: Rust 1.78+; a biblioteca estática V8 é baixada automaticamente no primeiro build. O recurso furtivo adicionalmente precisa de go, cmake e um compilador C++. O recurso de screenshot acompanha um subconjunto de fontes CJK empacotado (GB2312 + símbolos comuns) — sem necessidade de fontes do sistema para renderização correta de chinês.

Variáveis de Ambiente em Tempo de Execução

VariávelPadrãoDescrição
AGINXBROWSER_BIND0.0.0.0:8089Endereço de escuta
AGINXBROWSER_STEALTHhabilitado0 desabilita o modo furtivo (para diagnósticos)
AGINXBROWSER_UALinux Chrome145User-Agent falsificado
AGINXBROWSER_ACCEPT_LANGUAGEzh-CN,zh;q=0.9,en;q=0.8Cabeçalho Accept-Language
AGINXBROWSER_PROXYnenhumProxy de fallback opcional. Mecanismos com fonte bloqueada (Google, Bing News, Hugging Face) conectam diretamente primeiro e caem para este proxy apenas quando a tentativa direta falha — implantações no exterior não precisam de proxy algum; use_proxy:true por requisição também roteia fetch/search através dele
AGINXBROWSER_CACHE_TTL_SECS600TTL do cache /fetch, 0 desabilita
AGINXBROWSER_IGNORE_ROBOTSnão definidorobots.txt é respeitado por padrão em /fetch, /screenshot, /download e ferramentas MCP; defina 1 para pular verificações (opt-out do operador)
AGINXBROWSER_ROBOTS_TTL_SECS3600TTL do cache de política robots.txt por host
AGINXBROWSER_MCP_ALLOWED_HOSTSnão definidoValores extras de Host aceitos por /mcp (separados por vírgula) — o guarda de rebinding de DNS do transporte usa loopback por padrão, então adicione seu IP de LAN ou hostname Docker quando outras máquinas chamarem a instância
CAPTCHA_SOLVER_API_KEYnenhumChave de API 2captcha; habilita resolução automática de CAPTCHA
CAPTCHA_SOLVER_SERVICE2captchaProvedor de resolução de CAPTCHA
AGINXBROWSER_MEILI_URLnenhumURL base do Meilisearch; defina para habilitar o mecanismo de índice privado
AGINXBROWSER_MEILI_INDEXnenhumUID do índice Meilisearch a consultar
AGINXBROWSER_MEILI_KEYnenhumChave Bearer opcional para a instância Meilisearch

Documentação da API

Referência completa da APIdocs/API.md Notas de auditoria de segurançadocs/skills-sh-audit.md — por que skills.sh mostra "Risco Crítico" e a qual recurso real do produto cada aviso corresponde

Cobre:

  • Todos os endpoints HTTP (/fetch, /click, /eval, /search, /v1/scrape, 9 endpoints de sessão)
  • Todas as 15 ferramentas do servidor MCP e seus parâmetros
  • Configuração de clientes Claude Code / Claude Desktop / Cursor
  • Variáveis de ambiente, códigos de erro, exemplos de raspagem por site

Integração com Outros Sistemas

AginxBrowser é infraestrutura puramente anexável — como um navegador real, ele roda como um serviço independente que qualquer coisa pode chamar, sem incorporar código do host ou poluir a configuração do host. Implante uma instância por máquina (sob systemd) e todo aplicativo que precise de capacidade "renderizar + raspar" a compartilha.

Integração: leia a variável de ambiente AGINXBROWSER_URL=http://127.0.0.1:8089. Não definida → comportamento inalterado; definida → sites com risco controlado roteiam automaticamente através do AginxBrowser para renderização, com fallback gracioso em caso de falha.

Limitações Conhecidas

  1. Screenshots são opt-in: /screenshot requer cargo build --release --features screenshot (adiciona a pilha de renderização, +30-40MB). O mecanismo de renderização padrão é diting (nossa própria pilha CSS+layout+pintura); passe engine: "blitz" para optar de volta ao pipeline de referência Blitz. O CSS de sites complexos é aproximado em ambos (não pixel-perfect como Chromium)
  2. Coordenadas de elementos suportadas (nível de bloco): /screenshot com selector retorna coordenadas de página do elemento (selector_rects, px CSS); selector sozinho recorta diretamente para esse elemento. Elementos inline puros (<a>text</a>) não têm caixa independente — escolha um ancestral de bloco
  3. Interação JS funciona amplamente; páginas com impressão digital pesada podem ainda falhar: delegação de eventos React/Vue funciona normalmente (atributos de reflexão de URL como src/href resolvem para URLs absolutas para que Next.js/webpack hidratem e cliques disparem handlers). Páginas de autenticação com impressão digital pesada (WorkOS/Cloudflare) que sondam navigator.plugins, canvas WebGL etc. podem ainda quebrar até a cobertura de impressão digital furtiva ser concluída
  4. Suporte a proxy: HTTP/HTTPS/SOCKS5 via AGINXBROWSER_PROXY
  5. Sites com risco controlado difícil: Baidu Wenku não suportado; artigos Zhihu precisam de um __zse_ck válido

Licença

Consistente com o projeto principal OpenCarrier. Apache-2.0.