From 7163ec636a7290d1fa3544ead20c645bc8e80f6c Mon Sep 17 00:00:00 2001 From: He-Pin Date: Mon, 8 Sep 2025 21:47:05 +0800 Subject: [PATCH] chore: Extract DefaultMcpServerSessionFactory from McpAsyncServer. Signed-off-by: He-Pin --- .../server/McpAsyncServer.java | 47 +++++------------ .../spec/DefaultMcpServerSessionFactory.java | 50 +++++++++++++++++++ 2 files changed, 62 insertions(+), 35 deletions(-) create mode 100644 mcp/src/main/java/io/modelcontextprotocol/spec/DefaultMcpServerSessionFactory.java diff --git a/mcp/src/main/java/io/modelcontextprotocol/server/McpAsyncServer.java b/mcp/src/main/java/io/modelcontextprotocol/server/McpAsyncServer.java index 3c8057a72..f671b8527 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/server/McpAsyncServer.java +++ b/mcp/src/main/java/io/modelcontextprotocol/server/McpAsyncServer.java @@ -4,47 +4,25 @@ package io.modelcontextprotocol.server; -import java.time.Duration; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.function.BiFunction; - -import io.modelcontextprotocol.spec.DefaultMcpStreamableServerSessionFactory; -import io.modelcontextprotocol.spec.McpServerTransportProviderBase; -import io.modelcontextprotocol.spec.McpStreamableServerTransportProvider; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; - -import io.modelcontextprotocol.spec.JsonSchemaValidator; -import io.modelcontextprotocol.spec.McpClientSession; -import io.modelcontextprotocol.spec.McpError; -import io.modelcontextprotocol.spec.McpSchema; -import io.modelcontextprotocol.spec.McpSchema.CallToolResult; -import io.modelcontextprotocol.spec.McpSchema.JSONRPCResponse; -import io.modelcontextprotocol.spec.McpSchema.LoggingLevel; -import io.modelcontextprotocol.spec.McpSchema.LoggingMessageNotification; -import io.modelcontextprotocol.spec.McpSchema.ResourceTemplate; -import io.modelcontextprotocol.spec.McpSchema.SetLevelRequest; -import io.modelcontextprotocol.spec.McpSchema.TextContent; -import io.modelcontextprotocol.spec.McpSchema.Tool; -import io.modelcontextprotocol.spec.McpServerSession; -import io.modelcontextprotocol.spec.McpServerTransportProvider; +import io.modelcontextprotocol.spec.*; +import io.modelcontextprotocol.spec.McpSchema.*; import io.modelcontextprotocol.util.Assert; import io.modelcontextprotocol.util.DeafaultMcpUriTemplateManagerFactory; import io.modelcontextprotocol.util.McpUriTemplateManagerFactory; import io.modelcontextprotocol.util.Utils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.time.Duration; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.BiFunction; + /** * The Model Context Protocol (MCP) server implementation that provides asynchronous * communication using Project Reactor's Mono and Flux types. @@ -148,9 +126,8 @@ public class McpAsyncServer { Map notificationHandlers = prepareNotificationHandlers(features); this.protocolVersions = mcpTransportProvider.protocolVersions(); - - mcpTransportProvider.setSessionFactory(transport -> new McpServerSession(UUID.randomUUID().toString(), - requestTimeout, transport, this::asyncInitializeRequestHandler, requestHandlers, notificationHandlers)); + mcpTransportProvider.setSessionFactory(new DefaultMcpServerSessionFactory(requestTimeout, + this::asyncInitializeRequestHandler, requestHandlers, notificationHandlers)); } McpAsyncServer(McpStreamableServerTransportProvider mcpTransportProvider, ObjectMapper objectMapper, diff --git a/mcp/src/main/java/io/modelcontextprotocol/spec/DefaultMcpServerSessionFactory.java b/mcp/src/main/java/io/modelcontextprotocol/spec/DefaultMcpServerSessionFactory.java new file mode 100644 index 000000000..2aae285b8 --- /dev/null +++ b/mcp/src/main/java/io/modelcontextprotocol/spec/DefaultMcpServerSessionFactory.java @@ -0,0 +1,50 @@ +package io.modelcontextprotocol.spec; + +import io.modelcontextprotocol.server.McpInitRequestHandler; +import io.modelcontextprotocol.server.McpNotificationHandler; +import io.modelcontextprotocol.server.McpRequestHandler; + +import java.time.Duration; +import java.util.Map; + +/** + * The default implementation of {@link McpServerSession.Factory}. + * + * @author He-Pin + */ +public class DefaultMcpServerSessionFactory implements McpServerSession.Factory { + + Duration requestTimeout; + + McpInitRequestHandler initHandler; + + Map> requestHandlers; + + Map notificationHandlers; + + public DefaultMcpServerSessionFactory(final Duration requestTimeout, final McpInitRequestHandler initHandler, + final Map> requestHandlers, + final Map notificationHandlers) { + this.requestTimeout = requestTimeout; + this.initHandler = initHandler; + this.requestHandlers = requestHandlers; + this.notificationHandlers = notificationHandlers; + } + + @Override + public McpServerSession create(final McpServerTransport sessionTransport) { + final String sessionId = generateSessionId(sessionTransport); + return new McpServerSession(sessionId, requestTimeout, sessionTransport, initHandler, requestHandlers, + notificationHandlers); + } + + /** + * Generate a unique session ID for the given transport. + * @param sessionTransport the transport + * @return unique session ID + */ + protected String generateSessionId(final McpServerTransport sessionTransport) { + return java.util.UUID.randomUUID().toString(); + } + +}