Diwall MCP
Un servidor MCP que entrega a un modelo de lenguaje la captura de pantalla, el árbol de accesibilidad y los gestos del navegador en el que usted ha iniciado sesión. Una ventana pide su respuesta antes de una acción irreversible, y un campo de contraseña se enmascara en la imagen y en el texto.
Un modelo que no ve su navegador trabaja a partir de su descripción. Lo que usted omite en esa descripción, él no lo sabe.
Con Diwall MCP, abre páginas en un navegador que usted ha elegido para él, recibe la captura de pantalla y el árbol de accesibilidad que usted vería, y actúa en las sesiones en las que usted ha iniciado sesión allí.
Primero, lo que recibe el modelo

Una llamada a la herramienta observe sobre una página de inicio de sesión,
hecha en una Raspberry Pi 4 (ARM de 64 bits), en un Chromium que se inició
para el servidor sobre un perfil propio. No se escribió nada: el campo de contraseña está
vacío y el servidor lo cubre en la imagen de todos modos.
La imagen es la que observe entrega al modelo: cada elemento que puede tocar
está en un marco numerado, y el campo de contraseña está cubierto por un
rectángulo sólido.
El texto que recibe el modelo, con claves omitidas, y el nombre de la aplicación y el del equipo sustituidos por puntos suspensivos, sin ninguna otra modificación:
{"ok": true,
"server": {"capture": "ok",
"counters": {"marks": 3, "tree_lines": 10, "redacted_fields": 0,
"frames_masked": 0, "marks_truncated": false}},
"page_content": {"title": "… — Connexion",
"tree": ["RootWebArea \"… — Connexion\"",
" StaticText \"…\"",
" StaticText \"Interface d'administration\"",
" form \"\"",
" StaticText \"Identifiant\"",
" textbox \"Identifiant\"",
" StaticText \"Mot de passe\"",
" textbox \"Mot de passe\"",
" button \"Se connecter\"",
" StaticText \"…\""],
"elements": [{"mark": 1, "role": "textbox", "name": "Identifiant", "value": "",
"state": ["focused", "required"]},
{"mark": 2, "role": "textbox", "name": "Mot de passe", "value": "",
"state": ["required"]},
{"mark": 3, "role": "button", "name": "Se connecter", "value": ""}]}}
Omitido: bajo server, las claves origin, notices, tab_id,
snapshot_id, loader_id, viewport, dialog_open, image, operation_id y
tool, y los contadores omitted_not_visible y tree_truncated; bajo
page_content, url; en cada elemento, in_viewport. El campo de contraseña
no contiene nada, así que la respuesta no guarda ningún valor para él. Una
llamada del mismo tipo se puede repetir sobre la página de demostración del
repositorio, docs/demo/index.html: la prueba de humo la hace en su máquina:
Instalar y comprobar →
Qué es
Diwall MCP da a su modelo los ojos y las manos de una persona sentada ante su navegador, dentro de sus propias sesiones.
Su cliente MCP inicia el servidor y le habla por la entrada y la salida
estándar; el modelo recibe catorce herramientas. El servidor se conecta al
navegador que usted inicia por su cuenta, sobre un perfil
reservado para él, con su puerto de depuración en 127.0.0.1. El modelo observa
una pestaña y designa un elemento por su marca; el servidor comprueba que el
elemento sigue siendo el que se observó antes de hacer clic o de escribir.
Tres reglas no dependen de lo que decida el modelo. El servidor solo lee y actúa en los sitios que admite su política de orígenes: por defecto, los que enumera su perfil. Un pago, una eliminación irreversible o un cambio de secreto espera su respuesta en una ventana que el servidor abre en su pantalla. Una contraseña se escribe desde su directorio cifrado y nunca llega al modelo. Lo que nunca hace →
mcp-server-diwall-browser, en
Python 3.12 o posterior; se instala desde un paquete o desde un clon del
repositorio.Una sesión, de la observación a una ventana de confirmación
→ observe {"tab_id": "f395445606543e95"} capture: ok — marks: 4 — redacted_fields: 1 [1] textbox "User name" [2] textbox "Password" [3] button "Sign in" [4] link "Help" → click {"snapshot_id": "56f18791c433fa584ea5067f99185355", "mark": 3} → click {"snapshot_id": "…", "mark": …} Confirmation du serveur MCP Origine : https://shop.example.invalid Outil : click — geste : clic Texte tiré de la page : button "Payer maintenant" Cible du formulaire : https://shop.example.invalid Montants détectés (heuristique) : 42,00 € Catégories : paiement Signaux : vocabulary_payment, card_field_on_page, card_field_in_form [ Autoriser ] [ Refuser ]
El modelo no apunta a píxeles: designa la marca 3, ligada al botón que el navegador mantiene detrás. Si la página ha movido o sustituido ese botón desde la observación, el clic se rechaza y el modelo observa de nuevo. El segundo clic apunta a un botón de pago: el servidor solo lo hace una vez dado su acuerdo, y no ocurre nada hasta que usted responda, en una ventana que pertenece al servidor, no al cliente del modelo. Noventa segundos sin respuesta cuentan como un rechazo.
La primera llamada es la observación real de arriba, abreviada a sus marcas. El
clic en Sign in solo muestra la llamada. La ventana pertenece a otra página:
es el texto que el servidor construyó en la sesión propia del proyecto para un
clic en un botón de pago, en una dirección de ejemplo
(sección 9 de la guía del operador);
sus rótulos están en francés, tal como el servidor los escribe. Ese clic no
nombra ningún intent_category: el bloqueo lo armaron las palabras y los campos
de tarjeta de la página, la línea Signaux.
Adónde ir a continuación
- Guías: de un clon del repositorio a un modelo que trabaja en su navegador, en cinco pasos, cada uno con su comprobación.
- Percepción: lo que contiene una observación y cómo se comprueba una marca antes de un clic.
- Casos de uso: las herramientas en el orden de una tarea, en una sesión en la que ya ha iniciado sesión, y lo que el proyecto ha ejecutado hasta ahora.
- Arquitectura: lo que sale de su máquina, las decisiones tomadas, los límites.
- Agentes: si usted es un modelo de lenguaje, empiece por ahí.
- El proyecto: de dónde viene, su relación con Diwall, quién lo construyó.