Class HttpServletSseServerTransportProvider

java.lang.Object
jakarta.servlet.GenericServlet
jakarta.servlet.http.HttpServlet
io.modelcontextprotocol.server.transport.HttpServletSseServerTransportProvider
All Implemented Interfaces:
McpServerTransportProvider, McpServerTransportProviderBase, jakarta.servlet.Servlet, jakarta.servlet.ServletConfig, Serializable

@WebServlet(asyncSupported=true) public class HttpServletSseServerTransportProvider extends jakarta.servlet.http.HttpServlet implements McpServerTransportProvider
A Servlet-based implementation of the MCP HTTP with Server-Sent Events (SSE) transport specification. This implementation provides similar functionality to WebFluxSseServerTransportProvider but uses the traditional Servlet API instead of WebFlux.

The transport handles two types of endpoints:

  • SSE endpoint (/sse) - Establishes a long-lived connection for server-to-client events
  • Message endpoint (configurable) - Handles client-to-server message requests

Features:

  • Asynchronous message handling using Servlet 6.0 async support
  • Session management for multiple client connections
  • Graceful shutdown support
  • Error handling and response formatting
Author:
Christian Tzolov, Alexandros Pappas
See Also:
  • Field Details

  • Constructor Details

    • HttpServletSseServerTransportProvider

      @Deprecated public HttpServletSseServerTransportProvider(com.fasterxml.jackson.databind.ObjectMapper objectMapper, String messageEndpoint, String sseEndpoint)
      Deprecated.
      Use the builder builder() instead for better configuration options.
      Creates a new HttpServletSseServerTransportProvider instance with a custom SSE endpoint.
      Parameters:
      objectMapper - The JSON object mapper to use for message serialization/deserialization
      messageEndpoint - The endpoint path where clients will send their messages
      sseEndpoint - The endpoint path where clients will establish SSE connections
    • HttpServletSseServerTransportProvider

      @Deprecated public HttpServletSseServerTransportProvider(com.fasterxml.jackson.databind.ObjectMapper objectMapper, String baseUrl, String messageEndpoint, String sseEndpoint)
      Deprecated.
      Use the builder builder() instead for better configuration options.
      Creates a new HttpServletSseServerTransportProvider instance with a custom SSE endpoint.
      Parameters:
      objectMapper - The JSON object mapper to use for message serialization/deserialization
      baseUrl - The base URL for the server transport
      messageEndpoint - The endpoint path where clients will send their messages
      sseEndpoint - The endpoint path where clients will establish SSE connections
    • HttpServletSseServerTransportProvider

      @Deprecated public HttpServletSseServerTransportProvider(com.fasterxml.jackson.databind.ObjectMapper objectMapper, String baseUrl, String messageEndpoint, String sseEndpoint, Duration keepAliveInterval)
      Deprecated.
      Use the builder builder() instead for better configuration options.
      Creates a new HttpServletSseServerTransportProvider instance with a custom SSE endpoint.
      Parameters:
      objectMapper - The JSON object mapper to use for message serialization/deserialization
      baseUrl - The base URL for the server transport
      messageEndpoint - The endpoint path where clients will send their messages
      sseEndpoint - The endpoint path where clients will establish SSE connections
      keepAliveInterval - The interval for keep-alive pings, or null to disable keep-alive functionality
    • HttpServletSseServerTransportProvider

      public HttpServletSseServerTransportProvider(com.fasterxml.jackson.databind.ObjectMapper objectMapper, String messageEndpoint)
      Creates a new HttpServletSseServerTransportProvider instance with the default SSE endpoint.
      Parameters:
      objectMapper - The JSON object mapper to use for message serialization/deserialization
      messageEndpoint - The endpoint path where clients will send their messages
  • Method Details

    • protocolVersion

      public String protocolVersion()
      Description copied from interface: McpServerTransportProviderBase
      Returns the protocol version supported by this transport provider.
      Specified by:
      protocolVersion in interface McpServerTransportProviderBase
      Returns:
      the protocol version as a string
    • setSessionFactory

      public void setSessionFactory(McpServerSession.Factory sessionFactory)
      Sets the session factory for creating new sessions.
      Specified by:
      setSessionFactory in interface McpServerTransportProvider
      Parameters:
      sessionFactory - The session factory to use
    • notifyClients

      public reactor.core.publisher.Mono<Void> notifyClients(String method, Object params)
      Broadcasts a notification to all connected clients.
      Specified by:
      notifyClients in interface McpServerTransportProviderBase
      Parameters:
      method - The method name for the notification
      params - The parameters for the notification
      Returns:
      A Mono that completes when the broadcast attempt is finished
      See Also:
    • doGet

      protected void doGet(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response) throws jakarta.servlet.ServletException, IOException
      Handles GET requests to establish SSE connections.

      This method sets up a new SSE connection when a client connects to the SSE endpoint. It configures the response headers for SSE, creates a new session, and sends the initial endpoint information to the client.

      Overrides:
      doGet in class jakarta.servlet.http.HttpServlet
      Parameters:
      request - The HTTP servlet request
      response - The HTTP servlet response
      Throws:
      jakarta.servlet.ServletException - If a servlet-specific error occurs
      IOException - If an I/O error occurs
    • doPost

      protected void doPost(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response) throws jakarta.servlet.ServletException, IOException
      Handles POST requests for client messages.

      This method processes incoming messages from clients, routes them through the session handler, and sends back the appropriate response. It handles error cases and formats error responses according to the MCP specification.

      Overrides:
      doPost in class jakarta.servlet.http.HttpServlet
      Parameters:
      request - The HTTP servlet request
      response - The HTTP servlet response
      Throws:
      jakarta.servlet.ServletException - If a servlet-specific error occurs
      IOException - If an I/O error occurs
    • closeGracefully

      public reactor.core.publisher.Mono<Void> closeGracefully()
      Initiates a graceful shutdown of the transport.

      This method marks the transport as closing and closes all active client sessions. New connection attempts will be rejected during shutdown.

      Specified by:
      closeGracefully in interface McpServerTransportProviderBase
      Returns:
      A Mono that completes when all sessions have been closed
    • destroy

      public void destroy()
      Cleans up resources when the servlet is being destroyed.

      This method ensures a graceful shutdown by closing all client connections before calling the parent's destroy method.

      Specified by:
      destroy in interface jakarta.servlet.Servlet
      Overrides:
      destroy in class jakarta.servlet.GenericServlet
    • builder

      Creates a new Builder instance for configuring and creating instances of HttpServletSseServerTransportProvider.
      Returns:
      A new Builder instance