Decisiones técnicas
Un cliente DevTools escrito a mano con 27 métodos permitidos, flujos estándar en lugar de un puerto, una ventana de confirmación que el cliente del modelo no puede responder y las opciones descartadas con lo que las reabriría.
Python, cuatro dependencias fijadas
El servidor es un paquete de Python (3.12 o posterior). Sus dependencias de
ejecución están fijadas a versiones exactas en pyproject.toml: mcp 1.25.0 (el
SDK de MCP), websockets 15.0.1, pillow 12.0.0 y pydantic 2.12.5. Entre
ellas no hay ninguna biblioteca de automatización de navegador.
Un cliente DevTools escrito a mano
Con una biblioteca de automatización general, lo que el servidor puede enviar al
navegador es todo lo que la biblioteca puede enviar. El servidor tiene en cambio
su propio cliente para el Chrome DevTools Protocol, y los métodos que puede llamar
son una lista de 27, en un módulo; una prueba compara esa lista con cada
nombre de método que usa el código. Los scripts llegan a una página solo desde una
tabla de textos constantes de ese módulo. Los argumentos de una herramienta viajan
en el campo arguments del protocolo y nunca se escriben en un script, de modo
que un valor que elige el modelo no puede convertirse en código.
Flujos estándar, sin puerto
El servidor habla con su cliente por la entrada y la salida estándar y no mantiene ningún socket de escucha. Un puerto de escucha puede alcanzarlo cualquier proceso de la máquina; los flujos estándar atan el servidor al único cliente que lo inició. Se ejecuta con un límite de archivo core de cero y no escribe en su salida estándar nada que no sea el protocolo.
Una confirmación que el cliente no puede responder
El cliente MCP actúa por el modelo y puede responder él mismo a una petición. Por
eso un pago, una eliminación irreversible o un cambio de secreto se confirma en
una ventana que el servidor abre con kdialog o zenity, iniciada sin shell, que
muestra el estado leído en el navegador en ese momento: el origen, el gesto, el
texto del elemento, el destino del formulario, los importes encontrados. El
rechazo es el botón predeterminado cuando el programa de ventana lo permite; la
falta de respuesta en 90 segundos cuenta como rechazo. Una respuesta cubre una
acción. La única excepción, una petición a través del cliente (elicitation),
necesita una declaración de su perfil de operador.
Lo que arma el bloqueo es un vocabulario escrito en el código y los campos de
tarjeta de la página. El intent_category del modelo y las heurísticas de la
página pueden añadir un bloqueo; nada quita ninguno, y el perfil del operador no
puede configurarlos.
Descartado, y lo que lo reabriría
- Playwright o una biblioteca parecida. Lo que el servidor envía sería la lista de la biblioteca, no la del proyecto. Lo reabriría: un navegador cuyo protocolo el cliente escrito a mano ya no pueda hablar.
- Una herramienta que ejecute un script. Eludiría las marcas, las comprobaciones de identidad, el bloqueo y las máscaras, y leería todo lo que contenga una página. Lo reabriría: una tarea suya que las herramientas no puedan hacer, y entonces como un nuevo script constante, nunca uno que escriba el modelo.
- Leer dentro de los marcos. Un marco de otro origen es otro sitio, a menudo de pagos o de publicidad. Lo reabriría: un sitio de su lista cuyo contenido necesario esté en un marco del mismo origen.
- Un transporte de red. Un puerto de escucha es accesible para cualquier proceso local. Lo reabriría: un cliente que usted necesite y que solo alcance servidores por la red.
- Topes más altos. Mantienen acotado lo que recibe el modelo. Los reabriría: una página cuya única capa se recorta con el orden actual.
- Una herramienta que convierta credenciales. Se entregaría al modelo la ruta de un archivo de secretos. La reabriría: un operador sin shell y una manera de mantener los valores fuera de la sesión del modelo.
- Un contexto de navegador propio del servidor. Sus pestañas no compartirían sus sesiones iniciadas, la razón de ser del proyecto. Lo reabriría: un navegador que acepte el ajuste de descargas para una sola pestaña.
Diwall, el proyecto del que desciende este, también da a un modelo una imagen con elementos numerados y el árbol de accesibilidad; su navegador y su transporte no son estos. Cómo se relacionan los dos proyectos está en El proyecto.