Перейти к содержимому

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

Техническая спецификация Model Context Protocol — транспорты, примитивы, жизненный цикл

Model Context Protocol (MCP) — открытый протокол для интеграции AI-приложений с внешними источниками данных и инструментами. Создан Anthropic в ноябре 2024 года.

КомпонентОписаниеПримеры
HostПриложение, запускающее клиентClaude Desktop, IDE
ClientПоддерживает соединение с серверомВстроен в Host
ServerПредоставляет capabilitiesВаш MCP сервер

MCP поддерживает два типа транспорта для коммуникации.

Клиент запускает сервер как subprocess и общается через stdin/stdout.

Когда использовать:

  • Локальная разработка
  • Интеграция с Claude Desktop
  • Простые сценарии

Пример запуска:

Окно терминала
# Клиент запускает сервер
python server.py
# stdin → JSON-RPC запросы
# stdout → JSON-RPC ответы
# stderr → логи (не протокол!)

HTTP-транспорт для удалённых серверов (спецификация 2025).

Когда использовать:

  • Удалённые серверы
  • Масштабируемые решения
  • Production окружения

Требования (2025):

  • OAuth 2.1 обязателен для аутентификации
  • HTTPS для production

MCP определяет три основных примитива для взаимодействия.

Функции, которые AI может вызывать для выполнения действий.

@mcp.tool()
def send_email(to: str, subject: str, body: str) -> str:
"""Отправить email"""
# Реализация...
return "Email отправлен"

Характеристики:

  • Вызываются по инициативе AI
  • Могут изменять состояние
  • Возвращают результат

JSON-RPC:

// Запрос: tools/call
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "send_email",
"arguments": {
"to": "user@example.com",
"subject": "Hello",
"body": "Message"
}
}
}
// Ответ
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{"type": "text", "text": "Email отправлен"}
]
}
}

Данные, доступные для чтения по URI.

@mcp.resource("config://settings")
def get_settings() -> str:
"""Настройки приложения"""
return json.dumps({"theme": "dark", "lang": "ru"})

Характеристики:

  • Read-only доступ
  • Идентифицируются по URI
  • Могут обновляться (подписка)

Схемы URI:

СхемаПримерНазначение
file://file:///path/to/file.txtФайлы
http://http://api.example.com/dataHTTP ресурсы
db://db://users/123База данных
memory://memory://cacheПамять
config://config://settingsКонфигурация

Шаблоны для типовых запросов к AI.

@mcp.prompt()
def code_review(language: str, code: str) -> str:
"""Шаблон для code review"""
return f"""
Проведи code review для следующего {language} кода:
```{language}
{code}

Проверь:

  1. Ошибки и баги
  2. Стиль кода
  3. Производительность
  4. Безопасность """
**Характеристики:**
- Генерируют текст для AI
- Принимают аргументы
- Упрощают типовые задачи
---
## JSON-RPC 2.0
MCP использует JSON-RPC 2.0 для всей коммуникации.
### Формат запроса
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "method_name",
"params": { ... }
}
{
"jsonrpc": "2.0",
"id": 1,
"result": { ... }
}
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32600,
"message": "Invalid Request",
"data": { ... }
}
}
{
"jsonrpc": "2.0",
"method": "notifications/progress",
"params": {
"progress": 50,
"total": 100
}
}

// Запрос
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {
"roots": { "listChanged": true }
},
"clientInfo": {
"name": "Claude Desktop",
"version": "1.0.0"
}
}
}
// Ответ
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2024-11-05",
"capabilities": {
"tools": {},
"resources": { "subscribe": true },
"prompts": {}
},
"serverInfo": {
"name": "my-server",
"version": "1.0.0"
}
}
}
{
"jsonrpc": "2.0",
"method": "notifications/initialized"
}

МетодНаправлениеОписание
initializeClient → ServerИнициализация соединения
initializedClient → ServerПодтверждение инициализации
shutdownClient → ServerЗавершение работы
МетодОписание
tools/listПолучить список инструментов
tools/callВызвать инструмент
МетодОписание
resources/listПолучить список ресурсов
resources/readПрочитать ресурс
resources/subscribeПодписаться на обновления
resources/unsubscribeОтписаться от обновлений
МетодОписание
prompts/listПолучить список промптов
prompts/getПолучить содержимое промпта
МетодНаправлениеОписание
notifications/progressServer → ClientПрогресс операции
notifications/resources/updatedServer → ClientРесурс обновился
notifications/tools/list_changedServer → ClientСписок tools изменился

MCP поддерживает несколько типов контента в ответах.

{
"type": "text",
"text": "Результат операции"
}
{
"type": "image",
"data": "base64_encoded_image_data",
"mimeType": "image/png"
}
{
"type": "resource",
"resource": {
"uri": "file:///path/to/file.txt",
"mimeType": "text/plain",
"text": "Содержимое файла"
}
}

КодНазваниеОписание
-32700Parse errorНевалидный JSON
-32600Invalid RequestНеверная структура запроса
-32601Method not foundМетод не существует
-32602Invalid paramsНеверные параметры
-32603Internal errorВнутренняя ошибка сервера
КодНазваниеОписание
-32000Connection closedСоединение закрыто
-32001Request timeoutТаймаут запроса
-32002Resource not foundРесурс не найден
-32003Tool not foundИнструмент не найден
-32004Prompt not foundПромпт не найден

При инициализации клиент и сервер обмениваются своими capabilities.

{
"capabilities": {
"tools": {},
"resources": {
"subscribe": true,
"listChanged": true
},
"prompts": {
"listChanged": true
},
"logging": {}
}
}
{
"capabilities": {
"roots": {
"listChanged": true
},
"sampling": {}
}
}

ВерсияДатаОсновные изменения
2024-11-05Nov 2024Первая публичная версия
2025-03-xxMar 2025OAuth 2.1 обязателен для HTTP
2025-06-xxJun 2025Streamable HTTP вместо SSE

JSON-RPC 2.0

jsonrpc.org — спецификация протокола

Быстрый старт

5 минут — создайте первый сервер