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 меняет направление. Вместо вывода намерения из пикселей вы регистрируете инструменты явно — имя, описание, схема входных данных, функция выполнения — и браузер отдаёт их агенту в структурированном виде. Логика остаётся на странице, права остаются внутри сессии пользователя, интерфейс остаётся под вашим контролем.

Императивный вариант:

js
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:

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.

WebMCP: сайт как набор инструментов для агентов · bahashwan.dev