WebMCP: сайт как набор инструментов для агентов
Начиная с Chrome 149 Google проводит публичный origin trial для WebMCP — предложения, которое позволяет странице самой объявлять свои инструменты для AI-агентов вместо того, чтобы те угадывали интерфейс. Документация Chrome вышла 18 мая 2026 года и была обновлена 9 июня, а 5 мая в Lighthouse появился набор проверок «agentic browsing»: одна из них отмечает любую <form>, у которой нет понятного агенту описания. Спецификация развивается внутри W3C Web Machine Learning Community Group, и точка входа уже переехала с navigator.modelContext на document.modelContext.
Проблема: агент угадывает, а платит продукт
Сегодняшний агентный браузинг — это скриншот, разбор DOM, клик наугад. В демо работает, в продакшене рассыпается: переименовали класс, добавили условно отображаемое поле, вставили лишний шаг верификации — и весь сценарий сломан. Хуже того, ломается тихо: агент рапортует об успешном бронировании, хотя форма так и не была отправлена.
Ирония в том, что приложение прекрасно знает, что в нём можно сделать: добавить товар в корзину, найти рейс, забронировать столик. Это знание уже лежит в коде. Просто не было стандартного способа его экспортировать.
Что изменилось: страница объявляет инструменты сама
WebMCP меняет направление. Вместо вывода намерения из пикселей вы регистрируете инструменты явно — имя, описание, схема входных данных, функция выполнения — и браузер отдаёт их агенту в структурированном виде. Логика остаётся на странице, права остаются внутри сессии пользователя, интерфейс остаётся под вашим контролем.
Императивный вариант:
const controller = new AbortController();
document.modelContext.registerTool({
name: "add-todo",
description: "Add a new item to the user's active todo list",
inputSchema: {
type: "object",
properties: {
text: { type: "string", description: "The text content of the todo item" }
},
required: ["text"]
},
async execute({ text }) {
await addTodoItemToCollection(text);
return {
content: [{ type: "text", text: `Added todo item: "${text}" successfully.` }]
};
}
}, { signal: controller.signal });Обратите внимание на signal: отмена AbortController снимает регистрацию инструмента. Это позволяет привязать регистрацию к жизненному циклу компонента React или Vue без ручной уборки.
И декларативный вариант вообще без JavaScript
Большая часть того, что интересует агентов, — это уже существующие формы. Поэтому спецификация поддерживает декларативный стиль на атрибутах HTML:
<form toolname="supportRequestTool"
tooldescription="Submit a request for support."
action="/submit">
<label for="firstName">First Name</label>
<input type="text" name="firstName" id="firstName">
<select name="select" required
toolparamdescription="Determines what team this request is routed to.">
<option value="Customer happiness team">Return my purchase.</option>
<option value="Distribution team">Check where my package is.</option>
</select>
<button type="submit">Submit</button>
</form>Три атрибута: toolname и tooldescription на форме, toolparamdescription на полях, смысл которых неочевиден. Если их нет, браузер использует связанный <label> или aria-description.
Где эффект заметен раньше всего
Самая очевидная выгода — электронная коммерция и бронирования: поиск товара по составным критериям, отслеживание посылки, запуск возврата, запись на приём. Это длинные сценарии с условными полями, и именно они ломаются при клике наугад. Явное описание их как инструментов превращает работу агента из угадывания в вызов, у которого есть внятный результат — успех или ошибка. Побочная выгода: попытка написать честный tooldescription заставляет точно сформулировать назначение формы, а это упражнение обычно вскрывает двусмысленность, от которой страдал и живой пользователь.
Ограничения, которые стоит принимать всерьёз
- Это всё ещё эксперимент. API активно обсуждается и уже менялся. Относитесь к нему как к прогрессивному улучшению, а не как к зависимости.
- Никакого headless. Нужна настоящая вкладка браузера или webview, документы должны быть origin-isolated, а доступ ограничен Permissions Policy с именем
tools. - Отправка не автоматическая. Кнопку Submit по-прежнему нажимает пользователь, пока вы осознанно не добавите
toolautosubmit— хорошее поведение по умолчанию для всего значимого. - Инструмент — не граница безопасности. Всё зарегистрированное выполняется с правами текущего пользователя. Это ближе к проектированию публичного API, чем к добавлению кнопки: проверяйте входные данные и требуйте явного подтверждения перед покупкой или удалением. Более широкий вопрос аутентификации агентов разбирался в материале MCP и аутентификация агентов.
Вывод
Тридцать лет веб описывал себя людям и поисковым системам. WebMCP — первая серьёзная попытка описать его агентам с той же ясностью. Разработчика это не заменяет — это умножает эффект интерфейса, который разработчик уже построил, потому что намерение продукта становится явным, а не выводимым. Самый дешёвый старт: добавьте toolname и tooldescription к самой важной форме, запустите новую проверку Lighthouse и посмотрите на результат.
Первоисточники: WebMCP на Chrome for Developers и репозиторий спецификации W3C Web Machine Learning CG.