Skip to main content
Glama
lauyuen

stealth-browser-mcp

by lauyuen

stealth-browser-mcp

Un servidor MCP que ofrece a un asistente de IA un navegador Chrome real que mantiene la sesión iniciada.

La mayoría de las herramientas de automatización de navegador entregan al modelo un navegador nuevo y vacío. Esta, en cambio, utiliza un perfil de Chrome persistente, así que una vez que has iniciado sesión en un sitio tú mismo — con el 2FA, CAPTCHA o aprobación de dispositivo que sea — el modelo puede seguir usando esa sesión en ejecuciones posteriores sin llegar a ver tu contraseña.

Para los sitios que no toleran un inicio de sesión automatizado, añade dos vías de escape: credenciales obtenidas del Keychain de macOS en el momento de rellenar, y passkeys WebAuthn reproducidas mediante el autenticador virtual de Chrome.

[!WARNING] Esta es una herramienta poderosa. Da a un modelo de lenguaje control sobre un navegador con tus sesiones activas, y es capaz de escribir tus contraseñas guardadas en páginas que el modelo elija. Lee SECURITY.md y Uso responsable antes de usarla con cualquier cosa que te importe.


Contenido


Related MCP server: agent-browser-mcp

Cómo funciona

        MCP client (Claude Code, Claude Desktop, Cursor, …)
                          │
                          │  JSON-RPC over stdio
                          ▼
              ┌───────────────────────────┐
              │   stealth-browser-mcp     │
              │   16 tools, one browser   │
              └─────┬───────────────┬─────┘
                    │               │
     credentials    │               │   CDP + Puppeteer
                    ▼               ▼
        ┌───────────────────┐   ┌───────────────────────┐
        │  macOS Keychain   │   │  Google Chrome        │
        │  stealth-mcp:*    │   │  + stealth plugin     │
        │  passwords,       │   │  + WebAuthn virtual   │
        │  passkey material │   │    authenticator      │
        └───────────────────┘   └───────────┬───────────┘
                                            │
                                            ▼
                              ┌─────────────────────────┐
                              │  Persistent profile dir │
                              │  cookies · localStorage │
                              │  IndexedDB · sessions   │
                              └─────────────────────────┘

Hay tres elementos clave:

  • Persistencia. El navegador se lanza contra un userDataDir fijo en lugar de uno desechable. Al iniciar sesión una vez de forma interactiva, las cookies sobreviven en todas las ejecuciones posteriores — desaparece el motivo habitual por el que la automatización falla en sitios reales.

  • Sigilo: puppeteer-extra-plugin-stealth cubre las marcas de automatización más conocidas, y el servidor suma algunas más: navigator.webdriver no está definido, window.chrome.runtime está presente, HeadlessChrome se elimina del user agent y se activa --disable-blink-features=AutomationControlled. Los clics mueven el ratón por una trayectoria hasta llegar a un punto con variación dentro del objetivo; la escritura se hace carácter a carácter con intervalos de 30–100 ms.

  • Reutilización de sesión en lugar de creación de sesión: El diseño busca evitar automatizar los inicios de sesión por completo. El autocompletado del Keychain y la reproducción de passkeys existen para los casos en los que no se puede evitar.

Requisitos

  • Node.js 18 o superior

  • Google Chrome: El Chromium integrado de Puppeteer funciona, pero una compilación real de Chrome es notablemente menos detectable.

  • macOS, si quieres las funciones de Keychain y passkeys. El resto — navegación, extracción, capturas de pantalla, perfil persistente — es multiplataforma. La capa Keychain invoca /usr/bin/security y fallará en otras plataformas; las herramientas del navegador no la utilizan.

Instalación

git clone https://github.com/lauyuen/stealth-browser-mcp.git
cd stealth-browser-mcp
npm install

Opcionalmente, copia y edita el archivo de entorno de ejemplo:

cp .env.example .env

Confirma que el navegador se lanza y que las técnicas de evasión están activas:

npm run check-stealth

Conectar con un cliente MCP

