Skip to content

Commit aee3a2b

Browse files
committed
chore: Pass TransportContext sessionFactory
Signed-off-by: He-Pin <[email protected]>
1 parent 2d22868 commit aee3a2b

File tree

12 files changed

+60
-11
lines changed

12 files changed

+60
-11
lines changed

mcp-core/src/main/java/io/modelcontextprotocol/server/transport/HttpServletSseServerTransportProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ public Mono<Void> notifyClients(String method, Object params) {
210210
@Override
211211
protected void doGet(HttpServletRequest request, HttpServletResponse response)
212212
throws ServletException, IOException {
213+
final McpTransportContext transportContext = this.contextExtractor.extract(request);
213214

214215
String requestURI = request.getRequestURI();
215216
if (!requestURI.endsWith(sseEndpoint)) {
@@ -239,7 +240,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)
239240
writer);
240241

241242
// Create a new session using the session factory
242-
McpServerSession session = sessionFactory.create(sessionTransport);
243+
McpServerSession session = sessionFactory.create(transportContext, sessionTransport);
243244
this.sessions.put(sessionId, session);
244245

245246
// Send initial endpoint event

mcp-core/src/main/java/io/modelcontextprotocol/server/transport/HttpServletStreamableServerTransportProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
408408
new TypeRef<McpSchema.InitializeRequest>() {
409409
});
410410
McpStreamableServerSession.McpStreamableServerSessionInit init = this.sessionFactory
411-
.startSession(initializeRequest);
411+
.startSession(transportContext, initializeRequest);
412412
this.sessions.put(init.session().getId(), init.session());
413413

