SlimAtlas
Un servidor MCP que proporciona capacidades de automatización de navegador extremadamente ligeras utilizando el navegador Lightpanda. Este servidor permite a los LLMs interactuar con páginas web a través de la automatización del navegador.
Documentación
SlimAtlas AI
Un servidor MCP independiente extremadamente ligero para automatización de navegador eficiente en tokens para agentes de IA, diseñado para ejecutarse en servidores.
~5x menos memoria que Chromium. ~25x instantáneas más pequeñas que HTML crudo.
Funciona con Linux y macOS.
Construido sobre Bun, Puppeteer y Lightpanda.
Características
- Automatización de Navegador: Navegar, hacer clic, escribir, completar formularios y evaluar JavaScript
- Ligero por Defecto: ~5x menos memoria que Chromium, ~25x instantáneas más pequeñas que HTML crudo
- Instantáneas de Página: Obtén instantáneas compactas del árbol de accesibilidad en YAML con IDs de nodo únicos para apuntar a elementos con precisión
- Contexto Optimizado para LLM: Las instantáneas se reducen a lo esencial semántico, manteniendo el uso de contexto mínimo para que quepan más páginas y sesiones más largas en la misma ventana
- Navegador de Respaldo Configurable: Modelo de dos niveles — primero el navegador ligero, luego escalar a Chrome con interfaz, Browserless o Browserbase en la nube solo cuando el predeterminado es detectado como bot, falla o expira.
- Límite de Velocidad: Mantente bajo el radar. Aplica un retraso mínimo configurable entre solicitudes a dominios específicos con patrones comodín (
*,*.reddit.com) más jitter opcional, para que tu agente se regule en lugar de golpear un sitio y activar sus defensas antibots. - Soporte de Proxy: Enruta cada solicitud a través de un proxy HTTP con una sola configuración de
PROXY_SERVER— aplicada automáticamente a ambas capas del navegador, para que tu IP real nunca toque el objetivo. Soporta autenticación básica en línea (http://user:pass@host:port). - Gestión Robusta de Sesiones: Serialización por sesión, límite de sesiones opcional (
MAX_SESSIONS), recuperación de fallos a mitad de sesión con reproducción de historial y apagado elegante. - Gestión de Sesiones: Reutiliza sesiones en múltiples operaciones con IDs de sesión únicos
- Multiplataforma: Funciona en Linux y macOS, con un respaldo de navegador real configurable cuando sea necesario
Benchmark
SlimAtlas fue comparado con Playwright MCP (Chromium sin interfaz y con interfaz) usando slim-atlas-bench — 25 sitios reales en 5 categorías, 3 ejecuciones cada uno (225 en total), todos ejecutándose en Docker en localhost.
Configuración: Cada servicio se ejecuta como un servidor MCP en su propio contenedor Docker. El harness de benchmark mide la latencia por llamada de herramienta (navegar + instantánea) vía langchain-mcp-adapters, y captura la RAM del contenedor a través de la API de estadísticas de Docker. Las instantáneas se estiman en tokens a ~4 caracteres/token (misma metodología que la línea base de HTML crudo).
| Métrica (mediana) | SlimAtlas | Playwright sin interfaz | Playwright con interfaz |
|---|---|---|---|
| Navegar + Instantánea (ms) | 1,383 | 1,116 | 687 |
| RAM del Contenedor (MB) | 124 | 635 | 815 |
| Tokens de Instantánea | 414 | 940 | 1,843 |
SlimAtlas intercambia velocidad de navegación por un uso de recursos drásticamente menor. Chromium es más rápido en la carga de páginas, pero usa 5–6x más RAM y produce 2–4x más tokens por instantánea — los dos costos que dominan a escala en flujos de trabajo de agentes.
Resultados
Tokens de Instantánea![]() | Uso de Memoria![]() |
Instalación
Requiere Bun ≥1.1.
# Install dependencies
bun install
El binario del navegador se descarga automáticamente en la primera ejecución.
Navegador de respaldo: El nivel 1 es siempre el navegador ligero. El nivel 2 es FALLBACK_BROWSER — uno de headful (Chrome con interfaz), browserbase (nube), browserless (nube), o none (predeterminado, sin respaldo). Cuando el predeterminado falla, expira o es detectado como bot, la sesión cambia una vez al respaldo configurado. Chrome está incluido con Puppeteer; Browserbase/Browserless requieren credenciales de API (ver abajo).
Uso
Ejecutar el Servidor MCP
# Standalone HTTP server (default)
bun run src/index.ts --port=8080
# Remote, authenticated
MCP_AUTH_TOKEN=s3cret bun run src/index.ts --host=0.0.0.0 --port=8080
SlimAtlas expone un único endpoint Streamable HTTP /mcp. Cada cliente obtiene su propia sesión a través del encabezado mcp-session-id; MAX_SESSIONS limita la concurrencia. Apunta tu cliente MCP a él:
{
"mcpServers": {
"slimatlas": {
"url": "http://localhost:8080/mcp",
"transport": "http"
}
}
}
Con autenticación:
{
"mcpServers": {
"slimatlas": {
"url": "http://your-host:8080/mcp",
"transport": "http",
"headers": { "Authorization": "Bearer s3cret" }
}
}
}
Consejo: Usa --host=0.0.0.0 para exponer remotamente, pero siempre establece MCP_AUTH_TOKEN al hacerlo. El servidor habla solo HTTP plano — termina TLS al frente (Caddy/nginx) o el token Bearer viaja por la red en texto claro.
Docker
La imagen incluye el binario de Lightpanda en el momento de la compilación, por lo que el contenedor arranca autocontenido y nunca vuelve a descargar:
docker build -t slimatlas .
docker run -p 8080:8080 -e MCP_AUTH_TOKEN=s3cret slimatlas
# -> http://localhost:8080/mcp
Fija una versión de Lightpanda para compilaciones reproducibles (cualquier etiqueta lightpanda-io/browser — predeterminado nightly):
docker build --build-arg LIGHTPANDA_VERSION=0.3.3 -t slimatlas:0.3.3 .
La arquitectura múltiple se maneja automáticamente — la compilación detecta la arquitectura del contenedor vía uname -m (x86_64 → lightpanda-x86_64-linux, aarch64 → lightpanda-aarch64-linux), por lo que el binario siempre coincide con la plataforma que se está compilando.
Apple Silicon (Macs con chip M): pasa
--platform linux/arm64para compilar/ejecutar de forma nativa. Sin ello, Docker Desktop puede usar por defectoamd64y ejecutar el contenedor bajo Rosetta, lo que falla al lanzar el binario de Lightpanda (rosetta error: failed to open elf …).docker build --platform linux/arm64 --build-arg FALLBACK_BROWSER=headful -t slimatlas . docker run --platform linux/arm64 --name slimatlas -p 8080:8080 -e MCP_AUTH_TOKEN=s3cret -e PLUGINS=document-export -e LIGHTPANDA_POOL_SIZE=20 -e CHROME_POOL_SIZE=10 -e SKIP_LIGHTPANDA_DOMAINS=reddit.com -e RATE_LIMIT_DOMAINS=reddit.com -e RATE_LIMIT_MIN_DELAY_MS=10000 slimatlasNota sobre sitios con verificación antibots (Reddit, sitios con Cloudflare al frente): en
linux/arm64la imagen recurre a Debian Chromium, al que los muros antibots actuales (p. ej. "Demuestra tu humanidad" de Reddit, "Solo un momento..." de Cloudflare) le sirven un desafío interactivo independientemente de la configuración de sigilo. Verificado contra Reddit: el mismo contenedor enlinux/amd64— que fija Chrome-for-Testing (predeterminado131.0.6778.204; las compilaciones estables de generación actual quedan bloqueadas) — renderiza los hilos correctamente. Prefiere la imagen amd64 para objetivos con verificación antibots (en Macs con chip M se ejecuta bajo Rosetta; Lightpanda funciona allí ya que el binario x86_64 está incluido en el momento de la compilación).Elección de motor / proxy: AMBAS capas del navegador se enrutan a través de
PROXY_SERVER(mismas credenciales; Lightpanda vía autenticación en línea--http-proxy, Chrome vía--proxy-server+page.authenticate). Reddit se renderiza a través de Lightpanda con proxy directamente; cuando una sesión encuentra un desafío, la capa de detección de bots la escala al respaldo de Chrome 131. Añade-e SKIP_LIGHTPANDA_DOMAINS=reddit.compara forzar los hilos directamente a Chrome en su lugar.Notas sobre proxy:
PROXY_SERVERaceptahttp://user:pass@host:porto el formato del panel dehost:port:user:pass(normalizado internamente). Las sesiones fijas (formatogate.<provider>:port:user-sessid-xxx:pass) funcionan a través de la misma variable de entorno.-e PROXY_BYPASS_DOMAINS=a.com,b.comenruta los dominios listados DIRECTAMENTE en Chrome (para sitios cuyo Cloudflare desaprueba tus salidas de proxy más que tu propia IP).Ejemplo completo de producción — configuración verificada contra Reddit y una ráfaga paralela de páginas de estadísticas:
docker build --platform linux/amd64 --build-arg FALLBACK_BROWSER=headful -t slimatlas . docker rm -f slimatlas docker run -d --name slimatlas -p 8080:8080 \ -e MCP_AUTH_TOKEN=s3cret \ -e PLUGINS=document-export \ -e CHROME_POOL_SIZE=6 \ -e RATE_LIMIT_DOMAINS=reddit.com \ -e RATE_LIMIT_MIN_DELAY_MS=10000 \ -e TZ=America/New_York \ -e PROXY_SERVER="http://user:pass@proxy-host:port" \ -e PROXY_BYPASS_DOMAINS=cloudflare-heavy-site.com \ slimatlasOmite
PROXY_SERVER,PROXY_BYPASS_DOMAINSyTZsi no usas un proxy.CHROME_POOL_SIZEimporta: el predeterminado de 1 serializa cada sesión escalada por desafío y causa tiempos de espera del cliente una vez que una sesión se filtra. La versión fijada de Chrome se puede anular en el momento de la compilación con--build-arg CHROME_CFT_VERSION=<version>si el muro de un sitio comienza a marcarla.
Variante de respaldo con interfaz. La imagen predeterminada ejecuta solo Lightpanda (FALLBACK_BROWSER=none). Para habilitar el respaldo de Chrome con interfaz (necesario solo si estableces FALLBACK_BROWSER=headful en tiempo de ejecución), compila la variante con interfaz — añade las bibliotecas de tiempo de ejecución de Chrome + Xvfb (~150MB) y preconfigura FALLBACK_BROWSER=headful:
docker build --build-arg LIGHTPANDA_VERSION=0.3.3 FALLBACK_BROWSER=headful -t slimatlas:headful .
docker run -p 8080:8080 -e MCP_AUTH_TOKEN=s3cret -e PLUGINS=document-export slimatlas:headful
Xvfb se inicia de forma diferida dentro del contenedor en la primera sesión que escala a Chrome con interfaz — sin entrypoint ni xvfb-run manual necesario.
Plugin de exportación de documentos (PDF/PPTX). browser_print_pdf y browser_export_pptx se incluyen en el plugin document-export y están deshabilitados por defecto — habilítalos con -e PLUGINS=document-export (o la bandera --plugins=document-export). Ambas herramientas fuerzan el respaldo de Chrome real, por lo que necesitan una imagen que realmente lo tenga: usa la variante con interfaz de arriba. En la imagen predeterminada solo con Lightpanda, las herramientas aparecen en la lista pero cada llamada falla (No fallback browser configured). Guía de creación de plugins: docs/plugins.md.
Modo Stdio
Para clientes MCP que inician el servidor como subproceso (local, de un solo cliente), usa el transporte stdio:
bun run src/index.ts
{
"mcpServers": {
"slimatlas": {
"command": "bun",
"args": ["run", "path/to/mcp/src/index.ts"]
}
}
}
Configuración
Añade a la configuración de tu cliente MCP:
{
"mcpServers": {
"slimatlas": {
"command": "bun",
"args": ["run", "path/to/mcp/src/index.ts"]
}
}
}
Consejo: Establece FALLBACK_BROWSER=none para usar solo el navegador ligero y propagar los errores con honestidad. Usa headful o browserbase para habilitar un respaldo de navegador real.
Consulta docs/configs.md para todas las variables de entorno y banderas de CLI.
Navegador de respaldo
FALLBACK_BROWSER | Navegador de nivel 2 | Notas |
|---|---|---|
none (predeterminado) | — | Solo navegador ligero; los errores se propagan con honestidad |
headful | Chrome con interfaz | Ventana real en macOS; necesita xvfb en Linux sin interfaz |
browserbase | Browserbase en la nube | Requiere BROWSERBASE_API_KEY + BROWSERBASE_PROJECT_ID |
Omite el navegador predeterminado para dominios conocidos como difíciles con SKIP_LIGHTPANDA_DOMAINS (separados por comas, consciente de subdominios). Los hosts coincidentes comienzan directamente en el navegador de respaldo. Requiere FALLBACK_BROWSER != none (de lo contrario, la lista se ignora con una advertencia).
Límite de velocidad
Ritmo educado y antidetección para tu agente. RateLimiter aplica un retraso mínimo a nivel de servidor entre llamadas browser_navigate a los dominios que listas, con jitter aleatorio opcional para que la cadencia no sea un intervalo fijo y rastreable. Los buckets se asignan por host en todas las sesiones (porque el sitio objetivo ve tu IP, no tus sesiones), y los patrones admiten comodines:
| Patrón | Coincide | Bucket |
|---|---|---|
* | Cada host | Cada host limitado de forma independiente |
*.reddit.com | Solo subdominios (www.reddit.com, old.reddit.com) — no reddit.com | Todos los subdominios coincidentes comparten un bucket |
g2.com | g2.com + sus subdominios | Apex + subdominios comparten un bucket |
Deshabilitado por defecto. Habilítalo con una lista de dominios no vacía y un retraso distinto de cero:
# Via CLI flags
bun run src/index.ts --rate-limit-domains=*.reddit.com,g2.com --rate-limit-min-delay-ms=2000 --rate-limit-jitter-ms=1500
# Or via environment / .env
RATE_LIMIT_DOMAINS=*.reddit.com,g2.com
RATE_LIMIT_MIN_DELAY_MS=2000
RATE_LIMIT_JITTER_MS=1500
Proxy
Mantén tu IP real fuera del objetivo. Establece un solo PROXY_SERVER y SlimAtlas enruta todo el tráfico HTTP de ambas capas del navegador a través de él — sin necesidad de configuración por navegador:
- Navegador ligero (nivel 1) — reenviado a través de su bandera nativa
--http-proxy. - Respaldo de Chrome (nivel 2) — aplicado vía
--proxy-serveral inicio.
# Via CLI flag
bun run src/index.ts --proxy-server=http://host:8080
# Or via environment / .env
PROXY_SERVER=http://user:pass@host:8080
La autenticación básica en línea (http://user:pass@host:port) es compatible en la capa del navegador ligero. Para proxies con IP en lista blanca (sin credenciales) funciona en ambas capas. (Autenticación de Chrome por página vía page.authenticate está en la hoja de ruta.)
Banderas de CLI
Toda variable de entorno también puede pasarse como una bandera CLI en minúsculas en formato --flag=value. Las banderas CLI tienen prioridad sobre las variables de entorno. Las banderas desconocidas hacen que el servidor se cierre al iniciar. Consulta docs/configs.md para la lista completa.
bun run src/index.ts --fallback-browser=headful --lightpanda-pool-size=3 --skip-lightpanda-domains=g2.com --navigate-timeout=60000
Para usar banderas desde un cliente MCP, agrégalas al arreglo args:
{
"mcpServers": {
"slimatlas": {
"command": "bun",
"args": [
"run",
"path/to/mcp/src/index.ts",
"--fallback-browser=headful",
"--skip-lightpanda-domains=g2.com,linkedin.com",
"--chrome-pool-size=3"
]
}
}
}
Flujo de Uso
# Example: Navigate, snapshot, and interact with a page
# 1. Navigate to a URL (creates a new session automatically)
result = mcp.call("browser_navigate", {"url": "https://example.com"})
# Returns: session_id: abc1, result: Navigated to https://example.com. Title: Example Domain
# 2. Take a snapshot to see the page structure
snapshot = mcp.call("browser_snapshot", {"session_id": "abc1"})
# Returns YAML with node IDs like: 0: {type: div, children: ...}
# 3. Click a node by ID (from the snapshot)
mcp.call("browser_click", {"session_id": "abc1", "nodeId": 2})
# 4. Type into a search box
mcp.call("browser_type", {"session_id": "abc1", "nodeId": 5, "text": "search query"})
# 5. Close the session when done
mcp.call("browser_close", {"session_id": "abc1"})
Herramientas Disponibles
Las herramientas principales de browser_* a continuación están siempre disponibles. Dos herramientas adicionales de pipeline — browser_print_pdf y browser_export_pptx — se incluyen en el plugin document-export y están deshabilitadas por defecto (-e PLUGINS=document-export / --plugins=document-export); consulta docs/plugins.md.
| Herramienta | Descripción | Valor |
|---|---|---|
browser_navigate | Navegar a una URL con estrategia de espera configurable | Punto de entrada para todas las interacciones web. Soporta load, domcontentloaded, networkidle0, networkidle2 |
browser_snapshot | Obtener árbol de accesibilidad YAML con IDs de nodo únicos | Representación estructurada de la página ideal para comprensión por LLM. Los IDs de nodo permiten apuntar con precisión para clics/escrituras |
browser_view_node | Ver contenido específico de nodo por ID (texto o imagen) | Inspeccionar elementos individuales sin releer toda la página. Devuelve imágenes como base64 para verificación visual |
browser_click | Hacer clic en un elemento por ID de nodo o selector CSS | Se recomienda el ID de nodo (de snapshot) sobre selectores CSS por fiabilidad y simplicidad |
browser_type | Escribir texto en un elemento con retraso de teclas opcional | Simula escritura humana. Úsalo para cuadros de búsqueda, formularios y entradas de texto |
browser_fill | Rellenar un elemento de entrada con un valor al instante | Más rápido que browser_type para campos de formulario. Limpia el valor existente antes de escribir |
browser_go_back | Navegar hacia atrás en el historial del navegador | Esencial para flujos de trabajo de varios pasos y corregir errores de navegación |
browser_go_forward | Navegar hacia adelante en el historial del navegador | Complementa a browser_go_back para navegación bidireccional |
browser_reload | Recargar la página actual | Refrescar contenido dinámico o recuperarse de estado de página obsoleto |
browser_get_page_info | Obtener URL y título de la página actual | Forma rápida de verificar el éxito de la navegación y el contexto actual |
browser_close | Cerrar sesión del navegador y liberar recursos | Importante para limpieza. Las sesiones se cierran automáticamente al agotar el tiempo, pero se recomienda cerrarlas explícitamente |
Herramientas de plugin (solo con PLUGINS=document-export):
| Herramienta | Descripción | Valor |
|---|---|---|
browser_print_pdf | Imprimir la página actual o un documento HTML proporcionado a un PDF base64 | Solo para pipelines de generación de documentos/informes — NO para investigación/navegación de agentes. Fuerza el respaldo de Chrome real (FALLBACK_BROWSER); acepta un session_id proporcionado por el llamador (crear → imprimir → browser_close) |
browser_export_pptx | Convertir la página actual o un documento HTML proporcionado a un .pptx base64 mediante dom-to-pptx | Solo para pipelines de generación de presentaciones. Las diapositivas son los elementos que coinciden con selector (por defecto .slide) al tamaño de píxel final (p. ej. 1920x1080); with_previews=true también devuelve PNGs por diapositiva. Fuerza el respaldo de Chrome real; el llamador cierra la sesión con browser_close |
Ejecutar Pruebas
# Run all tests
bun test
# Run tests in watch mode
bun test --watch
Requisitos
- Bun ≥1.1
- Linux o macOS (descarga automática) o Chrome/Chromium (respaldo)
Licencia
MIT

