diff --git a/api/kotlin-sdk.api b/api/kotlin-sdk.api index 4154809..411bb3d 100644 --- a/api/kotlin-sdk.api +++ b/api/kotlin-sdk.api @@ -2492,6 +2492,13 @@ public final class io/modelcontextprotocol/kotlin/sdk/TypesKt { public static final fun getSUPPORTED_PROTOCOL_VERSIONS ()[Ljava/lang/String; } +public final class io/modelcontextprotocol/kotlin/sdk/Types_utilKt { + public static final fun error (Lio/modelcontextprotocol/kotlin/sdk/CallToolResult$Companion;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/CallToolResult; + public static synthetic fun error$default (Lio/modelcontextprotocol/kotlin/sdk/CallToolResult$Companion;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/CallToolResult; + public static final fun ok (Lio/modelcontextprotocol/kotlin/sdk/CallToolResult$Companion;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/CallToolResult; + public static synthetic fun ok$default (Lio/modelcontextprotocol/kotlin/sdk/CallToolResult$Companion;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/CallToolResult; +} + public final class io/modelcontextprotocol/kotlin/sdk/UnknownContent : io/modelcontextprotocol/kotlin/sdk/PromptMessageContentTextOrImage { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/UnknownContent$Companion; public fun (Ljava/lang/String;)V diff --git a/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.util.kt b/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.util.kt index cb7b100..e93abde 100644 --- a/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.util.kt +++ b/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.util.kt @@ -294,4 +294,24 @@ public class RequestIdSerializer : KSerializer { is RequestId.NumberId -> jsonEncoder.encodeLong(value.value) } } -} \ No newline at end of file +} + +/** + * Creates a [CallToolResult] with single [TextContent] and [meta]. + */ +public fun CallToolResult.Companion.ok(content: String, meta: JsonObject = EmptyJsonObject): CallToolResult = + CallToolResult( + content = listOf(TextContent(content)), + isError = false, + _meta = meta + ) + +/** + * Creates a [CallToolResult] with single [TextContent] and [meta], with `isError` being true. + */ +public fun CallToolResult.Companion.error(content: String, meta: JsonObject = EmptyJsonObject): CallToolResult = + CallToolResult( + content = listOf(TextContent(content)), + isError = true, + _meta = meta + ) \ No newline at end of file diff --git a/src/commonTest/kotlin/CallToolResultUtilsTest.kt b/src/commonTest/kotlin/CallToolResultUtilsTest.kt new file mode 100644 index 0000000..4d5ad2d --- /dev/null +++ b/src/commonTest/kotlin/CallToolResultUtilsTest.kt @@ -0,0 +1,64 @@ +package io.modelcontextprotocol.kotlin.sdk + +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.buildJsonObject +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +class CallToolResultUtilsTest { + + @Test + fun testOkWithOnlyText() { + val content = "TextMessage" + val result = CallToolResult.Companion.ok(content) + + assertEquals(1, result.content.size) + assertEquals(content, (result.content[0] as TextContent).text) + assertFalse(result.isError == true) + assertEquals(EmptyJsonObject, result._meta) + } + + @Test + fun testOkWithMeta() { + val content = "TextMessageWithMeta" + val meta = buildJsonObject { + put("key1", JsonPrimitive("value1")) + put("key2", JsonPrimitive(42)) + } + val result = CallToolResult.Companion.ok(content, meta) + + assertEquals(1, result.content.size) + assertEquals(content, (result.content[0] as TextContent).text) + assertFalse(result.isError == true) + assertEquals(meta, result._meta) + } + + @Test + fun testErrorWithOnlyText() { + val content = "ErrorMessage" + val result = CallToolResult.Companion.error(content) + + assertEquals(1, result.content.size) + assertEquals(content, (result.content[0] as TextContent).text) + assertTrue(result.isError == true) + assertEquals(EmptyJsonObject, result._meta) + } + + @Test + fun testErrorWithMeta() { + val content = "ErrorMessageWithMeta" + val meta = buildJsonObject { + put("errorCode", JsonPrimitive(404)) + put("errorDetail", JsonPrimitive("资源未找到")) + } + val result = CallToolResult.Companion.error(content, meta) + + assertEquals(1, result.content.size) + assertEquals(content, (result.content[0] as TextContent).text) + assertTrue(result.isError == true) + assertEquals(meta, result._meta) + } +} +