opencode-gui-bridge
opencode-gui-bridge
Даёт opencode (или любому MCP-клиенту) возможности управления компьютером: видеть (понимать состояние экрана), действовать (кликать/вводить/прокручивать), проверять (подтверждать, что действие сработало).
Реализовано на PySide6 + Win32 API + Windows UI Automation + локальный OCR, без системных зависимостей. Базовые операции выполняются локально, без сети (только визуальный describe опционально использует сетевой API).
Быстрый старт
Распакуйте проект в любую папку (пример
D:\gui-bridge\), дважды кликнитеsetup.bat, дождитесь сообщенияDone.В рабочей папке opencode создайте
opencode.json(содержимое — в разделе «Подключение к opencode»), замените два пути на фактические из шага 1Перезапустите opencode
В диалоге с ИИ просто скажите:
«Перечисли окна на компьютере» → получите результат
list_targets«Открой Блокнот и введи туда привет» → автоматически выполнится: открыть → привязать → снимок → клик → ввод → проверка
Установка
.\setup.batСкрипт выполняет всё за один раз: создаёт виртуальное окружение venv (если уже есть — пропускает) → устанавливает зависимости через pip → запускает смоук-тест. Увидели Done. — установка успешна; при ошибке скрипт завершится и выведет причину.
Вручную можно сделать то же самое:
python -m venv venv
venv\Scripts\python -m pip install -e .
venv\Scripts\python tests\smoke_test.pyТребования: Windows 10/11 + Python 3.10+ (при установке отметьте Add python.exe to PATH).
Подключение к opencode
opencode.json размещается в рабочей папке, где вы запускаете opencode (не внутри проекта):
{
"$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}"
}
}
}
}Два изменения:
Замените оба
D:\\gui-bridge\\...на ваши фактические пути (в JSON обратный слэш\пишется как\\)Строка
SILICONFLOW_API_KEY: для локального OCR и кликов/ввода ключ не нужен, он требуется только если вы планируете использовать визуальный describe (см. следующий раздел). Если ключа нет — удалите эту строку.
Проверка подключения: после перезапуска opencode скажите ИИ «Перечисли окна на компьютере»; если ИИ вернёт список окон, значит пути python.exe и server.py настроены правильно.
Настройка визуального канала (для describe, опционально)
channels.vision в ответе list_targets показывает статус: ready (есть ключ) или no-key (нет). Используется OpenAI-совместимый API, любой провайдер:
Переменная окружения | Назначение | По умолчанию |
| Адрес API (OpenAI/DeepSeek/通义/智谱 и др.) |
|
| Визуальный ключ (если пусто — используется | — |
| Модель визуального понимания |
|
| Модель визуального OCR (запасной вариант для describe) |
|
Три способа настройки, выберите любой:
a) Встроить в opencode.json (следует за конфигурацией, рекомендуется)
"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} означает чтение уже существующей переменной окружения на вашем компьютере.
b) Системное постоянное хранение (действует для всех терминалов):
setx VISION_API_KEY "sk-xxxx"
setx VISION_BASE_URL "https://api.siliconflow.cn/v1"После установки нужно перезапустить терминал и перезапустить opencode, чтобы изменения вступили в силу.
c) Только для текущей сессии терминала:
$env:VISION_API_KEY = "sk-xxxx"Настройка канала CDP (WebView2 / Tauri / Electron)
В приложениях на веб-движках (Tauri, WebView2, Electron и т.п.) UIA видит только внешнюю оболочку и не читает DOM. После включения отладочного порта CDP снимок автоматически идёт через канал CDP (префикс id элементов d:), чтение полного текста занимает миллисекунды.
Включите отладочный порт в зависимости от типа приложения:
Тип приложения | Способ |
Браузер Chrome/Edge | Запуск с параметром: |
WebView2 (встроенный в WPF/WinForms/Tauri) | Сначала задайте переменную окружения, затем запустите приложение: |
Приложение Electron | Запуск с параметром: |
$env:WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS = "--remote-debugging-port=9222 --remote-allow-origins=*"
Start-Process 目标应用После запуска проверьте через list_targets: в ответе channels.cdp будет показан номер порта (например 9222). Далее snapshot автоматически использует CDP, а act автоматически маршрутизирует операции с DOM:
Чтение полного текста страницы: DOM innerText, <10ms (OCR занимает 1~6s)
Клик: нативный DOM click (в обход физического hit-test оверлея)
Ввод: Input.insertText — настоящий конвейер ввода (совместим с редакторами типа Quill)
Координаты элементов: CSS×DPR + позиция окна (приблизительно; операции не зависят от координат)
Если порт не включён, это не мешает: такие приложения автоматически переключаются на локальный OCR-канал, и чтение экрана и операции всё равно работают.
Инструментарий: 7 MCP-инструментов
Инструмент | Параметры | Назначение | Типичный ответ |
| нет | Перечислить доступные окна + статус 4 каналов |
|
| дескриптор или заголовок (подстрока) | Привязать целевое окно |
|
|
| Снимок интерфейса, список элементов со стабильными id | Многострочный текст, например |
| действие и цель | Клик/ввод/клавиши/прокрутка/Enter, с проверкой |
|
| область или текст | Ожидание изменения интерфейса / появления текста |
|
| область можно опустить (по умолчанию целевое окно) | Сохранить скриншот в | Путь сохранения |
| путь к файлу скриншота, если пусто — целевое окно | Описание изображения визуальной моделью (нужен визуальный ключ) | Описание на естественном языке |
Правило: snapshot/act можно вызывать только после focus_target.
Подробнее о действиях act
action | Параметры | Описание |
|
| Клик по элементу, канал выбирается автоматически по префиксу id |
|
| Сфокусировать элемент и ввести текст, затем автоматически проверить появление текста через OCR |
|
| Комбинация клавиш: |
| нет | Эквивалент |
|
| Прокрутка; если заданы координаты — прокрутить до этой точки |
Структура ответа {ok, verify, detail}:
ok: выполнено ли действиеverify: результат автоматической проверки после выполненияchanged/matched: интерфейс действительно изменился / введённый текст подтверждёнno_change/no_match: ожидаемое изменение не обнаружено (возможно, действие не сработало; рекомендуется сделать новый snapshot для актуального состояния)cdp_insert/skipped: выполнен ввод через CDP или проверка отключенаfailed: ошибка выполнения, вdetailбудет причина; при ошибках клика автоматически выполняется физическая повторная попытка и прикладывается путь к диагностическому скриншоту
detail: понятное человеку описание результата, может содержатьдиагностический скриншот: <путь>
Архитектура
┌─ 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:每次工具调用的耗时/通道/结果)。Ключевые принципы
ИИ работает только по id элементов, не по координатам. Снимок даёт id, act автоматически маршрутизирует id в оптимальный канал.
Автоматическое понижение канала: CDP → UIA → OCR → визуальный; клик: InvokePattern → PostMessage → физический.
Встроенный цикл проверки: act возвращает verify=changed/no_match/failed + причину.
Безопасный захват при перекрытии: OCR и проверка используют PrintWindow для получения реального содержимого целевого окна; даже если окно перекрыто другими, содержимое не смешивается.
Правила id элементов
Префикс | Источник | Пример | Стабильность |
| CDP DOM |
| стабилен, если структура не меняется |
| UIA |
| стабилен, если структура не меняется |
| OCR |
| после каждого изменения интерфейса нужно получать новый снимок |
Для o: и для u:, которые могли устареть после изменений интерфейса, перед кликом обязательно сделайте новый snapshot, чтобы получить свежие id.
Тестирование
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 会话Известные ограничения
WebView2/Tauri с двойной оболочкой не expose DOM в UIA → автоматически используется OCR-канал (на практике полное чтение экрана и операции работают)
Windows может запрещать фоновым процессам захватывать фокус → focus_target выведет предупреждение; при необходимости один раз кликните по целевому окну вручную
OCR-канал занимает 1~6s на снимок (при статичном экране кэш снимков может дать субсекундный ответ) — это основной источник задержки для WebView-приложений
В настоящее время поддерживается только 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