Проблема, которую решает chrome-bridge, знакома каждому, кто пробовал запускать браузерных агентов. Playwright и Selenium поднимают чистый профиль без сессий — на первом же шаге агент упирается в логин, 2FA или капчу. Подключение к живому Chrome через remote-debugging требует запуска с флагом и ломает нормальную сессию. MCP-серверы для браузера обрастают JSON-конфигами и всё равно часто работают через скриншоты. Вендорские решения — расширение Anthropic, расширение OpenAI, встроенный браузер VS Code Copilot — замкнуты на свою экосистему и свой профиль. Ни одно не отвечает на вопрос «как дать агенту мой браузер».

chrome-bridge отвечает именно на него. Архитектура укладывается в одну строку: расширение Chrome (один файл background.js) — WebSocket — локальный Node-сервер — CLI. Никакого облака, никаких аккаунтов, код и данные не покидают машину. Клиент у CLI — обычный shell, поэтому подойдёт любой агент, умеющий запускать команды: Claude Code, Cursor, Codex, GLM, Kimi, Qwen, DeepSeek, локальные модели. MCP не нужен, SDK не нужен, версия модели не важна.

ПодходПроблема
Playwright / SeleniumЧистый профиль без сессий, стена логина, 2FA или капча
Remote-debugging к живому ChromeТребует запуска с флагом, убивает нормальную сессию
MCP-браузерные серверыJSON-конфиги, совместимость клиента, часто всё равно скриншоты
Расширение AnthropicРаботает только из Claude, сессия гоняется через облако
Расширение OpenAIУправляется десктоп-приложением, в Codex CLI браузер недоступен
Встроенный браузер VS Code CopilotОтдельная среда со своим профилем, не ваш Chrome
chrome-bridgeРасширение + CLI, ваш залогиненный Chrome, open source, MIT

Главное отличие от скриншотных подходов — формат восприятия страницы. Агент получает accessibility-дерево: весь текст страницы со ссылками на элементы вида @e1, @e5, @e12. Замер на живой странице показал: дерево целиком — 2,4 КБ, скриншот той же страницы шириной 1000px — 16 КБ. Разница примерно на порядок на каждом шаге. Агент не угадывает координаты по картинке, а кликает по ссылке из дерева. Ссылки переживают повторные снимки и истекают только при навигации — после перехода агент делает новый snap. Команды выглядят так: node cli.mjs snap habr.com, node cli.mjs click habr.com @e14, node cli.mjs fill habr.com @e12 "chrome extension", node cli.mjs shot habr.com out.png --max 800 — последняя нужна, когда без пикселей не обойтись.

Агент видит страницу как accessibility-дерево с ссылками @eN, а не как набор пикселей, что снижает расход контекста примерно на порядок.

Отдельная инженерная задача — доверие событий. Синтетические события не имеют флага isTrusted, и часть приложений их честно игнорирует. Для этого в проекте есть режим --trusted: клик идёт через DevTools Input с isTrusted=true. Плата очевидна — команды через CDP (net, shot, --trusted) монтируют отладчик, и страница это видит. Стелс-стека в проекте сознательно нет: это инструмент для своих аккаунтов на своей машине, и в README это написано прямым текстом.

Вторая обязательная часть — вердикты. После действия агент получает не тишину, а диагноз: succeeded, needs_human (стена логина — зовём человека), blocked (rate limit) или uncertain (событие ушло, ничего не изменилось — проверь иначе). На Excalidraw это выглядело честно: клик в канвас вернул uncertain, скриншот подтвердил, что ничего не произошло, а --trusted с двойным кликом прошёл и создал текстовый элемент, который потом появился прямо в дереве.

Сервер держит кольцевой журнал: каждая команда попадает в него в момент выполнения со статусом ok/fail. Команда history --batch out экспортирует журнал как реплейбельный скрипт: упавшая строка закомментирована с текстом ошибки, секретные значения (fill/type/paste) вырезаны. Полуупавший батч можно дописать с места падения — с одной честной оговоркой: реплей не идемпотентен, уже сделанный клик сделается ещё раз, хвост скрипта допиливается руками.

Ограничения тоже названы прямо. Сервер слушает 127.0.0.1 и не отвечает запросам со страниц, но любой локальный процесс может им воспользоваться — инструмент для машины, которой вы доверяете. Canvas-приложения деревом почти не видны; там агент чаще работает скриншотами. CDP-команды детектируются антибот-системами, и стелс-стек в проект сознательно не включён. Расширение просит <all_urls> и debugger — это цена функциональности. Код при этом читается целиком: один background.js и манифест, без сборки.

В контексте отрасли chrome-bridge занимает нишу, которую вендоры обходят стороной. Anthropic, OpenAI и Microsoft строят браузерных агентов внутри своих экосистем — со своей подпиской, своим профилем, своей моделью. chrome-bridge не привязан ни к вендору, ни к модели, ни к облаку. Это попытка решить одну конкретную проблему: агент весь день сидит в терминале рядом с залогиненным браузером и не может в него зайти. Теперь может — дерево вместо скриншотов, клики по ссылкам вместо координат, фиолетовая плашка с историей каждого действия и кнопка ⏏, которая одним нажатием возвращает контроль пользователю.