414414
try {

mcp-core/src/main/java/io/modelcontextprotocol/server/transport/StdioServerTransportProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public List<String> protocolVersions() {
9191
public void setSessionFactory(McpServerSession.Factory sessionFactory) {
9292
// Create a single session for the stdio connection
9393
var transport = new StdioMcpSessionTransport();
94-
this.session = sessionFactory.create(transport);
94+
this.session = sessionFactory.create(null, transport);
9595
transport.initProcessing();
9696
}
9797

mcp-core/src/main/java/io/modelcontextprotocol/spec/DefaultMcpStreamableServerSessionFactory.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
package io.modelcontextprotocol.spec;
66

7+
import io.modelcontextprotocol.common.McpTransportContext;
78
import io.modelcontextprotocol.server.McpNotificationHandler;
89
import io.modelcontextprotocol.server.McpRequestHandler;
910

@@ -45,11 +46,33 @@ public DefaultMcpStreamableServerSessionFactory(Duration requestTimeout,
4546

4647
@Override
4748
public McpStreamableServerSession.McpStreamableServerSessionInit startSession(
48-
McpSchema.InitializeRequest initializeRequest) {
49+
final McpSchema.InitializeRequest initializeRequest) {
50+
final String sessionId = generateSessionId(null, initializeRequest);
4951
return new McpStreamableServerSession.McpStreamableServerSessionInit(
50-
new McpStreamableServerSession(UUID.randomUUID().toString(), initializeRequest.capabilities(),
52+
new McpStreamableServerSession(sessionId, initializeRequest.capabilities(),
5153
initializeRequest.clientInfo(), requestTimeout, requestHandlers, notificationHandlers),
5254
this.initRequestHandler.handle(initializeRequest));
5355
}
5456

57+
@Override
58+
public McpStreamableServerSession.McpStreamableServerSessionInit startSession(
59+
final McpTransportContext mcpTransportContext, final McpSchema.InitializeRequest initializeRequest) {
60+
final String sessionId = generateSessionId(mcpTransportContext, initializeRequest);
61+
return new McpStreamableServerSession.McpStreamableServerSessionInit(
62+
new McpStreamableServerSession(sessionId, initializeRequest.capabilities(),
63+
initializeRequest.clientInfo(), requestTimeout, requestHandlers, notificationHandlers),
64+
this.initRequestHandler.handle(initializeRequest));
65+
}
66+
67+
/**
68+
* An extensibility point to generate session IDs differently.
69+
* @param mcpTransportContext transport context
70+
* @param initializeRequest initialization request
71+
* @return generated session ID
72+
*/
73+
protected String generateSessionId(McpTransportContext mcpTransportContext,
74+
McpSchema.InitializeRequest initializeRequest) {
75+
return UUID.randomUUID().toString();
76+
}
77+
5578
}

mcp-core/src/main/java/io/modelcontextprotocol/spec/McpServerSession.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,16 @@ public interface Factory {
439439
*/
440440
McpServerSession create(McpServerTransport sessionTransport);
441441

442+
/**
443+
* Creates a new 1:1 representation of the client-server interaction.
444+
* @param mcpTransportContext the transport context associated with the client.
445+
* @param sessionTransport the transport to use for communication with the client.
446+
* @return a new server session.
447+
*/
448+
default McpServerSession create(McpTransportContext mcpTransportContext, McpServerTransport sessionTransport) {
449+
return create(sessionTransport);
450+
}
451+
442452
}
443453

444454
}

mcp-core/src/main/java/io/modelcontextprotocol/spec/McpStreamableServerSession.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,20 @@ public interface Factory {
298298
* @param initializeRequest the initialization request from the client
299299
* @return a composite allowing the session to start
300300
*/
301+
@Deprecated
301302
McpStreamableServerSessionInit startSession(McpSchema.InitializeRequest initializeRequest);
302303

304+
/**
305+
* Given an initialize request, create a composite for the session initialization
306+
* @param mcpTransportContext the transport context for the initialization request
307+
* @param initializeRequest the initialization request from the client
308+
* @return a composite allowing the session to start
309+
*/
310+
default McpStreamableServerSessionInit startSession(McpTransportContext mcpTransportContext,
311+
McpSchema.InitializeRequest initializeRequest) {
312+
return startSession(initializeRequest);
313+
}
314+
303315
}
304316

305317
/**

mcp-core/src/test/java/io/modelcontextprotocol/MockMcpServerTransportProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public MockMcpServerTransport getTransport() {
3030
@Override
3131
public void setSessionFactory(Factory sessionFactory) {
3232

33-
session = sessionFactory.create(transport);
33+
session = sessionFactory.create(null, transport);
3434
}
3535

3636
@Override

mcp-core/src/test/java/io/modelcontextprotocol/server/transport/StdioServerTransportProviderTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.concurrent.TimeUnit;
1515
import java.util.concurrent.atomic.AtomicReference;
1616

17+
import io.modelcontextprotocol.common.McpTransportContext;
1718
import io.modelcontextprotocol.spec.McpError;
1819
import io.modelcontextprotocol.spec.McpSchema;
1920
import io.modelcontextprotocol.spec.McpServerSession;
@@ -67,7 +68,8 @@ void setUp() {
6768
sessionFactory = mock(McpServerSession.Factory.class);
6869

6970
// Configure mock behavior
70-
when(sessionFactory.create(any(McpServerTransport.class))).thenReturn(mockSession);
71+
when(sessionFactory.create(any(McpTransportContext.class), any(McpServerTransport.class)))
72+
.thenReturn(mockSession);
7173
when(mockSession.closeGracefully()).thenReturn(Mono.empty());
7274
when(mockSession.sendNotification(any(), any())).thenReturn(Mono.empty());
7375

mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/server/transport/WebFluxSseServerTransportProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ private Mono<ServerResponse> handleSseConnection(ServerRequest request) {
278278
.body(Flux.<ServerSentEvent<?>>create(sink -> {
279279
WebFluxMcpSessionTransport sessionTransport = new WebFluxMcpSessionTransport(sink);
280280

281-
McpServerSession session = sessionFactory.create(sessionTransport);
281+
McpServerSession session = sessionFactory.create(transportContext, sessionTransport);
282282
String sessionId = session.getId();
283283

284284
logger.debug("Created new SSE connection for session: {}", sessionId);

mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/server/transport/WebFluxStreamableServerTransportProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ private Mono<ServerResponse> handlePost(ServerRequest request) {
239239
McpSchema.InitializeRequest initializeRequest = jsonMapper.convertValue(jsonrpcRequest.params(),
240240
typeReference);
241241
McpStreamableServerSession.McpStreamableServerSessionInit init = this.sessionFactory
242-
.startSession(initializeRequest);
242+
.startSession(transportContext, initializeRequest);
243243
sessions.put(init.session().getId(), init.session());
244244
return init.initResult().map(initializeResult -> {
245245
McpSchema.JSONRPCResponse jsonrpcResponse = new McpSchema.JSONRPCResponse(

0 commit comments

Comments
 (0)