MCPprotocol.ru

Главная / Архитектура MCP

Архитектура MCP

Как устроено соединение между ИИ-приложением и сервером MCP и что изменилось с переходом на протокол без состояния.

Ревизия MCP 2026-07-28 · проверено 03.10.2026 · Markdown

Участники#

В MCP три роли. Хост — ИИ-приложение, с которым работает пользователь. Клиент — компонент хоста, который держит связь с одним сервером. Сервер — программа, которая предлагает инструменты, ресурсы и шаблоны запросов.

Схема MCP: хост, клиенты и серверыХост с двумя клиентами MCP. Первый клиент подключён к локальному серверу по stdio, второй — к удалённому серверу по Streamable HTTP. Серверы обращаются к файлам, базам данных и внешним сервисам.ХостИИ-приложение с модельюКлиент MCP Аодин клиент — один серверКлиент MCP Бодин клиент — один серверstdioStreamable HTTPСервер MCP 1локальный процессСервер MCP 2удалённый, по адресуФайлы, БДданные на машинеAPI сервисовоблако, SaaS
Хост создаёт по клиенту на каждый подключённый сервер. Серверы сами обращаются к файлам, базам данных и внешним сервисам.

Протокол взял идею у Language Server Protocol: так же, как тот стандартизирует поддержку языков программирования в редакторах, MCP стандартизирует подключение контекста и инструментов к ИИ-приложениям. Сообщения передаются в формате JSON-RPC 2.0.

Транспорты#

Транспорт определяет, как сообщения доходят от клиента до сервера. Сейчас действуют два транспорта, ещё один устарел.

Транспорты MCP
ТранспортДля чегоКак устроенСтатус
stdioЛокальные серверыХост запускает сервер как процесс и обменивается сообщениями через стандартные потокиДействует
Streamable HTTPУдалённые серверыЗапросы HTTP POST на адрес сервера, ответ обычный или потоковыйДействует
HTTP+SSEУдалённые серверыПрежний транспорт с двумя адресамиУстарел устарело

Запросы без состояния#

Главное изменение ревизии 2026-07-28: протокол больше не хранит состояние соединения. Рукопожатие initialize и заголовок Mcp-Session-Id удалены, каждый запрос несёт всё необходимое сам.

Сравнение: соединение с сессией до 2026-07-28 и запросы без состояния послеСлева: клиент обменивается с сервером сообщениями initialize и initialized, после чего все запросы идут в одной сессии. Справа: три самодостаточных запроса проходят через балансировщик и могут попасть на разные экземпляры сервера.До 2026-07-28: сессияКлиентСерверinitializeвозможности сервераinitializedзапрос + Mcp-Session-Idзапрос + Mcp-Session-IdС 2026-07-28: без состояниязапрос 1всё нужное в _metaзапрос 2всё нужное в _metaзапрос 3всё нужное в _metaбалан-сировщиксерверАсерверБЛюбой запрос обработает любой экземпляр.
Слева: до 2026-07-28 клиент сначала согласовывал сессию. Справа: каждый запрос самодостаточен, поэтому его может обработать любой экземпляр сервера за обычным балансировщиком.
  • Каждый запрос содержит версию протокола (заголовок MCP-Protocol-Version и поле в _meta), возможности клиента и, как правило, сведения о клиенте.
  • Если клиенту нужно узнать возможности сервера заранее, он вызывает метод server/discover; сервер обязан его поддерживать.
  • При несовпадении версий сервер возвращает ошибку UnsupportedProtocolVersion.
  • Если серверу нужно состояние между вызовами, он выдаёт явный идентификатор через инструмент, а модель передаёт его как обычный аргумент.
Пример запроса Streamable HTTP (упрощён, значения вымышлены)
POST /mcp HTTP/1.1
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: get_stock

{"jsonrpc":"2.0","id":1,"method":"tools/call",
 "params":{"name":"get_stock","arguments":{"sku":"A-100"},
 "_meta":{"io.modelcontextprotocol/clientInfo":{"name":"my-app","version":"1.0"}}}}

Заголовки Mcp-Method и Mcp-Name обязательны для запросов POST в Streamable HTTP. Благодаря им шлюз, ограничитель запросов или файервол могут маршрутизировать и учитывать вызовы, не разбирая тело.

Многошаговые запросы#

Раньше серверу, которому не хватало данных, приходилось самому отправлять запрос клиенту по открытому потоку: спросить пользователя, обратиться к модели, запросить корневые каталоги. Для протокола без состояния это не подходит.

Теперь действует схема многошагового запроса (MRTR). Сервер возвращает результат типа input_required и перечисляет, что ему нужно. Клиент получает ответы — например, спрашивает пользователя — и повторяет исходный запрос, добавив их в поле inputResponses. Каждый результат теперь содержит обязательное поле resultType: complete для обычного ответа или input_required для промежуточного.

Кэширование и уведомления#

Списки инструментов, шаблонов и ресурсов, а также чтение ресурса теперь содержат ttlMs и cacheScope. Клиент использует их, чтобы не запрашивать список заново без нужды, а промежуточные узлы знают, можно ли хранить ответ общим.

Сервер должен возвращать инструменты в одном и том же порядке: это помогает кэшировать список и стабильно использовать кэш запросов к модели. Об изменениях сервер сообщает через единый поток subscriptions/listen, на который клиент подписывается по типам уведомлений.

Расширения#

Всё, что не входит в ядро, оформляется как расширение: клиент и сервер объявляют поддержку явно. В ревизии 2026-07-28 к ним относятся:

  • Tasks (io.modelcontextprotocol/tasks) — долгие операции с опросом состояния;
  • MCP Apps — интерактивные элементы интерфейса в диалоге;
  • Enterprise Managed Authorization — корпоративное управление доступом.

Кроме того, рабочая группа развивает «Skills over MCP» — передачу структурированных инструкций для сценариев агента через MCP; в спецификации это пока не расширение ядра.