Un agente de IA que corre dentro de la pestaña con Pyodide y Ollama
El bucle del agente vive en la pestaña, no en un Chrome headless: Pyodide aporta CPython en WebAssembly, el DOM local hace de herramienta y Ollama razona.

Cuando un agente tiene que manejar una aplicación web, lo habitual es lanzar Chrome headless y conducirlo con Playwright. Hay un atajo menos obvio: meter al agente dentro de la pestaña. Pyodide aporta CPython compilado a WebAssembly, la página da acceso directo a su DOM y a su red, y un modelo local servido por Ollama hace de backend de razonamiento. El autor del montaje lo deja claro desde el principio: lo que construye es una capa de herramientas al estilo MCP, no una implementación del protocolo.
El problema del enfoque clásico es que cada interacción es un ida y vuelta entre dos procesos. La sesión real (cookies, login, estado renderizado) vive en el navegador que el usuario está mirando, mientras el agente trabaja sobre una copia sintética. Sincronizar esos dos mundos es de donde salen los fallos y la latencia.
El bucle se ejecuta en la pestaña
La propuesta invierte el reparto. Un registro de herramientas escrito en Python expone operaciones del DOM como herramientas con nombre: read_dom, click_element, evaluate_js y done. El modelo las invoca con argumentos en JSON, la forma que popularizó MCP, y una función de despacho ejecuta cada llamada contra la página viva. El razonamiento sigue fuera, en Ollama: percepción y acción en la pestaña, inferencia en el modelo local.
Cada paso del bucle lee el cuerpo de la página, recorta el contenido a 2000 caracteres y lo mete en un prompt junto con la tarea. La llamada va a http://localhost:11434/api/generate pidiendo salida en JSON, con llama3.2 como modelo. El bucle se corta cuando el modelo invoca la herramienta done o al llegar a cinco pasos.
Dos requisitos que rompen el montaje
Ollama rechaza las peticiones cross-origin por defecto, y el código del navegador llamando a localhost:11434 lo es. Hay que arrancarlo con una allowlist: OLLAMA_ORIGINS="http://localhost:8000" ollama serve. El comodín * vale solo para pruebas locales. Además, la página tiene que servirse por HTTP; abrirla como fichero rompe la llamada.
El propio autor señala el agujero de evaluate_js: expone ejecución arbitraria de JavaScript con acceso al contexto de sesión y a las credenciales de la página. Lo considera aceptable en un experimento local sobre páginas propias, pero un despliegue real debería limitar el conjunto de operaciones con una lista blanca y no exponer nunca un eval sin restricciones, igual que un servidor MCP en producción valida cada entrada de herramienta.
Lo aprovechable aquí no es el código, que son unas pocas decenas de líneas, sino el reparto: si el agente vive donde vive la sesión, desaparece toda la fontanería de sincronizar un navegador headless con el real. Llevarlo a un MCP completo sobre transporte HTTP dentro del navegador queda como proyecto aparte, y el autor no dice cuándo piensa abordarlo.

