К курсу

Цикл агента

Один шаг цикла агентаПрактика: один шаг циклаЦикл в кодеПрактика: цикл в кодеОстановка и повторыПрактика: остановка и повторыЧто решает только кодПрактика: что решает код

Надёжность в проде

Таймаут и ключ идемпотентностиПрактика: таймаут и ключ идемпотентности

Устройство агентов

Workflow или агентПрактика: workflow или агентReAct и plan-and-executeПрактика: ReAct и plan-and-executeОдин агент или ройПрактика: один агент или рой

Контекст и стоимость

Почему растёт счёт за агентаПрактика: токены и кэшКонтекст-инженерияПрактика: управление окномПамять агентаПрактика: что агент хранит

Инструменты и протоколы

MCPПрактика: MCP
←→ENВойти
Агенты › Инструменты и протоколы

MCP

Опирается наЦикл в коде

Этот блок объясняет, как инструмент другой команды попадает к вашему агенту через Model Context Protocol (MCP), как выглядит текущая версия протокола и что он оставляет на вас с точки зрения безопасности.

Два одинаковых бланка на все отделы

Коллега на телефоне всё чаще просит то, что есть только у других отделов: статус посылки у доставки, остатки у склада. У каждого отдела своя процедура, и вы держите на каждый отдельную папку с инструкциями.

Потом все отделы договариваются о двух бланках. Один спрашивает «что вы умеете?», другой говорит «сделайте, пожалуйста, вот это». Первый бланк каждый отдел заполняет сам, а вы зачитываете ответы коллеге.

У Northwind три агента, и всем нужны одни и те же три сервиса. Без общего формата на каждую пару нужен свой адаптер.

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

MCP — это такая пара бланков, записанная сообщениями JSON-RPC 2.0. API сервиса остаётся на месте. Здесь сервер MCP — это адаптер перед ним, и любое приложение, которое говорит по MCP, может им пользоваться без кода под этот сервер.

Кто что делает

Модель в протоколе не участвует и соединений не открывает. Вот один запрос статуса посылки:

Сервер говорит только с вашим приложением, а приложение говорит с моделью и переводит между ними.
Сервер говорит только с вашим приложением, а приложение говорит с моделью и переводит между ними.
  1. Ваше приложение отправляет tools/list, и сервер доставки отвечает своими определениями.
  2. Приложение копирует их в поле tools запроса к модели. В MCP схема называется inputSchema, а в API Anthropic — input_schema, поэтому приложение её переименовывает.
  3. Модель отвечает блоком tool_use для track_parcel.
  4. Приложение проводит свои проверки и отправляет tools/call.
  5. Сервер делает работу и возвращает результат. Приложение заворачивает его в tool_result, и цикл из прошлых блоков продолжается.

На шаге 2 нужна осторожность с именами. Имя инструмента уникально только внутри одного сервера, так что у двух серверов может быть по search, и спецификация говорит, что клиентам следует различать их, например приставкой с именем сервера. Приставку лучше задавать в самом хосте: спецификация предупреждает, что собственное name сервера не обязано быть уникальным. Ещё MCP разрешает точку в имени, а API Anthropic нет. Поэтому хост Northwind показывает модели shipping__track_parcel, заменяет точки на подчёркивания и убирает приставку перед вызовом сервера.

Шаг 4 в текущей редакции выглядит так:

{
  "jsonrpc": "2.0",
  "id": 7,
  "method": "tools/call",
  "params": {
    "name": "track_parcel",
    "arguments": {
      "order_id": "4417"
    },
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientCapabilities": {}
    }
  }
}

И ответ:

{
  "jsonrpc": "2.0",
  "id": 7,
  "result": {
    "resultType": "complete",
    "content": [
      {
        "type": "text",
        "text": "4417: курьер в пути"
      }
    ],
    "isError": false
  }
}

Кроме инструментов, у серверов есть и другое. Инструменты (tools) — это функции, которые запускает модель, ресурсы (resources) — данные для пользователя или модели, а промпты (prompts) — шаблоны сообщений для пользователя. В обратную сторону клиент может предложить elicitation: сервер спрашивает у пользователя нужные сведения.

Сообщения идут по одному из двух стандартных транспортов. В stdio клиент запускает сервер как дочерний процесс, и они обмениваются строками через его стандартные потоки. В Streamable HTTP каждое сообщение — это POST на один адрес. Более старый транспорт HTTP+SSE объявлен устаревшим.

О какой версии вы читаете

На 2026-11-10 текущая редакция — 2026-07-28, и она изменила основу протокола. Статьи и примеры SDK, написанные раньше, описывают рукопожатие слева.

Старые редакции начинаются с рукопожатия. В текущей каждый запрос сам сообщает о себе всё нужное.
Старые редакции начинаются с рукопожатия. В текущей каждый запрос сам сообщает о себе всё нужное.

2025-11-25 и раньше

2026-07-28

Версия и возможности клиента

Согласуются один раз в initialize

Идут в _meta каждого запроса

Узнать возможности сервера

Ответ на initialize

server/discover: сервер обязан его реализовать, клиент может не вызывать

Состояние между вызовами

Необязательный Mcp-Session-Id по HTTP

Сессии в протоколе нет; сервер выдаёт идентификатор (handle), который передают аргументом инструмента

Серверу нужен ввод пользователя

Сервер шлёт запрос клиенту

В результате стоит resultType: "input_required", и клиент повторяет вызов с inputResponses

Roots, Sampling, Logging

Действуют

Объявлены устаревшими, но работают ещё минимум двенадцать месяцев

Устаревший не значит удалённый, но новым реализациям брать эти функции не следует. Вместо Roots спецификация предлагает параметры инструмента, URI ресурсов или настройки сервера. Elicitation остаётся в силе, а Roots, Sampling и Logging могут исчезнуть не раньше первой редакции, вышедшей 2027-07-28 или позже.

Сами по себе эти две эпохи не совмещаются. Клиент, который знает только новую редакцию, не сможет работать с сервером, знающим только рукопожатие, и наоборот. Реализация, которой нужны обе, поддерживает обе, и спецификация называет это dual-era.

Что MCP оставляет вам

Спецификация прямо говорит, что MCP не может обеспечить свои принципы безопасности на уровне протокола. Эта работа лежит на вашем хосте и на сервисе.

Правило из блока про возвраты остаётся в силе: customer_id не попадает в arguments. Авторизация в MCP необязательна. Если сервер на Streamable HTTP её использует, токен идёт с каждым запросом, и сервер берёт личность из него.

MCP окупается, когда один сервис нужен нескольким агентам или сервис делает другая команда. Одному агенту с двумя вашими функциями он не нужен.

Вывод

Глубже

Specification 2026-07-28: key changesТочный список изменений с 2025-11-25 и номера предложений.MCP toolsНастоящие сообщения tools/list и tools/call и замечания о безопасности в конце.Versioning and compatibilityТаблица того, какие эпохи клиентов и серверов работают вместе.The 2026-07-28 specification (MCP blog)Авторы объясняют, зачем ядро стало stateless.
‹ Назад
Предложить улучшениеНашёл ошибку