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 Logo

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.

license MIT bun 1.3.11 TypeScript 5.9

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)SlimAtlasPlaywright sin interfazPlaywright con interfaz
Navegar + Instantánea (ms)1,3831,116687
RAM del Contenedor (MB)124635815
Tokens de Instantánea4149401,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
Snapshot Tokens
Uso de Memoria
Memory Usage

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/arm64 para compilar/ejecutar de forma nativa. Sin ello, Docker Desktop puede usar por defecto amd64 y 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 slimatlas

Nota sobre sitios con verificación antibots (Reddit, sitios con Cloudflare al frente): en linux/arm64 la 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 en linux/amd64 — que fija Chrome-for-Testing (predeterminado 131.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.com para forzar los hilos directamente a Chrome en su lugar.

Notas sobre proxy: PROXY_SERVER acepta http://user:pass@host:port o el formato del panel de host:port:user:pass (normalizado internamente). Las sesiones fijas (formato gate.<provider>:port:user-sessid-xxx:pass) funcionan a través de la misma variable de entorno. -e PROXY_BYPASS_DOMAINS=a.com,b.com enruta 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 \
  slimatlas

Omite PROXY_SERVER, PROXY_BYPASS_DOMAINS y TZ si no usas un proxy. CHROME_POOL_SIZE importa: 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_BROWSERNavegador de nivel 2Notas
none (predeterminado)—Solo navegador ligero; los errores se propagan con honestidad
headfulChrome con interfazVentana real en macOS; necesita xvfb en Linux sin interfaz
browserbaseBrowserbase en la nubeRequiere 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ónCoincideBucket
*Cada hostCada host limitado de forma independiente
*.reddit.comSolo subdominios (www.reddit.com, old.reddit.com) — no reddit.comTodos los subdominios coincidentes comparten un bucket
g2.comg2.com + sus subdominiosApex + 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-server al 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.

HerramientaDescripciónValor
browser_navigateNavegar a una URL con estrategia de espera configurablePunto de entrada para todas las interacciones web. Soporta load, domcontentloaded, networkidle0, networkidle2
browser_snapshotObtener árbol de accesibilidad YAML con IDs de nodo únicosRepresentació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_nodeVer 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_clickHacer clic en un elemento por ID de nodo o selector CSSSe recomienda el ID de nodo (de snapshot) sobre selectores CSS por fiabilidad y simplicidad
browser_typeEscribir texto en un elemento con retraso de teclas opcionalSimula escritura humana. Úsalo para cuadros de búsqueda, formularios y entradas de texto
browser_fillRellenar un elemento de entrada con un valor al instanteMás rápido que browser_type para campos de formulario. Limpia el valor existente antes de escribir
browser_go_backNavegar hacia atrás en el historial del navegadorEsencial para flujos de trabajo de varios pasos y corregir errores de navegación
browser_go_forwardNavegar hacia adelante en el historial del navegadorComplementa a browser_go_back para navegación bidireccional
browser_reloadRecargar la página actualRefrescar contenido dinámico o recuperarse de estado de página obsoleto
browser_get_page_infoObtener URL y título de la página actualForma rápida de verificar el éxito de la navegación y el contexto actual
browser_closeCerrar sesión del navegador y liberar recursosImportante 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):

HerramientaDescripciónValor
browser_print_pdfImprimir la página actual o un documento HTML proporcionado a un PDF base64Solo 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_pptxConvertir la página actual o un documento HTML proporcionado a un .pptx base64 mediante dom-to-pptxSolo 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