Транспорт MCP-серверов: STDIO, Streamable HTTP и SSE
Важно
Функциональность доступна только в Visual Studio Code.
Протокол контекста модели (MCP) поддерживает три основных механизма транспорта для связи между Code Assistant и MCP-серверами: стандартный ввод/вывод (STDIO), Streamable HTTP (современный стандарт) и Server-Sent Events (SSE) (устаревший способ). Каждый из них имеет свои особенности, преимущества и области применения.
Транспорт STDIO
Транспорт STDIO работает локально на вашем компьютере и использует стандартные потоки ввода-вывода.
Как работает транспорт STDIO
- Клиент (Code Assistant) запускает MCP-сервер как дочерний процесс.
- Связь осуществляется через потоки процесса: клиент записывает в STDIN сервера, сервер отвечает через STDOUT.
- Каждое сообщение разделяется символом новой строки.
- Сообщения форматируются в виде JSON-RPC 2.0.
Клиент Сервер
| |
|---- JSON сообщение ---->| (через STDIN)
| | (обрабатывает запрос)
|<---- JSON сообщение ----| (через STDOUT)
| |
Характеристики STDIO
- Локальность — работает на том же компьютере, что и Code Assistant.
- Производительность — очень низкая задержка и накладные расходы из-за неиспользования сети.
- Простота — прямая связь процессов без настройки сети.
- Взаимодействие — один клиент на один сервер.
- Безопасность — транспорт более безопасен, так как отсутствует сетевое воздействие.
Когда использовать STDIO
STDIO идеально подходит для следующих сценариев:
- Локальных интеграций и инструментов, работающих на том же компьютере.
- Операций, требующих высокой безопасности.
- Сценариев с низкой задержкой.
- Одноклиентских сценариев — один экземпляр Code Assistant на сервер.
- Инструментов командной строки или расширений IDE.
Пример реализации транспорта STDIO
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = new Server({name: 'local-server', version: '1.0.0'});
// Регистрация инструментов...
// Использование транспорта STDIO
const transport = new StdioServerTransport(server);
transport.listen();
Транспорт Streamable HTTP
Streamable HTTP — это современный стандарт для удаленной связи MCP-серверов, заменяющий устаревший транспорт HTTP+SSE. Он работает через HTTP/HTTPS и позволяет более гибко реализовывать серверы.
Как работает транспорт Streamable HTTP
- Сервер предоставляет единый HTTP-эндпоинт (MCP-эндпоинт), который поддерживает методы POST и GET.
- Клиент (Code Assistant) отправляет запросы на этот эндпоинт с использованием HTTP-запроса POST.
- Сервер обрабатывает запрос и отправляет ответ.
- Опционально сервер может использовать Server-Sent Events (SSE) для потоковой передачи нескольких сообщений или уведомлений клиенту.
Клиент Сервер
| |
|---- HTTP POST /mcp_endpoint ---->| (запрос клиента)
| | (обрабатывает запрос)
|<--- HTTP Response / SSE Stream --| (ответ сервера / поток)
| |
Характеристики Streamable HTTP
- Современный стандарт — предпочтительный метод для новых удаленных MCP-серверов.
- Удаленный доступ — может быть размещен на другом компьютере, отличном от того, на котором запущен Code Assistant.
- Масштабируемость — может обрабатывать несколько клиентских подключений одновременно.
- Протокол — работает через стандартный HTTP/HTTPS.
- Гибкость — поддерживает как простые запросы-ответы, так и продвинутую потоковую передачу.
- Единый эндпоинт — использует один URL для всей связи MCP.
- Аутентификация — могут использоваться стандартные механизмы аутентификации HTTP.
Пример реализации транспорта Streamable HTTP
Конфигурация settings.json
:
"mcp.servers": {
"StreamableHTTPMCPName": {
"type": "streamable-http",
"url": "http://localhost:8080/mcp"
}
}
Для реализации серверной части обратитесь к документации MCP SDK по StreamableHTTPClientTransport
.
Обратная совместимость с HTTP+SSE
Начиная с версии протокола 2024-11-05 клиенты и серверы могут поддерживать обратную совместимость с устаревшим транспортом HTTP+SSE.
Чтобы поддержать на сервере старых клиентов, продолжайте размещать как SSE-эндпоинт (/events
), так и POST-эндпоинт (/message
) старого транспорта, наряду с новым MCP-эндпоинтом, определенным для транспорта Streamable HTTP.
Транспорт SSE (устаревший)
Server-Sent Events (SSE) — это устаревший метод удаленной связи через HTTP/HTTPS. Для новых реализаций рекомендуется транспорт Streamable HTTP. SSE остается доступным для совместимости с более старыми MCP-серверами.
Как работает транспорт SSE
- Клиент (Code Assistant) подключается к SSE-эндпоинту сервера через HTTP GET-запрос.
- Устанавливается постоянное соединение, через которое сервер может отправлять события клиенту.
- Для связи клиент-сервер клиент выполняет HTTP POST-запросы на отдельный эндпоинт.
- Связь осуществляется через два канала:
- Поток событий (GET) — обновления от сервера к клиенту.
- Эндпоинт сообщений (POST) — запросы клиента к серверу.
Пример реализации транспорта SSE
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
import express from 'express';
const app = express();
const server = new Server({name: 'remote-server', version: '1.0.0'});
// Регистрация инструментов...
// Использование транспорта SSE
const transport = new SSEServerTransport(server);
app.use('/mcp', transport.requestHandler());
app.listen(3000, () => {
console.log('MCP server listening on port 3000');
});
Локальное развертывание или хостинг
Выбор между транспортами STDIO и SSE напрямую влияет на то, как вы будете развертывать и управлять вашими MCP-серверами.
Локальное развертывание STDIO
Серверы STDIO работают локально на том же компьютере, что и Code Assistant. Это имеет несколько важных последствий:
- Установка — исполняемый файл сервера должен быть установлен на каждом компьютере пользователя.
- Дистрибуция — необходимо предоставлять установочные пакеты для разных операционных систем.
- Обновления — каждую инсталляцию нужно обновлять отдельно.
- Ресурсы — используются ресурсы локального компьютера (CPU, RAM, диск).
- Контроль доступа — использование разрешений на действия с файлами в операционной системе локального компьютера.
- Интеграция — простая интеграция с локальными системными ресурсами (файлы, процессы).
- Исполнение — запускается и останавливается вместе с Code Assistant (жизненный цикл дочернего процесса).
- Зависимости — все зависимости должны быть установлены на компьютере пользователя.
Практический пример
Инструмент локального поиска файлов с использованием STDIO будет:
- Работать на компьютере пользователя.
- Иметь прямой доступ к локальной файловой системе.
- Запускаться по запросу Code Assistant.
- Не требовать настройки сети.
- Требовать установки вместе с Code Assistant или через менеджер пакетов.
Хостинг Streamable HTTP или SSE
Streamable HTTP (рекомендуется) и устаревшие серверы SSE могут быть развернуты на удаленных серверах и доступны через сеть:
- Установка — устанавливается один раз на сервере, который доступен для многих пользователей.
- Дистрибуция — одно развертывание обслуживает нескольких клиентов.
- Обновления — централизованные обновления сразу влияют на всех пользователей.
- Ресурсы — используются ресурсы сервера, а не локальных компьютеров.
- Контроль доступа — управляется через системы аутентификации и авторизации.
- Интеграция — более сложная интеграция с пользовательскими ресурсами.
- Исполнение — работает как независимая служба (часто непрерывно).
- Зависимости — управляются на сервере, а не на компьютерах пользователей.
Практический пример
Инструмент запросов к базе данных с использованием SSE будет:
- Работать на центральном сервере.
- Подключаться к базам данных с серверными учетными данными.
- Быть постоянно доступным для нескольких пользователей.
- Требовать правильной настройки сетевой безопасности.
- Развертываться с использованием контейнерных или облачных технологий.
Гибридные подходы
Некоторые сценарии выигрывают от гибридного подхода:
- STDIO с сетевым доступом — локальный сервер STDIO, который действует как прокси для удаленных сервисов.
- SSE с локальными командами — удаленный сервер SSE, который может запускать операции на клиентском компьютере через обратные вызовы.
- Шаблон шлюза — серверы STDIO для локальных операций, которые подключаются к серверам SSE для специализированных функций.
Выбор типа транспорта
Параметр | STDIO | Streamable HTTP | SSE (устаревший) |
---|---|---|---|
Расположение | Локально | Локально или удаленно | Локально или удаленно |
Количество клиентов | Один | Несколько | Несколько |
Производительность | Низкая задержка | Более высокая задержка (сетевые накладные расходы) | Более высокая задержка (сетевые накладные расходы) |
Сложность настройки | Просто | Сложно (требуется HTTP-сервер) | Сложно (требуется HTTP-сервер, опционально два эндпоинта) |
Безопасность | Внутренне безопасен | Требуются явные меры безопасности | Требуются явные меры безопасности |
Сетевой доступ | Не требуется | Требуется | Требуется |
Масштабируемость | Ограничена локальным компьютером | Может распределяться по сети | Может распределяться по сети |
Рекомендация | Идеально для локальных инструментов | Современный стандарт для всех новых серверов | Для существующих старых серверов |