web-bridge
web-bridge — MCP-инструмент, позволяющий ИИ-редактору управлять произвольными статическими веб-страницами
web-bridge — это MCP Server (один процесс Node, два интерфейса), который позволяет ИИ-редактору выполнять JavaScript на статических веб-страницах, подключивших client.js, читать консоль, имитировать клики/ввод. Подходит для локальной отладки в нескольких браузерах и вкладках, а также поддерживает развёртывание на внешнем сервере (--transport http, см. ниже «Удалённое развёртывание»).
AI 编辑器 ┌───────────────────┐ 浏览器页面
┌──────────────┐ │ MCP Server │ ┌──────────────────┐
│ MCP Client │ │ (Node 单进程) │ │ <script src= │
│ │ stdio 或 │ · 接口B: MCP │ WebSocket │ :3210/client.js">│
│ AI 只到这里 │◄─────────►│ (stdio / http) │◄──────────►│ client.js │
└──────────────┘ Streamable│ · 接口A: WebSocket │ 接口A │ (eval 执行/ │
HTTP(远程) │ · HTTP /client.js │ │ console 捕获) │
└───────────────────┘ └──────────────────┘ИИ-редактор и браузер не соединяются напрямую: оба соединения завершаются на MCP Server (server.js), ИИ управляет страницей косвенно через вызовы инструментов.
Быстрый старт
cd web-bridge
npm install # 首次Подключите скрипт к статической веб-странице (подходит любая страница и любой порт, кросс-доменный доступ разрешён):
<script src="http://127.0.0.1:3210/client.js"></script>Настройте MCP-сервис в ИИ-редакторе: замените
<REPO>/server.jsв mcp.json на абсолютный путь к этому репозиторию и вставьте так, как показано ниже для соответствующего редактора. Как только редактор запуститserver.js, WebSocket-сервис (по умолчанию127.0.0.1:3210) будет готов.Скажите ИИ: «используй list_pages из web-bridge, чтобы посмотреть, какие страницы подключены, затем eval_js помоги мне нажать #btn и прочитать консоль».
Примечание о порядке подключения: можно подключить скрипт на странице заранее — client.js будет автоматически переподключаться (с экспоненциальной задержкой 1s→2s→5s→10s), и после запуска редактора страница подключится сама. Страница состояния hub: http://127.0.0.1:3210/
Инструменты MCP
Инструмент | Параметры | Описание |
| — | список подключённых страниц (pageId, заголовок, URL, время подключения) |
|
| выполняет произвольный JS на странице и возвращает сериализованный результат; поддерживает |
| необязательно | читает последние выводы console и неперехваченные исключения страницы |
|
| находит элемент и вызывает click() (сначала scrollIntoView) |
|
| фокусирует, вводит текст, отправляет события input / change (совместимо с contenteditable) |
| необязательно | читает innerText элемента |
Правило pageId: если подключена только одна страница, его можно опустить; если подключено несколько страниц и pageId не указан, инструмент вернёт ошибку и список страниц, и ИИ сам добавит pageId и повторит.
Подключение в различных редакторах
В следующих примерах предполагается абсолютный путь к репозиторию /path/to/web-bridge; при необходимости замените его.
ZCode / Claude Code (в корне проекта .mcp.json или claude mcp add):
{
"mcpServers": {
"web-bridge": {
"command": "node",
"args": ["/path/to/web-bridge/server.js"],
"env": { "PORT": "3210" }
}
}
}Cursor (.cursor/mcp.json): формат тот же.
Claude Desktop (claude_desktop_config.json): формат тот же.
Аргументы командной строки: node server.js --port 3210 --host 127.0.0.1 --token <secret> (можно также использовать переменные окружения PORT / HOST / TOKEN).
Удалённое развёртывание (внешний сервер)
Обычный режим stdio требует, чтобы редактор запускал процесс локально; при развёртывании web-bridge на внешнем сервере используйте режим HTTP-транспорта — редактору достаточно указать один url в конфигурации MCP:
1. Запустите на сервере (рекомендуется управление через systemd / pm2; для публичного доступа обязательно включите токен):
node server.js --transport http --host 0.0.0.0 --port 3210 --token <secret>2. Конфигурация редактора (Claude Code / Cursor / ZCode и др., вставьте в место исходной конфигурации):
{
"mcpServers": {
"web-bridge": {
"type": "http",
"url": "https://your-domain.com/mcp",
"headers": { "Authorization": "Bearer <secret>" }
}
}
}При прямом подключении (без обратного прокси/TLS) url укажите как http://<服务器IP>:3210/mcp. Примечание: Claude Desktop поддерживает только локальный режим stdio и не поддерживает удалённый url.
3. Скрипт на странице измените так, чтобы он указывал на сервер:
<script src="https://your-domain.com/client.js?token=<secret>"></script>Пояснения:
HTTPS-страницы могут подключаться только через
https/wss(ограничение смешанного содержимого). Рекомендуется использовать обратный прокси, например nginx / caddy, для терминации TLS и пересылки на этот сервис; при отправке client.js автоматически распознаётX-Forwarded-Proto/X-Forwarded-Hostи формирует правильный адрес подключенияwss://, без дополнительной настройки. Пример для caddy (автоматический выпуск сертификата):your-domain.com { reverse_proxy 127.0.0.1:3210 }После включения токена конечная точка
/mcpподдерживает три способа аутентификации:Authorization: Bearer <secret>(рекомендуется; в конфигурации редактора укажите headers),X-Web-Bridge-Token: <secret>, параметр url?token=.HTTP-транспорт использует официальный протокол Streamable HTTP (режим stateless); каждый запрос обрабатывается независимо, все разделяют общий hub, и несколько редакторов могут подключаться одновременно.
При публичном развёртывании обязательно: задайте
--token, используйте TLS, в файрволе откройте только необходимые порты.
Замечания по безопасности
По умолчанию прослушивается только
127.0.0.1. Любая открытая на этом компьютере веб-страница (включая сторонние сайты, которые вы просматриваете) может попытаться подключиться к локальному порту — в режиме без токена по умолчанию она сможет получать код от ИИ, а также подделывать результаты.В недоверенной сетевой среде или при необходимости подключить локальные устройства (например, телефон) через
--host 0.0.0.0обязательно включите--token: в этом случае запрос client.js должен содержать?token=<secret>, и первый пакет WebSocket также проверяет токен.
Протокол сообщений WebSocket (внутренняя справка)
WS-сообщения между браузером и MCP Server представляют собой текстовые JSON-фреймы; используйте это при поддержке lib/hub.mjs / client.js:
Направление | Сообщение | Поля | Описание |
страница→сервер |
|
| первый пакет после подключения; если не получен в течение 5 секунд, соединение закрывается; при повторном pageId (дублированная вкладка) новое соединение заменяет старое |
страница→сервер |
|
| отправляется после подключения, а также по событиям DOMContentLoaded/load/popstate/hashchange и каждые 5 с по опросу (запасной механизм для SPA) |
страница→сервер |
|
| обёртка console и перехват неперехваченных исключений, пакетная отправка с троттлингом 500 мс; hub хранит кольцевой буфер по 500 записей на страницу (сохраняются после отключения) |
страница→сервер |
|
| опоздавшие ответы (уже истёк тайм-аут) игнорируются |
сервер→страница |
|
| проверка hello пройдена |
сервер→страница |
|
| код, который должен быть выполнен |
сервер→страница |
|
| например, ошибка токена |
Соглашения выполнения eval (client.js): сначала код оборачивается как выражение async () => ( code ); при SyntaxError происходит возврат к блоку операторов (можно использовать return); предустановлены $ / $$; тайм-аут отсчитывается на стороне hub (по умолчанию 30 с, максимум 120 с); результат безопасно сериализуется в строковое представление (Error→stack, DOM→краткое содержимое outerHTML, пометка циклических ссылок, глубина ≤ 6, ≤ 50k символов).
Разработка
Тесты:
npm test(Node e2e: запуск процесса + имитация страницы + вызов инструментов через два транспорта stdio/HTTP);npm run test:browser(сценарий с реальным браузером через Playwright: Chromium загружает test/test-page.html, через реальный WebSocket проверяются 6 инструментов; перед первым запуском выполнитеnpx playwright install chromium). Сценарий с реальным браузером можно также проверить вручную, открыв тестовую страницу.Зависимости:
ws(WebSocket),@modelcontextprotocol/sdk(MCP),zod(проверка параметров); dev-зависимость@playwright/test. Node ≥ 18.
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
Live browser debugging for AI assistants — DOM, console, network via MCP.
MCP server for understanding Javascript internals from ECMAScript specification.
A paid remote MCP for AI agent browser MCP session, built to return verdicts, receipts, usage logs,
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/kirakiray/web-bridge'
If you have feedback or need assistance with the MCP directory API, please join our Discord server