Cargando

StreamableHTTP es la solución de MCP a un problema fundamental: algunas funcionalidades de MCP requieren que el servidor haga solicitudes al cliente, pero HTTP hace que esto sea complicado. Exploremos cómo StreamableHTTP resuelve esta limitación y cuándo podrías necesitar romper esa solución alternativa.

El problema central

Algunas funciones de MCP como el sampling, las notificaciones y el logging dependen de que el servidor inicie solicitudes hacia el cliente. Sin embargo, HTTP está diseñado para que los clientes hagan solicitudes a los servidores, no al revés. StreamableHTTP resuelve esto con una ingeniosa solución alternativa usando Server-Sent Events (SSE).

Cómo funciona StreamableHTTP

La magia ocurre a través de un proceso de varios pasos que establece conexiones persistentes entre el cliente y el servidor.

Los tres mensajes de inicialización listados a continuación; la Initialized Notification lleva el ID de sesión y no recibe ningún resultado de vuelta.

Configuración inicial de la conexión

El proceso comienza como cualquier conexión MCP:

  • El cliente envía una Initialize Request al servidor
  • El servidor responde con un Initialize Result que incluye un encabezado especial mcp-session-id
  • El cliente envía una Initialized Notification con el ID de sesión

Este ID de sesión es crucial: identifica de manera única al cliente y debe incluirse en todas las solicitudes futuras.

La solución alternativa con SSE

Después de la inicialización, el cliente puede hacer una solicitud GET para establecer una conexión de Server-Sent Events. Esto crea una respuesta HTTP de larga duración que el servidor puede usar para transmitir mensajes de vuelta al cliente en cualquier momento.

GET mcp-server.com/mcp/ con un encabezado mcp-session-id, respondido por una respuesta SSE que puede mantenerse abierta indefinidamente.

Esta conexión SSE es la clave para permitir la comunicación de servidor a cliente. El servidor ahora puede enviar solicitudes, notificaciones y otros mensajes a través de este canal persistente.

Llamadas a herramientas y conexiones SSE duales

Cuando el cliente hace una llamada a una herramienta, las cosas se vuelven más complejas. El sistema crea dos conexiones SSE separadas:

Entre dos respuestas SSE del servidor MCP, el cliente envía un Call Tool Request POST con un encabezado mcp-session-id.

  • Conexión SSE primaria: Se usa para solicitudes iniciadas por el servidor y permanece abierta indefinidamente
  • Conexión SSE específica de la herramienta: Se crea para cada llamada a una herramienta y se cierra automáticamente cuando se envía el resultado de la herramienta

Enrutamiento de mensajes

Diferentes tipos de mensajes se enrutan a través de diferentes conexiones:

  • Notificaciones de progreso: Se envían a través de la conexión SSE primaria
  • Mensajes de logging y resultados de herramientas: Se envían a través de la conexión SSE específica de la herramienta

Call Tool Request POSTs a mcp-server.com/mcp/ con el encabezado mcp-session-id; las respuestas SSE pueden permanecer abiertas indefinidamente.

Indicadores de configuración que rompen la solución alternativa

StreamableHTTP incluye dos opciones de configuración importantes:

  • stateless_http
  • json_response

Establecer estas en True puede romper el mecanismo de la solución alternativa con SSE. Es posible que quieras habilitar estos indicadores en ciertos escenarios, pero hacerlo limita la funcionalidad completa de MCP que depende de la comunicación de servidor a cliente.

Puntos clave

StreamableHTTP es más complejo que otros transportes de MCP porque tiene que resolver las limitaciones de HTTP. La solución alternativa basada en SSE habilita la funcionalidad completa de MCP sobre HTTP, pero entender el modelo de conexión dual es crucial para la depuración y la optimización.

Al construir aplicaciones MCP con StreamableHTTP, recuerda que los IDs de sesión son obligatorios para todas las solicitudes posteriores a la inicialización, y que el sistema gestiona automáticamente múltiples conexiones SSE para manejar diferentes tipos de comunicación de servidor a cliente.