Разработка ИИ-агентов · Модуль 4 · Урок 4.1

Протокол MCP: клиент/сервер, транспорты (stdio/HTTP)

Какую проблему решает MCP

Каждый агент рано или поздно обрастает интеграциями: файлы, базы, GitHub, поиск, внутренние сервисы. Без стандарта это превращается в проблему M×N: M агентов нужно подружить с N инструментами, и каждый раз пишется свой клей. MCP (Model Context Protocol) — открытый стандарт от Anthropic, который превращает M×N в M+N: инструмент один раз оборачивают в MCP-сервер, и любой MCP-совместимый агент может им пользоваться.

Аналогия: MCP для агентов — как USB-C для устройств. Единый разъём вместо зоопарка проводов. Вы пишете сервер один раз — и он работает с разными хостами (агентами, IDE, десктоп-приложениями), не зная о них ничего.

Клиент, сервер и что сервер отдаёт

В MCP две роли. Сервер предоставляет возможности; клиент (внутри хоста-агента) к нему подключается и ими пользуется. Один хост может держать несколько клиентов — по одному на каждый сервер.

Сервер выставляет три вида примитивов: - Tools (инструменты) — действия, которые может выполнить модель (поиск, запрос, запись). У каждого имя, описание и JSON Schema входа — ровно как в обычном tool calling из Модуля 1. - Resources (ресурсы) — данные только для чтения, адресуемые по URI (файл, запись в БД, документ). Это контекст, а не действие. - Prompts (промпты) — заготовленные шаблоны/сценарии, которые сервер предлагает хосту.

Главное для нас сейчас — tools и resources: первые дают агенту «руки», вторые — справочный контекст.

JSON-RPC и транспорты

Под капотом MCP — JSON-RPC 2.0: клиент и сервер обмениваются JSON-сообщениями (запрос с method и params → ответ с result или error). Сессия начинается с рукопожатия: клиент шлёт initialize (с версией протокола и своими возможностями), сервер отвечает своими, после чего доступны вызовы tools/list, tools/call, resources/list, resources/read и т.д.

Сообщения ходят по транспорту, и их два основных: - stdio — сервер запускается как локальный подпроцесс, общение идёт через его stdin/stdout (построчный JSON). Идеально для локальных интеграций. - HTTP (в актуальной спецификации — Streamable HTTP) — для удалённых серверов по сети.

Конкретные имена методов и детали транспорта версионно-зависимы — всегда сверяйтесь с актуальной спецификацией MCP.

Рукопожатие и список инструментов (JSON-RPC поверх MCP)
// 1. Клиент инициирует сессию.
{"jsonrpc":"2.0","id":1,"method":"initialize",
 "params":{"protocolVersion":"2025-06-18","capabilities":{},
           "clientInfo":{"name":"my-agent","version":"0.1.0"}}}

// 2. Клиент запрашивает доступные инструменты.
{"jsonrpc":"2.0","id":2,"method":"tools/list"}

// 3. Сервер отвечает списком инструментов с JSON Schema входа.
{"jsonrpc":"2.0","id":2,"result":{"tools":[
  {"name":"get_weather",
   "description":"Текущая погода в городе.",
   "inputSchema":{"type":"object",
     "properties":{"city":{"type":"string"}},
     "required":["city"]}}]}}

// 4. Клиент вызывает инструмент.
{"jsonrpc":"2.0","id":3,"method":"tools/call",
 "params":{"name":"get_weather","arguments":{"city":"Москва"}}}

Anti-patterns

Анти-паттернПочему плохоКак правильно
Писать свой клей под каждый агент×инструментПроблема M×N, дублирование, хрупкостьОбернуть инструмент в MCP-сервер один раз (M+N)
Путать tools и resourcesДействие там, где нужен read-only контекст, и наоборотTools — действия; resources — данные для чтения по URI
Хардкодить версию протокола/методов как вечнуюСпецификация MCP развиваетсяСогласовывать версию в initialize; сверяться с актуальной спекой
Брать HTTP-транспорт для простой локальной интеграцииЛишняя сложность сети/аутентификацииЛокально — stdio (подпроцесс); HTTP — для удалённых серверов

Практическое задание

  • Своими словами опишите, какую проблему M×N решает MCP и почему это становится M+N.
  • Перечислите три примитива сервера (tools, resources, prompts) и приведите по примеру для своей задачи.
  • Разберите последовательность JSON-RPC: initializetools/listtools/call.
  • Выберите транспорт для двух сценариев: локальная утилита на той же машине и удалённый сервис.
  • Найдите в реестре готовых MCP-серверов один, релевантный вашей задаче, и посмотрите его набор инструментов.

Проверка знаний

Какую главную проблему решает MCP?

  • A Ускоряет генерацию токенов моделью
  • B Стандартизирует подключение инструментов к агентам, превращая интеграции M×N в M+N
  • C Заменяет язык программирования агента
  • D Делает модель детерминированной

Чем resources отличаются от tools в MCP?

  • A Resources — это действия, tools — данные
  • B Tools — действия, которые может выполнить модель; resources — данные только для чтения, адресуемые по URI
  • C Это одно и то же
  • D Resources работают только по HTTP

Какой транспорт уместен для локального MCP-сервера, запускаемого как подпроцесс?

  • A stdio — обмен JSON через stdin/stdout подпроцесса
  • B Только HTTP с TLS
  • C Прямое соединение к БД
  • D gRPC обязательно