1
1
package io.modelcontextprotocol.kotlin.sdk
2
2
3
- import io.kotest.assertions.json.shouldEqualJson
4
3
import io.modelcontextprotocol.kotlin.sdk.shared.McpJson
5
4
import kotlinx.serialization.json.Json
5
+ import kotlinx.serialization.json.JsonArray
6
6
import kotlinx.serialization.json.JsonPrimitive
7
7
import kotlinx.serialization.json.buildJsonObject
8
+ import kotlinx.serialization.json.decodeFromJsonElement
9
+ import kotlinx.serialization.json.encodeToJsonElement
8
10
import kotlin.test.Test
9
11
import kotlin.test.assertEquals
10
12
11
13
class ToolSerializationTest {
12
14
13
15
// 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
+ }
49
51
50
52
val getWeatherTool = Tool (
51
53
name = " get_weather" ,
@@ -81,12 +83,18 @@ class ToolSerializationTest {
81
83
82
84
@Test
83
85
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
+ )
85
93
}
86
94
87
95
@Test
88
96
fun `should deserialize get_weather tool` () {
89
- val tool = McpJson .decodeFromString <Tool >(getWeatherToolJson)
97
+ val tool = McpJson .decodeFromJsonElement <Tool >(getWeatherToolJson)
90
98
assertEquals(expected = getWeatherTool, actual = tool)
91
99
}
92
100
@@ -95,6 +103,11 @@ class ToolSerializationTest {
95
103
val json = Json (from = McpJson ) {
96
104
encodeDefaults = false
97
105
}
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
+ )
99
112
}
100
113
}
0 commit comments