Skip to content

Commit e8bd7e8

Browse files
bilaloumehdiKehrlann
authored andcommitted
fix: Remove JsonSchema and use a Map for inputSchema to support json schemas dialect (modelcontextprotocol#749)
* feat: remove JsonSchema an use a Map for inputSchema - Fixes modelcontextprotocol#886 Co-authored-by: Daniel Garnier-Moiroux <git@garnier.wf>
1 parent 1ee1628 commit e8bd7e8

File tree

13 files changed

+72
-45
lines changed

13 files changed

+72
-45
lines changed

conformance-tests/server-servlet/src/main/java/io/modelcontextprotocol/conformance/server/ConformanceServlet.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import io.modelcontextprotocol.spec.McpSchema.EmbeddedResource;
2121
import io.modelcontextprotocol.spec.McpSchema.GetPromptResult;
2222
import io.modelcontextprotocol.spec.McpSchema.ImageContent;
23-
import io.modelcontextprotocol.spec.McpSchema.JsonSchema;
2423
import io.modelcontextprotocol.spec.McpSchema.LoggingLevel;
2524
import io.modelcontextprotocol.spec.McpSchema.LoggingMessageNotification;
2625
import io.modelcontextprotocol.spec.McpSchema.ProgressNotification;
@@ -51,8 +50,8 @@ public class ConformanceServlet {
5150

5251
private static final String MCP_ENDPOINT = "/mcp";
5352

54-
private static final JsonSchema EMPTY_JSON_SCHEMA = new JsonSchema("object", Collections.emptyMap(), null, null,
55-
null, null);
53+
private static final Map<String, Object> EMPTY_JSON_SCHEMA = Map.of("type", "object", "properties",
54+
Collections.emptyMap());
5655

5756
// Minimal 1x1 red pixel PNG (base64 encoded)
5857
private static final String RED_PIXEL_PNG = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg==";
@@ -326,10 +325,10 @@ private static List<McpServerFeatures.SyncToolSpecification> createToolSpecs() {
326325
.tool(Tool.builder()
327326
.name("test_sampling")
328327
.description("Tool that requests LLM sampling from client")
329-
.inputSchema(new JsonSchema("object",
328+
.inputSchema(Map.of("type", "object", "properties",
330329
Map.of("prompt",
331330
Map.of("type", "string", "description", "The prompt to send to the LLM")),
332-
List.of("prompt"), null, null, null))
331+
"required", List.of("prompt")))
333332
.build())
334333
.callHandler((exchange, request) -> {
335334
logger.info("Tool 'test_sampling' called");
@@ -355,10 +354,10 @@ private static List<McpServerFeatures.SyncToolSpecification> createToolSpecs() {
355354
.tool(Tool.builder()
356355
.name("test_elicitation")
357356
.description("Tool that requests user input from client")
358-
.inputSchema(new JsonSchema("object",
357+
.inputSchema(Map.of("type", "object", "properties",
359358
Map.of("message",
360359
Map.of("type", "string", "description", "The message to show the user")),
361-
List.of("message"), null, null, null))
360+
"required", List.of("message")))
362361
.build())
363362
.callHandler((exchange, request) -> {
364363
logger.info("Tool 'test_elicitation' called");

mcp-core/src/main/java/io/modelcontextprotocol/spec/McpSchema.java

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1307,7 +1307,9 @@ public ListToolsResult(List<Tool> tools, String nextCursor) {
13071307
* @param additionalProperties Whether additional properties are allowed
13081308
* @param defs Schema definitions using the newer $defs keyword
13091309
* @param definitions Schema definitions using the legacy definitions keyword
1310+
* @deprecated use {@link Map} instead.
13101311
*/
1312+
@Deprecated
13111313
@JsonInclude(JsonInclude.Include.NON_ABSENT)
13121314
@JsonIgnoreProperties(ignoreUnknown = true)
13131315
public record JsonSchema( // @formatter:off
@@ -1363,7 +1365,7 @@ public record Tool( // @formatter:off
13631365
@JsonProperty("name") String name,
13641366
@JsonProperty("title") String title,
13651367
@JsonProperty("description") String description,
1366-
@JsonProperty("inputSchema") JsonSchema inputSchema,
1368+
@JsonProperty("inputSchema") Map<String, Object> inputSchema,
13671369
@JsonProperty("outputSchema") Map<String, Object> outputSchema,
13681370
@JsonProperty("annotations") ToolAnnotations annotations,
13691371
@JsonProperty("_meta") Map<String, Object> meta) { // @formatter:on
@@ -1380,7 +1382,7 @@ public static class Builder {
13801382

13811383
private String description;
13821384

1383-
private JsonSchema inputSchema;
1385+
private Map<String, Object> inputSchema;
13841386

13851387
private Map<String, Object> outputSchema;
13861388

@@ -1403,13 +1405,34 @@ public Builder description(String description) {
14031405
return this;
14041406
}
14051407

1408+
/**
1409+
* @deprecated use {@link #inputSchema(Map)} instead.
1410+
*/
1411+
@Deprecated
14061412
public Builder inputSchema(JsonSchema inputSchema) {
1413+
Map<String, Object> schema = new HashMap<>();
1414+
if (inputSchema.type() != null)
1415+
schema.put("type", inputSchema.type());
1416+
if (inputSchema.properties() != null)
1417+
schema.put("properties", inputSchema.properties());
1418+
if (inputSchema.required() != null)
1419+
schema.put("required", inputSchema.required());
1420+
if (inputSchema.additionalProperties() != null)
1421+
schema.put("additionalProperties", inputSchema.additionalProperties());
1422+
if (inputSchema.defs() != null)
1423+
schema.put("$defs", inputSchema.defs());
1424+
if (inputSchema.definitions() != null)
1425+
schema.put("definitions", inputSchema.definitions());
1426+
return inputSchema(schema);
1427+
}
1428+
1429+
public Builder inputSchema(Map<String, Object> inputSchema) {
14071430
this.inputSchema = inputSchema;
14081431
return this;
14091432
}
14101433

14111434
public Builder inputSchema(McpJsonMapper jsonMapper, String inputSchema) {
1412-
this.inputSchema = parseSchema(jsonMapper, inputSchema);
1435+
this.inputSchema = schemaToMap(jsonMapper, inputSchema);
14131436
return this;
14141437
}
14151438

@@ -1450,15 +1473,6 @@ private static Map<String, Object> schemaToMap(McpJsonMapper jsonMapper, String
14501473
}
14511474
}
14521475

1453-
private static JsonSchema parseSchema(McpJsonMapper jsonMapper, String schema) {
1454-
try {
1455-
return jsonMapper.readValue(schema, JsonSchema.class);
1456-
}
1457-
catch (IOException e) {
1458-
throw new IllegalArgumentException("Invalid schema: " + schema, e);
1459-
}
1460-
}
1461-
14621476
/**
14631477
* Used by the client to call a tool provided by the server.
14641478
*

mcp-core/src/test/java/io/modelcontextprotocol/server/AsyncToolSpecificationBuilderTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
package io.modelcontextprotocol.server;
66

7+
import static io.modelcontextprotocol.util.ToolsUtils.EMPTY_JSON_SCHEMA;
8+
79
import java.util.List;
810
import java.util.Map;
911

@@ -25,7 +27,6 @@
2527
import reactor.core.publisher.Mono;
2628
import reactor.test.StepVerifier;
2729

28-
import static io.modelcontextprotocol.util.ToolsUtils.EMPTY_JSON_SCHEMA;
2930
import static org.assertj.core.api.Assertions.assertThat;
3031
import static org.assertj.core.api.Assertions.assertThatCode;
3132
import static org.assertj.core.api.Assertions.assertThatThrownBy;

mcp-core/src/test/java/io/modelcontextprotocol/server/SyncToolSpecificationBuilderTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
package io.modelcontextprotocol.server;
66

7+
import static io.modelcontextprotocol.util.ToolsUtils.EMPTY_JSON_SCHEMA;
8+
79
import java.util.List;
810
import java.util.Map;
911

@@ -22,7 +24,6 @@
2224
import org.junit.jupiter.api.Test;
2325
import org.slf4j.LoggerFactory;
2426

25-
import static io.modelcontextprotocol.util.ToolsUtils.EMPTY_JSON_SCHEMA;
2627
import static org.assertj.core.api.Assertions.assertThat;
2728
import static org.assertj.core.api.Assertions.assertThatCode;
2829
import static org.assertj.core.api.Assertions.assertThatThrownBy;
Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package io.modelcontextprotocol.util;
22

3-
import io.modelcontextprotocol.spec.McpSchema;
4-
53
import java.util.Collections;
4+
import java.util.Map;
65

76
public final class ToolsUtils {
87

98
private ToolsUtils() {
109
}
1110

12-
public static final McpSchema.JsonSchema EMPTY_JSON_SCHEMA = new McpSchema.JsonSchema("object",
13-
Collections.emptyMap(), null, null, null, null);
11+
public static final Map<String, Object> EMPTY_JSON_SCHEMA = Map.of("type", "object", "properties",
12+
Collections.emptyMap());
1413

1514
}

mcp-test/src/main/java/io/modelcontextprotocol/AbstractMcpClientServerIntegrationTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
package io.modelcontextprotocol;
66

7+
import static io.modelcontextprotocol.util.ToolsUtils.EMPTY_JSON_SCHEMA;
8+
79
import java.net.URI;
810
import java.net.http.HttpClient;
911
import java.net.http.HttpRequest;
@@ -56,7 +58,6 @@
5658
import org.junit.jupiter.params.provider.ValueSource;
5759
import reactor.core.publisher.Mono;
5860

59-
import static io.modelcontextprotocol.util.ToolsUtils.EMPTY_JSON_SCHEMA;
6061
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
6162
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.json;
6263
import static org.assertj.core.api.Assertions.assertThat;

mcp-test/src/main/java/io/modelcontextprotocol/AbstractStatelessIntegrationTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
package io.modelcontextprotocol;
66

7+
import static io.modelcontextprotocol.util.ToolsUtils.EMPTY_JSON_SCHEMA;
8+
79
import java.net.URI;
810
import java.net.http.HttpClient;
911
import java.net.http.HttpRequest;
@@ -32,7 +34,6 @@
3234
import org.junit.jupiter.params.provider.ValueSource;
3335
import reactor.core.publisher.Mono;
3436

35-
import static io.modelcontextprotocol.util.ToolsUtils.EMPTY_JSON_SCHEMA;
3637
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
3738
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.json;
3839
import static org.assertj.core.api.Assertions.assertThat;

mcp-test/src/main/java/io/modelcontextprotocol/server/AbstractMcpAsyncServerTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44

55
package io.modelcontextprotocol.server;
66

7+
import static io.modelcontextprotocol.util.ToolsUtils.EMPTY_JSON_SCHEMA;
8+
79
import java.time.Duration;
810
import java.util.List;
11+
import java.util.Map;
912

1013
import io.modelcontextprotocol.spec.McpSchema;
1114
import io.modelcontextprotocol.spec.McpSchema.CallToolResult;
@@ -25,7 +28,6 @@
2528
import reactor.core.publisher.Mono;
2629
import reactor.test.StepVerifier;
2730

28-
import static io.modelcontextprotocol.util.ToolsUtils.EMPTY_JSON_SCHEMA;
2931
import static org.assertj.core.api.Assertions.assertThat;
3032
import static org.assertj.core.api.Assertions.assertThatCode;
3133
import static org.assertj.core.api.Assertions.assertThatThrownBy;

mcp-test/src/main/java/io/modelcontextprotocol/server/AbstractMcpSyncServerTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44

55
package io.modelcontextprotocol.server;
66

7+
import static io.modelcontextprotocol.util.ToolsUtils.EMPTY_JSON_SCHEMA;
8+
79
import java.util.List;
10+
import java.util.Map;
811

912
import io.modelcontextprotocol.spec.McpSchema;
1013
import io.modelcontextprotocol.spec.McpSchema.CallToolResult;
@@ -20,7 +23,6 @@
2023
import org.junit.jupiter.api.BeforeEach;
2124
import org.junit.jupiter.api.Test;
2225

23-
import static io.modelcontextprotocol.util.ToolsUtils.EMPTY_JSON_SCHEMA;
2426
import static org.assertj.core.api.Assertions.assertThat;
2527
import static org.assertj.core.api.Assertions.assertThatCode;
2628
import static org.assertj.core.api.Assertions.assertThatThrownBy;
Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package io.modelcontextprotocol.util;
22

3-
import io.modelcontextprotocol.spec.McpSchema;
4-
53
import java.util.Collections;
4+
import java.util.Map;
65

76
public final class ToolsUtils {
87

98
private ToolsUtils() {
109
}
1110

12-
public static final McpSchema.JsonSchema EMPTY_JSON_SCHEMA = new McpSchema.JsonSchema("object",
13-
Collections.emptyMap(), null, null, null, null);
11+
public static final Map<String, Object> EMPTY_JSON_SCHEMA = Map.of("type", "object", "properties",
12+
Collections.emptyMap());
1413

1514
}

0 commit comments

Comments
 (0)