From 391ec19fdc346c6d0ebf369f692c370a48339d3d Mon Sep 17 00:00:00 2001 From: Christian Tzolov <1351573+tzolov@users.noreply.github.com> Date: Thu, 10 Apr 2025 12:26:29 +0200 Subject: [PATCH] refactor: change notification params type from Map to Object (#137) * refactor: change notification params type from Map to Object This change generalizes the parameter type for notification methods across the MCP framework, allowing for more flexible parameter passing. Instead of requiring parameters to be structured as a Map, the API now accepts any Object as parameters. The primary motivation is to simplify client usage by allowing direct passing of strongly-typed objects without requiring conversion to a Map first, as demonstrated in the McpAsyncServer logging notification implementation. Affected components: - McpSession interface and implementations - McpServerTransportProvider interface and implementations - McpSchema JSONRPCNotification record --------- Signed-off-by: Christian Tzolov --- .../transport/WebFluxSseServerTransportProvider.java | 2 +- .../server/transport/WebMvcSseServerTransportProvider.java | 2 +- .../io/modelcontextprotocol/server/McpAsyncServer.java | 7 ++----- .../transport/HttpServletSseServerTransportProvider.java | 2 +- .../server/transport/StdioServerTransportProvider.java | 2 +- .../io/modelcontextprotocol/spec/McpClientSession.java | 2 +- .../main/java/io/modelcontextprotocol/spec/McpSchema.java | 2 +- .../io/modelcontextprotocol/spec/McpServerSession.java | 2 +- .../spec/McpServerTransportProvider.java | 4 ++-- .../main/java/io/modelcontextprotocol/spec/McpSession.java | 4 ++-- .../MockMcpServerTransportProvider.java | 2 +- 11 files changed, 14 insertions(+), 17 deletions(-) diff --git a/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/server/transport/WebFluxSseServerTransportProvider.java b/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/server/transport/WebFluxSseServerTransportProvider.java index df8dd02..be30bd7 100644 --- a/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/server/transport/WebFluxSseServerTransportProvider.java +++ b/mcp-spring/mcp-spring-webflux/src/main/java/io/modelcontextprotocol/server/transport/WebFluxSseServerTransportProvider.java @@ -188,7 +188,7 @@ public class WebFluxSseServerTransportProvider implements McpServerTransportProv * errors if any session fails to receive the message */ @Override - public Mono notifyClients(String method, Map params) { + public Mono notifyClients(String method, Object params) { if (sessions.isEmpty()) { logger.debug("No active sessions to broadcast message to"); return Mono.empty(); diff --git a/mcp-spring/mcp-spring-webmvc/src/main/java/io/modelcontextprotocol/server/transport/WebMvcSseServerTransportProvider.java b/mcp-spring/mcp-spring-webmvc/src/main/java/io/modelcontextprotocol/server/transport/WebMvcSseServerTransportProvider.java index fa2e357..7bd1aa6 100644 --- a/mcp-spring/mcp-spring-webmvc/src/main/java/io/modelcontextprotocol/server/transport/WebMvcSseServerTransportProvider.java +++ b/mcp-spring/mcp-spring-webmvc/src/main/java/io/modelcontextprotocol/server/transport/WebMvcSseServerTransportProvider.java @@ -179,7 +179,7 @@ public class WebMvcSseServerTransportProvider implements McpServerTransportProvi * @return A Mono that completes when the broadcast attempt is finished */ @Override - public Mono notifyClients(String method, Map params) { + public Mono notifyClients(String method, Object params) { if (sessions.isEmpty()) { logger.debug("No active sessions to broadcast message to"); return Mono.empty(); diff --git a/mcp/src/main/java/io/modelcontextprotocol/server/McpAsyncServer.java b/mcp/src/main/java/io/modelcontextprotocol/server/McpAsyncServer.java index df93866..ec2a04c 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/server/McpAsyncServer.java +++ b/mcp/src/main/java/io/modelcontextprotocol/server/McpAsyncServer.java @@ -669,15 +669,12 @@ public class McpAsyncServer { return Mono.error(new McpError("Logging message must not be null")); } - Map params = this.objectMapper.convertValue(loggingMessageNotification, - new TypeReference>() { - }); - if (loggingMessageNotification.level().level() < minLoggingLevel.level()) { return Mono.empty(); } - return this.mcpTransportProvider.notifyClients(McpSchema.METHOD_NOTIFICATION_MESSAGE, params); + return this.mcpTransportProvider.notifyClients(McpSchema.METHOD_NOTIFICATION_MESSAGE, + loggingMessageNotification); } private McpServerSession.RequestHandler setLoggerRequestHandler() { diff --git a/mcp/src/main/java/io/modelcontextprotocol/server/transport/HttpServletSseServerTransportProvider.java b/mcp/src/main/java/io/modelcontextprotocol/server/transport/HttpServletSseServerTransportProvider.java index e52fc88..afdbff4 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/server/transport/HttpServletSseServerTransportProvider.java +++ b/mcp/src/main/java/io/modelcontextprotocol/server/transport/HttpServletSseServerTransportProvider.java @@ -160,7 +160,7 @@ public class HttpServletSseServerTransportProvider extends HttpServlet implement * @return A Mono that completes when the broadcast attempt is finished */ @Override - public Mono notifyClients(String method, Map params) { + public Mono notifyClients(String method, Object params) { if (sessions.isEmpty()) { logger.debug("No active sessions to broadcast message to"); return Mono.empty(); diff --git a/mcp/src/main/java/io/modelcontextprotocol/server/transport/StdioServerTransportProvider.java b/mcp/src/main/java/io/modelcontextprotocol/server/transport/StdioServerTransportProvider.java index a8b980e..819da97 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/server/transport/StdioServerTransportProvider.java +++ b/mcp/src/main/java/io/modelcontextprotocol/server/transport/StdioServerTransportProvider.java @@ -99,7 +99,7 @@ public class StdioServerTransportProvider implements McpServerTransportProvider } @Override - public Mono notifyClients(String method, Map params) { + public Mono notifyClients(String method, Object params) { if (this.session == null) { return Mono.error(new McpError("No session to close")); } diff --git a/mcp/src/main/java/io/modelcontextprotocol/spec/McpClientSession.java b/mcp/src/main/java/io/modelcontextprotocol/spec/McpClientSession.java index 719a780..0895e02 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/spec/McpClientSession.java +++ b/mcp/src/main/java/io/modelcontextprotocol/spec/McpClientSession.java @@ -258,7 +258,7 @@ public class McpClientSession implements McpSession { * @return A Mono that completes when the notification is sent */ @Override - public Mono sendNotification(String method, Map params) { + public Mono sendNotification(String method, Object params) { McpSchema.JSONRPCNotification jsonrpcNotification = new McpSchema.JSONRPCNotification(McpSchema.JSONRPC_VERSION, method, params); return this.transport.sendMessage(jsonrpcNotification); diff --git a/mcp/src/main/java/io/modelcontextprotocol/spec/McpSchema.java b/mcp/src/main/java/io/modelcontextprotocol/spec/McpSchema.java index e38403c..4c596b6 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/spec/McpSchema.java +++ b/mcp/src/main/java/io/modelcontextprotocol/spec/McpSchema.java @@ -191,7 +191,7 @@ public final class McpSchema { public record JSONRPCNotification( // @formatter:off @JsonProperty("jsonrpc") String jsonrpc, @JsonProperty("method") String method, - @JsonProperty("params") Map params) implements JSONRPCMessage { + @JsonProperty("params") Object params) implements JSONRPCMessage { } // @formatter:on @JsonInclude(JsonInclude.Include.NON_ABSENT) diff --git a/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerSession.java b/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerSession.java index bcdf224..46014af 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerSession.java +++ b/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerSession.java @@ -132,7 +132,7 @@ public class McpServerSession implements McpSession { } @Override - public Mono sendNotification(String method, Map params) { + public Mono sendNotification(String method, Object params) { McpSchema.JSONRPCNotification jsonrpcNotification = new McpSchema.JSONRPCNotification(McpSchema.JSONRPC_VERSION, method, params); return this.transport.sendMessage(jsonrpcNotification); diff --git a/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerTransportProvider.java b/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerTransportProvider.java index dba8cc4..5fdbd7a 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerTransportProvider.java +++ b/mcp/src/main/java/io/modelcontextprotocol/spec/McpServerTransportProvider.java @@ -42,11 +42,11 @@ public interface McpServerTransportProvider { /** * Sends a notification to all connected clients. * @param method the name of the notification method to be called on the clients - * @param params a map of parameters to be sent with the notification + * @param params parameters to be sent with the notification * @return a Mono that completes when the notification has been broadcast * @see McpSession#sendNotification(String, Map) */ - Mono notifyClients(String method, Map params); + Mono notifyClients(String method, Object params); /** * Immediately closes all the transports with connected clients and releases any diff --git a/mcp/src/main/java/io/modelcontextprotocol/spec/McpSession.java b/mcp/src/main/java/io/modelcontextprotocol/spec/McpSession.java index b97c3cc..473a860 100644 --- a/mcp/src/main/java/io/modelcontextprotocol/spec/McpSession.java +++ b/mcp/src/main/java/io/modelcontextprotocol/spec/McpSession.java @@ -63,10 +63,10 @@ public interface McpSession { * parameters with the notification. *

* @param method the name of the notification method to be sent to the counterparty - * @param params a map of parameters to be sent with the notification + * @param params parameters to be sent with the notification * @return a Mono that completes when the notification has been sent */ - Mono sendNotification(String method, Map params); + Mono sendNotification(String method, Object params); /** * Closes the session and releases any associated resources asynchronously. diff --git a/mcp/src/test/java/io/modelcontextprotocol/MockMcpServerTransportProvider.java b/mcp/src/test/java/io/modelcontextprotocol/MockMcpServerTransportProvider.java index 3fb1918..20a8c0c 100644 --- a/mcp/src/test/java/io/modelcontextprotocol/MockMcpServerTransportProvider.java +++ b/mcp/src/test/java/io/modelcontextprotocol/MockMcpServerTransportProvider.java @@ -47,7 +47,7 @@ public class MockMcpServerTransportProvider implements McpServerTransportProvide } @Override - public Mono notifyClients(String method, Map params) { + public Mono notifyClients(String method, Object params) { return session.sendNotification(method, params); }