opencode-gui-bridge
opencode-gui-bridge
Permite que opencode (o cualquier cliente MCP) obtenga capacidades de uso de computadora: pueda ver (entender el estado de la pantalla), operar (hacer clic / escribir / desplazarse) y verificar (confirmar que la acción surtió efecto).
Implementado con PySide6 + Win32 API + Windows UI Automation + OCR local, con cero dependencias a nivel de sistema. Todas las operaciones básicas se ejecutan localmente sin necesidad de red (solo la opción visual describe puede requerir una API de red).
Inicio rápido
Descomprima el proyecto en cualquier directorio (ejemplo
D:\gui-bridge\), haga doble clic ensetup.baty espere a que muestreDone.En su directorio de trabajo de opencode, coloque un archivo
opencode.json(contenido según «Integración con opencode»), y modifique las dos rutas para que apunten a las rutas reales del paso 1Reinicie opencode
Use el cuadro de diálogo de IA directamente:
«Lista las ventanas de la computadora» → obtiene el resultado de
list_targets«Abre el bloc de notas y escribe hola dentro» → se ejecuta automáticamente: abrir → vincular → instantánea → clic → escribir → verificar
Instalación
.\setup.batEl script lo hace todo de una vez: crea el entorno virtual venv (si ya existe, lo omite) → instala dependencias con pip → ejecuta una prueba de humo. Si ve Done., la instalación fue exitosa; en caso de fallo, el script sale e imprime el motivo.
Hacerlo manualmente produce el mismo resultado:
python -m venv venv
venv\Scripts\python -m pip install -e .
venv\Scripts\python tests\smoke_test.pyRequisitos: Windows 10/11 + Python 3.10 o superior (marque Add python.exe to PATH durante la instalación).
Integración con opencode
Coloque opencode.json en el directorio de trabajo donde ejecuta opencode (no dentro del proyecto):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"gui-bridge": {
"type": "local",
"command": [
"D:\\gui-bridge\\venv\\Scripts\\python.exe",
"D:\\gui-bridge\\server.py"
],
"enabled": true,
"environment": {
"SILICONFLOW_API_KEY": "{env:SILICONFLOW_API_KEY}"
}
}
}
}Dos cambios:
Cambie las dos
D:\\gui-bridge\\...por sus rutas reales (en JSON,\debe escribirse como\\)La línea
SILICONFLOW_API_KEY: el OCR local y el clic/escritura no necesitan ninguna clave, solo necesita configurarla si planea usar la descripción visual (consulte la siguiente sección). Si no tiene clave, elimine esa línea.
Para verificar la integración: después de reiniciar opencode, diga a la IA «Lista las ventanas de la computadora»; si la IA devuelve una lista de ventanas, significa que las rutas de python.exe y server.py están configuradas correctamente.
Configuración del canal visual (para describe, opcional)
El campo channels.vision devuelto por list_targets indica el estado: ready (con clave) o no-key (sin clave). Usa una API compatible con OpenAI, de cualquier proveedor:
Variable de entorno | Función | Valor por defecto |
| Dirección de la API (OpenAI/DeepSeek/通义/智谱, etc.) |
|
| Clave de visión (si se deja vacía, usa | — |
| Modelo de comprensión visual |
|
| Modelo de OCR visual (respaldo de OCR para describe) |
|
Hay tres formas de configurarlo, elija una:
a) Incrustado en opencode.json (sigue la configuración, recomendado)
"environment": {
"VISION_BASE_URL": "https://api.siliconflow.cn/v1",
"VISION_API_KEY": "{env:OPENAI_API_KEY}",
"VISION_MODEL": "Qwen/Qwen3-VL-32B-Instruct"
}{env:XXX} indica que se leerá la variable de entorno del mismo nombre ya existente en su máquina.
b) Persistente a nivel de sistema (afecta a todas las terminales):
setx VISION_API_KEY "sk-xxxx"
setx VISION_BASE_URL "https://api.siliconflow.cn/v1"Después de configurarlo, debe reiniciar la terminal y reiniciar opencode para que surta efecto.
c) Solo para la sesión actual de la terminal:
$env:VISION_API_KEY = "sk-xxxx"Configuración del canal CDP (WebView2 / Tauri / Electron)
En aplicaciones con núcleo Web como Tauri, WebView2, Electron, etc., UIA solo puede ver la cáscara externa, no el DOM. Al habilitar el puerto de depuración CDP, la instantánea (snapshot) automáticamente usará el canal CDP (los ids de elementos tienen el prefijo d:), y leer el texto completo es cuestión de milisegundos.
Active el puerto de depuración según el tipo de aplicación:
Tipo de aplicación | Método |
Navegador Chrome/Edge | Iniciar con argumento: |
WebView2 (embebido en WPF/WinForms/Tauri) | Primero establezca la variable de entorno y luego inicie la aplicación: |
Aplicación Electron | Iniciar con argumento: |
$env:WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS = "--remote-debugging-port=9222 --remote-allow-origins=*"
Start-Process 目标应用Después de iniciar, verifique con list_targets: el campo channels.cdp mostrará el número de puerto (por ejemplo 9222). A partir de entonces, snapshot usará automáticamente CDP y act dirigirá las operaciones del DOM automáticamente:
Leer el texto completo de la página: DOM innerText, <10ms (el OCR toma de 1 a 6 s)
Clic: clic DOM nativo (omite las capas de cobertura física hit-test)
Entrada: canal de entrada real
Input.insertText(compatible con editores como Quill)Coordenadas de elementos: aproximadas (CSS × DPR + posición de la ventana) (las operaciones no dependen de coordenadas)
Si no se habilita, no afecta el uso: este tipo de aplicaciones degrada automáticamente al canal de OCR local, que igual puede leer y operar la pantalla.
Caja de herramientas: 7 herramientas MCP
Herramienta | Parámetros | Función | Retorno típico |
| Ninguno | Enumera ventanas disponibles + estado de 4 canales |
|
| Manejador o título (coincidencia de subcadena) | Vincular ventana objetivo |
|
|
| Instantánea de la interfaz, genera una lista de elementos con ids estables | Texto de varias líneas, como |
| Acción y objetivo | Clic / escritura / teclas / scroll / Enter, con verificación |
|
| Región o texto | Espera un cambio en la interfaz / la aparición de un texto |
|
| Región opcional (por defecto la ventana objetivo) | Guarda captura en | Ruta de guardado |
| Ruta de archivo de captura, omitido = ventana objetivo | El modelo visual describe la escena (requiere clave de visión) | Descripción en lenguaje natural |
Regla: snapshot/act requieren llamar a focus_target antes.
Detalles de las acciones de act
action | Parámetros | Descripción |
|
| Clic en un elemento, elige el canal según el prefijo del id automáticamente |
|
| Focaliza el elemento, escribe el texto y luego verifica automáticamente con OCR si el texto aparece |
|
| Teclas combinadas, |
| Ninguno | Equivalente a |
|
| Desplazamiento; si se dan coordenadas, desplaza a ese punto |
Estructura de retorno {ok, verify, detail}:
ok: si la acción se ejecutóverify: resultado de la verificación automática después de ejecutarchanged/matched: la interfaz realmente cambió / el contenido escrito se confirmóno_change/no_match: no se detectó el cambio esperado (posiblemente la acción no surtió efecto, se recomienda tomar una nueva instantánea para ver el estado actual)cdp_insert/skipped: se usó entrada CDP o se desactivó la verificaciónfailed: fallo de ejecución;detailincluirá el motivo; en caso de fallo de clic, se reintenta físicamente automáticamente y adjunta una ruta de captura de diagnóstico
detail: explicación legible para humanos, puede incluirdiagnóstico screenshot: <ruta>
Arquitectura
┌─ Agent (AI)
│ 7 个 MCP 工具: list_targets / focus_target / snapshot /
│ act / wait_change / screenshot / describe
├─ server.py 会话编排: 目标窗口绑定, 通道选择, 验证闭环
├─ snapshot.py 统一元素抽象: {id, type, text, bbox, enabled, focused}
│ 通道融合 + 稳定 id (u:路径链 / o:OCR索引)
├─ executor.py 动作路由: click/input/press/scroll + 内置验证
├─ uia.py UIA 控件树通道 (L1, 毫秒级, 原生应用)
├─ ocr.py 本地 OCR 通道 (L2, 1~6s, WebView 兜底)
├─ win32io.py Win32 底层: 窗口/鼠标/键盘/截图/PostMessage/PrintWindow
└─ vision.py 视觉模型通道 (L3, 兜底理解, 需 API key)
运行日志写入 `logs/gui-bridge.log`(JSON lines:每次工具调用的耗时/通道/结果)。Diseño central
La IA opera solo por id de elemento, no por coordenadas. La instantánea da los ids, y
actlos enruta automáticamente al mejor canal.Degradación automática de canales: CDP → UIA → OCR → visual; clics: InvokePattern → PostMessage → físico.
Ciclo de verificación integrado:
actretornaverify=changed/no\_match/failedcon la razón.Captura segura frente a oclusiones: el OCR y la verificación usan
PrintWindowpara capturar directamente el contenido real de la ventana objetivo, evitando que si la ventana está cubierta por otras, se mezcle el contenido.
Reglas de id de elemento
Prefijo | Origen | Ejemplo | Estabilidad |
| CDP DOM |
| Estable si la estructura no cambia |
| UIA |
| Estable si la estructura no cambia |
| OCR |
| Necesita una nueva instantánea después de cada cambio de interfaz |
Los ids o: y los u: que quedan obsoletos después de cambios de interfaz requieren volver a tomar snapshot antes de hacer clic.
Pruebas
venv\Scripts\python tests\smoke_test.py # 7 工具 + UIA 全链路(自建测试窗口)
venv\Scripts\python tests\ocr_test.py # OCR 通道兜底链路
venv\Scripts\python tests\stdio_e2e.py # 端到端:真实 MCP stdio 会话Limitaciones conocidas
El DOM de doble capa de WebView2/Tauri no se expone a UIA → se degrada automáticamente al canal OCR (en pruebas se lee y opera la pantalla por completo)
Windows puede impedir que procesos en segundo plano tomen el foco →
focus_targetlo avisará; si es necesario, haga clic manualmente una vez en la ventana objetivoEl canal OCR toma de 1 a 6 s por instantánea (en reposo, el caché de instantáneas puede dar respuesta en menos de un segundo), siendo la principal fuente de latencia en aplicaciones WebView
Actualmente solo admite Windows
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Eyes and hands on real Windows PCs — observe, click, type via Glasswarp API.
Provides cloud browser automation capabilities using Stagehand and Browserbase, enabling LLMs to i…
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Yueqi-Wang-795/opencode-gui-bridge'
If you have feedback or need assistance with the MCP directory API, please join our Discord server