n0x — это open-source AI-воркстейшн, который работает полностью в браузере. Всё — от LLM и RAG до Python-песочницы и генерации изображений — запускается через WebGPU и WASM. Никакого сервера, никаких API-ключей. Ваши данные не покидают устройство.
Проблема: агент только разговаривал
Проект уже много умеет, но до недавнего времени его возможности ограничивались диалогом. Агент мог вызывать внутренние инструменты — поиск, Python, память, — но не взаимодействовал с внешним миром.
Мне хотелось, чтобы фраза «открой Хабр» приводила к реальному открытию вкладки с habr.com. Для этого я решил добавить поддержку MCP.
Что такое MCP (Model Context Protocol)
MCP — это протокол, позволяющий LLM-приложениям вызывать внешние инструменты через стандартизированный интерфейс. Его разработали в Anthropic (создатели Claude), но он быстро стал стандартом во всей экосистеме ИИ.
Принцип прост:
- MCP Server — отдельный процесс, предоставляющий набор инструментов.
- Например, chrome-devtools-mcp позволяет управлять браузером: открывать URL, делать скриншоты, выполнять JavaScript.
- LLM в своём ответе формирует специальный объект вызова.
- MCP-клиент перехватывает его, обращается к серверу, получает результат и передаёт обратно модели для финального ответа.
Интеграция MCP в n0x
В n0x используется стек: React + Zustand + Web Workers. Чтобы не блокировать интерфейс, MCP-клиент запущен в отдельном воркере.
Архитектура включает несколько уровней:
- UI — отображает панель управления инструментами (McpToolDrawer).
- useAgent.ts — парсит ответы LLM и инициирует вызовы инструментов.
- useMCP.ts — Zustand-хранилище и связь с воркером.
- mcp.worker.ts — выполняет HTTP-запросы к MCP-серверу.
- MCP Server — внешний процесс, например, chrome-devtools-mcp.
Ключевые части реализации
1. Подключение к MCP-серверу (mcp.worker.ts)
Реализация проста: создаётся транспорт, подключается клиент, получается список доступных инструментов через стандартный MCP-интерфейс.
2. Парсинг команд (useAgent.ts)
Сложность была в том, чтобы научить LLM понимать естественный язык и возвращать структурированный вызов, а не просто текст. Например, фраза «открой Яндекс» теперь преобразуется в корректный вызов инструмента.
3. Алиасы для удобства (useChat.ts)
После загрузки MCP-инструментов я добавил короткие алиасы. Теперь можно писать «open google.com» вместо полного имени chrome_devtools_navigate.
4. Системный промпт с инструкциями
Чтобы модель понимала, когда и какие инструменты использовать, в системный промпт была добавлена специальная секция с описанием доступных действий и условиями их вызова.
Опыт пользователя
- Пользователь пишет: «открой хабр».
- Агент распознаёт команду и вызывает MCP-инструмент navigate.
- Chrome открывает новую вкладку с habr.com.
- Агент отвечает: «✓ Открыл https://habr.com».
Всё происходит быстро и без дополнительных действий.
Настройка подключения
Для работы нужна связка из двух процессов — мост между n0x и Chrome:
- Запустите Chrome с включённым remote debugging.
- Проверьте, что браузер доступен по http://localhost:9222.
- Запустите supergateway с подключённым chrome-devtools-mcp.
- Укажите в n0x путь к MCP-инструментам: http://localhost:8080/mcp.
Готово.
Что дальше?
Пока реализовано только открытие URL. Но MCP открывает гораздо больше возможностей:
- Скриншоты — «сделай скриншот текущей страницы».
- Выполнение JS — «найди на странице все заголовки h1».
- Взаимодействие с DOM — «кликни на кнопку “Войти”».
- Заполнение форм — «заполни поле поиска словом “MCP”».
Цель — создать полноценного AI-ассистента, который реально работает в браузере, а не просто ведёт диалог.
За один вечер я добавил в n0x поддержку MCP. Главное, что понял: MCP — это мост между LLM и реальным миром. И этот мост уже можно запустить прямо в браузере. Исходный код доступен в открытом репозитории n0x.