Что такое MCP (Model Context Protocol)

Model Context Protocol (MCP) - открытый протокол, который стандартизирует подключение ИИ-приложений к внешним инструментам, источникам данных и сервисам. Приложение с поддержкой MCP работает с любым MCP-сервером, будь то доступ к файловой системе, базе данных, баг-трекеру или платёжному API, без отдельной интеграции для каждой пары «приложение - сервис».

MCP представила компания Anthropic в ноябре 2024 года. С декабря 2025 года протокол развивается в Agentic AI Foundation, входящем в Linux Foundation. Текущая версия спецификации - 2026-07-28.

Кратко

Параметр Значение
Тип Открытый протокол прикладного уровня, клиент-сервер
Формат сообщений JSON-RPC 2.0
Транспорты stdio для локальных серверов, Streamable HTTP для удалённых
Примитивы сервера Инструменты (tools), ресурсы (resources), промпты (prompts)
Текущая спецификация 2026-07-28
Управление проектом Agentic AI Foundation (Linux Foundation) с декабря 2025 года
Официальные SDK TypeScript, Python, Go, C# (Tier 1); также Java, Kotlin, Rust, Swift, PHP и другие

Какую задачу решает MCP

Языковая модель работает только с тем текстом, который получила. Чтобы прочитать файл, выполнить запрос к базе данных или создать задачу, модели нужно приложение, которое обращается к внешним системам от её имени и возвращает результаты в её контекст. Провайдеры моделей поддерживают это через function calling (его также называют tool use): приложение описывает функции в JSON Schema, модель возвращает запрос на вызов одной из них, приложение выполняет вызов.

Function calling определяет, как модель просит о вызове. Откуда берутся сами инструменты, он не определяет. До MCP у каждого ИИ-приложения был свой формат плагинов или интеграций, и интеграцию с одним и тем же сервисом писали отдельно под каждое приложение. При N приложениях и M сервисах это до N × M интеграций, у каждой свой код, своя аутентификация и своя поддержка.

MCP заменяет это одним контрактом. Сервис один раз реализует MCP-сервер, приложение один раз реализует MCP-клиент, и любая совместимая пара работает вместе: N + M реализаций вместо N × M.

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

История

Дата Событие
25 ноября 2024 Anthropic публикует MCP как открытый стандарт вместе с SDK для Python и TypeScript и набором эталонных серверов. Авторы - David Soria Parra и Justin Spahr-Summers
Март 2025 Спецификация 2025-03-26: транспорт Streamable HTTP и авторизация на основе OAuth 2.1. OpenAI переходит на MCP, начиная с Agents SDK
Апрель 2025 Google объявляет о поддержке MCP в моделях Gemini и Gemini SDK
Май 2025 Microsoft на конференции Build 2025 объявляет о поддержке MCP в своих платформах
Июнь 2025 Спецификация 2025-06-18: структурированный результат инструментов и elicitation
Сентябрь 2025 Предварительная версия официального MCP Registry
Ноябрь 2025 Спецификация 2025-11-25: экспериментальные задачи (tasks), OAuth Client ID Metadata Documents
Декабрь 2025 Anthropic передаёт MCP в Agentic AI Foundation (AAIF) - фонд Linux Foundation, основанный Anthropic, Block и OpenAI
Январь 2026 MCP Apps, первое официальное расширение: интерактивные интерфейсы, которые отдают MCP-серверы
28 июля 2026 Спецификация 2026-07-28: ядро протокола становится stateless (без состояния)

Архитектура

Участники

В MCP три роли:

  • Хост (host) - ИИ-приложение, с которым работает пользователь: чат-ассистент, IDE, агент. Хост ведёт диалог с моделью и решает, что модели разрешено делать. Примеры: Claude Desktop, Claude Code, Visual Studio Code, ChatGPT.
  • Клиент (client) - компонент внутри хоста, который держит соединение с одним MCP-сервером. Для каждого сервера хост создаёт отдельный клиент.
  • Сервер (server) - программа, которая предоставляет контекст и действия: инструменты, данные, шаблоны промптов. Сервер может быть обёрткой над файловой системой, базой данных, API SaaS-сервиса или внутренним сервисом компании.
