11package io.modelcontextprotocol.kotlin.sdk
22
3+ import io.kotest.assertions.json.shouldEqualJson
34import io.modelcontextprotocol.kotlin.sdk.shared.McpJson
45import 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
108import kotlin.test.Test
119import kotlin.test.assertEquals
1210
1311class ToolSerializationTest {
1412
1513 // see https://docs.anthropic.com/en/docs/build-with-claude/tool-use
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- }
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()
5149
5250 val getWeatherTool = Tool (
5351 name = " get_weather" ,
@@ -83,18 +81,12 @@ class ToolSerializationTest {
8381
8482 @Test
8583 fun `should serialize get_weather tool` () {
86- val actual = McpJson .encodeToJsonElement(getWeatherTool)
87-
88- assertEquals(
89- getWeatherToolJson,
90- actual,
91- " Expected $actual to be equal to $getWeatherToolJson "
92- )
84+ McpJson .encodeToString(getWeatherTool) shouldEqualJson getWeatherToolJson
9385 }
9486
9587 @Test
9688 fun `should deserialize get_weather tool` () {
97- val tool = McpJson .decodeFromJsonElement <Tool >(getWeatherToolJson)
89+ val tool = McpJson .decodeFromString <Tool >(getWeatherToolJson)
9890 assertEquals(expected = getWeatherTool, actual = tool)
9991 }
10092
@@ -103,11 +95,6 @@ class ToolSerializationTest {
10395 val json = Json (from = McpJson ) {
10496 encodeDefaults = false
10597 }
106- val actual = json.encodeToJsonElement(getWeatherTool)
107- assertEquals(
108- getWeatherToolJson,
109- actual,
110- " Expected $actual to be equal to $getWeatherToolJson "
111- )
98+ json.encodeToString(getWeatherTool) shouldEqualJson getWeatherToolJson
11299 }
113100}
0 commit comments