Browser Controller
Какую проблему решает этот проект
Вы выпускаете исправление. Ваш агент говорит: «Готово, проверьте, пожалуйста». Вы переключаетесь на Chrome, переходите на страницу, входите в систему, кликаете, находите баг.
Ваш агент только что написал код. Он мог бы и проверить его. У него уже открыт ваш браузер. Он просто не может его видеть.
Теперь может. Browser Controller даёт любому MCP-совместимому ИИ-агенту (Cursor, Claude Desktop, Windsurf, …) прямой контроль над браузером, который у вас уже открыт — ваши реальные сессии, ваши логины, ваши куки. Никакого headless-браузера, никакого нового профиля, никакой повторной аутентификации.
Related MCP server: Tabryn
Ключевые возможности
Несколько агентов одновременно. Cursor может управлять вкладкой 10, пока Claude управляет вкладкой 11 — оба через один общий демон, не блокируя друг друга.
Нацеливание на вкладку, а не на «активную вкладку». Каждое действие указывает
tabId. Двигайте мышью, переключайте вкладки, смотрите YouTube — агент продолжает работать с той вкладкой, которую вы ему указали. Он никогда не захватывает страницу, которую вы читаете.Изоляция по вкладкам. Ссылки на элементы, журналы консоли и сетевые буферы привязаны к каждой вкладке. Ссылка из вкладки 10 никогда не сможет кликнуть что-то во вкладке 20.
Параллельность по вкладкам. Два действия на одной и той же вкладке выполняются последовательно (без гонок); действия на разных вкладках выполняются параллельно.
Блокировка вкладок. Агент может захватить вкладку, чтобы другие встали в очередь за ним вместо гонок (
browser_tabs { action: "lock" }). Блокировки переживают перезапуск service worker'а Chrome (chrome.storage.session).Защита от перехвата управления агентом. Пока агент работает с вкладкой, вы видите полупрозрачную синюю внутреннюю рамку, а ваш ввод на этой вкладке блокируется (мышь, клавиатура, колесо) — бейдж показывает
agent <name> controlling the tabи исчезает, когда действие завершается. Блокировка вкладки сохраняет простую рамку на всё время блокировки.Проникновение в iframe того же origin. Устаревшие/корпоративные интерфейсы, живущие внутри iframe (например, консоль ONT в
iframe#mainFrame), доступны: все инструменты поиска элементов просматривают документы iframe, аfind/click_textобходят каждый фрейм.Спасение от открытых диалогов. Нативный
alert/confirm/promptзамораживает JS-поток страницы —browser_handle_dialogзакрывает его в обход через CDP, без необходимости в JS страницы, что также разблокирует все остальные инструменты на этой вкладке.browser_tabs close/focusвсегда работают, даже на замороженной вкладке.Аутентифицированное локальное соединение. Токен + одноразовый секрет регистрации, так что никакой другой локальный процесс не сможет незаметно управлять вашим браузером. Всё остаётся на localhost — никакого облака, никакой телеметрии.
Нет баннера отладчика.
browser_evaluateвыполняется в MAIN-мире страницы черезchrome.scripting— никакого жёлтого баннера «эта вкладка отлаживается», и реальные значения возвращаются через границу миров MV3.Честные ошибки. Каждый сбой инструмента доходит до вашего агента как настоящий результат
isErrorс полной полезной нагрузкой — никаких «успешных» ответов, скрывающих сбои в середине рабочего процесса.
Как это работает
Три компонента, все на вашей машине. Ничего не покидает localhost.
Agent (Cursor / Claude / Windsurf) ── other agents connect too ──┐
│ stdio (MCP protocol) │
▼ ▼
┌─────────────────────────────┐ ┌─────────────────────────────────────────┐
│ thin MCP client │ │ thin MCP client │
│ (node mcp-server/dist/ │ │ (node mcp-server/dist/ │
│ index.js) │ │ index.js) │
│ - speaks MCP over stdio │ │ - spawns daemon if not running │
│ - forwards calls to daemon │ │ - gets its own sessionId │
└──────────────┬──────────────┘ └────────────────────┬───────────────────┘
│ local IPC socket (AF_UNIX / named pipe, token-auth) │
▼ ▼
┌──────────────────────────────────────────────────────────────────────────┐
│ DAEMON (single long-running process, owns port 7225) │
│ - multiplexes N clients → 1 extension │
│ - tags every call with the client's sessionId │
│ - heartbeat eviction, per-session rate limiting │
└──────────────────────────────┬───────────────────────────────────────────┘
│ WebSocket ws://127.0.0.1:7225 (token-auth)
▼
┌──────────────────────────────────────────────────────────────────────────┐
│ Chrome Extension (Manifest V3 service worker) │
│ - resolves the target tabId (never "the active tab" implicitly) │
│ - serializes same-tab actions, parallelizes cross-tab actions │
│ - executes click/type/snapshot/evaluate against the named tab │
└──────────────────────────────────────────────────────────────────────────┘Ключевая идея: при первом запуске любого агента тонкий клиент порождает фоновый демон, который владеет портом 7225 и соединением с расширением. Каждый последующий агент (даже из другого MCP-клиента) подключается к тому же демону через локальный IPC-сокет и получает собственный sessionId. Расширение видит одно стабильное соединение и направляет каждый вызов на ту вкладку, которую указал вызывающий.
Быстрый старт
Проект не размещён в Chrome Web Store и не в npm — вы устанавливаете его из этого репозитория. Две части: MCP-сервер (работает на вашей машине, общается с вашим ИИ-агентом) и расширение Chrome (находится в вашем браузере, выполняет команды).
Предварительные требования: Node.js ≥ 20 и Chrome/Chromium/Edge.
1. Клонируйте и соберите
git clone https://github.com/compnew2006/browser-controller.git
cd browser-controller
npm install
npm run build # compiles TypeScript → mcp-server/dist/2. Загрузите расширение Chrome
Откройте
chrome://extensionsи включите Режим разработчика (переключатель в правом верхнем углу)Нажмите Загрузить распакованное и выберите папку
extension/из клонированного репозиторияЗакрепите значок Browser Controller на панели инструментов
Серый кружок = ожидание демона. Зелёный = подключено.
3. Добавьте MCP-сервер в ваш клиент
Cursor: Settings → MCP → «Add new MCP server». Claude Desktop: отредактируйте claude_desktop_config.json. Windsurf: Settings → MCP. Подойдёт любой MCP-совместимый клиент.
Замените /path/to/browser-controller на абсолютный путь к вашему клону (Windows: используйте C:\\path\\to\\browser-controller\\mcp-server\\dist\\index.js):
{
"mcpServers": {
"browser-controller": {
"command": "node",
"args": ["/path/to/browser-controller/mcp-server/dist/index.js"]
}
}
}По умолчанию демон называет каждое соединение по имени родительской IDE («Cursor», «Claude», …). Чтобы переопределить — например, когда несколько агентов используют одну IDE, или чтобы пометить их по проектам — передайте --agent <name> в аргументах. Он имеет приоритет над любым автоопределением:
{
"mcpServers": {
"browser-controller": {
"command": "node",
"args": ["/path/to/browser-controller/mcp-server/dist/index.js", "--agent", "My Project Agent"]
}
}
}Имя появляется в списке Connected Agents во всплывающем окне. (Вы также можете задать переменную окружения MCP_AGENT_NAME — эквивалентно.) Повторное подключение с тем же именем заменяет старую запись, так что перезапуски IDE не накапливают дубликаты.
4. Свяжите расширение с демоном
Демон использует два секрета, оба генерируются при первом запуске в ~/.browser-controller/ (Windows: %USERPROFILE%\.browser-controller\). Запустите его один раз, попросив агента «list my browser tabs», затем:
Прочитайте секреты:
cat ~/.browser-controller/enrollment.json # one-time pairing secret cat ~/.browser-controller/token.json # WebSocket auth token(Секрет регистрации также выводится в журнал MCP-клиента при первом запуске.)
Нажмите на значок расширения → вкладка Settings → вставьте Enrollment Secret и Auth Token (оставьте порт
7225, если вы не менялиWS_PORT).
Зелёный кружок = вы подключены. Ваш агент теперь видит ваш браузер.
Эти секреты не позволяют любому другому локальному процессу открыть WebSocket и управлять вашими аутентифицированными сессиями браузера. Чтобы их ротировать, остановите MCP-клиенты, удалите папку, и при следующем запуске оба секрета будут созданы заново. Полную модель угроз см. в SECURITY.md.
Использование
Модель ориентирована на вкладки: агент всегда указывает, на какой вкладке действовать. Он никогда не предполагает «активную вкладку».
Базовый рабочий процесс
Перечислите вкладки, чтобы получить
tabId:browser_tabs { action: "list" } → [{ id: 15, url: "...", title: "...", active: true, lockedBy: null }, ...]Сделайте снимок этой вкладки, чтобы увидеть её структуру и получить ссылки на элементы:
browser_snapshot { tabId: 15 } → { tree: [ { ref: "e3", role: "button", name: "Sign in" }, ... ] }Ссылки действительны только для этого tabId. Если вы перешли по ссылке или DOM изменился, сделайте новый снимок. Новые элементы с момента последнего снимка помечаются
isNew: true— после того как действие открыло оверлей/выпадающее меню, агент может сосредоточиться только на них, не перечитывая всё дерево.Взаимодействуйте, используя ссылку и тот же tabId:
browser_click { tabId: 15, ref: "e3" } browser_type { tabId: 15, ref: "e5", text: "hello@example.com" } browser_press_key { tabId: 15, key: "Enter" }Если ссылка устарела, но элемент всё ещё существует, он находится автоматически через надёжный селектор + сканирование текста/роли (ответ содержит
via: "fallback"). Если элемент был полностью прокручен за пределы видимости (виртуализированные ленты), ответ содержитfreshRefs: [...]со свежим снимком прямо в нём — повторите с одной из этих новых ссылок в том же шаге, отдельный снимок не нужен.Проверьте — сделайте снимок или прочитайте текст снова после действия.
Координация нескольких агентов (два агента, две вкладки)
Агент A перечисляет вкладки, выбирает вкладку 10, при желании блокирует её:
browser_tabs { action: "lock", tabId: 10 }Агент B перечисляет вкладки, выбирает вкладку 11, блокирует её:
browser_tabs { action: "lock", tabId: 11 }Оба работают параллельно. Вызовы каждого агента сериализуются относительно его собственной вкладки; две вкладки никогда не мешают друг другу.
По завершении:
browser_tabs { action: "unlock", tabId: 10 }.
Всплывающее окно — ваша панель управления
Оболочка с вкладками фиксированной высоты (тело никогда не прокручивается, прокручиваются только списки):
Tabs — каждая открытая вкладка с владельцем блокировки, плюс Unlock all на панели инструментов для мгновенного снятия блокировок, если агент упал посреди блокировки.
Agents — каждый подключённый агент с именем, идентификатором сессии, временем работы и ✕ для немедленного отключения (очищает зомби, которого ещё не вычистил heartbeat).
Settings — порт WebSocket, Auth Token, Enrollment Secret.
Activity bar — сворачиваемая полоса внизу, показывающая последнюю активность инструментов; разверните её для прокручиваемого журнала.
Что стоит знать
Забыли
tabId? Вы получите понятную ошибку:tabId is required. Call browser_tabs list first.Защищённые страницы (
chrome://, Web Store, devtools) нельзя скриптовать — вы получитеCannot access protected page (chrome://...)вместо тихого зависания.browser_navigate— единственный инструмент, гдеtabIdнеобязателен (по умолчанию — активная вкладка), но для безопасности при нескольких агентах передавайте его явно. Изменения только хэша (например,/page→/page#section) разрешаются сразу после установки URL, без ожидания событияcomplete(SPA не перезагружаются при изменении хэша, поэтому это событие никогда не срабатывает).browser_evaluateвыполняется в MAIN-мире страницы (без баннера отладчика, безопасно для CSP) и возвращает реальные значения (JSON-сериализованные через границу миров). Он мощный, но неидемпотентный — не будет автоматически повторён при тайм-ауте.Прокрутка виртуализированных лент (Facebook/Instagram/Twitter):
browser_scrollвозвращаетrefsMayBeStale: true, потому что эти сайты перерабатывают узлы DOM. Сделайте новый снимок перед следующим взаимодействием.Дублирующиеся элементы: когда несколько элементов имеют одинаковый текст+роль (например, 3 кнопки «Like»), резервный резолвер выбирает правильный по порядковому номеру (
nth), а не просто первое совпадение.Замороженная вкладка (нативный диалог блокирует) не заводит вас в тупик:
browser_handle_dialogзакрывает его через CDP, аbrowser_tabs { action: "close" }всегда работает как гарантированный выход.
🧠 Обучите своего агента
Агент может использовать все 22 инструмента из коробки, но работает лучше, когда знает ориентированный на вкладки рабочий процесс. Из корня репозитория:
npm run setup:cursor # or: node mcp-server/dist/index.js --setup cursorЭто устанавливает:
~/.cursor/rules/browser-controller.mdc— рабочий процесс нацеливания на вкладки, обработка выпадающих меню, когда блокировать вкладки~/.cursor/commands/check-browser.md— добавляет/check-browserв ваш чат Cursor
После этого введите /check-browser в любом чате. Или просто скажите «проверь результат в моём браузере» — и агент будет знать, что делать.
npm run setup:claudeДобавляет AGENTS.md в корень вашего проекта. Claude Code обнаруживает его автоматически.
См. agent-config/ для ручной установки или настройки правил.
Что он умеет
22 инструмента. Каждый инструмент взаимодействия со страницей принимает tabId (единственное исключение — browser_navigate, где он необязателен).
Смотреть
Инструмент | Что делает |
| Дерево доступности со ссылками на элементы. Компактный режим (по умолчанию) возвращает только интерактивные элементы. Обходит shadow DOM + iframe. |
| Снимок вкладки в виде изображения (сначала активирует вкладку для захвата) |
| Извлечение необработанного текста со страницы или элемента |
| Поиск элементов по естественному языку — также обходит iframe того же origin |
Взаимодействие
Инструмент | Что делает |
| Клик по ref или CSS-селектору — проникает в iframe того же origin |
| Клик по видимому тексту. Работает через React-порталы и оверлеи |
| Ввод в поля ввода и contenteditable-поля |
| Комбинации клавиш (Enter, Escape, Ctrl+A) |
| Прокрутка страниц и виртуальных контейнеров |
| Вызов подсказок и выпадающих списков |
| Выбор из нативных выпадающих списков |
| Ожидание появления или исчезновения элементов |
| Заполнение нескольких полей формы одним вызовом (безопасные сеттеры для React/Vue) |
| Перетаскивание с элемента на элемент (использует CDP для надёжности) |
| Загрузка файлов через |
browser_upload_file внедряет локальные файлы в <input type="file">, как если бы их выбрал пользователь: нативный диалог никогда не открывается, а события input/change срабатывают после, так что формы React/Vue реагируют.
browser_upload_file { tabId: 15, selector: "#resume", filePath: "/Users/me/resume.pdf" }
browser_upload_file { tabId: 15, ref: "e12", files: ["/tmp/a.png", "/tmp/b.png"] }Пути абсолютные и локальные для машины, на которой запущен браузер. Опустите ref/selector, чтобы автоматически нацелиться на первый файловый input на странице; несколько файлов одновременно требуют input с атрибутом multiple.
Навигация
Инструмент | Что делает |
| Переход по URL во вкладке ( |
| Список / создание / закрытие / фокус / блокировка / разблокировка вкладок |
Отладка и продвинутые возможности
Инструмент | Что делает |
| Вывод консоли (log, warn, error) — по вкладкам, максимум 200 записей |
| XHR/fetch-запросы с кодами статуса — по вкладкам, необязательный |
| Выполнение JavaScript в MAIN-мире страницы (без баннера, безопасно для CSP) |
| Отклонить/принять открытый alert/confirm/prompt через CDP (работает на замороженных страницах) |
| Выполнение автономного JS-объекта действия через CDP |
Сравнение с другими
Browser Controller | Playwright MCP | Chrome DevTools MCP | |
Использует ваш существующий браузер | Да | Нет, запускает новый | Частично, нужен debug-порт |
Сессии и куки | Уже есть | Новый профиль | Ручная настройка |
Работает за корпоративным SSO | Да | Нет | Зависит |
Несколько агентов, несколько вкладок | Да | Нет | Нет |
Нацеливание на вкладку (не захватывает активную вкладку) | Да | Н/Д | Нет |
Аутентифицированное локальное соединение | Да | Н/Д | Нет |
Настройка | Сборка из исходников + расширение | Headless-браузер | Chrome с |
Конфигурация
Переменная окружения | По умолчанию | Что делает |
|
| WebSocket-порт, который демон использует для соединения с расширением |
| (не задано) | Установите |
| (авто: имя IDE) | Переопределяет имя агента, отображаемое во всплывающем окне (то же, что |
Файлы состояния демона
Демон хранит всё в ~/.browser-controller/ (Windows: %USERPROFILE%\.browser-controller\):
Файл | Назначение |
| Одноразовый секрет сопряжения для расширения (режим |
| Токен аутентификации, который расширение должно предъявлять при каждом WebSocket-соединении (режим |
| IPC-сокет, к которому подключаются тонкие клиенты (AF_UNIX на mac/linux; именованный канал на Windows) |
| Метаданные демона (pid, порт, время запуска) — используются для обнаружения запущенного демона |
| stdout/stderr демона при запуске клиентом |
Для полного сброса: остановите ваши MCP-клиенты, удалите папку, и при следующем запуске она будет создана заново с новыми секретами.
Надёжность
Демон автоматически запускается при первом запуске любого клиента и остаётся работать в откреплённом режиме.
При обрывах соединения используется экспоненциальная задержка (1с → 30с), проверки работоспособности ping/pong каждые 10с; клиент, пропустивший 3 pong, вытесняется.
Ограничение скорости 120 вызовов/мин на сессию защищает демон от зациклившегося агента.
Таймауты на инструмент (5–15с для большинства действий, 60с для навигации), размещённые вместе с определением каждого инструмента, чтобы они не расходились с реестром.
Идемпотентные инструменты чтения (snapshot, screenshot, text, find) повторяются при таймауте; инструменты с побочными эффектами (click, type, navigate, evaluate) — а также
console/network(которые изменяют состояние приclear:true) — никогда не повторяются, поэтому клик не может сработать дважды.Если другой процесс уже занимает порт 7225, демон отказывается запускаться, а не убивает процесс, который он не порождал, — он сообщает о конфликте, чтобы вы могли осознанно его разрешить.
Запустите два демона на разных портах, задав WS_PORT для каждого клиента:
{
"mcpServers": {
"browser-work": {
"command": "node",
"args": ["/path/to/browser-controller/mcp-server/dist/index.js"]
},
"browser-personal": {
"command": "node",
"args": ["/path/to/browser-controller/mcp-server/dist/index.js"],
"env": { "WS_PORT": "9333" }
}
}
}Обновите порт во всплывающем окне каждого расширения, чтобы он совпадал.
Архитектура
Всё остаётся на вашей машине. Расширение подключается к демону через аутентифицированный WebSocket на localhost; MCP-клиенты подключаются к демону через локальный IPC-сокет. Никакого облака, никакого прокси, ничего не покидает ваш браузер.
browser-controller/
├── mcp-server/ MCP server (TypeScript)
│ └── src/
│ ├── daemon.ts Single multi-client daemon (owns WS :7225)
│ ├── daemon-config.ts IPC protocol, paths, auth/enrollment tokens
│ ├── index.ts Thin stdio MCP client (spawns daemon, multiplexes)
│ ├── bridge.ts Extension WS server + cross-platform port probe
│ ├── register-tools.ts Progressive-disclosure wiring
│ └── tools/ One file per tool (22), registry pattern
├── extension/ Chrome extension (Manifest V3, plain JS, ES modules)
│ ├── background.js Wiring only (~30 lines): inject router, register events, connect
│ ├── lib/ state (buffers/locks/persistence), connection (WS lifecycle),
│ │ router (dispatch + mutex/locks + control shield), page-exec,
│ │ overlay, lock-ops, tab-concurrency (pure, unit-tested)
│ ├── handlers/ Tool implementations: navigation, interaction, inspection, tabs, cdp
│ ├── utils/ navigation + smart-selector fallback resolution
│ ├── events.js chrome.* listeners (console capture, popup, webRequest, lifecycle)
│ ├── content.js Console capture
│ └── popup/ Fixed tabbed shell (Tabs · Agents · Settings) + collapsible activity bar
├── agent-config/ Pre-built configs for Cursor + Claude Code
│ ├── cursor/ Rules and commands
│ ├── skills/ Browser automation skill
│ └── setup.mjs One-command installer
└── tests/ 15 suites / 215 testsСтек: TypeScript (строгий) · MCP SDK · WebSocket · Chrome Extension Manifest V3 · Vitest
Разработка
git clone https://github.com/compnew2006/browser-controller.git
cd browser-controller
npm install
npm run build
npm testКоманда | Что делает |
| Компиляция TypeScript → |
| Режим наблюдения |
| Запуск полного набора тестов (215 тестов) |
| Проверка типов без генерации |
| Установка правила и команды Cursor |
| Установка |
Набор покрывает WebSocket-мост (включая отклонение токен-аутентификации и единый канал ошибок), реестр инструментов, жизненный цикл демона (вытеснение по heartbeat, ограничение скорости, IPC-аутентификация), конкурентность по вкладкам (сериализация в одной вкладке + параллелизм между вкладками) и поведение расширения через мокированный API chrome (маршрутизация, семантика щита, round-trip evaluate, проникновение в iframe, спасение диалогов). CI запускает набор на Node 20 и 22, а также сканирование CodeQL и Scorecard.
Обновление существующей установки
git pull
npm install
npm run buildЗатем два ручных шага: перезагрузите расширение в chrome://extensions (запущенный service worker сам по себе никогда не подхватывает изменения файлов) и перезапустите демон — он долгоживущий и тоже не перезагружает dist/ (убейте его или просто перезапустите ваш MCP-клиент, и при следующем запуске он будет пересоздан на новой сборке).
Часто задаваемые вопросы
В этом весь смысл. Расширение работает внутри вашего реального Chrome — те же куки, те же сессии, то же локальное хранилище. Повторная аутентификация не нужна.
Нет. MCP-клиенты, демон и расширение общаются через localhost (IPC-сокет + WebSocket). Ничего не покидает вашу машину. Никакой аналитики, никакой телеметрии, никакого облачного компонента. См. SECURITY.md — модель угроз, дизайн аутентификации и окно TOFU при первом контакте.
Любой MCP-совместимый клиент. Cursor, Claude Desktop, Claude Code, Windsurf, Cline и всё остальное, что говорит на протоколе MCP. Несколько таких клиентов могут одновременно работать с одним и тем же демоном.
Да. Каждый агент подключается к общему демону, получает собственный sessionId и нацеливается на конкретный tabId. Действия на одной вкладке сериализуются через мьютекс на вкладку; действия на разных вкладках выполняются параллельно. При желании агент может lock вкладку, чтобы получить исключительный доступ; другие агенты встают в очередь за блокировкой, а не завершаются с ошибкой.
Он не может — по крайней мере, незаметно. Каждый инструмент взаимодействия со страницей требует tabId, и если он отсутствует, вы получите понятную ошибку tabId is required. Агент никогда не сможет случайно воздействовать на вкладку, на которую вы смотрите. (Единственное исключение — browser_navigate без tabId, который использует активную вкладку, — но для многоагентного использования вам всегда следует передавать tabId.)
Без них любой локальный процесс на вашей машине мог бы открыть WebSocket на порт 7225 и управлять вашими аутентифицированными сессиями браузера (ваш банк, ваша почта, ваш корпоративный SSO). Секрет enrollment связывает расширение с демоном ровно один раз (вне полосы, до создания любого WebSocket); токен auth затем аутентифицирует каждое соединение. Оба хранятся в ~/.browser-controller/ с правами 0600.
Они запускают новый экземпляр браузера с нуля — без состояния, без куки, без сессий. Вам приходится заново проходить весь процесс входа каждый раз. Это подключается к браузеру, который у вас уже открыт, со всем уже загруженным.
Участие в разработке
Отчёты об ошибках, запросы функций и PR приветствуются в трекере задач. Для крупных изменений сначала откройте issue.
Безопасность
См. SECURITY.md — архитектура только для localhost, дизайн token + enrollment, модель угроз и рекомендации по сообщению об уязвимостях.
Лицензия
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
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
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Live browser debugging for AI assistants — DOM, console, network via MCP.
Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables CLI coding agents to interact with your live browser tabs via MCP, using your real sessions and cookies without a sandbox.MIT
- AlicenseNot gradedqualityAmaintenanceConnects AI agents to your Chrome browser via MCP, enabling real-time control of existing tabs, sessions, and application state for development workflows.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to control your existing Chrome browser via MCP, using your logged-in sessions for automation on authenticated sites. Provides high-level browser tools plus raw CDP and Chrome API access.MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI to control a real browser through MCP tools for clicking, typing, navigation, screenshots, and more. It supports a follow mode that tracks the active tab, plus fixed mode for controlling specific tabs.18MIT
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/compnew2006/browser-controller'
If you have feedback or need assistance with the MCP directory API, please join our Discord server