Хост (ИИ-приложение)
 |
 +-- MCP-клиент 1 --- stdio ------------- MCP-сервер: файловая система (локальный)
 +-- MCP-клиент 2 --- stdio ------------- MCP-сервер: база данных (локальный)
 +-- MCP-клиент 3 --- Streamable HTTP --- MCP-сервер: баг-трекер (удалённый)

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

Сервер, который работает процессом на машине пользователя, называют локальным. Сервер, который работает как сетевой сервис, называют удалённым. Локальный сервер обычно обслуживает одного клиента, удалённый - многих.

Уровни

Протокол состоит из двух уровней:

  • Уровень данных (data layer) определяет сообщения JSON-RPC 2.0 и их смысл: обнаружение возможностей, примитивы, уведомления, ошибки.
  • Транспортный уровень (transport layer) определяет доставку сообщений: соединение, разбиение потока на сообщения, авторизацию.

Одни и те же сообщения JSON-RPC идут по любому транспорту, поэтому логика сервера не зависит от того, как он развёрнут.

Примитивы

Примитивы - это то, что стороны предлагают друг другу. Спецификация определяет три примитива сервера:

Примитив Что это Кто решает использовать Методы
Инструменты (tools) Функции, которые выполняют действия: запрос к базе данных, создание задачи, вызов внешнего API Модель, с разрешения хоста tools/list, tools/call
Ресурсы (resources) Данные для контекста: содержимое файлов, записи базы данных, документы. Каждый ресурс идентифицируется URI Приложение resources/list, resources/read
Промпты (prompts) Многоразовые шаблоны инструкций для модели, часто с параметрами Пользователь, например через слеш-команду prompts/list, prompts/get

Инструмент описывается именем, заголовком для человека, описанием и JSON Schema входных параметров (inputSchema). Инструмент может объявить и схему своего результата (outputSchema). Модель выбирает инструмент и заполняет аргументы по имени, описанию и схеме. Поэтому текст описаний - часть интерфейса: неточное описание приводит к неверным или пропущенным вызовам, даже когда код инструмента работает правильно.

Сторона клиента предоставляет примитивы, через которые сервер может что-то запросить у хоста:

  • Elicitation (запрос данных у пользователя): сервер просит пользователя ввести недостающие данные или подтвердить действие (elicitation/create).
  • Sampling (устарел в 2026-07-28): сервер просит модель клиента сгенерировать ответ (sampling/createMessage). Новые реализации обращаются к API провайдеров моделей напрямую.
  • Roots (устарел): клиент сообщает серверу, с какими каталогами можно работать. Теперь пути передают параметрами инструментов или в конфигурации сервера.
  • Logging (устарел): сообщения журнала от сервера к клиенту. Заменён стандартным потоком ошибок для stdio-серверов и OpenTelemetry.

Устаревшая возможность продолжает работать не меньше двенадцати месяцев. Этот минимальный срок - часть формальной политики вывода функций из употребления, которую ввела версия 2026-07-28.

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

Как проходит запрос

Обнаружение возможностей

С версии 2026-07-28 MCP не хранит состояние (stateless): каждый запрос содержит всё, что нужно серверу для его обработки. Версия протокола, данные о клиенте и его возможности передаются в поле _meta каждого запроса.

Чтобы узнать, что поддерживает сервер, клиент может отправить server/discover. Этот метод обязан реализовать каждый сервер; клиент может его пропустить и сразу отправлять другие запросы.

JSON
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "server/discover",
  "params": {
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientInfo": { "name": "example-client", "version": "1.0.0" },
      "io.modelcontextprotocol/clientCapabilities": { "elicitation": {} }
    }
  }
}

В ответе - поддерживаемые версии протокола и возможности сервера. Ответ можно кешировать:

JSON
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "resultType": "complete",
    "supportedVersions": ["2026-07-28"],
    "capabilities": { "tools": { "listChanged": true }, "resources": {} },
    "_meta": {
      "io.modelcontextprotocol/serverInfo": { "name": "example-server", "version": "1.0.0" }
    },
    "ttlMs": 3600000,
    "cacheScope": "public"
  }
}

Если сервер не поддерживает запрошенную версию, он отклоняет запрос с ошибкой UnsupportedProtocolVersionError и списком версий, которые поддерживает. Клиент повторяет запрос с версией, которую поддерживают обе стороны.

Вызов инструмента