El servidor usa stdio. Señala a la ruta absoluta de src/server.js desde tu cliente.

Claude Code

claude mcp add stealth-browser -- node /absolute/path/to/stealth-browser-mcp/src/server.js

Claude Desktop~/Library/Application Support/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "stealth-browser": {
      "command": "node",
      "args": ["/absolute/path/to/stealth-browser-mcp/src/server.js"]
    }
  }
}

Cualquier otro cliente MCP — El mismo formato, con una configuración adicional opcional para el perfil:

{
  "mcpServers": {
    "stealth-browser": {
      "command": "node",
      "args": ["/absolute/path/to/stealth-browser-mcp/src/server.js"],
      "env": {
        "BROWSER_PROFILE_DIR": "/absolute/path/to/a/private/profile/dir"
      }
    }
  }
}

Reinicia el cliente a después. browser_status es la forma más rápida de confirmar que la conexión está activa.

El primer inicio de sesión

Antes de que el modelo pueda usar un sitio, siembra el perfil tú mismo:

npm run login -- https://example.com

Se abre una ventana visible de Chrome con el mismo perfil que usará el servidor MCP. Inicia sesión con normalidad — gestores de contraseñas, avisos de 2FA, CAPTCHA, “recuerdar este dispositivo”, todo. Pulsa Enter en la terminal cuando termines y la sesión se guardará en disco.

Cada ejecución posterior del MCP hereda esa sesión. Repite el proceso por sitio. Las sesiones caducan según la programación del sitio, así que vuelve a ejecutarlo cuando el sitio cierre tu sesión.

Referencia de herramientas

Navegación e interacción

Tool

Argumentos

Nota

browser_navigate

url, waitUntil?

waitUntil puede ser load, domcontentloaded, networkidle0, networkidle2 (predeterminado). Devuelve la URL final, el título y el estado HTTP.

browser_click

selector

Lleva el elemento a la vista y luego mueve el ratón a un punto con variación dentro de él antes de pulsar.

browser_type

selector, text, clearFirst?

Escribe carácter a carácter con retrasos aleatorios.

browser_scroll

direction?, distance?

up o down, píxeles (predeterminado 600).

browser_wait_for

selector?, milliseconds?

Espera un elemento, aplica una pausa o hace ambas cosas.

Lectura de la página

Herramienta

Argumentos

Notas

browser_extract_text

selector?

Elimina scripts y estilos; devuelve texto así como enlaces y campos de formulario estructurados. Es lo más barato para que un modelo lea una página.

browser_extract_html

selector?

outerHTML sin procesar. Úsalo cuando necesites el markup o los atributos exactos.

browser_screenshot

fullPage?

Devuelve un PNG como contenido de imagen MCP.

browser_evaluate

script

Ejecuta JavaScript en el contexto de la página y devuelve el resultado. Ver la advertencia en SECURITY.md.

Sesión y autenticación

Herramienta

Argumentos

Notas

browser_autofill_login

service, account, usernameSelector?, passwordSelector, submitSelector?

Lee la contraseña del Keychain y la escribe. El secreto nunca se expone al modelo.

keychain_store_credential

service, account, password

Escribe en el Keychain bajo el prefijo stealth-mcp:<service>. Prefiere la CLI — ver abajo.

passkey_enable_virtual_authenticator

rpId?, account?

Con ambos argumentos, inyecta una passkey almacenada. Con ninguno, adjunta un autenticador vacío listo para el registro.

passkey_save_registration

rpId, account

Captura una credencial recién registrada y la guarda.

Ciclo de vida del navegador

Herramienta

Argumentos

Notas

browser_status

Estado de la conexión, número de pestañas, URL actual, ruta del perfil, y si hay un autenticador conectado.

browser_open_interactive_window

url?

Reabre la sesión actual en una ventana visible para que puedas resolver un CAPTCHA o aprobar un 2FA manualmente, y luego devuelve el control.

browser_close

Cierra correctamente y guarda los datos de la sesión en disco.

