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

Александра Клеппер
Alexandra Klepper
Франсуа Бофор
François Beaufort

Опубликовано: 18 мая 2026 г.

Пояснительная записка Веб Расширения Статус Chrome Намерение
GitHub Пробная версия для разработчиков Пробная версия для разработчиков Вид Намерение провести эксперимент

С помощью API WebMCP Imperative можно определять множество типов инструментов на основе стандартного JavaScript. Ваши инструменты могут выполнять различные функции, такие как ввод данных в формы, навигация по сайту и управление состоянием.

Перед использованием этого API ознакомьтесь с примерами его применения .

Предоставьте контекст модели

Для регистрации инструментов используйте интерфейс modelContext . Для регистрации инструмента необходимо указать имя, описание и входную схему с соответствующими свойствами.

Используйте registertool для добавления отдельного инструмента в контекст модели.

WebMCPza Maker

navigator.modelContext.registerTool({
  name: 'toggle_layer',
  description: 'Control pizza layers (sauce, cheese). Use "add", "remove", or "toggle".',
  inputSchema: {
    type: 'object',
    properties: {
      layer: { type: 'string', enum: ['sauce-layer', 'cheese-layer'] },
      action: { type: 'string', enum: ['add', 'remove', 'toggle'] },
    },
    required: ['layer'],
  },
  execute: ({ layer, action }) => {
    toggleLayer(layer, action);
    return `Performed ${action || 'toggle'} on layer: ${layer}`;
  },
});

Получить статус заказа

navigator.modelContext.registerTool({
  name: 'get_order_status',
  description: 'Search orders in a given timeframe. Returns order number, shipping status and location',
  inputSchema: {
    "type": "object",
    "properties": {
      "timeframe": { "type": "string", "oneOf": [
        { "type": "string", "const": "today", "title": "Today" },
        { "type": "string", "const": "yesterday", "title": "Yesterday" },
        { "type": "string", "const": "last_7_days", "title": "Last 7 Days" },
        { "type": "string", "const": "last_30_days", "title": "Last 30 Days" },
        { "type": "string", "const": "last_6_months", "title": "Last 6 Months" }],
      "enum": [ "today", "yesterday", "last_7_days", "last_30_days", "last_6_months" ],
      "description": "Timeframe for the order lookup." }
    },
    "required": [ "timeframe" ]
  },
  execute: ({ timeframe }) => {
    // Add your API or database logic here to fetch and return the order data as a string.
  },
});

Удалить инструмент можно с помощью AbortSignal , если этот параметр является необязательным.

const addTodoTool = {
  name: "addTodo",
  description: "Add a new item to the to-do list",
  inputSchema: {
    type: "object",
    properties: { text: { type: "string" } },
  },
  execute: ({ text }) => {
    // You should handle the persistence logic here (omitted for demo)
    return `Added to-do: ${text}`;
  },
  annotations: {
    readOnlyHint: false,
    untrustedContentHint: true
  },
};
const controller = new AbortController();
navigator.modelContext.registerTool(addTodoTool, { signal: controller.signal });

// Unregister the tool later...
controller.abort();

Откройте для себя инструменты

Чтобы увидеть доступные инструменты, используйте navigator.modelContext.getTools() . Этот асинхронный метод возвращает список инструментов, к которым вызывающий документ имеет доступ в зависимости от его источника.

const [tool] = await navigator.modelContext.getTools();
console.log(tool);

// {
//   annotations: { readOnlyHint: false, untrustedContentHint: true },
//   description: "Add a new item to the to-do list",
//   inputSchema: '{"type":"object","properties":{"text":{"type":"string"}}}',
//   name: "addTodo",
//   origin: "https://example.com",
//   window: Window {window: Window, self: Window, ...},
// }

Запустить инструмент

Для ручного выполнения инструмента, обнаруженного в getTools() , вызовите метод navigator.modelContext.executeTool() с входными аргументами в виде допустимой строки JSON. Этот асинхронный метод возвращает результат выполнения инструмента или null, если запускается навигация.

const result = await navigator.modelContext.executeTool(tool, '{"text": "Buy milk"}');
console.log(result);

// 'Added to-do: Buy milk'

Вы можете отменить выполнение ожидающего инструмента с помощью AbortSignal , если он передан в качестве необязательного параметра.

const controller = new AbortController();
navigator.modelContext.executeTool(tool, '{"text": "Buy milk"}', {
  signal: controller.signal,
});

// Cancel tool execution later...
controller.abort();

События

Фреймы могут отслеживать событие toolchange в navigator.modelContext , чтобы получать уведомления об изменении списка доступных инструментов.

navigator.modelContext.addEventListener("toolchange", (event) => {
  // Tools have changed.
});

iframe-элементы из разных источников

WebMCP поддерживает iframe-элементы, работающие в разных источниках и использующие как политики разрешений, так и явное ограничение доступа к источнику.

Политика разрешений

Регистрация инструментов по умолчанию отключена в iframe, содержащих данные из других источников. Страница должна делегировать доступ, используя политику разрешений tools :

<iframe src="https://example.com" allow="tools"></iframe>

Источник воздействия

Инструменты по умолчанию недоступны для документов из разных источников. Вы можете использовать массив exposedTo в registerTool , чтобы перечислить конкретные источники, которым разрешено просматривать и запускать инструмент. Этот массив поддерживает только источники с протоколом HTTPS.

navigator.modelContext.registerTool({
  name: 'my_shared_tool',
  description: 'Shared across origins',
  // ...
}, {
  exposedTo: ['https://trusted.com', 'https://partner.org']
});

Принимайте участие и делитесь отзывами.

WebMCP находится в стадии активного обсуждения и может быть изменен в будущем. Если вы попробуете этот API и у вас появятся отзывы, мы будем рады их услышать.