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(