11package io.modelcontextprotocol.kotlin.sdk
22
3- import io.kotest.assertions.json.shouldEqualJson
43import io.modelcontextprotocol.kotlin.sdk.shared.McpJson
54import kotlinx.serialization.json.Json
5+ import kotlinx.serialization.json.JsonArray
66import kotlinx.serialization.json.JsonPrimitive
77import kotlinx.serialization.json.buildJsonObject
8+ import kotlinx.serialization.json.decodeFromJsonElement
9+ import kotlinx.serialization.json.encodeToJsonElement
810import kotlin.test.Test
911import kotlin.test.assertEquals
1012
1113class ToolSerializationTest {
1214
1315 // see https://docs.anthropic.com/en/docs/build-with-claude/tool-use
14- /* language=json */
15- private val getWeatherToolJson = """
16- {
17- "name": "get_weather",
18- "description": "Get the current weather in a given location",
19- "inputSchema": {
20- "type": "object",
21- "properties": {
22- "location": {
23- "type": "string",
24- "description": "The city and state, e.g. San Francisco, CA"
25- }
26- },
27- "required": ["location"]
28- },
29- "outputSchema": {
30- "type": "object",
31- "properties": {
32- "temperature": {
33- "type": "number",
34- "description": "Temperature in celsius"
35- },
36- "conditions": {
37- "type": "string",
38- "description": "Weather conditions description"
39- },
40- "humidity": {
41- "type": "number",
42- "description": "Humidity percentage"
43- }
44- } ,
45- "required": [ "temperature", "conditions", "humidity"]
46- }
47- }
48- """ .trimIndent()
16+ private val getWeatherToolJson = buildJsonObject {
17+ put( " name " , JsonPrimitive ( " get_weather " ))
18+ put( " description " , JsonPrimitive ( " Get the current weather in a given location " ))
19+ put( " inputSchema " , buildJsonObject {
20+ put( " properties " , buildJsonObject {
21+ put( " location " , buildJsonObject {
22+ put( " type" , JsonPrimitive ( " string " ))
23+ put( " description " , JsonPrimitive ( " The city and state, e.g. San Francisco, CA " ))
24+ })
25+ })
26+ put( " required " , JsonArray ( listOf ( JsonPrimitive ( " location " ))))
27+ put( " type " , JsonPrimitive ( " object " ))
28+ })
29+ put( " outputSchema " , buildJsonObject {
30+ put( " type " , JsonPrimitive ( " object " ))
31+ put( " properties " , buildJsonObject {
32+ put( " temperature " , buildJsonObject {
33+ put( " type " , JsonPrimitive ( " number " ))
34+ put( " description " , JsonPrimitive ( " Temperature in celsius " ))
35+ })
36+ put( " conditions " , buildJsonObject {
37+ put( " type " , JsonPrimitive ( " string " ))
38+ put( " description " , JsonPrimitive ( " Weather conditions description " ))
39+ })
40+ put( " humidity " , buildJsonObject {
41+ put( " type " , JsonPrimitive ( " number " ))
42+ put( " description " , JsonPrimitive ( " Humidity percentage " ))
43+ })
44+ })
45+ put(
46+ " required " ,
47+ JsonArray ( listOf ( JsonPrimitive ( " temperature" ), JsonPrimitive ( " conditions" ), JsonPrimitive ( " humidity" )))
48+ )
49+ })
50+ }
4951
5052 val getWeatherTool = Tool (
5153 name = " get_weather" ,
@@ -81,12 +83,18 @@ class ToolSerializationTest {
8183
8284 @Test
8385 fun `should serialize get_weather tool` () {
84- McpJson .encodeToString(getWeatherTool) shouldEqualJson getWeatherToolJson
86+ val actual = McpJson .encodeToJsonElement(getWeatherTool)
87+
88+ assertEquals(
89+ getWeatherToolJson,
90+ actual,
91+ " Expected $actual to be equal to $getWeatherToolJson "
92+ )
8593 }
8694
8795 @Test
8896 fun `should deserialize get_weather tool` () {
89- val tool = McpJson .decodeFromString <Tool >(getWeatherToolJson)
97+ val tool = McpJson .decodeFromJsonElement <Tool >(getWeatherToolJson)
9098 assertEquals(expected = getWeatherTool, actual = tool)
9199 }
92100
@@ -95,6 +103,11 @@ class ToolSerializationTest {
95103 val json = Json (from = McpJson ) {
96104 encodeDefaults = false
97105 }
98- json.encodeToString(getWeatherTool) shouldEqualJson getWeatherToolJson
106+ val actual = json.encodeToJsonElement(getWeatherTool)
107+ assertEquals(
108+ getWeatherToolJson,
109+ actual,
110+ " Expected $actual to be equal to $getWeatherToolJson "
111+ )
99112 }
100113}
0 commit comments