Разработка ИИ-агентов · Модуль 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.
// 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:
initialize→tools/list→tools/call. - Выберите транспорт для двух сценариев: локальная утилита на той же машине и удалённый сервис.
- Найдите в реестре готовых MCP-серверов один, релевантный вашей задаче, и посмотрите его набор инструментов.
Проверка знаний
Какую главную проблему решает MCP?
Верный ответ: B
B верно. MCP — единый «разъём»: инструмент оборачивают в сервер один раз, и любой MCP-совместимый хост им пользуется. Это убирает квадратичный клей M×N. Остальное к MCP не относится.
Чем resources отличаются от tools в MCP?
Верный ответ: B
B верно. Tools дают агенту «руки» (выполнить действие), resources — read-only контекст по URI. A путает их местами.
Какой транспорт уместен для локального MCP-сервера, запускаемого как подпроцесс?
Верный ответ: A
A верно. Для локальной интеграции MCP использует stdio: хост запускает сервер-подпроцесс и общается через его stdin/stdout. HTTP — для удалённых серверов.