Ascended Browser
MCP de navegador para agentes de codificación: acciones verificadas, automatización de formularios, capturas de pantalla y herramientas de QA/depuración.
Documentación
ascended-browser
Un navegador real para tu agente de IA. Un comando para añadirlo.
Un navegador real para agentes de IA, como servidor MCP. Tu agente abre páginas, las lee y actúa sobre ellas mediante acciones verificadas: rellena un formulario completo en una sola llamada, selecciona "Sra." de un menú desplegable personalizado de React por nombre, y se le informa de cómo respondió la página, en lugar de hacer clic en coordenadas y esperar.
Es el navegador de Ascended, empaquetado por separado: Camoufox (un Firefox reforzado que parece un navegador de persona real para los sitios que visita) detrás del mismo despachador de herramientas, lectura de páginas y formato de resultados que usa el propio agente de Ascended.
Verlo funcionar
Tres ejecuciones reales de Claude Code con solo este servidor adjunto, en sitios en vivo. El panel lateral es la transcripción propia de Claude Code: cada llamada de herramienta que hizo y lo que devolvió, incluidos los errores, con el tiempo real transcurrido. La espera está recortada y el tiempo de las herramientas se reproduce más rápido; el puntero, los marcos de dispositivos, los paneles de devtools y los contornos se dibujan después a partir del registro de eventos del servidor (demo/record_demo.py), de modo que se sitúan sobre lo que el agente realmente tocó y leyó. Las grabaciones de pantalla completas sin editar están en videos/unedited/ (el navegador se controla mediante Playwright, por lo que no aparece ningún puntero del sistema operativo en ellas).
QA de front-end. react.dev en un teléfono y una tableta, modo oscuro/claro, capturas de pantalla antes/después, una auditoría que señala los elementos reales que causan el problema, consola y red.
Navegación. Escribe en la búsqueda de Wikipedia, encuentra un dato en el artículo, luego busca en YouTube y reproduce el primer video.
Formularios reales. booking.com: ventana emergente, autocompletado de destino, selector de fechas, búsqueda, ordenar por precio.
Inicios de sesión guardados. Guardas un inicio de sesión una vez; el agente inicia sesión con él y nunca lo ve. Construido a partir de una ejecución real (demo/login_demo.py, luego demo/login_explainer.py): la salida de la CLI, la pantalla y el texto e imágenes exactos que el agente recibió.
Haz clic en cualquier clip para ver el MP4 de máxima calidad.
Instalación
Desde Python (3.11 o más reciente) o desde npm; ambos ejecutan el mismo servidor.
uvx ascended-browser doctor # checks the machine; downloads nothing
uvx ascended-browser fetch # downloads the browser now (~700 MB; otherwise on first use)
npx -y ascended-browser doctor # the same, from npm
El navegador es Camoufox 135.0.1-beta.24, la compilación en la que se ejecutó cada prueba aquí; está fijado, por lo que una versión más reciente de Camoufox nunca cambia lo que tu agente controla, y cualquier otro Camoufox que tengas instalado se deja como está. Ejecuta fetch una vez antes de añadir el servidor a un agente, para que su primera llamada de herramienta no espere la descarga.
El paquete npm es un pequeño lanzador: ejecuta el paquete Python con uvx cuando uv está instalado (uv trae su propio Python), si no con pipx, si no con un venv privado creado con tu Python 3.11+. Usa el comando que prefieras en las configuraciones siguientes (npx -y ascended-browser en lugar de uvx ascended-browser).
Linux: instala xvfb para mantener el navegador en una pantalla virtual (lo más parecido a una pantalla real); sin él, el navegador se ejecuta en modo headless. En una pantalla, browser_viewport redimensiona la ventana real, por lo que las comprobaciones de teléfono y tableta reorganizan la página en los puntos de interrupción reales.
Añadirlo a tu agente
Claude Code
claude mcp add ascended-browser -- uvx ascended-browser
# or: claude mcp add ascended-browser -- npx -y ascended-browser
Codex
codex mcp add ascended-browser -- uvx ascended-browser
Si Codex pregunta antes de cada acción del navegador depende del modo de permisos que elijas en Codex: bajo Acceso completo simplemente las ejecuta; bajo Pedir aprobación pregunta primero. En un modo de sandbox, codex exec no puede preguntar y falla en cada llamada: usa Acceso completo, o preaprueba las herramientas de este servidor añadiendo default_tools_approval_mode = "approve" bajo [mcp_servers.ascended-browser] en ~/.codex/config.toml.
opencode (opencode.json)
{
"mcp": {
"ascended-browser": { "type": "local", "command": ["uvx", "ascended-browser"], "enabled": true }
}
}
Cursor, Windsurf, Claude Desktop y otros clientes: un servidor stdio con el comando uvx y los argumentos ["ascended-browser"], o el comando npx y los argumentos ["-y", "ascended-browser"].
Herramientas
| Herramienta | Qué hace |
|---|---|
browser_open | Abre una URL (o varias a la vez) y devuelve lo que hay en la página, cada control con una referencia |
browser_observe | Vuelve a mirar la página, o limita a una región, una consulta o un filtro |
browser_act | navigate, click, fill, fill_form, select, check, date, press, upload, scroll, wait, sequence: cada una verificada, cada una respondida con lo que cambió |
browser_extract | Lee el texto de la página y el estado de los campos, find una frase, lista cada coincidencia de un selector CSS con su texto y atributos (cada enlace de producto, cada precio), o read=console, read=network, read=inspect, read=audit, read=design para depurar una página |
browser_screenshot | Una imagen, cuando una observación no puede describirla: lienzo, gráficos, diseño visual; compare_with compara con una imagen anterior u otra pestaña |
browser_viewport | Redimensiona a teléfono/tableta/escritorio (Linux), emula modo oscuro, movimiento reducido, colores forzados o sin conexión |
browser_evaluate | JavaScript de solo lectura, verificado por políticas |
browser_tabs | Lista, cierra o duerme pestañas |
browser_flow | Graba una tarea una vez, la reproduce en la siguiente página con nuevos valores |
browser_login | Inicia sesión con un inicio de sesión que guardaste (ver Inicios de sesión guardados); el agente nunca ve sus valores |
wait_for_bot_wall | Espera a que pase una página de "comprobando tu navegador"; presiona una casilla de Turnstile/reCAPTCHA si una bloquea un formulario |
Los resultados largos se devuelven recortados, con un evidence_ref que browser_extract pagina, para que una página enorme no inunde el contexto del agente.
Cada acción espera a que la página se estabilice, bajo un tiempo de espera máximo, y dice cuándo no se pudo confirmar su efecto. Si un turno termina mientras una sigue en ejecución, al siguiente turno se le informa en lugar de encontrar una página que no puede explicar: un clic interrumpido (detuviste el turno) se nombra en el siguiente resultado para esa pestaña, y una acción cuyo servidor murió (claude -p finalizando, una sesión SSH cayéndose) se lista con el primer resultado de la siguiente sesión, para que el agente verifique antes de repetir un pedido o un formulario.
Inicios de sesión guardados
Guarda un inicio de sesión una vez y el agente puede iniciar sesión con él, sin verlo nunca.
uvx ascended-browser login add github.com --username you@example.com # prompts for the password
uvx ascended-browser login add accounts.example.com --name Work --totp # also a TOTP secret (or otpauth:// URI)
uvx ascended-browser login list # names, usernames, sites; never passwords
uvx ascended-browser login edit Work --password # change only what you pass
uvx ascended-browser login remove Work
El sitio es el host de la página de inicio de sesión (accounts.example.com, no example.com, cuando difieren); pasa varios para una cuenta en varios hosts. Las contraseñas y los secretos TOTP provienen de un mensaje oculto, o de stdin con --password-stdin, nunca de la línea de comandos, donde terminarían en el historial del shell y en la lista de procesos.
Luego pide a tu agente que inicie sesión. browser_open le dice que existe un inicio de sesión guardado para la página, y browser_login encuentra los campos de nombre de usuario, contraseña y código de un solo uso y escribe los valores (submit: true también presiona el botón). Lo que recibe el agente:
- Cada resultado de herramienta se depura de cada nombre de usuario, contraseña y secreto TOTP guardado, también codificado en URL, escapado en JSON o HTML:
browser_observe,browser_evaluate(leerinput.valuedevuelve[redacted]),browser_extract(texto de página, valores de campos, cuerpos de red) y resultados de acciones. Una página que imprime "Sesión iniciada como you@example.com" se lee como "Sesión iniciada como [redactado]". - Cada captura de pantalla se enmascara antes de llegar al agente: campos de contraseña, tarjeta y código de un solo uso, campos de nombre de usuario y correo electrónico, y cualquier valor guardado mostrado como texto de página.
Para sitios que un inicio de sesión guardado no puede rellenar (inicio de sesión único, passkeys, un CAPTCHA, un código enviado por correo electrónico), inicia sesión manualmente una vez:
uvx ascended-browser signin https://example.com/login # opens the browser; sign in, then press Enter
Las cookies permanecen en el perfil del navegador desde el que comienza cada sesión posterior del agente. Cierra primero las sesiones de agente en ejecución, para que el inicio de sesión aterrice en el perfil guardado en lugar de en una copia de la sesión.
La bóveda es logins.db en el directorio de datos, legible solo por tu usuario, y no está cifrada (como los archivos de credenciales de gh o aws). La depuración y el enmascaramiento cubren lo que devuelven las herramientas del navegador. Un agente que también tiene herramientas de shell o archivos (Claude Code, Codex) se ejecuta como tú y puede leer cualquier archivo que tú puedas, incluido este. Deniega a sus herramientas de archivos la ruta (en Claude Code, "deny": ["Read(~/.local/share/ascended/**)"] bajo permissions en ~/.claude/settings.json) y mantén los comandos de shell bajo aprobación; un agente libre de ejecutar cualquier comando aún puede llegar al archivo. Los valores de menos de 4 caracteres no se depuran, y un valor que la página cambia (los últimos cuatro dígitos de una tarjeta, por ejemplo) no se compara.
Configuración
| Variable | Predeterminado | |
|---|---|---|
ASCENDED_BROWSER_WINDOW | oculto | show abre una ventana visible |
ASCENDED_DATA_DIR | ~/.local/share/ascended/browser | Perfil del navegador (los inicios de sesión persisten), inicios de sesión guardados (logins.db), archivos de sesión |
ASCENDED_RESULT_MAX_CHARS | 24000 | Los resultados más largos se recortan con un evidence_ref |
ASCENDED_SETTING_<KEY> | Cualquier configuración del navegador, p. ej. ASCENDED_SETTING_BROWSER_WORKSPACE_OBSERVE_FORMAT=outline | |
ASCENDED_LOG_LEVEL | WARNING | Los registros van a stderr |
Límites
- Redimensionamiento de ventana (
browser_viewportajustes preestablecidos de teléfono/tableta/escritorio o cualquier ancho y alto) funciona en Linux: en la pantalla virtual propia del paquete por defecto, o en tu pantalla X11 conASCENDED_BROWSER_WINDOW=show. En macOS y Windows la ventana mantiene su tamaño de lanzamiento; la emulación (modo oscuro, movimiento reducido, colores forzados, sin conexión) funciona en todas partes. Las cuadrículas de capturas de pantalla en varios tamaños en una sola llamada no están incluidas. - Extracción con forma de esquema (un modelo lee la página en tu forma JSON) es una función de la aplicación Ascended que necesita un modelo, por lo que no está en este paquete y sus parámetros no están expuestos. Todo lo listado en Herramientas se ejecuta sin un modelo.
- Un proceso de servidor es una sesión de navegador: las pestañas y referencias duran hasta que tu cliente se desconecta; el perfil (cookies, inicios de sesión) dura entre sesiones. Varias sesiones pueden ejecutarse a la vez: la primera usa el perfil guardado, y cualquier otra que se inicie mientras corre obtiene su propia copia, ya iniciada en lo que fuera el perfil guardado. Los inicios de sesión hechos en una copia terminan con esa sesión.
Cómo está construido
src/ascended_browser/_app se genera desde Ascended mediante scripts/sync_from_ascended.py: los módulos del navegador copiados tal cual, el despachador de herramientas del navegador y el formateador de resultados extraídos por alcanzabilidad, y cada importación del resto de la aplicación reescrita a runtime/ (sustitutos independientes pequeños). La sincronización rechaza cualquier importación de la aplicación que no pueda mapear.
Probado con los arneses de estrés propios de Ascended ejecutados contra este paquete (tests/stress/), una prueba de humo MCP del lado del cliente (tests/smoke_mcp.py) y tareas de sitios web en vivo dadas a agentes reales (tests/agents/). Los inicios de sesión guardados tienen los suyos: tests/test_logins.py (la CLI de la bóveda y el depurador), tests/login_redaction_mcp.py (un cliente real inicia sesión en una página que hace eco del inicio de sesión en su texto, DOM y red, y ninguna herramienta puede mostrarlo; con tesseract instalado también lee las capturas de pantalla) y tests/signin_persists.py.
Lo que se ha verificado hasta ahora: Linux (Python 3.11, 3.12 y 3.14), con Claude Code y Codex (0.160) en tareas de sitios en vivo, opencode en una tarea de navegación, y el lanzador npm a través de uvx y a través de su propio venv. macOS y Windows deberían funcionar en modo headless o con una ventana visible, pero no están probados.
Licencia
MIT. El axe-core incluido (_app/browser_vendor/axe-core) es MPL-2.0 y mantiene su aviso en el archivo.



