Skip to content

Commit 68db5a3

Browse files
authored
Fix: Upgrade MCP SDK to 0.14.0 for protocol 2025-06-18 support (#23982) (#24850)
* Fix: Upgrade MCP SDK to 0.14.0 for protocol 2025-06-18 support (#23982) * spotless fix * Add mcp-json-jackson2 dependency for SDK 0.14.0, MCP SDK 0.14.0 split JSON functionality into separate module. JacksonMcpJsonMapper is required for McpServer and McpUtils.
1 parent 6fdc353 commit 68db5a3

7 files changed

Lines changed: 63 additions & 39 deletions

File tree

openmetadata-mcp/pom.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<assertj-core.version>3.26.3</assertj-core.version>
2020
<okhttp.version>4.12.0</okhttp.version>
2121
<awaitility.version>4.2.2</awaitility.version>
22-
<mcp-sdk.version>0.11.2</mcp-sdk.version>
22+
<mcp-sdk.version>0.14.0</mcp-sdk.version>
2323
<testcontainers.version>1.20.4</testcontainers.version>
2424
<jetty.version>11.0.25</jetty.version>
2525
</properties>
@@ -63,6 +63,11 @@
6363
<artifactId>mcp</artifactId>
6464
<version>${mcp-sdk.version}</version>
6565
</dependency>
66+
<dependency>
67+
<groupId>io.modelcontextprotocol.sdk</groupId>
68+
<artifactId>mcp-json-jackson2</artifactId>
69+
<version>${mcp-sdk.version}</version>
70+
</dependency>
6671
<dependency>
6772
<groupId>org.open-metadata</groupId>
6873
<artifactId>openmetadata-service</artifactId>
Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
package org.openmetadata.mcp;
22

3-
import io.modelcontextprotocol.server.McpTransportContext;
3+
import io.modelcontextprotocol.common.McpTransportContext;
44
import io.modelcontextprotocol.server.McpTransportContextExtractor;
55
import jakarta.servlet.http.HttpServletRequest;
6+
import java.util.HashMap;
7+
import java.util.Map;
68
import org.openmetadata.service.security.JwtFilter;
79

810
public class AuthEnrichedMcpContextExtractor
911
implements McpTransportContextExtractor<HttpServletRequest> {
1012
public static final String AUTHORIZATION_HEADER = "Authorization";
1113

1214
@Override
13-
public McpTransportContext extract(
14-
HttpServletRequest request, McpTransportContext transportContext) {
15-
transportContext.put(
15+
public McpTransportContext extract(HttpServletRequest request) {
16+
Map<String, Object> contextData = new HashMap<>();
17+
contextData.put(
1618
AUTHORIZATION_HEADER, JwtFilter.extractToken(request.getHeader(AUTHORIZATION_HEADER)));
17-
return transportContext;
19+
return McpTransportContext.create(contextData);
1820
}
1921
}

openmetadata-mcp/src/main/java/org/openmetadata/mcp/McpServer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.dropwizard.core.setup.Environment;
44
import io.dropwizard.jetty.MutableServletContextHandler;
5+
import io.modelcontextprotocol.json.jackson.JacksonMcpJsonMapper;
56
import io.modelcontextprotocol.server.McpStatelessServerFeatures;
67
import io.modelcontextprotocol.server.McpStatelessSyncServer;
78
import io.modelcontextprotocol.server.transport.HttpServletStatelessServerTransport;
@@ -88,14 +89,14 @@ private void addStatelessTransport(
8889

8990
HttpServletStatelessServerTransport statelessTransport =
9091
HttpServletStatelessServerTransport.builder()
91-
.objectMapper(JsonUtils.getObjectMapper())
92+
.jsonMapper(new JacksonMcpJsonMapper(JsonUtils.getObjectMapper()))
9293
.messageEndpoint("/mcp")
9394
.contextExtractor(new AuthEnrichedMcpContextExtractor())
9495
.build();
9596

9697
McpStatelessSyncServer server =
9798
io.modelcontextprotocol.server.McpServer.sync(statelessTransport)
98-
.serverInfo("openmetadata-mcp-stateless", "0.11.2")
99+
.serverInfo("openmetadata-mcp-stateless", "0.14.0")
99100
.capabilities(serverCapabilities)
100101
.build();
101102
addToolsToServer(server, tools);

openmetadata-mcp/src/main/java/org/openmetadata/mcp/McpUtils.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.fasterxml.jackson.databind.JsonNode;
44
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import io.modelcontextprotocol.json.jackson.JacksonMcpJsonMapper;
56
import io.modelcontextprotocol.spec.McpSchema;
67
import jakarta.servlet.http.HttpServletRequest;
78
import java.io.BufferedReader;
@@ -27,7 +28,8 @@ public static McpSchema.JSONRPCMessage getJsonRpcMessageWithAuthorizationParam(
2728
arguments.put("Authorization", JwtFilter.extractToken(request.getHeader("Authorization")));
2829
}
2930
}
30-
return McpSchema.deserializeJsonRpcMessage(objectMapper, JsonUtils.pojoToJson(requestMessage));
31+
return McpSchema.deserializeJsonRpcMessage(
32+
new JacksonMcpJsonMapper(objectMapper), JsonUtils.pojoToJson(requestMessage));
3133
}
3234

3335
@SuppressWarnings("unchecked")
@@ -79,12 +81,18 @@ public static List<McpSchema.Tool> getToolProperties(String jsonFilePath) {
7981
throw new RuntimeException("Failed to load tool definitions");
8082
}
8183
LOG.debug("Successfully loaded {} tool definitions", cachedTools.size());
84+
JacksonMcpJsonMapper jsonMapper = new JacksonMcpJsonMapper(JsonUtils.getObjectMapper());
8285
for (int i = 0; i < cachedTools.size(); i++) {
8386
Map<String, Object> toolDef = cachedTools.get(i);
8487
String name = (String) toolDef.get("name");
8588
String description = (String) toolDef.get("description");
8689
Map<String, Object> schema = JsonUtils.getMap(toolDef.get("parameters"));
87-
result.add(new McpSchema.Tool(name, description, JsonUtils.pojoToJson(schema)));
90+
result.add(
91+
McpSchema.Tool.builder()
92+
.name(name)
93+
.description(description)
94+
.inputSchema(jsonMapper, JsonUtils.pojoToJson(schema))
95+
.build());
8896
}
8997
return result;
9098
} catch (Exception e) {

openmetadata-mcp/src/main/java/org/openmetadata/mcp/tools/DefaultToolContext.java

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -59,39 +59,47 @@ public McpSchema.CallToolResult callTool(
5959
result = new GetLineageTool().execute(authorizer, securityContext, params);
6060
break;
6161
default:
62-
return new McpSchema.CallToolResult(
63-
List.of(
64-
new McpSchema.TextContent(
65-
JsonUtils.pojoToJson(Map.of("error", "Unknown function: " + toolName)))),
66-
true);
62+
return McpSchema.CallToolResult.builder()
63+
.content(
64+
List.of(
65+
new McpSchema.TextContent(
66+
JsonUtils.pojoToJson(Map.of("error", "Unknown function: " + toolName)))))
67+
.isError(true)
68+
.build();
6769
}
6870

69-
return new McpSchema.CallToolResult(
70-
List.of(new McpSchema.TextContent(JsonUtils.pojoToJson(result))), false);
71+
return McpSchema.CallToolResult.builder()
72+
.content(List.of(new McpSchema.TextContent(JsonUtils.pojoToJson(result))))
73+
.isError(false)
74+
.build();
7175
} catch (AuthorizationException ex) {
7276
LOG.error("Authorization error: {}", ex.getMessage());
73-
return new McpSchema.CallToolResult(
74-
List.of(
75-
new McpSchema.TextContent(
76-
JsonUtils.pojoToJson(
77-
Map.of(
78-
"error",
79-
String.format("Authorization error: %s", ex.getMessage()),
80-
"statusCode",
81-
403)))),
82-
true);
77+
return McpSchema.CallToolResult.builder()
78+
.content(
79+
List.of(
80+
new McpSchema.TextContent(
81+
JsonUtils.pojoToJson(
82+
Map.of(
83+
"error",
84+
String.format("Authorization error: %s", ex.getMessage()),
85+
"statusCode",
86+
403)))))
87+
.isError(true)
88+
.build();
8389
} catch (Exception ex) {
8490
LOG.error("Error executing tool: {}", ex.getMessage());
85-
return new McpSchema.CallToolResult(
86-
List.of(
87-
new McpSchema.TextContent(
88-
JsonUtils.pojoToJson(
89-
Map.of(
90-
"error",
91-
String.format("Error executing tool: %s", ex.getMessage()),
92-
"statusCode",
93-
500)))),
94-
true);
91+
return McpSchema.CallToolResult.builder()
92+
.content(
93+
List.of(
94+
new McpSchema.TextContent(
95+
JsonUtils.pojoToJson(
96+
Map.of(
97+
"error",
98+
String.format("Error executing tool: %s", ex.getMessage()),
99+
"statusCode",
100+
500)))))
101+
.isError(true)
102+
.build();
95103
}
96104
}
97105
}

openmetadata-mcp/src/test/java/org/openmetadata/mcp/McpTestUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public static Map<String, Object> createJsonRpcNotification(
4848
*/
4949
public static Map<String, Object> createInitializeRequest() {
5050
Map<String, Object> params = new HashMap<>();
51-
params.put("protocolVersion", "2024-11-05");
51+
params.put("protocolVersion", "2025-06-18");
5252
params.put(
5353
"capabilities",
5454
Map.of(

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@
149149
<json-patch.version>1.13</json-patch.version>
150150
<jetty.version>11.0.25</jetty.version>
151151
<jakarta-el.version>5.0.0-M1</jakarta-el.version>
152-
<mcp-sdk.version>0.11.2</mcp-sdk.version>
152+
<mcp-sdk.version>0.14.0</mcp-sdk.version>
153153
<lettuce.version>6.7.1.RELEASE</lettuce.version>
154154
<flyway.version>9.22.3</flyway.version>
155155
<angus-mail.version>2.0.4</angus-mail.version>

0 commit comments

Comments
 (0)