Типичный цикл выглядит так:

  1. Хост запрашивает список инструментов у каждого подключённого сервера (tools/list) и добавляет их описания в контекст модели.
  2. Пользователь задаёт вопрос. Модель решает, что нужен инструмент, и возвращает вызов с аргументами.
  3. Хост проверяет разрешения, при необходимости спрашивает подтверждение у пользователя и отправляет tools/call через клиент нужного сервера.
  4. Сервер выполняет действие и возвращает результат в виде массива content: текст, изображения, ссылки на ресурсы, структурированные данные.
  5. Хост передаёт результат модели, и модель продолжает ответ.

Запрос и ответ шагов 3 и 4:

JSON
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "weather_current",
    "arguments": { "location": "San Francisco", "units": "imperial" },
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28",
      "io.modelcontextprotocol/clientInfo": { "name": "example-client", "version": "1.0.0" },
      "io.modelcontextprotocol/clientCapabilities": { "elicitation": {} }
    }
  }
}
JSON
{
  "jsonrpc": "2.0",
  "id": 3,
  "result": {
    "resultType": "complete",
    "content": [
      { "type": "text", "text": "Current weather in San Francisco: 68°F, partly cloudy" }
    ]
  }
}

Ошибка, которая произошла во время работы инструмента, возвращается внутри результата с isError: true: модель её видит и может исправить вызов. Ошибки протокола, например неизвестный метод или неверные параметры, возвращаются как ошибки JSON-RPC.

Когда серверу нужны дополнительные данные

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

Спецификация 2026-07-28 заменяет этот механизм на Multi Round-Trip Requests (MRTR), многоэтапные запросы. Сервер отвечает на tools/call, resources/read или prompts/get результатом типа input_required. В поле inputRequests перечислено, чего не хватает серверу, а в поле requestState может лежать непрозрачное для клиента состояние:

JSON
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "resultType": "input_required",
    "inputRequests": {
      "github_login": {
        "method": "elicitation/create",
        "params": {
          "mode": "form",
          "message": "Please provide your GitHub username",
          "requestedSchema": {
            "type": "object",
            "properties": { "name": { "type": "string" } },
            "required": ["name"]
          }
        }
      }
    },
    "requestState": "AEAD-protected blob"
  }
}

Клиент собирает ответы, например спрашивает пользователя, и повторяет исходный запрос с новым id, ответами в inputResponses и неизменённым requestState. Повторный запрос может обработать любой экземпляр сервера. Поскольку requestState проходит через клиента, сервер обязан считать его недоверенными входными данными и защищать его целостность, если от него зависят авторизация или бизнес-логика.

Уведомления

Сервер может сообщить клиенту об изменениях, например о том, что изменился список инструментов (notifications/tools/list_changed). Уведомления клиент получает только по подписке: он открывает долгоживущий поток subscriptions/listen и перечисляет нужные типы уведомлений. Доставка не гарантирована, поэтому клиенты также периодически запрашивают списки заново.

Результаты tools/list, prompts/list, resources/list и resources/read содержат подсказки для кеширования: ttlMs (сколько результат остаётся актуальным) и cacheScope (кто может использовать его повторно). Спецификация рекомендует возвращать инструменты в детерминированном порядке, это сохраняет стабильность кеша промптов модели.

Транспорты

stdio

Хост запускает сервер как дочерний процесс. Сообщения JSON-RPC идут через стандартные потоки ввода и вывода, по одному сообщению на строку; стандартный поток ошибок используется для журнала. Этот транспорт применяют для локальных серверов: сети нет, учётные данные сервер берёт из окружения процесса, например из переменных окружения.

Streamable HTTP

Сервер - это HTTP-эндпоинт. Клиент отправляет каждое сообщение HTTP-запросом POST. Сервер отвечает JSON или открывает поток Server-Sent Events, когда ему нужно отправить несколько сообщений, например отчёты о прогрессе.

С версии 2026-07-28 запросы несут заголовки с методом и именем инструмента, ресурса или промпта. Шлюзы, ограничители частоты запросов и межсетевые экраны веб-приложений могут маршрутизировать и учитывать трафик, не разбирая тело JSON:

HTTP
POST /mcp HTTP/1.1
Content-Type: application/json
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: search_issues

Сессии на уровне протокола и заголовка Mcp-Session-Id больше нет, поэтому удалённый сервер может работать за обычным балансировщиком нагрузки с распределением по кругу (round-robin), без привязки клиента к экземпляру и общего хранилища сессий, в том числе на бессерверных платформах.

