Skip to content

Commit d17cb20

Browse files
Vishnuujainpmbrull
authored andcommitted
Fix: Upgrade MCP SDK to 1.1.0 (#26489)
* Fix: Upgrade MCP SDK to 1.1.0 to resolve elicitation deserialization crash * Fix Jackson 2/3 conflict and duplicate MCP servlet registration --------- Co-authored-by: Pere Miquel Brull <peremiquelbrull@gmail.com> (cherry picked from commit 6c001cb)
1 parent 644c208 commit d17cb20

7 files changed

Lines changed: 55 additions & 18 deletions

File tree

openmetadata-mcp/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
<dependencies>
6060
<dependency>
6161
<groupId>io.modelcontextprotocol.sdk</groupId>
62-
<artifactId>mcp</artifactId>
62+
<artifactId>mcp-core</artifactId>
6363
</dependency>
6464
<dependency>
6565
<groupId>io.modelcontextprotocol.sdk</groupId>

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

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

33
import io.dropwizard.core.setup.Environment;
44
import io.dropwizard.jetty.MutableServletContextHandler;
5-
import io.modelcontextprotocol.json.jackson.JacksonMcpJsonMapper;
5+
import io.modelcontextprotocol.json.jackson2.JacksonMcpJsonMapper;
66
import io.modelcontextprotocol.server.McpStatelessServerFeatures;
77
import io.modelcontextprotocol.server.McpStatelessSyncServer;
88
import io.modelcontextprotocol.server.transport.HttpServletStatelessServerTransport;
@@ -95,7 +95,7 @@ private void addStatelessTransport(
9595

9696
McpStatelessSyncServer server =
9797
io.modelcontextprotocol.server.McpServer.sync(statelessTransport)
98-
.serverInfo("openmetadata-mcp-stateless", "0.17.1")
98+
.serverInfo("openmetadata-mcp-stateless", "1.1.0")
9999
.capabilities(serverCapabilities)
100100
.build();
101101
addToolsToServer(server, tools);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.fasterxml.jackson.databind.JsonNode;
44
import io.modelcontextprotocol.json.McpJsonMapper;
5-
import io.modelcontextprotocol.json.jackson.JacksonMcpJsonMapper;
5+
import io.modelcontextprotocol.json.jackson2.JacksonMcpJsonMapper;
66
import io.modelcontextprotocol.spec.McpSchema;
77
import jakarta.servlet.http.HttpServletRequest;
88
import java.io.BufferedReader;

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

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import static org.mockito.Mockito.when;
66

77
import io.modelcontextprotocol.common.McpTransportContext;
8-
import io.modelcontextprotocol.json.jackson.JacksonMcpJsonMapper;
8+
import io.modelcontextprotocol.json.jackson2.JacksonMcpJsonMapper;
99
import io.modelcontextprotocol.spec.McpSchema;
1010
import jakarta.servlet.http.HttpServletRequest;
1111
import java.util.List;
@@ -14,8 +14,8 @@
1414
import org.openmetadata.schema.utils.JsonUtils;
1515

1616
/**
17-
* Tests to verify the MCP SDK 0.17.0 upgrade works correctly. These tests validate the API changes
18-
* made during the upgrade from 0.11.2 to 0.17.0.
17+
* Tests to verify the MCP SDK 1.1.0 upgrade works correctly. These tests validate the API changes
18+
* made during the upgrade from 0.17.1 to 1.1.0.
1919
*/
2020
public class McpSdkUpgradeTest {
2121

@@ -189,6 +189,41 @@ void testServerCapabilitiesDoNotAdvertiseLogging() {
189189
assertThat(capabilities.logging()).isNull();
190190
}
191191

192+
@Test
193+
void testElicitationCapabilitiesDeserialization() throws Exception {
194+
// Regression test for https://github.com/open-metadata/OpenMetadata/issues/26454
195+
// MCP clients implementing the 2025-11-25 spec send elicitation with form/url fields.
196+
// SDK <= 0.17.1 threw UnrecognizedPropertyException crashing the handshake.
197+
JacksonMcpJsonMapper jsonMapper = new JacksonMcpJsonMapper(JsonUtils.getObjectMapper());
198+
199+
String initRequest =
200+
"""
201+
{
202+
"jsonrpc": "2.0",
203+
"id": 0,
204+
"method": "initialize",
205+
"params": {
206+
"protocolVersion": "2025-11-25",
207+
"capabilities": {
208+
"roots": {},
209+
"elicitation": {
210+
"form": {},
211+
"url": {}
212+
}
213+
},
214+
"clientInfo": {"name": "claude-code", "version": "2.1.74"}
215+
}
216+
}
217+
""";
218+
219+
McpSchema.JSONRPCMessage message = McpSchema.deserializeJsonRpcMessage(jsonMapper, initRequest);
220+
221+
assertThat(message).isNotNull();
222+
assertThat(message).isInstanceOf(McpSchema.JSONRPCRequest.class);
223+
McpSchema.JSONRPCRequest request = (McpSchema.JSONRPCRequest) message;
224+
assertThat(request.method()).isEqualTo("initialize");
225+
}
226+
192227
@Test
193228
void testMcpUtilsGetPromptsLoadsPrompts() {
194229
// Test that McpUtils.getPrompts loads prompts from JSON file

openmetadata-service/pom.xml

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -769,15 +769,6 @@
769769
<artifactId>engine.io-server</artifactId>
770770
<version>6.2.1</version>
771771
</dependency>
772-
<dependency>
773-
<groupId>io.modelcontextprotocol.sdk</groupId>
774-
<artifactId>mcp-bom</artifactId>
775-
<type>pom</type>
776-
</dependency>
777-
<dependency>
778-
<groupId>io.modelcontextprotocol.sdk</groupId>
779-
<artifactId>mcp</artifactId>
780-
</dependency>
781772
<!-- Jetty EE10 WebSocket dependencies for Jetty 12 / Dropwizard 5.0 -->
782773
<dependency>
783774
<groupId>org.eclipse.jetty.ee10.websocket</groupId>

openmetadata-service/src/main/java/org/openmetadata/service/OpenMetadataApplication.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ public class OpenMetadataApplication extends Application<OpenMetadataApplication
203203
protected Authorizer authorizer;
204204
private AuthenticatorHandler authenticatorHandler;
205205
protected Limits limits;
206+
private volatile boolean mcpServerRegistered = false;
206207

207208
protected Jdbi jdbi;
208209
private Environment environment;
@@ -401,12 +402,17 @@ public void run(OpenMetadataApplicationConfig catalogConfig, Environment environ
401402

402403
protected void registerMCPServer(
403404
OpenMetadataApplicationConfig catalogConfig, Environment environment) {
405+
if (mcpServerRegistered) {
406+
LOG.info("MCP Server already registered, skipping");
407+
return;
408+
}
404409
try {
405410
if (ApplicationContext.getInstance().getAppIfExists("McpApplication") != null) {
406411
Class<?> mcpServerClass = Class.forName("org.openmetadata.mcp.McpServer");
407412
McpServerProvider mcpServer =
408413
(McpServerProvider) mcpServerClass.getDeclaredConstructor().newInstance();
409414
mcpServer.initializeMcpServer(environment, authorizer, limits, catalogConfig);
415+
mcpServerRegistered = true;
410416
LOG.info("MCP Server registered successfully");
411417
}
412418
} catch (ClassNotFoundException ex) {

pom.xml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@
151151
<json-patch.version>1.13</json-patch.version>
152152
<jetty.version>12.1.6</jetty.version>
153153
<jakarta-el.version>5.0.0-M1</jakarta-el.version>
154-
<mcp-sdk.version>0.17.1</mcp-sdk.version>
154+
<mcp-sdk.version>1.1.0</mcp-sdk.version>
155155
<lettuce.version>6.7.1.RELEASE</lettuce.version>
156156
<flyway.version>9.22.3</flyway.version>
157157
<angus-mail.version>2.0.4</angus-mail.version>
@@ -247,7 +247,12 @@
247247
</dependency>
248248
<dependency>
249249
<groupId>io.modelcontextprotocol.sdk</groupId>
250-
<artifactId>mcp</artifactId>
250+
<artifactId>mcp-core</artifactId>
251+
<version>${mcp-sdk.version}</version>
252+
</dependency>
253+
<dependency>
254+
<groupId>io.modelcontextprotocol.sdk</groupId>
255+
<artifactId>mcp-json-jackson2</artifactId>
251256
<version>${mcp-sdk.version}</version>
252257
</dependency>
253258
<dependency>

0 commit comments

Comments
 (0)