From 5fc631ab1136382783e7fff407890c6767306ffe Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 02:14:06 +0000 Subject: [PATCH 01/10] Initial plan From e34f264a41571261ea67f06739dac6bf5f069ec9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 02:25:01 +0000 Subject: [PATCH 02/10] fix(dubbo-mcp): adapt MCP integration to sdk 0.18.2 APIs Agent-Logs-Url: https://github.com/zrlw/dubbo/sessions/95ee4292-fa33-47c2-8947-6be0a474bb31 Co-authored-by: zrlw <40652892+zrlw@users.noreply.github.com> --- dubbo-plugin/dubbo-mcp/pom.xml | 2 +- .../core/McpApplicationDeployListener.java | 7 +++- .../mcp/tool/DubboOpenApiToolConverter.java | 29 ++++---------- .../mcp/tool/DubboServiceToolRegistry.java | 38 +++++++------------ .../DubboMcpSseTransportProvider.java | 16 ++++---- .../DubboMcpStreamableTransportProvider.java | 18 ++++----- .../tool/DubboServiceToolRegistryTest.java | 8 +++- .../DubboMcpSseTransportProviderTest.java | 3 +- ...bboMcpStreamableTransportProviderTest.java | 5 ++- 9 files changed, 55 insertions(+), 71 deletions(-) diff --git a/dubbo-plugin/dubbo-mcp/pom.xml b/dubbo-plugin/dubbo-mcp/pom.xml index 4ad926b2fbc9..652fc609cef9 100644 --- a/dubbo-plugin/dubbo-mcp/pom.xml +++ b/dubbo-plugin/dubbo-mcp/pom.xml @@ -26,7 +26,7 @@ dubbo-mcp - 0.11.2 + 0.18.2 false diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/core/McpApplicationDeployListener.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/core/McpApplicationDeployListener.java index 555c0b8aa332..494107066b8d 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/core/McpApplicationDeployListener.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/core/McpApplicationDeployListener.java @@ -44,6 +44,8 @@ import java.util.concurrent.ExecutorService; import com.fasterxml.jackson.databind.ObjectMapper; +import io.modelcontextprotocol.json.McpJsonMapper; +import io.modelcontextprotocol.json.jackson2.JacksonMcpJsonMapper; import io.modelcontextprotocol.server.McpAsyncServer; import io.modelcontextprotocol.server.McpServer; import io.modelcontextprotocol.spec.McpSchema; @@ -104,14 +106,15 @@ public void onStarted(ApplicationModel applicationModel) { Integer sessionTimeout = globalConf.getInt(McpConstant.SETTINGS_MCP_SESSION_TIMEOUT, McpConstant.DEFAULT_SESSION_TIMEOUT); + McpJsonMapper mcpJsonMapper = new JacksonMcpJsonMapper(new ObjectMapper()); if ("streamable".equals(protocol)) { dubboMcpStreamableTransportProvider = - new DubboMcpStreamableTransportProvider(new ObjectMapper(), sessionTimeout); + new DubboMcpStreamableTransportProvider(mcpJsonMapper, sessionTimeout); mcpAsyncServer = McpServer.async(getDubboMcpStreamableTransportProvider()) .capabilities(serverCapabilities) .build(); } else if ("sse".equals(protocol)) { - dubboMcpSseTransportProvider = new DubboMcpSseTransportProvider(new ObjectMapper(), sessionTimeout); + dubboMcpSseTransportProvider = new DubboMcpSseTransportProvider(mcpJsonMapper, sessionTimeout); mcpAsyncServer = McpServer.async(getDubboMcpSseTransportProvider()) .capabilities(serverCapabilities) .build(); diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboOpenApiToolConverter.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboOpenApiToolConverter.java index 68ac50687dcf..e018bc5498be 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboOpenApiToolConverter.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboOpenApiToolConverter.java @@ -42,7 +42,6 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import com.fasterxml.jackson.databind.ObjectMapper; import io.modelcontextprotocol.spec.McpSchema; public class DubboOpenApiToolConverter { @@ -50,7 +49,6 @@ public class DubboOpenApiToolConverter { private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(DubboOpenApiToolConverter.class); private final DefaultOpenAPIService openApiService; - private final ObjectMapper objectMapper = new ObjectMapper(); private final Map opCache = new ConcurrentHashMap<>(); public DubboOpenApiToolConverter(DefaultOpenAPIService openApiService) { @@ -107,20 +105,12 @@ private McpSchema.Tool convertOperationToMcpTool( String toolName = generateToolName(op, toolConfig); String desc = generateToolDescription(op, toolConfig, path, method); - Map paramsSchemaMap = extractParameterSchema(op); - String schemaJson; - try { - schemaJson = objectMapper.writeValueAsString(paramsSchemaMap); - } catch (Exception e) { - logger.error( - LoggerCodeConstants.COMMON_UNEXPECTED_EXCEPTION, - "Failed to serialize parameter schema for tool {}: {}", - opId, - e.getMessage(), - e); - schemaJson = "{\"type\":\"object\",\"properties\":{}}"; - } - return new McpSchema.Tool(toolName, desc, schemaJson); + McpSchema.JsonSchema inputSchema = extractParameterSchema(op); + return McpSchema.Tool.builder() + .name(toolName) + .description(desc) + .inputSchema(inputSchema) + .build(); } private String generateToolName(Operation op, McpServiceFilter.McpToolConfig toolConfig) { @@ -155,10 +145,8 @@ private String generateToolDescription( return desc; } - private Map extractParameterSchema(Operation op) { - Map schema = new HashMap<>(); + private McpSchema.JsonSchema extractParameterSchema(Operation op) { Map props = new HashMap<>(); - schema.put(McpConstant.SCHEMA_PROPERTY_TYPE, JsonSchemaType.OBJECT_SCHEMA.getJsonSchemaType()); if (op.getParameters() != null) { for (Parameter apiParam : op.getParameters()) { @@ -313,8 +301,7 @@ private Map extractParameterSchema(Operation op) { } }); } - schema.put(McpConstant.SCHEMA_PROPERTY_PROPERTIES, props); - return schema; + return new McpSchema.JsonSchema(JsonSchemaType.OBJECT_SCHEMA.getJsonSchemaType(), props, null, null, null, null); } private Map convertOpenApiSchemaToMcpMap(Schema openApiSchema) { diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java index 552a68aa3989..f2684999dcc0 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java @@ -42,7 +42,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiFunction; -import com.fasterxml.jackson.databind.ObjectMapper; import io.modelcontextprotocol.server.McpAsyncServer; import io.modelcontextprotocol.server.McpAsyncServerExchange; import io.modelcontextprotocol.server.McpServerFeatures; @@ -60,7 +59,6 @@ public class DubboServiceToolRegistry { private final McpServiceFilter mcpServiceFilter; private final Map registeredTools = new ConcurrentHashMap<>(); private final Map> serviceToToolsMapping = new ConcurrentHashMap<>(); - private final ObjectMapper objectMapper; public DubboServiceToolRegistry( McpAsyncServer mcpServer, @@ -71,7 +69,6 @@ public DubboServiceToolRegistry( this.toolConverter = toolConverter; this.genericCaller = genericCaller; this.mcpServiceFilter = mcpServiceFilter; - this.objectMapper = new ObjectMapper(); } public int registerService(ProviderModel providerModel) { @@ -191,7 +188,11 @@ private String registerMethodAsTool( description = generateDefaultDescription(method, providerModel); } - McpSchema.Tool mcpTool = new McpSchema.Tool(toolName, description, generateToolSchema(method)); + McpSchema.Tool mcpTool = McpSchema.Tool.builder() + .name(toolName) + .description(description) + .inputSchema(generateToolSchema(method)) + .build(); McpServerFeatures.AsyncToolSpecification toolSpec = createMethodToolSpecification(mcpTool, providerModel, method, url); @@ -369,32 +370,19 @@ private String generateDefaultDescription(Method method, ProviderModel providerM providerModel.getServiceModel().getInterfaceName()); } - private String generateToolSchema(Method method) { - Map schemaMap = new HashMap<>(); - schemaMap.put(McpConstant.SCHEMA_PROPERTY_TYPE, JsonSchemaType.OBJECT_SCHEMA.getJsonSchemaType()); - + private McpSchema.JsonSchema generateToolSchema(Method method) { Map properties = new HashMap<>(); List requiredParams = new ArrayList<>(); generateSchemaFromMethodSignature(method, properties, requiredParams); - schemaMap.put(McpConstant.SCHEMA_PROPERTY_PROPERTIES, properties); - - if (!requiredParams.isEmpty()) { - schemaMap.put(McpConstant.SCHEMA_PROPERTY_REQUIRED, requiredParams); - } - - try { - return objectMapper.writeValueAsString(schemaMap); - } catch (Exception e) { - logger.error( - LoggerCodeConstants.COMMON_UNEXPECTED_EXCEPTION, - "", - "", - "Failed to generate tool schema for method " + method.getName() + ": " + e.getMessage(), - e); - return "{\"type\":\"object\",\"properties\":{}}"; - } + return new McpSchema.JsonSchema( + JsonSchemaType.OBJECT_SCHEMA.getJsonSchemaType(), + properties, + requiredParams.isEmpty() ? null : requiredParams, + null, + null, + null); } private void generateSchemaFromMethodSignature( diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java index 2fce7725795b..01c052eba71d 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java @@ -37,8 +37,8 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; +import io.modelcontextprotocol.json.McpJsonMapper; +import io.modelcontextprotocol.json.TypeRef; import io.modelcontextprotocol.spec.McpError; import io.modelcontextprotocol.spec.McpSchema; import io.modelcontextprotocol.spec.McpServerSession; @@ -66,14 +66,14 @@ public class DubboMcpSseTransportProvider implements McpServerTransportProvider private McpServerSession.Factory sessionFactory; - private final ObjectMapper objectMapper; + private final McpJsonMapper objectMapper; /** * session cache, default expire time is 60 seconds */ private final ExpiringMap sessions; - public DubboMcpSseTransportProvider(ObjectMapper objectMapper, Integer expireSeconds) { + public DubboMcpSseTransportProvider(McpJsonMapper objectMapper, Integer expireSeconds) { if (expireSeconds != null) { if (expireSeconds < 60) { expireSeconds = 60; @@ -86,7 +86,7 @@ public DubboMcpSseTransportProvider(ObjectMapper objectMapper, Integer expireSec sessions.getExpireThread().startExpiryIfNotStarted(); } - public DubboMcpSseTransportProvider(ObjectMapper objectMapper) { + public DubboMcpSseTransportProvider(McpJsonMapper objectMapper) { this(objectMapper, 60); } @@ -179,12 +179,12 @@ private void sendEvent(StreamObserver> responseObserver, private static class DubboMcpSessionTransport implements McpServerTransport { - private final ObjectMapper JSON; + private final McpJsonMapper JSON; private final StreamObserver> responseObserver; public DubboMcpSessionTransport( - StreamObserver> responseObserver, ObjectMapper objectMapper) { + StreamObserver> responseObserver, McpJsonMapper objectMapper) { this.responseObserver = responseObserver; this.JSON = objectMapper; } @@ -215,7 +215,7 @@ public Mono sendMessage(McpSchema.JSONRPCMessage message) { } @Override - public T unmarshalFrom(Object data, TypeReference typeRef) { + public T unmarshalFrom(Object data, TypeRef typeRef) { return JSON.convertValue(data, typeRef); } } diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java index 30478fcdb512..3ab2585fc821 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java @@ -39,8 +39,8 @@ import java.util.ArrayList; import java.util.List; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; +import io.modelcontextprotocol.json.McpJsonMapper; +import io.modelcontextprotocol.json.TypeRef; import io.modelcontextprotocol.spec.McpError; import io.modelcontextprotocol.spec.McpSchema; import io.modelcontextprotocol.spec.McpStreamableServerSession; @@ -63,7 +63,7 @@ public class DubboMcpStreamableTransportProvider implements McpStreamableServerT private Factory sessionFactory; - private final ObjectMapper objectMapper; + private final McpJsonMapper objectMapper; public static final String SESSION_ID_HEADER = "mcp-session-id"; @@ -74,11 +74,11 @@ public class DubboMcpStreamableTransportProvider implements McpStreamableServerT */ private final ExpiringMap sessions; - public DubboMcpStreamableTransportProvider(ObjectMapper objectMapper) { + public DubboMcpStreamableTransportProvider(McpJsonMapper objectMapper) { this(objectMapper, McpConstant.DEFAULT_SESSION_TIMEOUT); } - public DubboMcpStreamableTransportProvider(ObjectMapper objectMapper, Integer expireSeconds) { + public DubboMcpStreamableTransportProvider(McpJsonMapper objectMapper, Integer expireSeconds) { // Minimum expiration time is 60 seconds if (expireSeconds != null) { if (expireSeconds < 60) { @@ -319,7 +319,7 @@ private void handlePost(StreamObserver> responseObserver // Create new session McpSchema.InitializeRequest initializeRequest = objectMapper.convertValue( - ((McpSchema.JSONRPCRequest) message).params(), new TypeReference<>() {}); + ((McpSchema.JSONRPCRequest) message).params(), McpSchema.InitializeRequest.class); McpStreamableServerSession.McpStreamableServerSessionInit init = sessionFactory.startSession(initializeRequest); @@ -528,12 +528,12 @@ private void refreshSessionExpire(McpStreamableServerSession session) { private static class DubboMcpSessionTransport implements McpStreamableServerTransport { - private final ObjectMapper JSON; + private final McpJsonMapper JSON; private final StreamObserver> responseObserver; public DubboMcpSessionTransport( - StreamObserver> responseObserver, ObjectMapper objectMapper) { + StreamObserver> responseObserver, McpJsonMapper objectMapper) { this.responseObserver = responseObserver; this.JSON = objectMapper; } @@ -587,7 +587,7 @@ public Mono sendMessage(McpSchema.JSONRPCMessage message, String messageId } @Override - public T unmarshalFrom(Object data, TypeReference typeRef) { + public T unmarshalFrom(Object data, TypeRef typeRef) { return JSON.convertValue(data, typeRef); } } diff --git a/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistryTest.java b/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistryTest.java index 56416b82f022..aee6322241ef 100644 --- a/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistryTest.java +++ b/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistryTest.java @@ -201,8 +201,12 @@ private McpServiceFilter.McpToolConfig createMockToolConfig() { private java.util.Map createMockTools() { java.util.Map tools = new java.util.HashMap<>(); - io.modelcontextprotocol.spec.McpSchema.Tool tool = - new io.modelcontextprotocol.spec.McpSchema.Tool("testTool", "Test description", "{}"); + io.modelcontextprotocol.spec.McpSchema.Tool tool = io.modelcontextprotocol.spec.McpSchema.Tool.builder() + .name("testTool") + .description("Test description") + .inputSchema(new io.modelcontextprotocol.spec.McpSchema.JsonSchema( + "object", java.util.Collections.emptyMap(), null, null, null, null)) + .build(); tools.put("testTool", tool); return tools; } diff --git a/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProviderTest.java b/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProviderTest.java index bd92f8f870e1..679c1a5bbb41 100644 --- a/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProviderTest.java +++ b/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProviderTest.java @@ -29,6 +29,7 @@ import java.io.ByteArrayInputStream; import com.fasterxml.jackson.databind.ObjectMapper; +import io.modelcontextprotocol.json.jackson2.JacksonMcpJsonMapper; import io.modelcontextprotocol.spec.McpSchema; import io.modelcontextprotocol.spec.McpServerSession; import org.junit.jupiter.api.AfterEach; @@ -87,7 +88,7 @@ void setUp() { rpcContextMockedStatic.when(RpcContext::getServiceContext).thenReturn(rpcServiceContext); when(rpcServiceContext.getRequest(HttpRequest.class)).thenReturn(httpRequest); when(rpcServiceContext.getResponse(HttpResponse.class)).thenReturn(httpResponse); - transportProvider = new DubboMcpSseTransportProvider(objectMapper); + transportProvider = new DubboMcpSseTransportProvider(new JacksonMcpJsonMapper(objectMapper)); transportProvider.setSessionFactory(sessionFactory); } diff --git a/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProviderTest.java b/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProviderTest.java index 71e0e1e6463d..b592d07fd49e 100644 --- a/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProviderTest.java +++ b/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProviderTest.java @@ -29,6 +29,7 @@ import java.util.Collections; import com.fasterxml.jackson.databind.ObjectMapper; +import io.modelcontextprotocol.json.jackson2.JacksonMcpJsonMapper; import io.modelcontextprotocol.spec.McpSchema; import io.modelcontextprotocol.spec.McpStreamableServerSession; import org.junit.jupiter.api.AfterEach; @@ -78,7 +79,7 @@ void setUp() { rpcContextMockedStatic.when(RpcContext::getServiceContext).thenReturn(rpcServiceContext); when(rpcServiceContext.getRequest(HttpRequest.class)).thenReturn(httpRequest); when(rpcServiceContext.getResponse(HttpResponse.class)).thenReturn(httpResponse); - transportProvider = new DubboMcpStreamableTransportProvider(objectMapper); + transportProvider = new DubboMcpStreamableTransportProvider(new JacksonMcpJsonMapper(objectMapper)); transportProvider.setSessionFactory(sessionFactory); } @@ -171,7 +172,7 @@ void handleGetReturnsNotFoundForUnknownSessionId() { void handleGetWithReplayRequestCallsSessionReplay() throws Exception { // Create a transport provider subclass for testing to access private methods and fields DubboMcpStreamableTransportProvider transportProviderUnderTest = - new DubboMcpStreamableTransportProvider(objectMapper); + new DubboMcpStreamableTransportProvider(new JacksonMcpJsonMapper(objectMapper)); transportProviderUnderTest.setSessionFactory(sessionFactory); // Use reflection to put mockSession into the sessions map From f5f70946ba29d504cc0f7a49c9be42a245721560 Mon Sep 17 00:00:00 2001 From: zrlw Date: Tue, 12 May 2026 10:57:16 +0800 Subject: [PATCH 03/10] format codes of DubboOpenApiToolConverter --- .../org/apache/dubbo/mcp/tool/DubboOpenApiToolConverter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboOpenApiToolConverter.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboOpenApiToolConverter.java index e018bc5498be..c24f0daf8e09 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboOpenApiToolConverter.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboOpenApiToolConverter.java @@ -301,7 +301,8 @@ private McpSchema.JsonSchema extractParameterSchema(Operation op) { } }); } - return new McpSchema.JsonSchema(JsonSchemaType.OBJECT_SCHEMA.getJsonSchemaType(), props, null, null, null, null); + return new McpSchema.JsonSchema( + JsonSchemaType.OBJECT_SCHEMA.getJsonSchemaType(), props, null, null, null, null); } private Map convertOpenApiSchemaToMcpMap(Schema openApiSchema) { From 7f8c5ccd4f9b1dedde7e9ce04fd3258f4cda6cfe Mon Sep 17 00:00:00 2001 From: zrlw Date: Tue, 12 May 2026 14:32:00 +0800 Subject: [PATCH 04/10] Create static JacksonMcpJsonMapper --- .../core/McpApplicationDeployListener.java | 14 ++++++++--- .../mcp/tool/DubboServiceToolRegistry.java | 2 +- .../DubboMcpStreamableTransportProvider.java | 24 +++++++++---------- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/core/McpApplicationDeployListener.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/core/McpApplicationDeployListener.java index 494107066b8d..0965ec9982b1 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/core/McpApplicationDeployListener.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/core/McpApplicationDeployListener.java @@ -56,6 +56,9 @@ public class McpApplicationDeployListener implements ApplicationDeployListener { private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(McpApplicationDeployListener.class); + + private static final McpJsonMapper MCP_JSON_MAPPER = createMcpJsonMapper(); + private DubboServiceToolRegistry toolRegistry; private boolean mcpEnable = true; @@ -106,15 +109,14 @@ public void onStarted(ApplicationModel applicationModel) { Integer sessionTimeout = globalConf.getInt(McpConstant.SETTINGS_MCP_SESSION_TIMEOUT, McpConstant.DEFAULT_SESSION_TIMEOUT); - McpJsonMapper mcpJsonMapper = new JacksonMcpJsonMapper(new ObjectMapper()); if ("streamable".equals(protocol)) { dubboMcpStreamableTransportProvider = - new DubboMcpStreamableTransportProvider(mcpJsonMapper, sessionTimeout); + new DubboMcpStreamableTransportProvider(MCP_JSON_MAPPER, sessionTimeout); mcpAsyncServer = McpServer.async(getDubboMcpStreamableTransportProvider()) .capabilities(serverCapabilities) .build(); } else if ("sse".equals(protocol)) { - dubboMcpSseTransportProvider = new DubboMcpSseTransportProvider(mcpJsonMapper, sessionTimeout); + dubboMcpSseTransportProvider = new DubboMcpSseTransportProvider(MCP_JSON_MAPPER, sessionTimeout); mcpAsyncServer = McpServer.async(getDubboMcpSseTransportProvider()) .capabilities(serverCapabilities) .build(); @@ -248,4 +250,10 @@ private int getRegisterPort() { } return NetUtils.getAvailablePort(); } + + private static McpJsonMapper createMcpJsonMapper() { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setSerializationInclusion(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL); + return new JacksonMcpJsonMapper(objectMapper); + } } diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java index f2684999dcc0..d2cfb3dfa9d6 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java @@ -379,7 +379,7 @@ private McpSchema.JsonSchema generateToolSchema(Method method) { return new McpSchema.JsonSchema( JsonSchemaType.OBJECT_SCHEMA.getJsonSchemaType(), properties, - requiredParams.isEmpty() ? null : requiredParams, + requiredParams, null, null, null); diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java index 3ab2585fc821..8ba93adf5f02 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java @@ -63,7 +63,7 @@ public class DubboMcpStreamableTransportProvider implements McpStreamableServerT private Factory sessionFactory; - private final McpJsonMapper objectMapper; + private final McpJsonMapper mcpJsonMapper; public static final String SESSION_ID_HEADER = "mcp-session-id"; @@ -88,7 +88,7 @@ public DubboMcpStreamableTransportProvider(McpJsonMapper objectMapper, Integer e expireSeconds = 60; } sessions = new ExpiringMap<>(expireSeconds, 30); - this.objectMapper = objectMapper; + this.mcpJsonMapper = objectMapper; sessions.getExpireThread().startExpiryIfNotStarted(); } @@ -208,7 +208,7 @@ private void handleGet(StreamObserver> responseObserver) message -> { if (responseObserver != null) { try { - String jsonData = objectMapper.writeValueAsString(message); + String jsonData = mcpJsonMapper.writeValueAsString(message); responseObserver.onNext(ServerSentEvent.builder() .event("message") .data(jsonData.getBytes(StandardCharsets.UTF_8)) @@ -296,7 +296,7 @@ private void handlePost(StreamObserver> responseObserver // Read and deserialize JSON-RPC message from request body String requestBody = IOUtils.read(request.inputStream(), StandardCharsets.UTF_8.name()); - McpSchema.JSONRPCMessage message = McpSchema.deserializeJsonRpcMessage(objectMapper, requestBody); + McpSchema.JSONRPCMessage message = McpSchema.deserializeJsonRpcMessage(mcpJsonMapper, requestBody); // Check if it's an initialization request if (message instanceof McpSchema.JSONRPCRequest @@ -318,7 +318,7 @@ private void handlePost(StreamObserver> responseObserver } // Create new session - McpSchema.InitializeRequest initializeRequest = objectMapper.convertValue( + McpSchema.InitializeRequest initializeRequest = mcpJsonMapper.convertValue( ((McpSchema.JSONRPCRequest) message).params(), McpSchema.InitializeRequest.class); McpStreamableServerSession.McpStreamableServerSessionInit init = @@ -333,7 +333,7 @@ private void handlePost(StreamObserver> responseObserver response.setHeader(SESSION_ID_HEADER, session.getId()); response.setStatus(HttpStatus.OK.getCode()); - String jsonResponse = objectMapper.writeValueAsString(new McpSchema.JSONRPCResponse( + String jsonResponse = mcpJsonMapper.writeValueAsString(new McpSchema.JSONRPCResponse( McpSchema.JSONRPC_VERSION, ((McpSchema.JSONRPCRequest) message).id(), initResult, null)); if (responseObserver != null) { @@ -428,7 +428,7 @@ private void handlePost(StreamObserver> responseObserver // Handle request stream DubboMcpSessionTransport sessionTransport = - new DubboMcpSessionTransport(responseObserver, objectMapper); + new DubboMcpSessionTransport(responseObserver, mcpJsonMapper); session.responseStream((McpSchema.JSONRPCRequest) message, sessionTransport) .block(); } else { @@ -528,14 +528,14 @@ private void refreshSessionExpire(McpStreamableServerSession session) { private static class DubboMcpSessionTransport implements McpStreamableServerTransport { - private final McpJsonMapper JSON; + private final McpJsonMapper mcpJsonMapper1; private final StreamObserver> responseObserver; public DubboMcpSessionTransport( StreamObserver> responseObserver, McpJsonMapper objectMapper) { this.responseObserver = responseObserver; - this.JSON = objectMapper; + this.mcpJsonMapper1 = objectMapper; } @Override @@ -555,7 +555,7 @@ public Mono sendMessage(McpSchema.JSONRPCMessage message) { return Mono.fromRunnable(() -> { try { if (responseObserver != null) { - String jsonText = JSON.writeValueAsString(message); + String jsonText = mcpJsonMapper1.writeValueAsString(message); responseObserver.onNext(ServerSentEvent.builder() .event("message") .data(jsonText.getBytes(StandardCharsets.UTF_8)) @@ -572,7 +572,7 @@ public Mono sendMessage(McpSchema.JSONRPCMessage message, String messageId return Mono.fromRunnable(() -> { try { if (responseObserver != null) { - String jsonText = JSON.writeValueAsString(message); + String jsonText = mcpJsonMapper1.writeValueAsString(message); ServerSentEvent event = ServerSentEvent.builder() .event("message") .data(jsonText.getBytes(StandardCharsets.UTF_8)) @@ -588,7 +588,7 @@ public Mono sendMessage(McpSchema.JSONRPCMessage message, String messageId @Override public T unmarshalFrom(Object data, TypeRef typeRef) { - return JSON.convertValue(data, typeRef); + return mcpJsonMapper1.convertValue(data, typeRef); } } } From 03b8b8ab52fd068327c15dab07a4dbabef300a76 Mon Sep 17 00:00:00 2001 From: zrlw Date: Tue, 12 May 2026 14:44:54 +0800 Subject: [PATCH 05/10] reformat codes of DubboServiceToolRegistry --- .../apache/dubbo/mcp/tool/DubboServiceToolRegistry.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java index d2cfb3dfa9d6..57e76574e9bd 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java @@ -377,12 +377,7 @@ private McpSchema.JsonSchema generateToolSchema(Method method) { generateSchemaFromMethodSignature(method, properties, requiredParams); return new McpSchema.JsonSchema( - JsonSchemaType.OBJECT_SCHEMA.getJsonSchemaType(), - properties, - requiredParams, - null, - null, - null); + JsonSchemaType.OBJECT_SCHEMA.getJsonSchemaType(), properties, requiredParams, null, null, null); } private void generateSchemaFromMethodSignature( From 230a32cb5be3cdd9754f6e8f9d50e314d64d4f4f Mon Sep 17 00:00:00 2001 From: zrlw Date: Tue, 12 May 2026 15:53:22 +0800 Subject: [PATCH 06/10] rename variable names of type McpJsonMapper --- .../DubboMcpSseTransportProvider.java | 24 +++++++++---------- .../DubboMcpStreamableTransportProvider.java | 20 ++++++++-------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java index 01c052eba71d..fa870da97855 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java @@ -66,14 +66,14 @@ public class DubboMcpSseTransportProvider implements McpServerTransportProvider private McpServerSession.Factory sessionFactory; - private final McpJsonMapper objectMapper; + private final McpJsonMapper mcpJsonMapper; /** * session cache, default expire time is 60 seconds */ private final ExpiringMap sessions; - public DubboMcpSseTransportProvider(McpJsonMapper objectMapper, Integer expireSeconds) { + public DubboMcpSseTransportProvider(McpJsonMapper mcpJsonMapper, Integer expireSeconds) { if (expireSeconds != null) { if (expireSeconds < 60) { expireSeconds = 60; @@ -82,12 +82,12 @@ public DubboMcpSseTransportProvider(McpJsonMapper objectMapper, Integer expireSe expireSeconds = 60; } sessions = new ExpiringMap<>(expireSeconds, 30); - this.objectMapper = objectMapper; + this.mcpJsonMapper = mcpJsonMapper; sessions.getExpireThread().startExpiryIfNotStarted(); } - public DubboMcpSseTransportProvider(McpJsonMapper objectMapper) { - this(objectMapper, 60); + public DubboMcpSseTransportProvider(McpJsonMapper mcpJsonMapper) { + this(mcpJsonMapper, 60); } @Override @@ -147,7 +147,7 @@ public void handleMessage() { refreshSessionExpire(session); try { McpSchema.JSONRPCMessage message = McpSchema.deserializeJsonRpcMessage( - objectMapper, IOUtils.read(request.inputStream(), String.valueOf(StandardCharsets.UTF_8))); + mcpJsonMapper, IOUtils.read(request.inputStream(), String.valueOf(StandardCharsets.UTF_8))); session.handle(message).block(); response.setStatus(HttpStatus.OK.getCode()); } catch (IOException e) { @@ -160,7 +160,7 @@ private void handleSseConnection(StreamObserver> respons // Handle the SSE connection // This is where you would set up the SSE stream and send events to the client DubboMcpSessionTransport dubboMcpSessionTransport = - new DubboMcpSessionTransport(responseObserver, objectMapper); + new DubboMcpSessionTransport(responseObserver, mcpJsonMapper); McpServerSession mcpServerSession = sessionFactory.create(dubboMcpSessionTransport); sessions.put(mcpServerSession.getId(), mcpServerSession); Configuration conf = ConfigurationUtils.getGlobalConfiguration(ApplicationModel.defaultModel()); @@ -179,14 +179,14 @@ private void sendEvent(StreamObserver> responseObserver, private static class DubboMcpSessionTransport implements McpServerTransport { - private final McpJsonMapper JSON; + private final McpJsonMapper mcpJsonMapper; private final StreamObserver> responseObserver; public DubboMcpSessionTransport( - StreamObserver> responseObserver, McpJsonMapper objectMapper) { + StreamObserver> responseObserver, McpJsonMapper mcpJsonMapper) { this.responseObserver = responseObserver; - this.JSON = objectMapper; + this.mcpJsonMapper = mcpJsonMapper; } @Override @@ -203,7 +203,7 @@ public Mono closeGracefully() { public Mono sendMessage(McpSchema.JSONRPCMessage message) { return Mono.fromRunnable(() -> { try { - String jsonText = JSON.writeValueAsString(message); + String jsonText = mcpJsonMapper.writeValueAsString(message); responseObserver.onNext(ServerSentEvent.builder() .event(MESSAGE_EVENT_TYPE) .data(jsonText) @@ -216,7 +216,7 @@ public Mono sendMessage(McpSchema.JSONRPCMessage message) { @Override public T unmarshalFrom(Object data, TypeRef typeRef) { - return JSON.convertValue(data, typeRef); + return mcpJsonMapper.convertValue(data, typeRef); } } } diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java index 8ba93adf5f02..0ff6d99aa462 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java @@ -74,11 +74,11 @@ public class DubboMcpStreamableTransportProvider implements McpStreamableServerT */ private final ExpiringMap sessions; - public DubboMcpStreamableTransportProvider(McpJsonMapper objectMapper) { - this(objectMapper, McpConstant.DEFAULT_SESSION_TIMEOUT); + public DubboMcpStreamableTransportProvider(McpJsonMapper mcpJsonMapper) { + this(mcpJsonMapper, McpConstant.DEFAULT_SESSION_TIMEOUT); } - public DubboMcpStreamableTransportProvider(McpJsonMapper objectMapper, Integer expireSeconds) { + public DubboMcpStreamableTransportProvider(McpJsonMapper mcpJsonMapper, Integer expireSeconds) { // Minimum expiration time is 60 seconds if (expireSeconds != null) { if (expireSeconds < 60) { @@ -88,7 +88,7 @@ public DubboMcpStreamableTransportProvider(McpJsonMapper objectMapper, Integer e expireSeconds = 60; } sessions = new ExpiringMap<>(expireSeconds, 30); - this.mcpJsonMapper = objectMapper; + this.mcpJsonMapper = mcpJsonMapper; sessions.getExpireThread().startExpiryIfNotStarted(); } @@ -528,14 +528,14 @@ private void refreshSessionExpire(McpStreamableServerSession session) { private static class DubboMcpSessionTransport implements McpStreamableServerTransport { - private final McpJsonMapper mcpJsonMapper1; + private final McpJsonMapper mcpJsonMapper; private final StreamObserver> responseObserver; public DubboMcpSessionTransport( - StreamObserver> responseObserver, McpJsonMapper objectMapper) { + StreamObserver> responseObserver, McpJsonMapper mcpJsonMapper) { this.responseObserver = responseObserver; - this.mcpJsonMapper1 = objectMapper; + this.mcpJsonMapper = mcpJsonMapper; } @Override @@ -555,7 +555,7 @@ public Mono sendMessage(McpSchema.JSONRPCMessage message) { return Mono.fromRunnable(() -> { try { if (responseObserver != null) { - String jsonText = mcpJsonMapper1.writeValueAsString(message); + String jsonText = mcpJsonMapper.writeValueAsString(message); responseObserver.onNext(ServerSentEvent.builder() .event("message") .data(jsonText.getBytes(StandardCharsets.UTF_8)) @@ -572,7 +572,7 @@ public Mono sendMessage(McpSchema.JSONRPCMessage message, String messageId return Mono.fromRunnable(() -> { try { if (responseObserver != null) { - String jsonText = mcpJsonMapper1.writeValueAsString(message); + String jsonText = mcpJsonMapper.writeValueAsString(message); ServerSentEvent event = ServerSentEvent.builder() .event("message") .data(jsonText.getBytes(StandardCharsets.UTF_8)) @@ -588,7 +588,7 @@ public Mono sendMessage(McpSchema.JSONRPCMessage message, String messageId @Override public T unmarshalFrom(Object data, TypeRef typeRef) { - return mcpJsonMapper1.convertValue(data, typeRef); + return mcpJsonMapper.convertValue(data, typeRef); } } } From 061887c639929d62949ee5471fac306e160b1bd1 Mon Sep 17 00:00:00 2001 From: zrlw Date: Tue, 12 May 2026 16:07:24 +0800 Subject: [PATCH 07/10] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../dubbo/mcp/transport/DubboMcpSseTransportProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java index fa870da97855..d0807f7b22cb 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java @@ -82,7 +82,7 @@ public DubboMcpSseTransportProvider(McpJsonMapper mcpJsonMapper, Integer expireS expireSeconds = 60; } sessions = new ExpiringMap<>(expireSeconds, 30); - this.mcpJsonMapper = mcpJsonMapper; + this.mcpJsonMapper = java.util.Objects.requireNonNull(mcpJsonMapper, "mcpJsonMapper"); sessions.getExpireThread().startExpiryIfNotStarted(); } From a0b8bc8c7c46da7127320621212f227a323ba191 Mon Sep 17 00:00:00 2001 From: zrlw Date: Tue, 12 May 2026 16:11:13 +0800 Subject: [PATCH 08/10] Read input stream with charset name --- .../dubbo/mcp/transport/DubboMcpSseTransportProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java index d0807f7b22cb..d1e77795fae2 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java @@ -147,7 +147,7 @@ public void handleMessage() { refreshSessionExpire(session); try { McpSchema.JSONRPCMessage message = McpSchema.deserializeJsonRpcMessage( - mcpJsonMapper, IOUtils.read(request.inputStream(), String.valueOf(StandardCharsets.UTF_8))); + mcpJsonMapper, IOUtils.read(request.inputStream(), StandardCharsets.UTF_8.name())); session.handle(message).block(); response.setStatus(HttpStatus.OK.getCode()); } catch (IOException e) { From f3f78e4de6b2d080324661fbca7a1c5ae075ae42 Mon Sep 17 00:00:00 2001 From: zrlw Date: Tue, 12 May 2026 17:55:23 +0800 Subject: [PATCH 09/10] Add mcpJsonMapper nonNull requirement adn adjust testcases --- .../dubbo/mcp/transport/DubboMcpSseTransportProvider.java | 2 +- .../mcp/transport/DubboMcpStreamableTransportProvider.java | 2 +- .../dubbo/mcp/transport/DubboMcpSseTransportProviderTest.java | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java index d1e77795fae2..ca8a9ea2b46e 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProvider.java @@ -82,7 +82,7 @@ public DubboMcpSseTransportProvider(McpJsonMapper mcpJsonMapper, Integer expireS expireSeconds = 60; } sessions = new ExpiringMap<>(expireSeconds, 30); - this.mcpJsonMapper = java.util.Objects.requireNonNull(mcpJsonMapper, "mcpJsonMapper"); + this.mcpJsonMapper = java.util.Objects.requireNonNull(mcpJsonMapper, "mcpJsonMapper must not be null"); sessions.getExpireThread().startExpiryIfNotStarted(); } diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java index 0ff6d99aa462..35d14e2d01f9 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/transport/DubboMcpStreamableTransportProvider.java @@ -88,7 +88,7 @@ public DubboMcpStreamableTransportProvider(McpJsonMapper mcpJsonMapper, Integer expireSeconds = 60; } sessions = new ExpiringMap<>(expireSeconds, 30); - this.mcpJsonMapper = mcpJsonMapper; + this.mcpJsonMapper = java.util.Objects.requireNonNull(mcpJsonMapper, "mcpJsonMapper must not be null"); sessions.getExpireThread().startExpiryIfNotStarted(); } diff --git a/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProviderTest.java b/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProviderTest.java index 679c1a5bbb41..5eb92d28d396 100644 --- a/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProviderTest.java +++ b/dubbo-plugin/dubbo-mcp/src/test/java/org/apache/dubbo/mcp/transport/DubboMcpSseTransportProviderTest.java @@ -38,7 +38,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockedStatic; import org.mockito.junit.jupiter.MockitoExtension; @@ -77,7 +76,6 @@ class DubboMcpSseTransportProviderTest { private MockedStatic rpcContextMockedStatic; - @InjectMocks private DubboMcpSseTransportProvider transportProvider; private final ObjectMapper objectMapper = new ObjectMapper(); From 85d80e2a7d092c72f5c9f4083ab400816fa7f6b0 Mon Sep 17 00:00:00 2001 From: zrlw Date: Tue, 12 May 2026 18:30:57 +0800 Subject: [PATCH 10/10] Be consistent with DubboOpenApiToolConverter by passing null when no required list --- .../org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java index 57e76574e9bd..cfb1cddcd0a9 100644 --- a/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java +++ b/dubbo-plugin/dubbo-mcp/src/main/java/org/apache/dubbo/mcp/tool/DubboServiceToolRegistry.java @@ -376,8 +376,9 @@ private McpSchema.JsonSchema generateToolSchema(Method method) { generateSchemaFromMethodSignature(method, properties, requiredParams); + List schemaRequiredParams = requiredParams.isEmpty() ? null : requiredParams; return new McpSchema.JsonSchema( - JsonSchemaType.OBJECT_SCHEMA.getJsonSchemaType(), properties, requiredParams, null, null, null); + JsonSchemaType.OBJECT_SCHEMA.getJsonSchemaType(), properties, schemaRequiredParams, null, null, null); } private void generateSchemaFromMethodSignature(