refactor: Add HttpServletSseServerTransport for generic Servlet integration

Introduces a new Server-Sent Events (SSE) Server transport implementation
based on the Servlet API that enables MCP integration with any Java HTTP
server application supporting Servlets.

This implementation complements the existing WebFlux and WebMvc transports
by providing a generic Servlet-based option that works with any Java web
server, not just Spring applications.

Key changes:

- Add HttpServletSseServerTransport with async Servlet 6.0 support
- Add integration tests with embedded Tomcat
- Add servlet dependencies with externalized versions:
  - jakarta.servlet-api 6.1.0 (provided)
  - tomcat-embed-core 11.0.2 (test)
  - tomcat-embed-websocket 11.0.2 (test)

Resolves #61
This commit is contained in:
Christian Tzolov 2025-01-12 16:46:19 +01:00
commit 0c8968044c
4 changed files with 273 additions and 206 deletions

View file

@ -153,6 +153,10 @@ class StdioServerTransport implements ServerMcpTransport {
}
class HttpServletSseServerTransport implements ServerMcpTransport {
}
class HttpClientSseClientTransport implements ClientMcpTransport {
}

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Before After
Before After

View file

@ -15,7 +15,8 @@ Java SDK implementation of the link:https://modelcontextprotocol.io/introduction
* Multiple transport implementations:
** Core transports:
*** Stdio-based transport for process-based communication
*** Java HttpClient-based SSE transport for HTTP streaming
*** Java HttpClient-based SSE client transport for HTTP SSE Client-side streaming
*** Servlet-based SSE server transport for HTTP SSE Server streaming
** Spring-based transports:
*** WebFlux SSE transport for reactive HTTP streaming
*** WebMVC SSE transport for servlet-based HTTP streaming
@ -515,6 +516,41 @@ Implements the MCP HTTP with SSE transport specification, providing:
* Message routing and session management
* Graceful shutdown capabilities
SSE (Servlet)::
+
Creates a Servlet-based SSE server transport.
Included in the core `mcp` module.
The `HttpServletSseServerTransport` can be used with any Servlet container.
To using it with a Spring Web application, you can register it as a Servlet bean:
+
[source,java]
----
@Configuration
@EnableWebMvc
public class McpServerConfig implements WebMvcConfigurer {
@Bean
public HttpServletSseServerTransport servletSseServerTransport() {
return new HttpServletSseServerTransport(new ObjectMapper(), "/mcp/message");
}
@Bean
public ServletRegistrationBean customServletBean(HttpServletSseServerTransport servlet) {
return new ServletRegistrationBean(servlet);
}
}
----
+
Implements the MCP HTTP with SSE transport specification using the traditional Servlet API, providing:
+
* Asynchronous message handling using Servlet 6.0 async support
* Session management for multiple client connections
* Two types of endpoints:
** SSE endpoint (/sse) for server-to-client events
** Message endpoint (configurable) for client-to-server requests
* Error handling and response formatting
* Graceful shutdown support
======
=== Server Capabilities

View file

@ -20,7 +20,8 @@ Core implementation of the Model Context Protocol specification, providing:
* *Core Transports*
** Stdio-based (`StdioClientTransport`, `StdioServerTransport`) for process-based communication
** Java HttpClient-based SSE client (`HttpClientSseClientTransport`) for HTTP streaming
** Java HttpClient-based SSE client (`HttpClientSseClientTransport`) for HTTP SSE Client-side streaming
** Servlet-based SSE server (`HttpServletSseServerTransport`) for HTTP SSE Server streaming using traditional Servlet API
* *Optional SSE Transports*
** link:https://github.com/spring-projects-experimental/spring-ai-mcp/tree/main/mcp-transport/mcp-webflux-sse-transport[WebFlux SSE Transport] - Reactive HTTP streaming with Spring WebFlux (Client & Server)
@ -114,6 +115,7 @@ Reffer to the xref:dependency-management.adoc[Dependency Management] page for mo
* link:https://github.com/habuma/spring-ai-examples/tree/main/spring-ai-mcp[Theme Park API] - MCP server/client with Theme Park API tools
* link:https://github.com/spring-projects/spring-ai-examples/tree/main/model-context-protocol/mcp-webflux-server[WebFlux SSE] - WebFlux server/client implementation
* link:https://github.com/spring-projects/spring-ai-examples/tree/main/model-context-protocol/mcp-webmvc-server[WebMvc SSE] - WebMvc server with HttpClient implementation
* link:https://github.com/spring-projects/spring-ai-examples/tree/main/model-context-protocol/mcp-servlet-server[Servlet SSE] - SSE Servlet server with HttpClient implementation
== Documentation