Старый транспорт HTTP+SSE из первой версии спецификации объявлен устаревшим, вместо него используется Streamable HTTP. Оба транспорта, их заголовки и требования описаны в статье Транспорты MCP.

Спецификация 2026-07-28

Мейнтейнеры называют 2026-07-28 самой крупной редакцией протокола с момента запуска. Основные изменения по сравнению с 2025-11-25:

Область До 2025-11-25 включительно 2026-07-28
Начало работы Рукопожатие initialize / initialized, которое открывает сессию Рукопожатия нет, каждый запрос самодостаточен
Сессия Заголовок Mcp-Session-Id Удалён
Возможности сторон Передаются один раз во время initialize Передаются в _meta каждого запроса; метод server/discover
Запросы от сервера к клиенту Сервер отправляет их во время обработки Multi Round-Trip Requests
Длительные операции Экспериментальные задачи в ядре Расширение Tasks io.modelcontextprotocol/tasks
Маршрутизация HTTP Метод только внутри тела JSON Заголовки Mcp-Method и Mcp-Name
Списки Без подсказок для кеширования ttlMs, cacheScope, детерминированный порядок инструментов
Вывод функций из употребления Формальной политики нет Не меньше двенадцати месяцев; roots, sampling и logging объявлены устаревшими

Версия также формализовала расширения (extensions): необязательные возможности, которые клиент и сервер должны явно поддержать и которые развиваются вне ядра протокола. Среди официальных расширений:

  • Tasks: асинхронное выполнение длительных операций. Инструмент возвращает идентификатор задачи, клиент опрашивает её статус (tasks/get) и забирает результат позже.
  • MCP Apps: интерактивные интерфейсы. Сервер связывает инструмент с ресурсом ui://, а хост отображает его в изолированном iframe. Хосты без поддержки расширения показывают текст или структурированные данные.
  • Enterprise-Managed Authorization: доступ к серверам выдают администраторы через корпоративного провайдера учётных записей, и пользователи подключаются автоматически при входе.

Больше всего изменений при миграции требуют серверы, которые опирались на идентификатор сессии. Состояние, которое нужно приложению между вызовами, передаётся явно: например, инструмент возвращает идентификатор, а модель передаёт его аргументом следующего вызова. Изменения и миграция с 2025-11-25 описаны в статье MCP без состояния, механизм расширений и официальные расширения - в статье Расширения MCP.

Безопасность и авторизация

Авторизация в MCP необязательна. Для серверов на HTTP, которым она нужна, спецификация определяет авторизацию на основе OAuth 2.1. MCP-сервер выступает сервером ресурсов OAuth: клиент получает токен доступа у сервера авторизации и передаёт его в заголовке Authorization каждого запроса. Сервер принимает только токены, выданные для него. Спецификация 2026-07-28 добавила требования, которые закрывают известные пути атак:

  • клиент обязан проверить издателя ответа авторизации (iss, RFC 9207), прежде чем обменять код авторизации на токен;
  • учётные данные клиента привязаны к издателю, который их выдал, и не используются с другим сервером авторизации;
  • динамическая регистрация клиентов (Dynamic Client Registration) объявлена устаревшей, вместо неё используются Client ID Metadata Documents.

Сервер не должен передавать токен, полученный от клиента, дальше в другие сервисы (token passthrough запрещён): для вызовов других API он получает собственные токены. Серверы на stdio не используют OAuth и берут учётные данные из окружения. Полная схема описана в статье Авторизация в MCP.

Спецификация требует, чтобы хост получал явное согласие пользователя перед вызовом инструмента, и считает описания инструментов от недоверенных серверов недоверенными данными. Известные классы рисков:

  • Отравление инструментов (tool poisoning): инструкции, скрытые в описаниях инструментов. Модель их читает, а пользователь обычно не видит. Это разновидность prompt injection, публично описанная в апреле 2025 года.
  • Prompt injection через данные: текст, который вернул инструмент или ресурс (веб-страница, письмо, задача в трекере), может содержать инструкции, адресованные модели.
  • Confused deputy («запутавшийся заместитель»): прокси-сервер с широкими правами выполняет действие для пользователя, у которого не должно быть к нему доступа.
  • Уязвимости реализаций: например, CVE-2025-6514 в пакете mcp-remote (CVSS 9.6) позволяла вредоносному серверу выполнять команды на машине пользователя, а CVE-2025-49596 в MCP Inspector возникла из-за отсутствия аутентификации по умолчанию.

