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 icon

ascended-browser

Un navegador real para tu agente de IA. Un comando para añadirlo.

PyPI npm MIT license

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).

Front-end QA. react.dev on a phone and a tablet, dark/light, before/after screenshots, an audit outlining the real offending elements, console and network.

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.

Browsing. Types into Wikipedia's search, finds a fact in the article, then searches YouTube and plays the first video.

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.

Real forms. booking.com: popup, destination autocomplete, date picker, search, sort by price.

Formularios reales. booking.com: ventana emergente, autocompletado de destino, selector de fechas, búsqueda, ordenar por precio.

Saved logins. A login is saved once with the CLI; the agent signs in with browser_login; your screen shows the account while every result and screenshot the agent gets has it redacted.

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

HerramientaQué hace
browser_openAbre una URL (o varias a la vez) y devuelve lo que hay en la página, cada control con una referencia
browser_observeVuelve a mirar la página, o limita a una región, una consulta o un filtro
browser_actnavigate, click, fill, fill_form, select, check, date, press, upload, scroll, wait, sequence: cada una verificada, cada una respondida con lo que cambió
browser_extractLee 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_screenshotUna 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_viewportRedimensiona a teléfono/tableta/escritorio (Linux), emula modo oscuro, movimiento reducido, colores forzados o sin conexión
browser_evaluateJavaScript de solo lectura, verificado por políticas
browser_tabsLista, cierra o duerme pestañas
browser_flowGraba una tarea una vez, la reproduce en la siguiente página con nuevos valores
browser_loginInicia 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_wallEspera 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 (leer input.value devuelve [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

VariablePredeterminado
ASCENDED_BROWSER_WINDOWocultoshow abre una ventana visible
ASCENDED_DATA_DIR~/.local/share/ascended/browserPerfil del navegador (los inicios de sesión persisten), inicios de sesión guardados (logins.db), archivos de sesión
ASCENDED_RESULT_MAX_CHARS24000Los 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_LEVELWARNINGLos registros van a stderr

Límites

  • Redimensionamiento de ventana (browser_viewport ajustes 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 con ASCENDED_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.