MCP-серверы
MCP в общей картине ИИ-приложения — слой подключений (tools и resources к API, БД, файлам). Слой знаний — RAG, слой исполнения — AI-агент. Как три паттерна сочетаются — в обзоре RAG, MCP и агенты — три слоя архитектуры.
MCP-серверы
Протокол MCP
MCP — это Model Context Protocol. Этот стандарт коммуникации позволяет моделям искусственного интеллекта взаимодействовать с внешними системами и данными через унифицированный интерфейс. Протокол определяет правила обмена сообщениями между клиентом, который запускает модель, и сервером, который предоставляет доступ к конкретным источникам информации или инструментам.
Протокол разрабатывается сообществом для решения проблемы фрагментации в области интеграции ИИ с инфраструктурой предприятия. Различные системы требуют различных методов подключения. MCP объединяет эти методы под единый контракт.
Основная задача протокола создание общего стандарта, который работает одинаково для всех типов моделей и всех типов подключений. Это упрощает разработку новых интеграций и расширяет возможности существующих систем без изменения базовой архитектуры.
Протокол поддерживает три основных направления:
- Предоставление контекста — источники данных, к которым модель получает доступ;
- Инструменты — функции, которые модель может вызывать для выполнения действий;
- Ресурсы — постоянные данные и метаданные, которые доступны модели во время сеанса работы.
Все эти элементы передаются в формате JSON, что обеспечивает совместимость с множеством языков программирования и платформ. Структура сообщений чётко определена и не требует дополнительных соглашений при внедрении.
История создания
Появление MCP связано с потребностью индустрии в стандартизации взаимодействия между языковыми моделями и корпоративными системами. Ранние реализации использовали различные проприетарные форматы подключения. Каждая платформа требовала собственной адаптации и настройки. Это создавало сложности при масштабировании и поддержке интеграций.
Первая версия прототипа появилась в середине 2025 года как экспериментальное решение внутри нескольких компаний. Участники проекта зафиксировали потребность в едином интерфейсе для подключения источников данных к нейросетям. Эксперименты показали эффективность унификации в вопросах безопасности и контроля доступа.
В начале 2026 года проект получил открытый статус. Разработчики опубликовали спецификацию на GitHub и привлекли сторонних участников из разных организаций. К концу первого квартала 2026 года протокол достиг статуса бета версии с поддержкой основных платформ.
Текущая стадия развития включает расширение поддержки типов ресурсов и инструментов. Сообщество продолжает добавлять новые категории подключений и улучшать документацию.
Основные этапы эволюции протокола:
| Дата | Событие | Статус |
|---|---|---|
| 2025-06 | Прототип внутри компании | Internal |
| 2025-09 | Первый публичный релиз | Alpha |
| 2025-12 | Открытие репозитория | Public Release |
| 2026-01 | Бета версия | Beta |
| 2026-05 | Стабильная версия | Stable |
Протокол поддерживается некоммерческой группой энтузиастов. Финансирование осуществляется через гранты и добровольные взносы участников сообщества. Никакие патентные ограничения не мешают свободному использованию стандарта в коммерческих проектах.
Архитектура протокола
Архитектура MCP строится на принципах клиент серверного взаимодействия. Клиент инициирует подключение и запрашивает услуги у сервера. Сервер отвечает на запросы и предоставляет доступ к данным или функционалу.
Взаимодействие происходит через два канала связи: прямой сокет или HTTP соединение. Выбор конкретного метода зависит от конфигурации среды развертывания. Оба способа поддерживают асинхронную доставку сообщений.
Серверная часть содержит несколько модулей:
Ресурсный менеджер — отвечает за доступ к файлам, базам данных и другим постоянным источникам;
Менеджер инструментов — реализует функции, которые могут быть вызваны внешними клиентами;
Обработчик событий — управляет потоком данных и уведомлениями о изменениях;
Менеджер связей — обеспечивает соединение между клиентом и сервером.
Каждый компонент работает независимо и обменивается данными через внутренний шину сообщений. Это позволяет масштабировать отдельные части системы без влияния на общую производительность.
Клиентская сторона содержит библиотеку для обработки входящих сообщений и отправку запросов. Эта библиотека существует для нескольких языков программирования включая JavaScript, Python и C#.
Процесс соединения состоит из следующих шагов:
- Подключение — клиент устанавливает TCP соединение с сервером;
- Инициализация — сервер отправляет список доступных возможностей;
- Запрос ресурсов — клиент запрашивает нужный источник данных;
- Вызов инструментов — клиент инициирует выполнение внешней функции;
- Отправка результатов — сервер возвращает ответ с результатами;
- Завершение — канал разъединяется по окончании работы.
Каждый шаг подтверждается специальным кодом состояния. Ошибки фиксируются в лог и передаются в виде структурированных объектов.
MCP и классический API
MCP решает ту же прикладную задачу, что и HTTP API — дать программе доступ к данным и действиям во внешней системе. Отличие в потребителе и форме контракта.
Классический API (REST, GraphQL, gRPC) рассчитан на приложения с заранее известным сценарием — мобильный клиент, веб-фронт, микросервис. Разработчик выбирает эндпоинт, передаёт JSON или Protobuf, обрабатывает код ответа в своём коде. Трафик часто проходит через API Gateway, который маршрутизирует запросы к внутренним сервисам (кэш, БД, вызовы внешних API).
MCP рассчитан на хост с языковой моделью — IDE-агент, десктоп с LLM, автономный агент. Хост подключает один или несколько MCP-серверов по единому протоколу запрос/ответ. Сервер объявляет ресурсы (что можно прочитать), инструменты (что можно вызвать) и промпты (готовые шаблоны). Под капотом тот же сервер может ходить в PostgreSQL по SQL, читать файлы или вызывать REST GitHub — для модели это один унифицированный слой, а не десяток разных SDK.
| Аспект | Классический API | MCP |
|---|---|---|
| Кто потребляет | Приложение, скрипт, человек через UI | LLM, агент, IDE с моделью |
| Контракт | Эндпоинты, схемы OpenAPI/WSDL | Ресурсы, tools, prompts |
| Типичный транспорт | HTTP/1.1, HTTP/2, gRPC | stdio, HTTP, WebSocket поверх MCP |
| Где живёт логика маршрутизации | Gateway, BFF, код клиента | MCP Host + выбор tool моделью |
| Типичный сценарий | Оформить заказ, показать ленту | "Найди issue в GitHub и приложи лог из БД" |
MCP дополняет, а не заменяет продуктовый бэкенд. Бизнес-API остаётся источником истины для мобильного приложения; MCP-сервер может быть тонкой обёрткой над тем же REST с ограниченным набором операций для агента.
База HTTP и REST — API — интерфейсы прикладного программирования. Архитектура агентов и политики инструментов — Агенты ИИ. Настройка MCP в Claude и Cursor — Cursor и Claude.
Типы ресурсов
Rесурсы представляют собой любые данные, которые модель может прочитать во время работы. К ресурсам относятся файлы, базы данных, конфигурационные параметры и другие постоянные источники информации.
Типы ресурсов классифицируются по способу доступа и формату хранения:
Файловые ресурсы — предоставляют доступ к файловой системе. Модели могут читать текстовые файлы, скрипты и конфигурации;
Базовые ресурсы — работают с реляционными и нереляционными базами данных. Запросы выполняются через безопасные ограничители прав доступа;
API ресурсы — обращаются к внешним веб сервисам через HTTP запросы. Данные передаются в форматах JSON или XML;
Конфигуративные ресурсы — содержат системные настройки и переменные окружения. Доступ к этим параметрам контролируется политикой безопасности.
Структура описания ресурса содержит обязательные поля:
| Поле | Тип | Описание |
|---|---|---|
| uri | string | Уникальный идентификатор ресурса |
| name | string | Человеко читаемое имя |
| mimeType | string | Формат содержимого |
| size | number | Размер в байтах |
| lastModified | timestamp | Время последнего изменения |
Пример определения файла через протокол:
{
"uri": "file:///var/log/app.log",
"name": "Лог приложения",
"mimeType": "text/plain",
"size": 1048576,
"lastModified": "2026-05-10T14:30:00Z"
}
Для чтения содержимого клиент использует команду ReadResource. Сервер возвращает полный текст или бинарные данные в зависимости от типа ресурса. Доступ к чувствительным файлам блокируется на уровне прав пользователя.
Ресурсы могут изменяться во время работы. Система уведомляет клиента об изменениях через событие ResourceUpdated. Клиент обновляет кэш и загружает актуальные данные.
Типы инструментов
Инструменты определяют набор функций, которые модель может вызывать для выполнения действий в внешней среде. Эти функции расширяют возможности анализа и создают возможность автоматизации задач.
Классификация инструментов основана на уровне доступа и типу выполняемых операций:
Системные инструменты — обеспечивают управление процессами, файлами и сетевыми настройками. Эти функции требуют повышенных прав доступа;
Прикладные инструменты — работают с конкретными программными продуктами. Например обработка документов или взаимодействие с CRM системой;
Информационные инструменты — предоставляют справочные данные и выполняют вычисления. Используются для генерации ответов на вопросы;
Административные инструменты — контролируют состояние системы и ведут логи. Необходимы для мониторинга и диагностики.
Описание инструмента содержит следующие параметры:
| Поле | Тип | Описание |
|---|---|---|
| name | string | Имя инструмента для идентификации |
| description | string | Полное описание функционала |
| inputSchema | object | Схема входных параметров |
| outputType | string | Тип возвращаемых данных |
Пример описания инструмента проверки статуса сервиса:
Код ITЗагрузка примера кода…
При вызове инструмента клиент отправляет параметры в формате JSON. Сервер выполняет функцию и возвращает результат. Ошибки исполнения сопровождаются кодом и описанием.
Безопасность инструментов обеспечивается через систему разрешений. Пользователь видит только те функции, к которым имеет доступ согласно политике организации.
Развертывание сервера
Развертывание MCP сервера начинается с выбора платформы и установки необходимых компонентов. Процесс отличается в зависимости от выбранной среды выполнения.
Системные требования для базовой конфигурации включают:
| Компонент | Минимум | Рекомендовано |
|---|---|---|
| CPU | 2 ядра | 4+ ядра |
| RAM | 4 ГБ | 8 ГБ |
| SSD | 10 ГБ | 20 ГБ |
| Node.js | 18.x | 20.x LTS |
| ОС | Linux/Windows/MacOS | Linux Ubuntu 22.04 |
Установка через пакетный менеджер Node.js:
npm install @modelcontextprotocol/server-core
Или использование Docker контейнера:
docker pull mcp-server:v1.0
docker run --rm -p 3000:3000 mcp-server:v1.0
Конфигурация сервера хранится в файле config.json:
Код ITЗагрузка примера кода…
Запуск сервера выполняется командой:
node server/index.js --config=config.json
Для фоновой работы используют systemd сервис:
[Unit]
Description=MCP Server Service
After=Сеть.target
[Service]
Type=simple
User=mcp
ExecStart=/usr/bin/node /opt/mcp-server/index.js
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Активация службы:
sudo systemctl daemon-reload
sudo systemctl enable mcp-server
sudo systemctl start mcp-server
Проверка статуса:
systemctl status mcp-server
journalctl -u mcp-server --no-pager
Следующие шаги включают настройку firewall и SSL сертификатов для производственной среды.
Использование сервера
Использование MCP сервера включает подключение клиента, выбор нужных ресурсов и инструментов, а также выполнение операций. Процесс начинается с инициализации соединения.
Клиентская программа подключается к серверу через порт 3000 по умолчанию:
Код ITЗагрузка примера кода…
Python вариант подключения:
Код ITЗагрузка примера кода…
Команды взаимодействия:
| Команда | Описание | Параметры | Ответ |
|---|---|---|---|
| Initialize | Инициализация соединения | none | Capabilities объект |
| ListResources | Получить список ресурсов | none | Массив ресурсов |
| ReadResource | Читать содержимое | uri | Строка или бинарные данные |
| CallTool | Выполнить инструмент | name, arguments | Результат выполнения |
| Subscribe | Подписаться на события | resourceURI | Подтверждение подписки |
| Unsubscribe | Отписаться от событий | resourceURI | Подтверждение отписки |
| Close | Завершить сеанс | none | Пустой ответ |
Обработка ошибок осуществляется через try catch блок. Код ошибки содержит код состояния и текстовое описание проблемы.
try {
const result = await client.callTool({
name: 'forbiddenOperation',
arguments: {}
});
} catch (error) {
console.error(`Ошибка ${error.code}: ${error.message}`);
}
Логирование операций помогает отслеживать активность клиентов и обнаруживать подозрительные действия.
Безопасность и контроль доступа
Безопасность MCP сервера базируется на нескольких уровнях защиты. Каждый уровень предотвращает определенные типы угроз.
Аутентификация пользователей осуществляется через JWT токены. Токен содержит информацию о ролях и правах доступа. Сервер проверяет подпись и срок действия токена.
Авторизация определяет доступ к конкретным ресурсам и инструментам. Политика прав задаётся на уровне администратора. Каждый пользователь получает набор разрешений согласно должности и задачам.
Шифрование трафика обеспечивает TLS соединение. Для внутренних сетей можно использовать незашифрованный режим. Настройки выбираются при запуске сервера.
Фильтрация ввода защищает от инъекций и переполнения буфера. Все входящие данные проходят валидацию перед обработкой.
Лимиты использования предотвращают перегрузку системы. Каждый клиент ограничен количеством запросов в минуту и общим объёмом передаваемых данных.
Модель разрешения прав доступа:
| Права | Описание | Пример |
|---|---|---|
| read | Только чтение данных | Просмотр файлов логов |
| write | Изменение содержимого | Обновление базы данных |
| execute | Выполнение инструментов | Запуск скриптов |
| admin | Полный доступ | Управление конфигурацией |
Пример политики доступа:
Код ITЗагрузка примера кода…
Мониторинг активности записывает все запросы в отдельный журнал. Администратор может анализировать логи и выявлять злоупотребления.
Система оповещений уведомляет о подозрительных событиях. Например множественные попытки входа с одного IP адреса.
Расширение функциональности
Расширение MCP сервера позволяет добавить новые типы ресурсов и инструментов. Разработка нового расширения включает следующие этапы.
Создание нового модуля начинается с определения интерфейса:
export interface CustomResourceProvider {
type: string;
listResources(): Promise<Resource[]>;
readResource(uri: string): Promise<Buffer>;
}
Регистрация модуля происходит в конфигурационном файле:
{
"extensions": [
{
"name": "CustomFileSystem",
"path": "./extensions/custom_fs.js",
"settings": {
"basePath": "/custom/data",
"maxFileSize": 10485760
}
}
]
}
Реализация расширенного инструмента:
class CustomTool {
name = 'getWeather';
description = 'Получение погоды по городу';
async execute(args: Record<string, any>): Promise<any> {
const city = args.city;
// Вызов погодного API
return { temperature: 22, condition: 'sunny' };
}
}
// Регистрация инструмента
server.registerTool(new CustomTool());
Компиляция расширений в отдельный файл:
tsc --outDir ./dist --module commonjs
Тестирование новых функций проводится через unit тесты:
test('CustomTool returns correct weather data', async () => {
const tool = new CustomTool();
const result = await tool.execute({ city: 'Moscow' });
expect(result.temperature).toBeGreaterThan(0);
});
Документирование новых возможностей включает описание входных и выходных параметров. Клиенты получают информацию через команду ListTools.
Механизм обновления плагинов позволяет добавлять функциональность без перезапуска сервера. Это уменьшает время простоя при развертывании изменений.