AginxBrowser
Servidor de navegador centrado en agentes: un solo binario de Rust con V8, sin Chromium. 14 herramientas MCP (fetch/search/click/screenshot/download + sesiones persistentes), huellas TLS sigilosas.
Documentación
AginxBrowser
El navegador para agentes de IA. Ve la web en vivo. Interactúa con ella.
Un navegador construido para agentes desde la primera línea de código — no un navegador humano adaptado a la automatización. Ve el mundo, léelo, búscalo y actúa sobre él: un solo binario de Rust con V8 integrado, sin necesidad de Chromium.
Los humanos tienen Chrome. Los agentes tienen AginxBrowser.
Un binario, cero dependencias, servicio instantáneo. API HTTP + MCP nativo — los agentes se conectan y listo.
Páginas reales renderizadas por el motor diting de AginxBrowser (sin Chromium) — Wikipedia, este repositorio, Rust. Toma una captura tú mismo →

Por Qué los Agentes Necesitan Su Propio Navegador
Medido contra Chrome sin interfaz en las mismas 20 páginas, misma red (benchmark, 2026-08-28): 7,6× más rápido para texto utilizable por agentes (p50 532 ms vs 4 053 ms), ~10× menos memoria (227 MB para todo el proceso vs ~2,1 GB por página de Chrome), y 0 fallos graves donde el --dump-dom de Chrome no produjo DOM en 5 de 40 cargas. El costo total de un agente es eficiencia del navegador × eficiencia del modelo — esta es la mitad del navegador.
La "automatización de navegadores" existente fue construida para humanos o para scraping de una sola vez — no para agentes:
| AginxBrowser | Puppeteer/Playwright | Firecrawl | Browser-use | |
|---|---|---|---|---|
| Diseñado para | Agentes primero | Depuración humana | Servicio de scraping | Envoltorio LLM |
| Dependencias | Binario único, sin Chromium | Chromium ~500MB | Docker ~1GB | Chromium |
| Ve (capturas) | ✅ motor de renderizado diting integrado | Necesita Chromium | ❌ | Necesita Chromium |
| Lee | markdown + js_extract | Hazlo tú mismo | markdown | Hazlo tú mismo |
| Encuentra (búsqueda) | ✅ metabúsqueda de 6 motores | ❌ | ❌ | ❌ |
| Actúa | interacción de sesión indexada | API DevTools | ❌ | Impulsado por LLM |
| Protocolo | HTTP + MCP nativo | API Node | HTTP | Python |
| Huellas TLS | ✅ Chrome/Firefox/Safari | Plugin requerido | ❌ | ❌ |
| Resolución de CAPTCHA | ✅ automática | Hazlo tú mismo | ❌ | ❌ |
| Sesiones interactivas | ✅ persistentes | ✅ | ❌ | ✅ |
Un agente necesita cinco cosas de un navegador: ver, leer, encontrar, actuar, desplegar. Un solo binario lo cubre todo — compatible con systemd, nativo MCP para Claude/Cursor, cero dependencias.
Ventaja principal: sin Chromium. AginxBrowser incluye un motor de navegador completo (V8 + pila HTTP de Rust + nuestro propio motor de renderizado CSS/diseño/pintura diting, con el linaje Blitz/Stylo/Taffy como implementación de referencia). Sin Puppeteer, sin Chrome, sin Docker. Un binario de Rust bajo systemd es tu infraestructura de navegación para agentes.
Tres Cosas Que los Renderizadores Sin Estado No Pueden Hacer
La mayoría de los "navegadores para agentes" nuevos son renderizadores de una sola vez, sin estado y sin huellas — bien para páginas públicas, muertos al llegar contra Cloudflare o flujos de inicio de sesión. AginxBrowser va en la dirección opuesta:
- 🔐 Huellas TLS reales — el modo sigiloso replica los apretones de manos TLS completos de Chrome145 / Firefox133 / Safari / Edge mediante BoringSSL (no solo una cadena UA), conmutable por solicitud; los desafíos de Cloudflare Turnstile esperan automáticamente durante
cf_clearance. Los motores sin huellas reciben 403 — nosotros pasamos. - 🤝 Sesiones interactivas con estado — sesiones persistentes (mantenimiento de 8 minutos en inactividad), estado de inicio de sesión inyectable y exportable (
session_create(cookies=...)↔session_cookies), que sobreviven a la paginación y flujos de varios pasos. Los motores de una sola vez descartan el estado. - 🔌 MCP nativo — 16 herramientas como ciudadanos de primera clase (no un shim de CDP). Claude Code / Cursor / Claude Desktop se conectan en una línea. Protocolo dual HTTP + MCP.
Punto de referencia: Kitesurf de Cloudflare explícitamente no incluye ni negociación real de huellas TLS ni sesiones de autenticación persistentes — el territorio anti-bot y de inicio de sesión es exactamente donde AginxBrowser juega.
Apache-2.0 de código abierto, binario único — autoalójalo hoy, sin dependencia de la nube.
Capacidades
- Renderizado por niveles: páginas estáticas sobre HTTP simple (~100ms); V8 se activa solo cuando se necesita renderizado JS (~1-2s) — el 90% del conjunto de páginas del benchmark se sirve sin activar V8 en absoluto; cada respuesta informa qué nivel la sirvió (campo
tier) - Metabúsqueda multi-motor: web general (Baidu / Bing / Sogou / WeChat / Google / DuckDuckGo), noticias (Bing News), código (Stack Overflow, GitHub), paquetes (npm, PyPI), académico (arXiv), modelos de IA (Hugging Face) — consultados concurrentemente, fusionados y deduplicados. Los operadores pueden conectar un índice Meilisearch privado al mismo
/search. Búsqueda → lectura en un solo paso - Búsqueda de imágenes:
categories=imagesconsulta los índices de imágenes de Baidu/Bing y devuelve enlaces binarios directosimage_url(descargables directamente a jpg/png) además de procedenciasource_url - Sesiones interactivas: sesiones de navegador persistentes con interacción indexada (
state/click/input/scroll/eval) — los agentes navegan como lo hacen los humanos, ysession_exportconvierte lo que un agente descubrió en un script de reproducción curl ejecutable (cero tokens de modelo al re-ejecutar) - Resolución automática de CAPTCHA: detección de tipo con integración opcional de 2captcha — la búsqueda nunca se detiene en páginas de verificación
- Extracción de datos JS:
js_extractextraewindow.__INITIAL_STATE__y otros datos estructurados de SPAs - Renderizado de capturas: endpoint
/screenshot(opt-in--features screenshot) pinta el DOM renderizado por JS con nuestro propio motor de renderizado diting — CPU pura, sin Chromium — a PNG. Entrada visual para agentes - Espera automática de Cloudflare: detecta páginas de desafío "Just a moment..." y espera durante
cf_clearance - Suplantación de huellas TLS: el modo sigiloso imita Chrome145/Firefox133/Safari/Edge, conmutable por solicitud
- Servidor MCP: el modo
--mcpexpone 16 herramientas (fetch/eval/click/search/download + 11 herramientas de sesión) — Claude Code / Claude Desktop / Cursor las llaman directamente - Compatible con Firecrawl: endpoint
/v1/scrape— los clientes existentes de Firecrawl migran cambiando la URL base - Protección contra rebinding de DNS: guardia SSRF integrada + validación de IP posterior a la resolución
Para Qué Sirve
No demos — trabajos reales que los navegadores para agentes están haciendo hoy:
- Avanzar por consolas de administración — AWS / App Store Connect / Google Play, docenas de capas de menú por tarea. Deja que el agente haga clic; vuelve solo cuando se necesita autorización.
- Acciones por lotes tras el inicio de sesión — llenar carritos, revisar historiales de pedidos, verificar páginas que solo se renderizan con sesión iniciada. Inyecta cookies, opera, exporta para reutilizar.
- Superar muros anti-bot — protección Cloudflare, desafíos Turnstile, verificaciones de huellas TLS. El modo sigiloso avanza en lugar de retroceder ante un 403.
- El internet chino — metabúsqueda Baidu / Sogou / WeChat en 5 motores, renderizado correcto de páginas en chino. No solo web en inglés.
- Scripting sobre la marcha — el agente lee la página, escribe JS, lo evalúa: tablas comparativas resaltadas, contenido reflujado, filtros de producto en parámetros ocultos. GreaseMonkey con esteroides.
- Visión multimodal — capturas como entrada visual para flujos de mirar-y-juzgar: elegir asientos, reconocer diseños, verificar renderizado.
Inicio Rápido
Prueba primero la instancia alojada: https://browser.aginx.net/
Instalación completa con un comando (superficie de activación SKILL.md + herramientas MCP + verificación):
# 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 solo MCP:
claude mcp add aginxbrowser --transport http https://browser.aginx.net/mcp
Instala la superficie de activación de habilidades vía skills.sh:
npx skills add yinnho/aginxbrowser
Autoalojamiento:
# 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
Estructura del Proyecto
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 (16 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)
│ ├── baidu_images.rs # Baidu Images (acjson API, images category)
│ ├── bing.rs # Bing (HTML parsing, plain reqwest)
│ ├── bing_images.rs # Bing Images (images/async endpoint, images category)
│ ├── sogou.rs # Sogou web (HTML parsing, plain reqwest)
│ ├── sogou_wechat.rs # Sogou WeChat (HTML parsing + /link resolution)
│ ├── duckduckgo.rs # DuckDuckGo (html.duckduckgo.com, general; direct-first)
│ ├── 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
Compilación
# 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+; la biblioteca estática de V8 se descarga automáticamente en la primera compilación. La función sigilosa además necesita go, cmake y un compilador de C++. La función de capturas incluye un subconjunto de fuentes CJK empaquetado (GB2312 + símbolos comunes) — no se requieren fuentes del sistema para un renderizado correcto en chino.
Variables de Entorno en Tiempo de Ejecución
| Variable | Predeterminado | Descripción |
|---|---|---|
AGINXBROWSER_BIND | 0.0.0.0:8089 | Dirección de escucha |
AGINXBROWSER_STEALTH | habilitado | 0 deshabilita el modo sigiloso (para diagnósticos) |
AGINXBROWSER_UA | Linux Chrome145 | User-Agent suplantado |
AGINXBROWSER_ACCEPT_LANGUAGE | zh-CN,zh;q=0.9,en;q=0.8 | Cabecera Accept-Language |
AGINXBROWSER_PROXY | ninguno | Proxy de respaldo opcional. Los motores con fuentes bloqueadas (Google, Bing News, Hugging Face) se conectan directamente primero y recurren a este proxy solo cuando el intento directo falla — los despliegues en el extranjero no necesitan proxy en absoluto; el use_proxy:true por solicitud también enruta fetch/search a través de él |
AGINXBROWSER_NAV_CHAIN_LIMIT | 10 | Límite de cadena de navegación JS: documentos que una página puede encadenar vía location/saltos de formulario antes de que la navegación se aborte. El conteo incluye el documento solicitado (10 = documento inicial + 9 saltos). Auméntalo para cadenas largas legítimas (traspaso SSO entre proveedores); las redirecciones HTTP 3xx se presupuestan por separado (20, según la especificación Fetch / paridad de navegador) |
AGINXBROWSER_CACHE_TTL_SECS | 600 | TTL de caché /fetch, 0 lo deshabilita |
AGINXBROWSER_IGNORE_ROBOTS | sin establecer | robots.txt se respeta por defecto en /fetch, /screenshot, /download y herramientas MCP; establece 1 para omitir verificaciones (opt-out del operador) |
AGINXBROWSER_ROBOTS_TTL_SECS | 3600 | TTL de caché de política robots.txt por host |
AGINXBROWSER_MCP_ALLOWED_HOSTS | sin establecer | Valores Host adicionales aceptados por /mcp (separados por comas) — el guardia de rebinding de DNS del transporte usa loopback por defecto, así que agrega tu IP LAN o nombre de host Docker cuando otras máquinas llamen a la instancia |
CAPTCHA_SOLVER_API_KEY | ninguno | Clave API de 2captcha; habilita la resolución automática de CAPTCHA |
CAPTCHA_SOLVER_SERVICE | 2captcha | Proveedor de resolución de CAPTCHA |
AGINXBROWSER_MEILI_URL | ninguno | URL base de Meilisearch; establece para habilitar el motor de índice privado |
AGINXBROWSER_MEILI_INDEX | ninguno | UID del índice Meilisearch a consultar |
AGINXBROWSER_MEILI_KEY | ninguno | Clave Bearer opcional para la instancia de Meilisearch |
Documentación de la API
Referencia completa de la API → docs/API.md
Notas de auditoría de seguridad → docs/skills-sh-audit.md — por qué skills.sh muestra "Riesgo Crítico", y a qué característica real del producto corresponde cada advertencia
Cubre:
- Todos los endpoints HTTP (
/fetch,/click,/eval,/search,/v1/scrape, 10 endpoints de sesión) - Las 15 herramientas del servidor MCP y sus parámetros
- Configuración de clientes Claude Code / Claude Desktop / Cursor
- Variables de entorno, códigos de error, ejemplos de scraping por sitio
Integración con Otros Sistemas
AginxBrowser es infraestructura pura de adjuntar-al-lado — como un navegador real, se ejecuta como un servicio independiente que cualquier cosa puede llamar, sin incrustar código del host ni contaminar la configuración del host. Despliega una instancia por máquina (bajo systemd) y cada aplicación que necesite capacidad de "renderizar + extraer" la comparte.
Integración: lee la variable de entorno AGINXBROWSER_URL=http://127.0.0.1:8089. Sin establecer → comportamiento sin cambios; establecida → los sitios con riesgo controlado se enrutan automáticamente a través de AginxBrowser para renderizado, con respaldo elegante ante fallos.
Limitaciones Conocidas
- Las capturas de pantalla son opcionales:
/screenshotrequierecargo build --release --features screenshot(añade el stack de renderizado, +30-40MB). El motor de renderizado predeterminado es diting (nuestro propio stack de CSS+layout+pintura); pasaengine: "blitz"para volver al pipeline de referencia Blitz. El CSS de sitios complejos es aproximado en ambos (no es pixel-perfect como Chromium). - Coordenadas de elementos compatibles:
/screenshotconselectordevuelve las coordenadas de página del elemento (selector_rects, px CSS);selectorsolo recorta directamente a ese elemento. Los elementos en línea (<a>text</a>) también obtienen un rect en el motor diting predeterminado — una unión de su contenido en línea aplanado, expandido con strut al propioline-heightdel elemento, como Chrome informa para inlines solo-reemplazados (<a><img></a>→ altura de línea-box, no la altura de la imagen). Los inlines vacíos aún no tienen rect — elige un ancestro de bloque en ese caso. - La interacción con JS funciona en general; las páginas con huellas pesadas pueden fallar: La delegación de eventos de React/Vue funciona normalmente (los atributos de reflexión de URL como
src/hrefse resuelven a URLs absolutas para que Next.js/webpack hidraten y los clics disparen handlers). Las páginas de autenticación con huellas pesadas (WorkOS/Cloudflare) que sondeannavigator.plugins, canvas WebGL, etc., pueden fallar hasta que se complete la cobertura de huellas sigilosas. - Soporte de proxy: HTTP/HTTPS/SOCKS5 vía
AGINXBROWSER_PROXY. - Sitios con control de riesgo estricto: Baidu Wenku no compatible; los artículos de Zhihu necesitan un
__zse_ckválido.
Licencia
Consistente con el proyecto principal de OpenCarrier. Apache-2.0.