Транспорт MCP-серверов: STDIO, Streamable HTTP и SSE

Важно

Функциональность доступна только в Visual Studio Code.

Протокол контекста модели (MCP) поддерживает три основных механизма транспорта для связи между Code Assistant и MCP-серверами: стандартный ввод/вывод (STDIO), Streamable HTTP (современный стандарт) и Server-Sent Events (SSE) (устаревший способ). Каждый из них имеет свои особенности, преимущества и области применения.

Транспорт STDIO

Транспорт STDIO работает локально на вашем компьютере и использует стандартные потоки ввода-вывода.

Как работает транспорт STDIO

  1. Клиент (Code Assistant) запускает MCP-сервер как дочерний процесс.
  2. Связь осуществляется через потоки процесса: клиент записывает в STDIN сервера, сервер отвечает через STDOUT.
  3. Каждое сообщение разделяется символом новой строки.
  4. Сообщения форматируются в виде 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

  1. Сервер предоставляет единый HTTP-эндпоинт (MCP-эндпоинт), который поддерживает методы POST и GET.
  2. Клиент (Code Assistant) отправляет запросы на этот эндпоинт с использованием HTTP-запроса POST.
  3. Сервер обрабатывает запрос и отправляет ответ.
  4. Опционально сервер может использовать 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

  1. Клиент (Code Assistant) подключается к SSE-эндпоинту сервера через HTTP GET-запрос.
  2. Устанавливается постоянное соединение, через которое сервер может отправлять события клиенту.
  3. Для связи клиент-сервер клиент выполняет HTTP POST-запросы на отдельный эндпоинт.
  4. Связь осуществляется через два канала:
    • Поток событий (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-сервер, опционально два эндпоинта)
Безопасность Внутренне безопасен Требуются явные меры безопасности Требуются явные меры безопасности
Сетевой доступ Не требуется Требуется Требуется
Масштабируемость Ограничена локальным компьютером Может распределяться по сети Может распределяться по сети
Рекомендация Идеально для локальных инструментов Современный стандарт для всех новых серверов Для существующих старых серверов
Предыдущая