Содержание
Протокол MCP определяет три транспорта: STDIO (локальный процесс, один клиент), Streamable HTTP (удалённый сервер, много клиентов) и устаревший HTTP+SSE, который не стоит использовать в новых проектах. В 2026 году реальный выбор стоит между STDIO для локальных инструментов и Streamable HTTP для всего, что работает по сети. По данным спецификации MCP 2025-11-25, SSE-транспорт официально deprecated — его поддержка будет удалена из SDK в 2026 году.
транспорта
SSE
STDIO
Streamable HTTP
Главное отличие: где живёт сервер
Три MCP-транспорта отличаются не деталями протокола, а тем, где и как запущен сервер. Это определяет всё остальное: количество клиентов, безопасность, конфигурацию, отладку и стоимость поддержки.
Rollbrains формулирует главный принцип: если сервер и клиент на одной машине и клиент же запускает сервер — это STDIO. Если сервер работает как независимый процесс где-то в сети — это Streamable HTTP. Третьего не дано.
GitHub-статистика MCP SDK (июль 2026): спецификация — 8,5K звёзд, Python SDK — 23,5K, TypeScript SDK — 12,8K, всего 44,8K звёзд в экосистеме
В 2026 году спецификация MCP (ревизия 2025-11-25) определяет ровно два стандартных транспорта. HTTP+SSE (ревизия 2024-11-05) помечен как deprecated — Marius Bughiu из StartDebugging подсчитал, что 82% конфигурационных файлов Claude Desktop, Cursor и VS Code используют STDIO, а оставшиеся 18% — Streamable HTTP или SSE.
Архитектура MCP-транспортов: STDIO для локальных процессов, Streamable HTTP для удалённых серверов, HTTP+SSE как устаревший вариант
Разберём каждый транспорт по отдельности.
STDIO — локальный транспорт по умолчанию
STDIO — самый простой и безопасный транспорт. Клиент запускает MCP-сервер как дочерний процесс и общается с ним через stdin/stdout, передавая JSON-RPC сообщения, разделённые символом новой строки. Никаких портов, никакого TLS, никакого auth.
Как это работает на практике
Когда вы пишете в конфиге Claude Desktop:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
}
}
}
Claude Desktop запускает npx как дочерний процесс, дожидается его готовности, шлёт JSON-RPC по stdin и читает ответы из stdout. Всё. Никакого HTTP, никакого ожидания порта, никаких CORS-заголовков.
Что важно знать
STDIO-сервер работает с правами того пользователя, который его запустил. Секреты передаются через переменные окружения в том же конфиге. Сервер живёт, пока жив клиент — закрыл Cursor, умер и сервер.
Roo Code Docs отмечают главное ограничение: один STDIO-сервер обслуживает ровно одного клиента. Если вам нужно расшарить один MCP-сервер между несколькими IDE или агентами на разных машинах — STDIO не подходит.
Streamable HTTP — современный удалённый транспорт
Streamable HTTP (спецификация 2025-11-25) — это транспорт для всего, что работает по сети. Один MCP-endpoint (обычно /mcp) принимает POST-запросы и может опционально открывать GET-поток с SSE для server-to-client сообщений.
MCPcat называет это «подходом с одним эндпоинтом»: клиент делает POST с JSON-RPC запросом, сервер отвечает. Если серверу нужно отправить несколько сообщений (например, прогресс выполнения долгой операции), он открывает SSE-сессию, и клиент получает поток через GET-запрос к тому же /mcp endpoint'у.
Главные отличия от STDIO
Сервер работает как независимый процесс — его не запускает клиент. Он может быть развёрнут:
- на отдельном VPS с Docker
- в Kubernetes как микросервис
- за TLS-терминатором (nginx, Cloudflare)
- с OAuth / Bearer-аутентификацией
Один сервер обслуживает множество клиентов одновременно. Ginger Labs пишет, что Streamable HTTP снижает требования к развёртыванию в два раза — вместо двух эндпоинтов (как в SSE) нужен один, а сессионные заголовки позволяют балансировщику корректно маршрутизировать трафик.
Сессионный заголовок Mcp-Session-Id
Для long-lived соединений Streamable HTTP использует заголовок Mcp-Session-Id. Клиент получает его в первом ответе сервера и передаёт в последующих запросах. Это решает проблему, которая мучила разработчиков SSE: при перезапуске сервера или ребалансировке клиент просто создаёт новую сессию — никаких виснущих соединений.
HTTP+SSE (legacy) — почему устарел
HTTP+SE — это транспорт ревизии 2024-11-05, который использовал два отдельных эндпоинта: GET-эндпоинт для долгоживущего SSE-стрима и POST-эндпоинт, адрес которого клиент получал из первого endpoint-ивента SSE.
ChatForest объясняет, почему это было проблемой: SSE-соединение — это HTTP-соединение, которое сервер не закрывает годами. На каждое открытое соединение — отдельный поток в nginx, отдельный file descriptor, отдельный процесс в uWSGI. При 1000 клиентов — 1000 вечно открытых соединений. Балансировщики ненавидят это. Кеширующие прокси не понимают. Cloudflare разрывает такие соединения через 100 секунд.
Атлассиан Rovo установил дедлайн 30 июня 2026 года для прекращения поддержки SSE-транспорта в своих интеграциях. Google и Microsoft, по неофициальным данным, сделали то же самое. Если ваш MCP-сервер всё ещё использует HTTP+SSE — миграция на Streamable HTTP не вопрос выбора, а вопрос времени.
Поддержка SSE в MCP SDK не удалена — спецификация сохраняет обратную совместимость. Но в новой ревизии 2026-07-28 планируется полностью убрать SSE как отдельный transport mode и оставить только stateless requests плюс опциональное SSE-streaming внутри Streamable HTTP.
Сравнительная таблица
Сводка различий между тремя транспортами — на основе спецификации MCP Transports (2025-11-25):
| Параметр | STDIO | Streamable HTTP | HTTP+SSE (legacy) |
|---|---|---|---|
| Статус в 2026 | Стандарт | Стандарт | Deprecated |
| Где работает сервер | Локальный процесс | Независимый / удалённый | Независимый / удалённый |
| Клиентов на сервер | Один | Много конкурентно | Много конкурентно |
| Эндпоинтов | Нет (трубы stdin/stdout) | Один (POST + GET) | Два (GET SSE + POST) |
| Server-to-client стриминг | Через stdout | SSE, опционально | Обязательный SSE |
| Аутентификация | Права процесса | OAuth / Bearer / API key | OAuth / Bearer / API key |
| Сессионный заголовок | Н/Д | Mcp-Session-Id | Н/Д |
| Пригодность для production | Локальные утилиты | Cloud / микросервисы | Легаси-системы |
Как выбрать транспорт под свою задачу
Универсальное правило простое: локальный инструмент — STDIO, удалённый сервис — Streamable HTTP. Но есть нюансы.
STDIO берём, когда:
Вы пишете MCP-сервер для Claude Desktop, VS Code, Cursor или любого другого IDE-агента, который запускается на машине разработчика. Это 80% случаев. STDIO не требует разворачивать HTTP-сервер, настраивать TLS или думать об аутентификации. В документации Claude Code все примеры конфигурации — STDIO: command + args, без портов и урлов.
Единственное, что может пойти не так — spawn npx ENOENT, когда клиент не находит Node.js. Решается явным указанием пути или использованием Python/FastMCP с mcp.run(transport='stdio').
Streamable HTTP берём, когда:
Сервер нужен не одному разработчику, а всей команде. Или он работает в CI/CD, на продакшен-сервере, или расшаривается между несколькими AI-агентами. PADISO приводит пример: MCP-сервер для доступа к общей базе знаний компании — каждый агент стучится к нему по HTTP, а не запускает свою копию.
Также Streamable HTTP — единственный выбор, если MCP-сервер должен быть доступен из браузера (веб-клиенты MCP), или если вы деплоите сервер в Kubernetes с горизонтальным масштабированием.
SSE — только для легаси
Никаких новых серверов на SSE. Только backward compatibility. Если старый сервер ещё жив — спланируйте миграцию в этом квартале. Reddit-обсуждение MCP-сообщества сходится: Streamable HTTP — это просто SSE, сделанный правильно.
Миграция с SSE на Streamable HTTP
Переезд с HTTP+SSE на Streamable HTTP — не переписывание сервера, а замена транспорта. FastMCP и Python SDK поддерживают оба режима одной строкой:
# FastMCP — меняем только последнюю строку
from fastmcp import FastMCP
mcp = FastMCP("my-server")
@mcp.tool()
def my_tool(x: int) -> int:
return x * 2
# Было (SSE)
# mcp.run(transport="sse")
# Стало (Streamable HTTP)
mcp.run(transport="streamable-http")
Для TypeScript SDK (v1.29.x) аналогично: McpServer с передачей транспорта в конструктор или через server.connect(transport).
Если сервер использует кастомную реализацию SSE — смотрите документацию SDK по миграции. Спецификация MCP гарантирует, что JSON-RPC сообщения не меняются — меняется только способ их передачи.
После миграции проверьте: клиент шлёт POST на /mcp, сервер отвечает, сессионные заголовки передаются. Сессии, открытые до деплоя, умрут — клиент создаст новые.
Что дальше: ревизия спецификации 2026-07-28
Следующая ревизия MCP-спецификации (2026-07-28, статус release candidate) вводит важное изменение: Streamable HTTP становится полностью stateless. Сервер может не хранить сессии — каждый POST-запрос самодостаточен.
Это развязывает руки для развёртывания через serverless-функции (AWS Lambda, Cloudflare Workers), где хранить состояние между запросами — отдельный вызов. Клиент в таком случае либо создаёт сессию на каждый запрос, либо использует токен для восстановления контекста.
SSE как отдельный транспортный режим будет полностью удалён из спецификации. Останется только STDIO и Streamable HTTP. SSE-стриминг внутри Streamable HTTP сохранится как опциональная возможность — сервер может отправить несколько JSON-RPC сообщений в одном HTTP-ответе, используя multipart или потоковую передачу.
Для разработчиков это означает: в новых проектах пишите сразу на Streamable HTTP. Через год переписывать не придётся.
Что ещё важно знать
Сколько всего транспортов в MCP?
Два активных: STDIO и Streamable HTTP. HTTP+SSE (легаси, ревизия 2024-11-05) официально deprecated. Третий транспорт — Streamable HTTP в stateless-режиме — появится в ревизии 2026-07-28.
SSE и Streamable HTTP — это одно и то же?
Нет. SSE (Server-Sent Events) — это технология передачи событий от сервера клиенту через HTTP. MCP использовал её в старом транспорте (2024-11-05) с двумя отдельными эндпоинтами. Streamable HTTP — текущий транспорт (2025-11-25) — может опционально использовать SSE для стриминга, но у него один эндпоинт, сессионные заголовки и stateless-режим.
Надо ли мигрировать SSE-сервер прямо сейчас?
Если сервер работает и не ломается — можно не спешить, но спланировать миграцию в этом квартале. Atlassian Rovo уже выставил дедлайн 30 июня 2026. В следующей ревизии спецификации SSE как отдельный транспорт будет удалён.
Может ли один сервер поддерживать два транспорта?
Да. MCP SDK позволяет запускать сервер с несколькими транспортами одновременно. Например, STDIO для локальных клиентов и Streamable HTTP для удалённых. FastMCP поддерживает это через mcp.run(transport=["stdio", "streamable-http"]).
Что использовать в новом проекте?
Для локального инструмента — STDIO. Для всего остального — Streamable HTTP. Не пишите новый код на HTTP+SSE.