Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor server side to handle multiple clients #31

Closed
wants to merge 21 commits into from
Closed
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
8ceb495
Refactor server side to handle multiple clients
chemicL Mar 5, 2025
8316ad8
Introduce Child server transport and Session Factory
chemicL Mar 6, 2025
0823591
Aim for smoother transition to new APIs
chemicL Mar 12, 2025
4c78455
Rename server session and exchange to follow consistent pattern
chemicL Mar 13, 2025
15e432f
Restore WebFluxSseServerTransport in order to deprecate it
chemicL Mar 13, 2025
517ee3c
Support specifying new handlers in McpServer spec
chemicL Mar 13, 2025
ed33697
Replacing Registration classes with Specification classes
chemicL Mar 14, 2025
e1f1ced
IT method usage fix
chemicL Mar 14, 2025
962cffa
Incorporate dynamic addition of tools, resources, and prompts
chemicL Mar 14, 2025
76c802f
fix: update sync tool/resource/prompt handlers to use McpSyncServerEx…
tzolov Mar 16, 2025
5015ca6
refactor: Add StdioServerTransportProvider with reactive streams
tzolov Mar 17, 2025
95a02f8
feat: add WebMvcSseServerTransportProvider implementation
tzolov Mar 17, 2025
892f12f
refactor(mcp): replace HttpServletSseServerTransport with provider-ba…
tzolov Mar 18, 2025
cbf2b54
Revert the McpClientTransport breaking change back to ClientMcpTransport
tzolov Mar 18, 2025
474641e
feat(server): Make toSpecification methods public in McpServerFeatures
tzolov Mar 18, 2025
6da69b4
refactor(webflux): refactor WebFluxSseIntegrationTests
tzolov Mar 19, 2025
8704863
Add documentation
chemicL Mar 18, 2025
3e0d8c5
Merge branch 'main' into refactor-server-session
chemicL Mar 20, 2025
3daab08
refactor: replace ClientMcpTransport to McpClientTransport and Defaul…
tzolov Mar 20, 2025
ac6cafb
Add migration guide markdown
tzolov Mar 20, 2025
e0e08fe
improve migration guide
tzolov Mar 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.modelcontextprotocol.spec.ClientMcpTransport;
import io.modelcontextprotocol.spec.McpClientTransport;
import io.modelcontextprotocol.spec.McpError;
import io.modelcontextprotocol.spec.McpSchema;
import io.modelcontextprotocol.spec.McpSchema.JSONRPCMessage;
@@ -58,7 +58,7 @@
* "https://spec.modelcontextprotocol.io/specification/basic/transports/#http-with-sse">MCP
* HTTP with SSE Transport Specification</a>
*/
public class WebFluxSseClientTransport implements ClientMcpTransport {
public class WebFluxSseClientTransport implements McpClientTransport {

private static final Logger logger = LoggerFactory.getLogger(WebFluxSseClientTransport.class);

Original file line number Diff line number Diff line change
@@ -60,7 +60,10 @@
* @author Alexandros Pappas
* @see ServerMcpTransport
* @see ServerSentEvent
* @deprecated This class will be removed in 0.9.0. Use
* {@link WebFluxSseServerTransportProvider}.
*/
@Deprecated
public class WebFluxSseServerTransport implements ServerMcpTransport {

private static final Logger logger = LoggerFactory.getLogger(WebFluxSseServerTransport.class);
@@ -182,16 +185,16 @@ public Mono<Void> sendMessage(McpSchema.JSONRPCMessage message) {
try {// @formatter:off
String jsonText = objectMapper.writeValueAsString(message);
ServerSentEvent<Object> event = ServerSentEvent.builder()
.event(MESSAGE_EVENT_TYPE)
.data(jsonText)
.build();
.event(MESSAGE_EVENT_TYPE)
.data(jsonText)
.build();

logger.debug("Attempting to broadcast message to {} active sessions", sessions.size());

List<String> failedSessions = sessions.values().stream()
.filter(session -> session.messageSink.tryEmitNext(event).isFailure())
.map(session -> session.id)
.toList();
.filter(session -> session.messageSink.tryEmitNext(event).isFailure())
.map(session -> session.id)
.toList();

if (failedSessions.isEmpty()) {
logger.debug("Successfully broadcast message to all sessions");
@@ -407,4 +410,4 @@ void close() {

}

}
}
Loading