From 2a3675fe0db5e8ada84f896d5bb63d088908e9da Mon Sep 17 00:00:00 2001 From: devcrocod Date: Thu, 17 Jul 2025 10:32:15 +0200 Subject: [PATCH] Revert "FEAT: Support all Tier 1, 2 and 3 targets by Kotlin & remove dependency on Kotest Json due to not supporting all targets (#151)" This reverts commit 21aec46cd0545d6087a16f176a5254094d8d1005. --- build.gradle.kts | 30 +----- .../kotlin/AudioContentSerializationTest.kt | 27 +++--- .../kotlin/sdk/ToolSerializationTest.kt | 91 ++++++++----------- .../kotlin/sdk/shared/ReadBufferTest.kt | 1 + .../kotlin/sdk/internal/utils.ios.kt} | 0 5 files changed, 56 insertions(+), 93 deletions(-) rename src/{nativeMain/kotlin/io/modelcontextprotocol/kotlin/sdk/internal/utils.native.kt => iosMain/kotlin/io/modelcontextprotocol/kotlin/sdk/internal/utils.ios.kt} (100%) diff --git a/build.gradle.kts b/build.gradle.kts index e3563cc2..6a997a70 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -220,6 +220,10 @@ kotlin { } } + iosArm64() + iosX64() + iosSimulatorArm64() + js(IR) { nodejs { testTask { @@ -234,31 +238,6 @@ kotlin { nodejs() } - // Tier 1 - macosX64() - macosArm64() - iosArm64() - iosX64() - iosSimulatorArm64() - - // Tier 2 - linuxX64() - linuxArm64() - watchosSimulatorArm64() - watchosX64() -// watchosArm32() not supported by libs.kotlin.logging - watchosArm64() - tvosSimulatorArm64() - tvosX64() - tvosArm64() - - // Tier 3 - androidNativeArm32() - androidNativeArm64() - androidNativeX86() - androidNativeX64() - mingwX64() - explicitApi = ExplicitApiMode.Strict jvmToolchain(21) @@ -283,6 +262,7 @@ kotlin { implementation(libs.kotlin.test) implementation(libs.ktor.server.test.host) implementation(libs.kotlinx.coroutines.test) + implementation(libs.kotest.assertions.json) } } diff --git a/src/commonTest/kotlin/AudioContentSerializationTest.kt b/src/commonTest/kotlin/AudioContentSerializationTest.kt index 8e89887e..6745972c 100644 --- a/src/commonTest/kotlin/AudioContentSerializationTest.kt +++ b/src/commonTest/kotlin/AudioContentSerializationTest.kt @@ -1,20 +1,20 @@ package io.modelcontextprotocol.kotlin.sdk +import io.kotest.assertions.json.shouldEqualJson import io.modelcontextprotocol.kotlin.sdk.shared.McpJson -import kotlinx.serialization.json.buildJsonObject -import kotlinx.serialization.json.decodeFromJsonElement -import kotlinx.serialization.json.encodeToJsonElement -import kotlinx.serialization.json.put +import kotlinx.serialization.encodeToString import kotlin.test.Test import kotlin.test.assertEquals class AudioContentSerializationTest { - private val audioContentJson = buildJsonObject { - put("data", "base64-encoded-audio-data") - put("mimeType", "audio/wav") - put("type", "audio") - } + private val audioContentJson = """ + { + "data": "base64-encoded-audio-data", + "mimeType": "audio/wav", + "type": "audio" + } + """.trimIndent() private val audioContent = AudioContent( data = "base64-encoded-audio-data", @@ -23,17 +23,12 @@ class AudioContentSerializationTest { @Test fun `should serialize audio content`() { - val actual = McpJson.encodeToJsonElement(audioContent) - assertEquals( - audioContentJson, - actual, - "Expected $actual to be equal to $audioContentJson" - ) + McpJson.encodeToString(audioContent) shouldEqualJson audioContentJson } @Test fun `should deserialize audio content`() { - val content = McpJson.decodeFromJsonElement(audioContentJson) + val content = McpJson.decodeFromString(audioContentJson) assertEquals(expected = audioContent, actual = content) } } \ No newline at end of file diff --git a/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/ToolSerializationTest.kt b/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/ToolSerializationTest.kt index 70a0cd66..6e2ac447 100644 --- a/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/ToolSerializationTest.kt +++ b/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/ToolSerializationTest.kt @@ -1,53 +1,51 @@ package io.modelcontextprotocol.kotlin.sdk +import io.kotest.assertions.json.shouldEqualJson import io.modelcontextprotocol.kotlin.sdk.shared.McpJson import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.buildJsonObject -import kotlinx.serialization.json.decodeFromJsonElement -import kotlinx.serialization.json.encodeToJsonElement import kotlin.test.Test import kotlin.test.assertEquals class ToolSerializationTest { // see https://docs.anthropic.com/en/docs/build-with-claude/tool-use - private val getWeatherToolJson = buildJsonObject { - put("name", JsonPrimitive("get_weather")) - put("description", JsonPrimitive("Get the current weather in a given location")) - put("inputSchema", buildJsonObject { - put("properties", buildJsonObject { - put("location", buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("The city and state, e.g. San Francisco, CA")) - }) - }) - put("required", JsonArray(listOf(JsonPrimitive("location")))) - put("type", JsonPrimitive("object")) - }) - put("outputSchema", buildJsonObject { - put("type", JsonPrimitive("object")) - put("properties", buildJsonObject { - put("temperature", buildJsonObject { - put("type", JsonPrimitive("number")) - put("description", JsonPrimitive("Temperature in celsius")) - }) - put("conditions", buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("Weather conditions description")) - }) - put("humidity", buildJsonObject { - put("type", JsonPrimitive("number")) - put("description", JsonPrimitive("Humidity percentage")) - }) - }) - put( - "required", - JsonArray(listOf(JsonPrimitive("temperature"), JsonPrimitive("conditions"), JsonPrimitive("humidity"))) - ) - }) - } + /* language=json */ + private val getWeatherToolJson = """ + { + "name": "get_weather", + "description": "Get the current weather in a given location", + "inputSchema": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA" + } + }, + "required": ["location"] + }, + "outputSchema": { + "type": "object", + "properties": { + "temperature": { + "type": "number", + "description": "Temperature in celsius" + }, + "conditions": { + "type": "string", + "description": "Weather conditions description" + }, + "humidity": { + "type": "number", + "description": "Humidity percentage" + } + }, + "required": ["temperature", "conditions", "humidity"] + } + } + """.trimIndent() val getWeatherTool = Tool( name = "get_weather", @@ -83,18 +81,12 @@ class ToolSerializationTest { @Test fun `should serialize get_weather tool`() { - val actual = McpJson.encodeToJsonElement(getWeatherTool) - - assertEquals( - getWeatherToolJson, - actual, - "Expected $actual to be equal to $getWeatherToolJson" - ) + McpJson.encodeToString(getWeatherTool) shouldEqualJson getWeatherToolJson } @Test fun `should deserialize get_weather tool`() { - val tool = McpJson.decodeFromJsonElement(getWeatherToolJson) + val tool = McpJson.decodeFromString(getWeatherToolJson) assertEquals(expected = getWeatherTool, actual = tool) } @@ -103,11 +95,6 @@ class ToolSerializationTest { val json = Json(from = McpJson) { encodeDefaults = false } - val actual = json.encodeToJsonElement(getWeatherTool) - assertEquals( - getWeatherToolJson, - actual, - "Expected $actual to be equal to $getWeatherToolJson" - ) + json.encodeToString(getWeatherTool) shouldEqualJson getWeatherToolJson } } diff --git a/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/ReadBufferTest.kt b/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/ReadBufferTest.kt index 8e6f4f65..6890aef6 100644 --- a/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/ReadBufferTest.kt +++ b/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/ReadBufferTest.kt @@ -4,6 +4,7 @@ import io.ktor.utils.io.charsets.Charsets import io.ktor.utils.io.core.toByteArray import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage import io.modelcontextprotocol.kotlin.sdk.JSONRPCNotification +import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import kotlin.test.Test import kotlin.test.assertEquals diff --git a/src/nativeMain/kotlin/io/modelcontextprotocol/kotlin/sdk/internal/utils.native.kt b/src/iosMain/kotlin/io/modelcontextprotocol/kotlin/sdk/internal/utils.ios.kt similarity index 100% rename from src/nativeMain/kotlin/io/modelcontextprotocol/kotlin/sdk/internal/utils.native.kt rename to src/iosMain/kotlin/io/modelcontextprotocol/kotlin/sdk/internal/utils.ios.kt