El navegador se ejecuta de forma headless en el modo cabeza o defaults y se reutiliza entre llamadas. browser_open_interactive_window es la única herramienta que lo muestra en una ventana visible.

Guardar credenciales en el Keychain

Las contraseñas se guardan en el Keychain de macOS bajo el prefijo de servicio stealth-mcp: — nunca en un archivo de este repositorio ni en el contexto del modelo.

npm run keychain set github you@example.com     # prompts; input is not echoed
npm run keychain get github you@example.com     # confirms presence, prints length only
npm run keychain delete github you@example.com

El modelo ejecuta entonces un alto inicio de sesión sin conocer el secreto:

GXP10

`service` es una etiqueta arbitraria que eliges tú — solo tiene que coincidir entre la CLI y la llamada a la herramienta.

También puedes pasar la contraseña como argumento final de CLI para la escritión de scripts, pero quedará en el historial de tu shell y en la lista de procesos, por lo que el comando te avisa cuando lo haces.

## Passkeys

Chrome expone un [WebAuthn virtual del que habla el Protocolo DevTools](https://chromedevtools.github.io/devtools-protocol/tot/WebAuthn/) — un autenticador de software pensado para probar flujos WebAuthn. Este servidor lo maneja y conserva el material de claves resultante en el Keychain para que supere el ciclo de la terapia.

**Registrar una passkey de automatización**

1. Llama a `passkey_enable_virtual_authenticator` sin argumentos.
2. Navega al flujo del sitio para “añadir una passkey” y complétalo. El autenticador virtual responde al desafío; no aparece ninguna solicitud del sistema.
3. Llama a `passkey_save_registration` con `rpId` del sitio y tu cuenta.

**Usarla más tarde**

Llama a `passkey_enable_virtual_authenticator` con `rpId` y `account` para inyectar la credencial antes de navegar, y el sitio te autenticará sin muestra ninguna pregunta.

> \[!CAUTION]
> Una passkey retenida de esta forma es un archivo, no una clave física. Puede copiarse, que es exactamente lo que las passkeys reales tratan de evitar. Registra con este método solo passkeys de automatización. No lo uses con la passkey que protege tu correo, tu banco o cualquier otra cosa cuya pérdida te importaría.

## Configuración

Toda la configuración se hace mediante variables de entorno, la extensión del proceso o de un archivo `.env`. Consulta [.env.example](.env.example).

| Qué la controla            | Valor por defecto                      | Propósito                                                                       |
|--------------------------- | -------------------------------------- | --------------------------------------------------------------------------------- |
| `BROWSER_PROFILE_DIR`      | `~/.config/stealth-browser-mcp/profile` | Perfil persistente de Chrome. Contiene sesiones reales — mantenlo privado y fuera del control de versiones. |
| `CHROME_EXECUTABLE_PATH`   | Valor por defecto de la plataforma       | Binario de Chrome a controlar. Si la ruta no existe, intentará con Chromium de Puppete. |
| `NAV_TIMEOUT`              | `45000`                                 | Tiempo de espera de navegación y selección, en milisegundos. |

Los indicadores de lanzamiento de Chrome y la ventana gráfica predeterminada de 1280×800 están en [`src/config.js`](src/config.js). Varios de esos indicadores intercambian seguridad por compatibilidad; [SECURITY.md](SECURITY.md#known-weakenings) explica cuáles y por qué deberías eliminar algunos.

## Verificar el sigilo

GXP11

Informa de `navigator.webdriver`, `window.chrome`, `window.chrome.runtime`, el número de plugins, `navigator.languages` y el user agent efectivo, y luego imprime el perfil resuelto y las rutas de Chrome.

Para una comprobación más exigente, apunta el navegador a una página de fingerprinting — por ejemplo `bot.sannysoft.com` o `abrahamjuliot.github.io/creepjs` — con `browser_navigate` seguido de `browser_screenshot`.

Ninguna configuración de stealth es indetectable. Los sitios bien defendidos combinan el fingerprinting con análisis de comportamiento, reputación de IP e historial de cuenta, y seguirán detectando la automatización. Trátalo como «no activa las comprobaciones obvias», no como invisibilidad.

## Solución de problemas

**«Failed to launch the browser process» / perfil bloqueado.** Chrome permite un proceso por directorio de perfil. Cierra cualquier Chrome que hayas iniciado manualmente contra el mismo directorio. El servidor elimina los archivos de bloqueo `Singleton*` obsoletos al iniciarse y se reconectará a una instancia activa a través de su puerto DevTools, pero un Chrome en ejecución que sea el propietario del perfil gana.

**Un sitio cierra la sesión del modelo o lo bloquea.** La sesión almacenada ha caducado. Vuelve a ejecutar `npm run login -- <url>`.

**Los selectores no coinciden.** Llama a `browser_extract_html` con un selector concreto y deja que el modelo lea el marcado real en lugar de adivinar. Las aplicaciones de una sola página suelen montar los inputs tarde — usa `browser_wait_for` primero.

**Aparece un CAPTCHA.** Llama a `browser_open_interactive_window`, resuélvelo tú mismo y continúa. El estado resuelto persiste en el perfil.

**Errores de Keychain en Linux o Windows.** Es de esperar — esa capa es solo de macOS. Las herramientas de navegador funcionan en todas partes; las de credenciales y passkeys no.

## Uso responsable

Este proyecto existe para permitir que un asistente actúe en sitios *en los que ya tienes una cuenta*, usando sesiones *que tú mismo has establecido*. Ese es el alcance previsto, y el diseño de perfil persistente lo refleja.

La automatización de anti-detección y credenciales obviamente puede dirigirse a otros fines. Antes de ejecutarla contra un sitio, ten en cuenta:

* **Los términos de servicio del sitio.** Muchos prohíben el acceso automatizado por completo. Evadir una defensa contra bots puede incumplir un contrato que aceptaste y, en algunas jurisdicciones, el acceso no autorizado conlleva responsabilidad penal. Poder eludir un control no es un permiso para hacerlo.
* **Consentimiento.** Automatiza cuentas que te pertenezcan, o sobre las que tengas autorización por escrito para actuar. Las credenciales de otra persona en tu Keychain no son consentimiento.
* **Carga.** Limita tu propia frecuencia de peticiones. Respeta `robots.txt` cuando corresponda. La automatización que le cuesta dinero real a un sitio es una buena forma de conseguir que la técnica se prohíba para todos.
* **Datos de otras personas.** Las páginas que lee el modelo fluyen hacia el proveedor de tu cliente MCP. No canalices información personal de terceros a través de él.

Las contribuciones que existan principalmente para derrotar las protecciones de un sitio específico, recolectar credenciales o ampliar el abuso no se fusionarán.

## Licencia

[MIT](LICENSE) © Yuen Lau
Install Server
A
license - permissive license
A
quality
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI agents to authenticate with websites using a real Chromium browser with anti-detection measures and human-in-the-loop support for captchas and 2FA. Features stealth browsing, human-like interactions, and persistent session storage to automate and resume login workflows.
  • A
    license
    B
    quality
    F
    maintenance
    Enables AI agents to directly control your real Chrome browser with full context including login sessions, cookies, and open tabs. It provides tools for page scanning, JavaScript execution, CDP control, screenshots, and physical mouse/keyboard input for authentic browser automation.
    20
    239
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Lets AI assistants control your real Chrome browser to perform web tasks like reading pages, taking screenshots, clicking, and typing, using your existing logged-in sessions.
    131
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Gives your AI agent a persistent browser identity with anti-detection, credential vault, and multi-persona support for automated web browsing, login, and signup.
    31
    8
    MIT

View all related MCP servers

Related MCP Connectors

  • Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.

  • AI-powered browser automation — navigate, click, fill forms, and extract data from any website.

  • Stealth web browser for agents: search, fetch, click and type through persistent sessions over MCP.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lauyuen/stealth-browser-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server