Риски и меры защиты от них описаны в статье Безопасность MCP.

Экосистема

  • SDK. SDK уровня Tier 1 (TypeScript, Python, Go и C#) поддержали 2026-07-28 к моменту выхода спецификации. Официальные SDK есть также для Java, Kotlin, Rust, Swift, PHP и других языков.
  • MCP Inspector - инструмент разработчика: подключается к серверу, показывает его примитивы, вызывает инструменты и отображает сообщения. Его применение в тестировании описано в статье Тестирование MCP-серверов.
  • MCP Registry (registry.modelcontextprotocol.io(откроется в новой вкладке)) - официальный каталог общедоступных серверов, предварительная версия запущена в сентябре 2025 года. Каталог хранит метаданные, а не код: каждая запись - файл server.json с уникальным именем в обратной DNS-нотации (например, io.github.user/server-name) и расположением пакета в npm, PyPI, Docker Hub или адресом удалённого сервера. API каталога открыт, поэтому компании могут держать собственные закрытые каталоги в том же формате. Публикация сервера описана в статье Публикация MCP-сервера в MCP Registry.
  • Хосты. MCP поддерживают Claude, ChatGPT, Visual Studio Code, Cursor и многие другие ИИ-приложения и фреймворки для агентов.

MCP и смежные технологии

Function calling MCP REST или GraphQL API
Уровень Возможность API модели Протокол между ИИ-приложением и внешними системами Интерфейс сервиса для программ
Кто описывает инструменты Разработчик приложения, в каждом запросе к модели Автор сервера, один раз Разработчик сервиса
Обнаружение во время работы Нет Да: tools/list, уведомления об изменениях Обычно через документацию или OpenAPI
Повторное использование в разных ИИ-приложениях Нет Да Каждое ИИ-приложение интегрируется отдельно

MCP не заменяет function calling: хост по-прежнему использует function calling своей модели, чтобы модель могла выбрать инструмент. MCP определяет, откуда берутся инструменты и как они вызываются.

API протокол тоже не заменяет. Типичный MCP-сервер - это слой над существующим API, который адаптирует его для модели: отбирает операции, которые стоит открыть, описывает их понятным языком, упрощает параметры и приводит результаты к виду, удобному для контекста модели. Как проектируется такой слой, описано в статье MCP-сервер поверх существующего API.

Протокол Agent2Agent (A2A) решает другую задачу: он связывает агентов между собой, а MCP связывает агента с инструментами и данными. Эти протоколы используют вместе.

Термины

Термин Значение
MCP-хост ИИ-приложение, которое работает с моделью и подключается к MCP-серверам
MCP-клиент Компонент хоста, который держит соединение с одним сервером
MCP-сервер Программа, которая предоставляет инструменты, ресурсы и промпты
Инструмент (tool) Функция, которую модель может вызвать через хост
Ресурс (resource) Данные с URI, которые приложение может добавить в контекст
Промпт (prompt) Шаблон инструкции, который вызывает пользователь
Elicitation Запрос сервера на дополнительные данные от пользователя
Возможность (capability) Функция, поддержку которой объявляет клиент или сервер
_meta Поле запроса с версией протокола, данными о клиенте и его возможностями
MRTR Multi Round-Trip Requests: сервер отвечает input_required, клиент повторяет запрос с ответами
Расширение (extension) Необязательная возможность вне ядра протокола, например Tasks или MCP Apps

Источники

Серия

Model Context Protocol (MCP)
  1. Что такое MCP (Model Context Protocol)Текущая
  2. Инструменты (tools) в MCP
  3. Ресурсы и шаблоны ресурсов в MCP
  4. Промпты (prompts) в MCP
  5. Транспорты MCP: stdio и Streamable HTTP
  6. MCP без состояния: изменения 2026-07-28
  7. Авторизация в MCP
  8. Безопасность MCP
  9. Расширения MCP
  10. MCP-сервер поверх существующего API
  11. Тестирование MCP-серверов: основы
  12. Оценка MCP-сервера на моделях
  13. Регрессионное тестирование MCP-сервера
  14. Публикация MCP-сервера в MCP Registry

Статьи Wiki пишет и поддерживает команда ComplexQA.