WebMCP: инструменты сайта для браузерного AI-агента
Что такое WebMCP (браузерный API document.modelContext), чем он отличается от удалённого MCP-сервера, минимальный пример registerTool, ошибки и как проверить.
Обновлено:
Что это
WebMCP — браузерный JavaScript API из черновика W3C Web Machine Learning Community
Group (авторы из Microsoft и Google). Страница регистрирует «инструменты» (tools) —
функции с именем, описанием и JSON Schema входных параметров — через
document.modelContext.registerTool(). AI-агент браузера (или агент в iframe или
расширении) вызывает эти функции напрямую, вместо того чтобы кликать по DOM.
Код инструмента выполняется на самой странице, в сессии пользователя: те же cookie,
тот же стейт приложения. С MCP у WebMCP общий словарь (tools, inputSchema), но это
не MCP-протокол поверх сети: у WebMCP нет серверного endpoint, транспорта и URL
для подключения.
Не путайте с удалённым MCP-сервером (транспорт Streamable HTTP / SSE по адресу вроде
/mcp) — это отдельный механизм, он обнаруживается через
MCP Server Card.
Зачем это AI-агентам
Агент, который управляет сайтом через скриншоты и клики, медленный и хрупкий: поменялась вёрстка — сценарий сломался. WebMCP даёт явный контракт: «вот какие действия здесь доступны и с какими параметрами». Плюсы:
- Надёжность — вызов функции вместо угадывания кнопок.
- Без отдельного бэкенда для агентов — инструмент переиспользует клиентский код и авторизацию пользователя.
- Пользователь в контуре — результат действия виден в интерфейсе, который он уже открыл.
Статус на октябрь 2026: origin trial в Chrome 149 и Edge 150 (локальная разработка —
флаг about:flags#enable-webmcp-testing), поддержка в ChatGPT Desktop, экспериментально
в Brave; у Firefox и Safari позиции пока нет. Декларативный вариант через <form>
удалён из спецификации 8 октября 2026 — остаётся императивный API.
Минимальный рабочий пример
<script type="module">
if ('modelContext' in document) {
const controller = new AbortController();
await document.modelContext.registerTool({
name: 'add-to-cart',
description: 'Добавляет товар в корзину по артикулу',
inputSchema: {
type: 'object',
properties: {
sku: { type: 'string', description: 'Артикул товара' },
qty: { type: 'integer', minimum: 1, description: 'Количество' },
},
required: ['sku'],
},
async execute({ sku, qty = 1 }) {
// Та же функция, что у кнопки «В корзину»: проверки, сессия, обновление UI
const item = await addToCart(sku, qty);
return { content: [{ type: 'text', text: `В корзине: ${item.title} × ${qty}` }] };
},
}, { signal: controller.signal });
// controller.abort() снимает инструмент — например, когда он стал неприменим
}
</script>
API доступен только в secure context (HTTPS). Агентам в cross-origin iframe
инструменты видны только при allow="tools" на iframe и явном списке origin в
опции exposedTo при регистрации. Изменения набора инструментов сопровождаются
событием toolchange.
Правильно vs неправильно
| Правильно | Неправильно |
|---|---|
| Несколько инструментов, у каждого одна задача | Десятки инструментов «на всё» — съедают контекст модели |
Ввод, права и предусловия проверяются внутри execute | Доверие аргументам агента — схема не защита |
| После вызова UI обновляется так же, как после клика | Действие прошло «невидимо», интерфейс показывает старое состояние |
Инструменты регистрируются и снимаются по состоянию приложения (AbortSignal) | Все инструменты висят всегда, даже когда неприменимы |
Проверка 'modelContext' in document перед вызовом | Ошибка в браузерах без WebMCP |
Типичные ошибки
- Путать WebMCP с удалённым MCP-сервером — endpoint
/mcpи SSE-транспорт к WebMCP не относятся. - Старый API
navigator.modelContext— в актуальной спецификации объект висит наdocument. - Декларативные
<form>-инструменты — удалены из спецификации, не стройте на них. - Нет проверок в
execute— агент может передать что угодно; валидируйте как пользовательский ввод. - Страница по HTTP — вне secure context
document.modelContextнедоступен.
Как проверить
Проверка webmcp в сканере информационная (вес 0, на балл не влияет) и пока не
выполняется: инструменты регистрируются из JavaScript, а сканер не исполняет скрипты
страницы. Дешёвый статический сигнал возможен — вызов modelContext.registerTool в
скриптах страницы, — но он показывает лишь наличие кода, а не работающие инструменты.
Вручную:
- Chrome 149+ с флагом
about:flags#enable-webmcp-testing(или origin trial на вашем домене). - Откройте страницу по HTTPS и в консоли DevTools выполните
'modelContext' in document— должно бытьtrue. - По спецификации
await document.modelContext.getTools()возвращает инструменты, зарегистрированные на странице, — ваши должны быть в списке.