diff --git a/conformance-test/run-conformance.sh b/conformance-test/run-conformance.sh index 8f15ac0..279254e 100755 --- a/conformance-test/run-conformance.sh +++ b/conformance-test/run-conformance.sh @@ -9,7 +9,7 @@ set -uo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1; pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." || exit 1; pwd)" -CONFORMANCE_VERSION="0.1.15" +CONFORMANCE_VERSION="0.1.16" PORT="${MCP_PORT:-3001}" SERVER_URL="http://localhost:${PORT}/mcp" RESULTS_DIR="$SCRIPT_DIR/results" diff --git a/conformance-test/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/conformance/ConformanceTools.kt b/conformance-test/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/conformance/ConformanceTools.kt index 579b222..54d5c8c 100644 --- a/conformance-test/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/conformance/ConformanceTools.kt +++ b/conformance-test/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/conformance/ConformanceTools.kt @@ -3,12 +3,17 @@ package io.modelcontextprotocol.kotlin.sdk.conformance import io.github.oshai.kotlinlogging.KotlinLogging import io.modelcontextprotocol.kotlin.sdk.server.Server import io.modelcontextprotocol.kotlin.sdk.types.AudioContent +import io.modelcontextprotocol.kotlin.sdk.types.BooleanSchema import io.modelcontextprotocol.kotlin.sdk.types.CallToolResult import io.modelcontextprotocol.kotlin.sdk.types.CreateMessageRequest import io.modelcontextprotocol.kotlin.sdk.types.CreateMessageRequestParams +import io.modelcontextprotocol.kotlin.sdk.types.DoubleSchema import io.modelcontextprotocol.kotlin.sdk.types.ElicitRequestParams import io.modelcontextprotocol.kotlin.sdk.types.EmbeddedResource +import io.modelcontextprotocol.kotlin.sdk.types.EnumOption import io.modelcontextprotocol.kotlin.sdk.types.ImageContent +import io.modelcontextprotocol.kotlin.sdk.types.IntegerSchema +import io.modelcontextprotocol.kotlin.sdk.types.LegacyTitledEnumSchema import io.modelcontextprotocol.kotlin.sdk.types.LoggingLevel import io.modelcontextprotocol.kotlin.sdk.types.LoggingMessageNotification import io.modelcontextprotocol.kotlin.sdk.types.LoggingMessageNotificationParams @@ -16,11 +21,15 @@ import io.modelcontextprotocol.kotlin.sdk.types.ProgressNotification import io.modelcontextprotocol.kotlin.sdk.types.ProgressNotificationParams import io.modelcontextprotocol.kotlin.sdk.types.Role import io.modelcontextprotocol.kotlin.sdk.types.SamplingMessage +import io.modelcontextprotocol.kotlin.sdk.types.StringSchema import io.modelcontextprotocol.kotlin.sdk.types.TextContent import io.modelcontextprotocol.kotlin.sdk.types.TextResourceContents +import io.modelcontextprotocol.kotlin.sdk.types.TitledMultiSelectEnumSchema +import io.modelcontextprotocol.kotlin.sdk.types.TitledSingleSelectEnumSchema import io.modelcontextprotocol.kotlin.sdk.types.ToolSchema +import io.modelcontextprotocol.kotlin.sdk.types.UntitledMultiSelectEnumSchema +import io.modelcontextprotocol.kotlin.sdk.types.UntitledSingleSelectEnumSchema import kotlinx.coroutines.delay -import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.double @@ -187,22 +196,10 @@ fun Server.registerConformanceTools() { ) { request -> val message = request.arguments?.get("message")?.jsonPrimitive?.content ?: "Please provide input" val schema = ElicitRequestParams.RequestedSchema( - properties = buildJsonObject { - put( - "username", - buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("User's response")) - }, - ) - put( - "email", - buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("User's email address")) - }, - ) - }, + properties = mapOf( + "username" to StringSchema(description = "User's response"), + "email" to StringSchema(description = "User's email address"), + ), required = listOf("username", "email"), ) val result = createElicitation(message, schema) @@ -215,54 +212,17 @@ fun Server.registerConformanceTools() { description = "test_elicitation_sep1034_defaults", ) { val schema = ElicitRequestParams.RequestedSchema( - properties = buildJsonObject { - put( - "name", - buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("User name")) - put("default", JsonPrimitive("John Doe")) - }, - ) - put( - "age", - buildJsonObject { - put("type", JsonPrimitive("integer")) - put("description", JsonPrimitive("User age")) - put("default", JsonPrimitive(30)) - }, - ) - put( - "score", - buildJsonObject { - put("type", JsonPrimitive("number")) - put("description", JsonPrimitive("User score")) - put("default", JsonPrimitive(95.5)) - }, - ) - put( - "status", - buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("User status")) - put("default", JsonPrimitive("active")) - put( - "enum", - JsonArray( - listOf(JsonPrimitive("active"), JsonPrimitive("inactive"), JsonPrimitive("pending")), - ), - ) - }, - ) - put( - "verified", - buildJsonObject { - put("type", JsonPrimitive("boolean")) - put("description", JsonPrimitive("Verification status")) - put("default", JsonPrimitive(true)) - }, - ) - }, + properties = mapOf( + "name" to StringSchema(description = "User name", default = "John Doe"), + "age" to IntegerSchema(description = "User age", default = 30), + "score" to DoubleSchema(description = "User score", default = 95.5), + "status" to UntitledSingleSelectEnumSchema( + description = "User status", + enumValues = listOf("active", "inactive", "pending"), + default = "active", + ), + "verified" to BooleanSchema(description = "Verification status", default = true), + ), required = listOf("name", "age", "score", "status", "verified"), ) val result = createElicitation( @@ -278,122 +238,43 @@ fun Server.registerConformanceTools() { description = "test_elicitation_sep1330_enums", ) { val schema = ElicitRequestParams.RequestedSchema( - properties = buildJsonObject { + properties = mapOf( // Untitled single-select - put( - "untitledSingle", - buildJsonObject { - put("type", JsonPrimitive("string")) - put( - "enum", - JsonArray( - listOf(JsonPrimitive("option1"), JsonPrimitive("option2"), JsonPrimitive("option3")), - ), - ) - }, - ) + "untitledSingle" to UntitledSingleSelectEnumSchema( + enumValues = listOf("option1", "option2", "option3"), + ), // Titled single-select - put( - "titledSingle", - buildJsonObject { - put("type", JsonPrimitive("string")) - put( - "oneOf", - JsonArray( - listOf( - buildJsonObject { - put("const", JsonPrimitive("value1")) - put("title", JsonPrimitive("First Option")) - }, - buildJsonObject { - put("const", JsonPrimitive("value2")) - put("title", JsonPrimitive("Second Option")) - }, - buildJsonObject { - put("const", JsonPrimitive("value3")) - put("title", JsonPrimitive("Third Option")) - }, - ), - ), - ) - }, - ) - // Legacy titled (deprecated) - uses enum + enumNames arrays - put( - "legacyEnum", - buildJsonObject { - put("type", JsonPrimitive("string")) - put( - "enum", - JsonArray(listOf(JsonPrimitive("opt1"), JsonPrimitive("opt2"), JsonPrimitive("opt3"))), - ) - put( - "enumNames", - JsonArray( - listOf( - JsonPrimitive("Option One"), - JsonPrimitive("Option Two"), - JsonPrimitive("Option Three"), - ), - ), - ) - }, - ) + "titledSingle" to TitledSingleSelectEnumSchema( + oneOf = listOf( + EnumOption(const = "value1", title = "First Option"), + EnumOption(const = "value2", title = "Second Option"), + EnumOption(const = "value3", title = "Third Option"), + ), + ), + // Legacy titled (deprecated) — uses enum + enumNames + @Suppress("DEPRECATION") + "legacyEnum" + to LegacyTitledEnumSchema( + enumValues = listOf("opt1", "opt2", "opt3"), + enumNames = listOf("Option One", "Option Two", "Option Three"), + ), // Untitled multi-select - put( - "untitledMulti", - buildJsonObject { - put("type", JsonPrimitive("array")) - put( - "items", - buildJsonObject { - put("type", JsonPrimitive("string")) - put( - "enum", - JsonArray( - listOf( - JsonPrimitive("option1"), - JsonPrimitive("option2"), - JsonPrimitive("option3"), - ), - ), - ) - }, - ) - }, - ) - // Titled multi-select - uses items.anyOf with const/title pairs - put( - "titledMulti", - buildJsonObject { - put("type", JsonPrimitive("array")) - put( - "items", - buildJsonObject { - put( - "anyOf", - JsonArray( - listOf( - buildJsonObject { - put("const", JsonPrimitive("value1")) - put("title", JsonPrimitive("First Choice")) - }, - buildJsonObject { - put("const", JsonPrimitive("value2")) - put("title", JsonPrimitive("Second Choice")) - }, - buildJsonObject { - put("const", JsonPrimitive("value3")) - put("title", JsonPrimitive("Third Choice")) - }, - ), - ), - ) - }, - ) - }, - ) - }, + "untitledMulti" to UntitledMultiSelectEnumSchema( + items = UntitledMultiSelectEnumSchema.Items( + enumValues = listOf("option1", "option2", "option3"), + ), + ), + // Titled multi-select + "titledMulti" to TitledMultiSelectEnumSchema( + items = TitledMultiSelectEnumSchema.Items( + anyOf = listOf( + EnumOption(const = "value1", title = "First Choice"), + EnumOption(const = "value2", title = "Second Choice"), + EnumOption(const = "value3", title = "Third Choice"), + ), + ), + ), + ), ) val result = createElicitation( "Please review and update the form fields with defaults", @@ -538,54 +419,17 @@ fun Server.registerConformanceTools() { description = "test_client_elicitation_defaults", ) { val schema = ElicitRequestParams.RequestedSchema( - properties = buildJsonObject { - put( - "name", - buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("User name")) - put("default", JsonPrimitive("John Doe")) - }, - ) - put( - "age", - buildJsonObject { - put("type", JsonPrimitive("integer")) - put("description", JsonPrimitive("User age")) - put("default", JsonPrimitive(30)) - }, - ) - put( - "score", - buildJsonObject { - put("type", JsonPrimitive("number")) - put("description", JsonPrimitive("User score")) - put("default", JsonPrimitive(95.5)) - }, - ) - put( - "status", - buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("User status")) - put("default", JsonPrimitive("active")) - put( - "enum", - JsonArray( - listOf(JsonPrimitive("active"), JsonPrimitive("inactive"), JsonPrimitive("pending")), - ), - ) - }, - ) - put( - "verified", - buildJsonObject { - put("type", JsonPrimitive("boolean")) - put("description", JsonPrimitive("Verification status")) - put("default", JsonPrimitive(true)) - }, - ) - }, + properties = mapOf( + "name" to StringSchema(description = "User name", default = "John Doe"), + "age" to IntegerSchema(description = "User age", default = 30), + "score" to DoubleSchema(description = "User score", default = 95.5), + "status" to UntitledSingleSelectEnumSchema( + description = "User status", + enumValues = listOf("active", "inactive", "pending"), + default = "active", + ), + "verified" to BooleanSchema(description = "Verification status", default = true), + ), required = emptyList(), ) val result = createElicitation( diff --git a/integration-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/ClientTest.kt b/integration-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/ClientTest.kt index 9d51236..1d84732 100644 --- a/integration-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/ClientTest.kt +++ b/integration-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/ClientTest.kt @@ -10,6 +10,7 @@ import io.modelcontextprotocol.kotlin.sdk.shared.TransportSendOptions import io.modelcontextprotocol.kotlin.sdk.types.ClientCapabilities import io.modelcontextprotocol.kotlin.sdk.types.CreateMessageRequest import io.modelcontextprotocol.kotlin.sdk.types.CreateMessageResult +import io.modelcontextprotocol.kotlin.sdk.types.ElicitRequestFormParams import io.modelcontextprotocol.kotlin.sdk.types.ElicitRequestParams import io.modelcontextprotocol.kotlin.sdk.types.ElicitResult import io.modelcontextprotocol.kotlin.sdk.types.EmptyJsonObject @@ -35,6 +36,7 @@ import io.modelcontextprotocol.kotlin.sdk.types.Root import io.modelcontextprotocol.kotlin.sdk.types.RootsListChangedNotification import io.modelcontextprotocol.kotlin.sdk.types.SUPPORTED_PROTOCOL_VERSIONS import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.StringSchema import io.modelcontextprotocol.kotlin.sdk.types.TextContent import io.modelcontextprotocol.kotlin.sdk.types.Tool import io.modelcontextprotocol.kotlin.sdk.types.ToolSchema @@ -48,7 +50,6 @@ import kotlinx.coroutines.test.runTest import kotlinx.coroutines.withTimeout import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.put -import kotlinx.serialization.json.putJsonObject import kotlin.coroutines.cancellation.CancellationException import kotlin.test.Test import kotlin.test.assertEquals @@ -953,11 +954,7 @@ class ClientTest { serverSession.createElicitation( message = "Please provide your GitHub username", requestedSchema = ElicitRequestParams.RequestedSchema( - properties = buildJsonObject { - putJsonObject("name") { - put("type", "string") - } - }, + properties = mapOf("name" to StringSchema()), required = listOf("name"), ), ) @@ -1061,11 +1058,7 @@ class ClientTest { val elicitationMessage = "Please provide your GitHub username" val requestedSchema = ElicitRequestParams.RequestedSchema( - properties = buildJsonObject { - putJsonObject("name") { - put("type", "string") - } - }, + properties = mapOf("name" to StringSchema()), required = listOf("name"), ) @@ -1076,7 +1069,8 @@ class ClientTest { client.setElicitationHandler { request -> assertEquals(elicitationMessage, request.params.message) - assertEquals(requestedSchema, request.params.requestedSchema) + val formParams = request.params as ElicitRequestFormParams + assertEquals(requestedSchema, formParams.requestedSchema) ElicitResult( action = elicitationResultAction, diff --git a/kotlin-sdk-core/api/kotlin-sdk-core.api b/kotlin-sdk-core/api/kotlin-sdk-core.api index e7cd0b8..0b81586 100644 --- a/kotlin-sdk-core/api/kotlin-sdk-core.api +++ b/kotlin-sdk-core/api/kotlin-sdk-core.api @@ -336,6 +336,40 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/BlobResourceContents public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/BooleanSchema : io/modelcontextprotocol/kotlin/sdk/types/PrimitiveSchemaDefinition { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/BooleanSchema$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Boolean; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;)Lio/modelcontextprotocol/kotlin/sdk/types/BooleanSchema; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/BooleanSchema;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/BooleanSchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/Boolean; + public final fun getDescription ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/BooleanSchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/BooleanSchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/BooleanSchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/BooleanSchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/BooleanSchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/CallToolRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequest$Companion; public fun (Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequestParams;)V @@ -1134,6 +1168,44 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/CustomRequest$Compan public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/DoubleSchema : io/modelcontextprotocol/kotlin/sdk/types/NumberSchemaDefinition { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/DoubleSchema$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Double; + public final fun component4 ()Ljava/lang/Double; + public final fun component5 ()Ljava/lang/Double; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;)Lio/modelcontextprotocol/kotlin/sdk/types/DoubleSchema; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/DoubleSchema;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/DoubleSchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/Double; + public final fun getDescription ()Ljava/lang/String; + public final fun getMaximum ()Ljava/lang/Double; + public final fun getMinimum ()Ljava/lang/Double; + public final fun getTitle ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/DoubleSchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/DoubleSchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/DoubleSchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/DoubleSchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/DoubleSchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequest : io/modelcontextprotocol/kotlin/sdk/types/ServerRequest { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequest$Companion; public fun (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams;)V @@ -1176,49 +1248,63 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestBuilder public final fun setMessage (Ljava/lang/String;)V } -public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { - public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$Companion; - public synthetic fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestFormParams : io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestFormParams$Companion; + public synthetic fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema; - public final fun component3-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; - public final fun copy-EDEVuBg (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams; - public static synthetic fun copy-EDEVuBg$default (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata; + public final fun component3 ()Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema; + public final fun component4-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-6R815Ik (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestFormParams; + public static synthetic fun copy-6R815Ik$default (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestFormParams;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestFormParams; public fun equals (Ljava/lang/Object;)Z - public final fun getMessage ()Ljava/lang/String; + public fun getMessage ()Ljava/lang/String; public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun getMode ()Ljava/lang/String; public final fun getRequestedSchema ()Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema; + public final fun getTask ()Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata; public fun hashCode ()I public fun toString ()Ljava/lang/String; } -public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { - public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$$serializer; +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestFormParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestFormParams$$serializer; public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; - public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestFormParams; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; - public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams;)V + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestFormParams;)V public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestFormParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$Companion; + public abstract fun getMessage ()Ljava/lang/String; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema$Companion; - public fun (Lkotlinx/serialization/json/JsonObject;Ljava/util/List;)V - public synthetic fun (Lkotlinx/serialization/json/JsonObject;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lkotlinx/serialization/json/JsonObject; - public final fun component2 ()Ljava/util/List; - public final fun copy (Lkotlinx/serialization/json/JsonObject;Ljava/util/List;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema; - public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;Ljava/util/List;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema; + public fun (Ljava/lang/String;Ljava/util/Map;Ljava/util/List;)V + public synthetic fun (Ljava/lang/String;Ljava/util/Map;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/util/Map; + public final fun component3 ()Ljava/util/List; + public final fun copy (Ljava/lang/String;Ljava/util/Map;Ljava/util/List;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Ljava/lang/String;Ljava/util/Map;Ljava/util/List;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema; public fun equals (Ljava/lang/Object;)Z - public final fun getProperties ()Lkotlinx/serialization/json/JsonObject; + public final fun getProperties ()Ljava/util/Map; public final fun getRequired ()Ljava/util/List; + public final fun getSchema ()Ljava/lang/String; public final fun getType ()Ljava/lang/String; public fun hashCode ()I public fun toString ()Ljava/lang/String; @@ -1239,6 +1325,43 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$ public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestURLParams : io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestURLParams$Companion; + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata; + public final fun component5-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-4asOmiE (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestURLParams; + public static synthetic fun copy-4asOmiE$default (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestURLParams;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestURLParams; + public fun equals (Ljava/lang/Object;)Z + public final fun getElicitationId ()Ljava/lang/String; + public fun getMessage ()Ljava/lang/String; + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun getMode ()Ljava/lang/String; + public final fun getTask ()Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata; + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestURLParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestURLParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestURLParams; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestURLParams;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestURLParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestedSchemaBuilder { public fun ()V public final fun build ()Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema; @@ -1294,6 +1417,11 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Compani public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitationKt { + public static final fun ElicitRequestParams-EDEVuBg (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestFormParams; + public static synthetic fun ElicitRequestParams-EDEVuBg$default (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestFormParams; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/Elicitation_dslKt { public static final fun buildElicitRequest (Lkotlin/jvm/functions/Function1;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequest; } @@ -1360,6 +1488,43 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/EmptyResult$Companio public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/EnumOption { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/EnumOption$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/EnumOption; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/EnumOption;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/EnumOption; + public fun equals (Ljava/lang/Object;)Z + public final fun getConst ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/EnumOption$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/EnumOption$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/EnumOption; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/EnumOption;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/EnumOption$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/EnumSchemaDefinition : io/modelcontextprotocol/kotlin/sdk/types/PrimitiveSchemaDefinition { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/EnumSchemaDefinition$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/EnumSchemaDefinition$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/GetPromptRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequest$Companion; public fun (Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequestParams;)V @@ -1955,6 +2120,44 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/InitializedNotificat public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/IntegerSchema : io/modelcontextprotocol/kotlin/sdk/types/NumberSchemaDefinition { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/IntegerSchema$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Integer; + public final fun component4 ()Ljava/lang/Integer; + public final fun component5 ()Ljava/lang/Integer; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;)Lio/modelcontextprotocol/kotlin/sdk/types/IntegerSchema; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/IntegerSchema;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/IntegerSchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/Integer; + public final fun getDescription ()Ljava/lang/String; + public final fun getMaximum ()Ljava/lang/Integer; + public final fun getMinimum ()Ljava/lang/Integer; + public final fun getTitle ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/IntegerSchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/IntegerSchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/IntegerSchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/IntegerSchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/IntegerSchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/JSONRPCEmptyMessage : io/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage { public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCEmptyMessage; public fun equals (Ljava/lang/Object;)Z @@ -2119,6 +2322,43 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/JsonUtilsKt { public static final fun toJson (Ljava/util/Map;)Ljava/util/Map; } +public final class io/modelcontextprotocol/kotlin/sdk/types/LegacyTitledEnumSchema : io/modelcontextprotocol/kotlin/sdk/types/EnumSchemaDefinition { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/LegacyTitledEnumSchema$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/util/List; + public final fun component4 ()Ljava/util/List; + public final fun component5 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/LegacyTitledEnumSchema; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/LegacyTitledEnumSchema;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/LegacyTitledEnumSchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/String; + public final fun getDescription ()Ljava/lang/String; + public final fun getEnumNames ()Ljava/util/List; + public final fun getEnumValues ()Ljava/util/List; + public final fun getTitle ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/LegacyTitledEnumSchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/LegacyTitledEnumSchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/LegacyTitledEnumSchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/LegacyTitledEnumSchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/LegacyTitledEnumSchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/ListPromptsRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest, io/modelcontextprotocol/kotlin/sdk/types/PaginatedRequest { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsRequest$Companion; public fun ()V @@ -2796,6 +3036,14 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/ModelPreferences$Com public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/MultiSelectEnumSchema : io/modelcontextprotocol/kotlin/sdk/types/EnumSchemaDefinition { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/MultiSelectEnumSchema$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/MultiSelectEnumSchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/Notification { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Notification$Companion; public abstract fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; @@ -2814,6 +3062,14 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/NotificationParams$C public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/NumberSchemaDefinition : io/modelcontextprotocol/kotlin/sdk/types/PrimitiveSchemaDefinition { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/NumberSchemaDefinition$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/NumberSchemaDefinition$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/PaginatedRequest : io/modelcontextprotocol/kotlin/sdk/types/Request { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequest$Companion; public fun getCursor ()Ljava/lang/String; @@ -2917,6 +3173,14 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/PingRequest_dslKt { public static final fun buildPingRequest (Lkotlin/jvm/functions/Function1;)Lio/modelcontextprotocol/kotlin/sdk/types/PingRequest; } +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/PrimitiveSchemaDefinition { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/PrimitiveSchemaDefinition$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/PrimitiveSchemaDefinition$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/Progress { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Progress$Companion; public fun (DLjava/lang/Double;Ljava/lang/String;)V @@ -4141,6 +4405,14 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/SetLevelRequestParam public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/SingleSelectEnumSchema : io/modelcontextprotocol/kotlin/sdk/types/EnumSchemaDefinition { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/SingleSelectEnumSchema$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/SingleSelectEnumSchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/StopReason { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/StopReason$Companion; public static final synthetic fun box-impl (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/StopReason; @@ -4174,6 +4446,61 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/StopReason$Companion public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/StringSchema : io/modelcontextprotocol/kotlin/sdk/types/PrimitiveSchemaDefinition { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/StringSchema$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lio/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lio/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Integer; + public final fun component4 ()Ljava/lang/Integer; + public final fun component5 ()Lio/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat; + public final fun component6 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lio/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat;Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/StringSchema; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/StringSchema;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lio/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat;Ljava/lang/String;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/StringSchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/String; + public final fun getDescription ()Ljava/lang/String; + public final fun getFormat ()Lio/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat; + public final fun getMaxLength ()Ljava/lang/Integer; + public final fun getMinLength ()Ljava/lang/Integer; + public final fun getTitle ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/StringSchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/StringSchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/StringSchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/StringSchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/StringSchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat : java/lang/Enum { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat$Companion; + public static final field Date Lio/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat; + public static final field DateTime Lio/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat; + public static final field Email Lio/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat; + public static final field Uri Lio/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat; + public static fun values ()[Lio/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/StringSchemaFormat$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/SubscribeRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequest$Companion; public fun (Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestParams;)V @@ -4503,6 +4830,107 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/TextResourceContents public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema : io/modelcontextprotocol/kotlin/sdk/types/MultiSelectEnumSchema { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items;Ljava/util/List;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Integer; + public final fun component4 ()Ljava/lang/Integer; + public final fun component5 ()Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items; + public final fun component6 ()Ljava/util/List; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items;Ljava/util/List;)Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items;Ljava/util/List;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/util/List; + public final fun getDescription ()Ljava/lang/String; + public final fun getItems ()Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items; + public final fun getMaxItems ()Ljava/lang/Integer; + public final fun getMinItems ()Ljava/lang/Integer; + public final fun getTitle ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items$Companion; + public fun (Ljava/util/List;)V + public final fun component1 ()Ljava/util/List; + public final fun copy (Ljava/util/List;)Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items;Ljava/util/List;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items; + public fun equals (Ljava/lang/Object;)Z + public final fun getAnyOf ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TitledMultiSelectEnumSchema$Items$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TitledSingleSelectEnumSchema : io/modelcontextprotocol/kotlin/sdk/types/SingleSelectEnumSchema { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/TitledSingleSelectEnumSchema$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/util/List; + public final fun component4 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/TitledSingleSelectEnumSchema; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/TitledSingleSelectEnumSchema;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/TitledSingleSelectEnumSchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/String; + public final fun getDescription ()Ljava/lang/String; + public final fun getOneOf ()Ljava/util/List; + public final fun getTitle ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/TitledSingleSelectEnumSchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/TitledSingleSelectEnumSchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/TitledSingleSelectEnumSchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/TitledSingleSelectEnumSchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TitledSingleSelectEnumSchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/Tool : io/modelcontextprotocol/kotlin/sdk/types/WithMeta { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Tool$Companion; public fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations;Ljava/util/List;Lio/modelcontextprotocol/kotlin/sdk/types/ToolExecution;Lkotlinx/serialization/json/JsonObject;)V @@ -4793,6 +5221,108 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequestPa public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema : io/modelcontextprotocol/kotlin/sdk/types/MultiSelectEnumSchema { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items;Ljava/util/List;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Integer; + public final fun component4 ()Ljava/lang/Integer; + public final fun component5 ()Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items; + public final fun component6 ()Ljava/util/List; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items;Ljava/util/List;)Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items;Ljava/util/List;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/util/List; + public final fun getDescription ()Ljava/lang/String; + public final fun getItems ()Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items; + public final fun getMaxItems ()Ljava/lang/Integer; + public final fun getMinItems ()Ljava/lang/Integer; + public final fun getTitle ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items$Companion; + public fun (Ljava/util/List;)V + public final fun component1 ()Ljava/util/List; + public final fun copy (Ljava/util/List;)Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items;Ljava/util/List;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items; + public fun equals (Ljava/lang/Object;)Z + public final fun getEnumValues ()Ljava/util/List; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/UntitledMultiSelectEnumSchema$Items$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/UntitledSingleSelectEnumSchema : io/modelcontextprotocol/kotlin/sdk/types/SingleSelectEnumSchema { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/UntitledSingleSelectEnumSchema$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/util/List; + public final fun component4 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/UntitledSingleSelectEnumSchema; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/UntitledSingleSelectEnumSchema;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/UntitledSingleSelectEnumSchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/String; + public final fun getDescription ()Ljava/lang/String; + public final fun getEnumValues ()Ljava/util/List; + public final fun getTitle ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/UntitledSingleSelectEnumSchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/UntitledSingleSelectEnumSchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/UntitledSingleSelectEnumSchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/UntitledSingleSelectEnumSchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/UntitledSingleSelectEnumSchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/WithMeta { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/WithMeta$Companion; public abstract fun getMeta ()Lkotlinx/serialization/json/JsonObject; diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/elicitation.dsl.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/elicitation.dsl.kt index e398d98..12309fa 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/elicitation.dsl.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/elicitation.dsl.kt @@ -4,6 +4,7 @@ import io.modelcontextprotocol.kotlin.sdk.ExperimentalMcpApi import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonObjectBuilder import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.decodeFromJsonElement import kotlin.contracts.ExperimentalContracts import kotlin.contracts.InvocationKind import kotlin.contracts.contract @@ -223,6 +224,9 @@ public class ElicitRequestedSchemaBuilder @PublishedApi internal constructor() { val properties = requireNotNull(properties) { "Missing required field 'properties'. Use properties { put(\"fieldName\", schema) }" } - return ElicitRequestParams.RequestedSchema(properties, required) + val typedProperties: Map = properties.mapValues { (_, value) -> + McpJson.decodeFromJsonElement(value) + } + return ElicitRequestParams.RequestedSchema(properties = typedProperties, required = required) } } diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/elicitation.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/elicitation.kt index dfda9bf..fc7787b 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/elicitation.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/elicitation.kt @@ -1,23 +1,20 @@ package io.modelcontextprotocol.kotlin.sdk.types import kotlinx.serialization.EncodeDefault -import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonObject /** - * A request from the server to elicit additional information from the user via the client. + * Represents an `elicitation/create` request from the server to the client. * - * This request type allows servers to prompt users for structured input through forms - * or dialogs presented by the client. The server defines a schema for the requested data, - * and the client presents an appropriate UI to collect this information. + * Supports two modes: form mode ([ElicitRequestFormParams]) for collecting structured data + * in-band, and URL mode ([ElicitRequestURLParams]) for directing the user to an external URL. * - * @property params The elicitation parameters including the message and requested schema. + * @property params The elicitation parameters — either form or URL mode. */ @Serializable public data class ElicitRequest(override val params: ElicitRequestParams) : ServerRequest { - @OptIn(ExperimentalSerializationApi::class) @EncodeDefault public override val method: Method = Method.Defined.ElicitationCreate @@ -30,8 +27,13 @@ public data class ElicitRequest(override val params: ElicitRequestParams) : Serv /** * A restricted subset of JSON Schema defining the structure of the requested data. */ - public val requestedSchema: ElicitRequestParams.RequestedSchema - get() = params.requestedSchema + @Deprecated( + "Use (params as ElicitRequestFormParams).requestedSchema", + ReplaceWith("(params as ElicitRequestFormParams).requestedSchema"), + DeprecationLevel.WARNING, + ) + public val requestedSchema: ElicitRequestParams.RequestedSchema? + get() = (params as? ElicitRequestFormParams)?.requestedSchema /** * Metadata for this request. May include a progressToken for out-of-band progress notifications. @@ -41,23 +43,13 @@ public data class ElicitRequest(override val params: ElicitRequestParams) : Serv } /** - * Parameters for an elicitation/create request. + * Represents the parameters for an `elicitation/create` request. * - * @property message The message to present to the user. This should clearly explain - * what information is being requested and why. - * @property requestedSchema A restricted subset of JSON Schema defining the structure - * of the requested data. Only top-level properties are allowed, - * without nesting. - * @property meta Optional metadata for this request. May include a progressToken for - * out-of-band progress notifications. + * Implementations: [ElicitRequestFormParams], [ElicitRequestURLParams]. */ -@Serializable -public data class ElicitRequestParams( - val message: String, - val requestedSchema: RequestedSchema, - @SerialName("_meta") - override val meta: RequestMeta? = null, -) : RequestParams { +@Serializable(with = ElicitRequestParamsSerializer::class) +public sealed interface ElicitRequestParams : RequestParams { + public val message: String /** * A restricted JSON Schema for elicitation requests. @@ -65,6 +57,7 @@ public data class ElicitRequestParams( * Only supports top-level primitive properties without nesting. Each property * represents a field in the form or dialog presented to the user. * + * @property schema Optional URI to a JSON Schema definition. * @property properties A map of property names to their schema definitions. * Each property must be a primitive type (string, number, boolean). * @property required Optional list of property names that must be provided by the user. @@ -72,24 +65,102 @@ public data class ElicitRequestParams( * @property type Always "object" for elicitation schemas. */ @Serializable - public data class RequestedSchema(val properties: JsonObject, val required: List? = null) { - @OptIn(ExperimentalSerializationApi::class) + public data class RequestedSchema( + @SerialName($$"$schema") + val schema: String? = null, + val properties: Map, + val required: List? = null, + ) { @EncodeDefault val type: String = "object" } } /** - * The client's response to an [ElicitRequest]. + * Creates an [ElicitRequestFormParams] for backwards compatibility. * - * Represents the user's action and, if accepted, the submitted form data. + * @param message The message to present to the user. + * @param requestedSchema The JSON Schema for the requested data. + * @param meta Optional request metadata. + * @return A configured [ElicitRequestFormParams] instance. + */ +@Deprecated( + "Use ElicitRequestFormParams instead", + ReplaceWith("ElicitRequestFormParams(message, requestedSchema = requestedSchema, meta = meta)"), + DeprecationLevel.WARNING, +) +@Suppress("FunctionNaming", "FunctionName") +public fun ElicitRequestParams( + message: String, + requestedSchema: ElicitRequestParams.RequestedSchema, + meta: RequestMeta? = null, +): ElicitRequestFormParams = ElicitRequestFormParams( + message = message, + requestedSchema = requestedSchema, + meta = meta, +) + +/** + * Represents form mode parameters for an `elicitation/create` request. * - * @property action The user action in response to the elicitation prompt. - * @property content The submitted form data, only present when [action] is [Action.Accept]. - * Contains values matching the requested schema, where keys correspond - * to property names and values are primitives (string, number, or boolean). + * Collects non-sensitive structured data from the user via a form presented by the client. + * + * @property message The message to present to the user describing what information is being requested. + * @property task If specified, the caller is requesting task-augmented execution. The request + * will return a [CreateTaskResult] immediately, and the actual result can be retrieved + * later via `tasks/result`. + * @property requestedSchema A restricted subset of JSON Schema. Only top-level properties + * are allowed, without nesting. + * @property meta Optional metadata. May include a progressToken for out-of-band progress notifications. + */ +@Serializable +public data class ElicitRequestFormParams( + override val message: String, + val task: TaskMetadata? = null, + val requestedSchema: ElicitRequestParams.RequestedSchema, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : ElicitRequestParams { + @EncodeDefault + public val mode: String = "form" +} + +/** + * Represents URL mode parameters for an `elicitation/create` request. + * + * Directs the user to an external URL for out-of-band interactions (e.g., OAuth flows, + * payment processing, or entering sensitive credentials) that must not pass through the MCP client. + * + * @property message The message explaining why the interaction is needed. + * @property elicitationId A unique identifier for this elicitation. The client MUST treat + * this ID as an opaque value. + * @property url The URL that the user should navigate to. + * @property task If specified, the caller is requesting task-augmented execution. The request + * will return a [CreateTaskResult] immediately, and the actual result can be retrieved + * later via `tasks/result`. + * @property meta Optional metadata. May include a progressToken for out-of-band progress notifications. + */ +@Serializable +public data class ElicitRequestURLParams( + override val message: String, + val elicitationId: String, + val url: String, + val task: TaskMetadata? = null, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : ElicitRequestParams { + @EncodeDefault + public val mode: String = "url" +} + +/** + * Represents the client's response to an [ElicitRequest]. + * + * @property action The user action in response to the elicitation. + * @property content The submitted form data, only present when [action] is [Action.Accept] + * and mode was form. Contains values matching the requested schema. Omitted for + * URL mode responses. * @property meta Optional metadata for this response. - * @throws IllegalArgumentException if content is provided with a non-accept action. */ @Serializable public data class ElicitResult( diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/schema.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/schema.kt new file mode 100644 index 0000000..dda2ac6 --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/schema.kt @@ -0,0 +1,292 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Restricted schema definition for elicitation request properties. + * + * Supports primitive types (string, number, integer, boolean) and enum schemas + * (single-select and multi-select). Only flat, top-level properties are allowed — + * arbitrary nested objects or arrays are not supported. + * + * Implementations: [StringSchema], [NumberSchemaDefinition], [BooleanSchema], [EnumSchemaDefinition]. + */ +@Serializable(with = PrimitiveSchemaDefinitionSerializer::class) +public sealed interface PrimitiveSchemaDefinition + +/** + * Defines a string-typed property in an elicitation schema. + * + * @property title Optional display title for the field. + * @property description Optional description for the field. + * @property minLength Minimum string length. + * @property maxLength Maximum string length. + * @property format Optional format constraint (e.g., email, URI, date). + * @property default Optional default value. + */ +@Serializable +public data class StringSchema( + val title: String? = null, + val description: String? = null, + val minLength: Int? = null, + val maxLength: Int? = null, + val format: StringSchemaFormat? = null, + val default: String? = null, +) : PrimitiveSchemaDefinition { + @EncodeDefault + public val type: String = "string" +} + +/** + * Supported format constraints for [StringSchema]. + */ +@Serializable +public enum class StringSchemaFormat { + @SerialName("email") + Email, + + @SerialName("uri") + Uri, + + @SerialName("date") + Date, + + @SerialName("date-time") + DateTime, +} + +/** + * Defines a numeric property in an elicitation schema. + * + * Implementations: [IntegerSchema] (`"integer"`), [DoubleSchema] (`"number"`). + */ +@Serializable +public sealed interface NumberSchemaDefinition : PrimitiveSchemaDefinition + +/** + * Defines an integer-typed property in an elicitation schema. + * + * @property title Optional display title for the field. + * @property description Optional description for the field. + * @property minimum Minimum allowed value. + * @property maximum Maximum allowed value. + * @property default Optional default value. + */ +@Serializable +public data class IntegerSchema( + val title: String? = null, + val description: String? = null, + val minimum: Int? = null, + val maximum: Int? = null, + val default: Int? = null, +) : NumberSchemaDefinition { + @EncodeDefault + val type: String = "integer" +} + +/** + * Defines a floating-point number property in an elicitation schema. + * + * @property title Optional display title for the field. + * @property description Optional description for the field. + * @property minimum Minimum allowed value. + * @property maximum Maximum allowed value. + * @property default Optional default value. + */ +@Serializable +public data class DoubleSchema( + val title: String? = null, + val description: String? = null, + val minimum: Double? = null, + val maximum: Double? = null, + val default: Double? = null, +) : NumberSchemaDefinition { + @EncodeDefault + val type: String = "number" +} + +/** + * Defines a boolean-typed property in an elicitation schema. + * + * @property title Optional display title for the field. + * @property description Optional description for the field. + * @property default Optional default value. + */ +@Serializable +public data class BooleanSchema( + val title: String? = null, + val description: String? = null, + val default: Boolean? = null, +) : PrimitiveSchemaDefinition { + @EncodeDefault + val type: String = "boolean" +} + +/** + * Defines an enumeration property in an elicitation schema. + * + * Implementations: [SingleSelectEnumSchema], [MultiSelectEnumSchema], [LegacyTitledEnumSchema]. + */ +@Serializable +public sealed interface EnumSchemaDefinition : PrimitiveSchemaDefinition + +/** + * Represents an enum option with a value and a display label. + * + * Used in [TitledSingleSelectEnumSchema] and [TitledMultiSelectEnumSchema]. + * + * @property const The enum value. + * @property title Display label for this option. + */ +@Serializable +public data class EnumOption(val const: String, val title: String) + +/** + * Defines a single-selection enumeration property. + * + * Implementations: [UntitledSingleSelectEnumSchema], [TitledSingleSelectEnumSchema]. + */ +@Serializable +public sealed interface SingleSelectEnumSchema : EnumSchemaDefinition + +/** + * Defines a single-selection enumeration without display titles for options. + * + * @property title Optional display title for the field. + * @property description Optional description for the field. + * @property enumValues Array of enum values to choose from. + * @property default Optional default value. + */ +@Serializable +public data class UntitledSingleSelectEnumSchema( + val title: String? = null, + val description: String? = null, + @SerialName("enum") + val enumValues: List, + val default: String? = null, +) : SingleSelectEnumSchema { + @EncodeDefault + val type: String = "string" +} + +/** + * Defines a single-selection enumeration with display titles for each option. + * + * @property title Optional display title for the field. + * @property description Optional description for the field. + * @property oneOf Array of enum options with values and display labels. + * @property default Optional default value. + */ +@Serializable +public data class TitledSingleSelectEnumSchema( + val title: String? = null, + val description: String? = null, + val oneOf: List, + val default: String? = null, +) : SingleSelectEnumSchema { + @EncodeDefault + val type: String = "string" +} + +/** + * Defines a single-selection enumeration with display names via the deprecated `enumNames` array. + * + * Use [TitledSingleSelectEnumSchema] instead. This class will be removed in a future version. + * + * @property title Optional display title for the field. + * @property description Optional description for the field. + * @property enumValues Array of enum values to choose from. + * @property enumNames Display names for enum values. Non-standard according to JSON Schema 2020-12. + * @property default Optional default value. + */ +@Deprecated("Use TitledSingleSelectEnumSchema instead") +@Serializable +public data class LegacyTitledEnumSchema( + val title: String? = null, + val description: String? = null, + @SerialName("enum") + val enumValues: List, + val enumNames: List? = null, + val default: String? = null, +) : EnumSchemaDefinition { + @EncodeDefault + val type: String = "string" +} + +/** + * Defines a multiple-selection enumeration property. + * + * Implementations: [UntitledMultiSelectEnumSchema], [TitledMultiSelectEnumSchema]. + */ +@Serializable +public sealed interface MultiSelectEnumSchema : EnumSchemaDefinition + +/** + * Defines a multiple-selection enumeration without display titles for options. + * + * @property title Optional display title for the field. + * @property description Optional description for the field. + * @property minItems Minimum number of items to select. + * @property maxItems Maximum number of items to select. + * @property items Schema for the array items. + * @property default Optional default value. + */ +@Serializable +public data class UntitledMultiSelectEnumSchema( + val title: String? = null, + val description: String? = null, + val minItems: Int? = null, + val maxItems: Int? = null, + val items: Items, + val default: List? = null, +) : MultiSelectEnumSchema { + @EncodeDefault + val type: String = "array" + + /** + * Schema for the array items with plain enum values. + * + * @property enumValues Array of enum values to choose from. + */ + @Serializable + public data class Items( + @SerialName("enum") + val enumValues: List, + ) { + @EncodeDefault + val type: String = "string" + } +} + +/** + * Defines a multiple-selection enumeration with display titles for each option. + * + * @property title Optional display title for the field. + * @property description Optional description for the field. + * @property minItems Minimum number of items to select. + * @property maxItems Maximum number of items to select. + * @property items Schema for array items with enum options and display labels. + * @property default Optional default value. + */ +@Serializable +public data class TitledMultiSelectEnumSchema( + val title: String? = null, + val description: String? = null, + val minItems: Int? = null, + val maxItems: Int? = null, + val items: Items, + val default: List? = null, +) : MultiSelectEnumSchema { + @EncodeDefault + val type: String = "array" + + /** + * Schema for array items with enum options and display labels. + * + * @property anyOf Array of enum options with values and display labels. + */ + @Serializable + public data class Items(val anyOf: List) +} diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt index 792c636..7f1c81d 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt @@ -12,6 +12,7 @@ import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.json.JsonContentPolymorphicSerializer import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.longOrNull @@ -420,3 +421,80 @@ internal object RequestIdPolymorphicSerializer : JsonContentPolymorphicSerialize else -> throw SerializationException("Invalid RequestId type: $element") } } + +// ============================================================================ +// ElicitationParams Serializers +// ============================================================================ + +internal object ElicitRequestParamsSerializer : JsonContentPolymorphicSerializer( + ElicitRequestParams::class, +) { + @Suppress("ThrowsCount") + override fun selectDeserializer(element: JsonElement): DeserializationStrategy { + val mode = when (val modeElement = element.jsonObject["mode"]) { + null -> null + + is JsonPrimitive -> { + if (!modeElement.isString) { + throw SerializationException("Invalid 'mode' type: expected string but was: $modeElement") + } + modeElement.contentOrNull + } + + else -> throw SerializationException("Invalid 'mode' type: expected string but was: $modeElement") + } + return when (mode) { + "url" -> ElicitRequestURLParams.serializer() + "form", null -> ElicitRequestFormParams.serializer() + else -> throw SerializationException("Unsupported elicitation mode: '$mode'") + } + } +} + +// ============================================================================ +// PrimitiveSchemaDefinition Serializers +// ============================================================================ + +internal object PrimitiveSchemaDefinitionSerializer : JsonContentPolymorphicSerializer( + PrimitiveSchemaDefinition::class, +) { + @Suppress("ThrowsCount") + override fun selectDeserializer(element: JsonElement): DeserializationStrategy { + val obj = element.jsonObject + val typeElement = obj["type"] + ?: throw SerializationException("Missing 'type' in PrimitiveSchemaDefinition: $element") + val type = if (typeElement is JsonPrimitive && typeElement.isString) { + typeElement.content + } else { + throw SerializationException("Expected 'type' to be a string but was: $typeElement") + } + return when (type) { + "boolean" -> BooleanSchema.serializer() + "integer" -> IntegerSchema.serializer() + "number" -> DoubleSchema.serializer() + "string" -> selectStringTypeDeserializer(obj) + "array" -> selectArrayTypeDeserializer(obj) + else -> throw SerializationException("Unknown PrimitiveSchemaDefinition type: '$type'") + } + } + + private fun selectArrayTypeDeserializer( + obj: Map, + ): DeserializationStrategy { + val items = obj["items"]?.jsonObject + return when { + items != null && "anyOf" in items -> TitledMultiSelectEnumSchema.serializer() + else -> UntitledMultiSelectEnumSchema.serializer() + } + } + + @Suppress("DEPRECATION") + private fun selectStringTypeDeserializer( + obj: Map, + ): DeserializationStrategy = when { + "enumNames" in obj -> LegacyTitledEnumSchema.serializer() + "enum" in obj -> UntitledSingleSelectEnumSchema.serializer() + "oneOf" in obj -> TitledSingleSelectEnumSchema.serializer() + else -> StringSchema.serializer() + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ElicitationTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ElicitationTest.kt index 0026ea0..5392890 100644 --- a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ElicitationTest.kt +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ElicitationTest.kt @@ -1,58 +1,39 @@ package io.modelcontextprotocol.kotlin.sdk.types import io.kotest.assertions.json.shouldEqualJson +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.matchers.nulls.shouldBeNull +import io.kotest.matchers.nulls.shouldNotBeNull +import io.kotest.matchers.shouldBe +import io.kotest.matchers.types.shouldBeInstanceOf import io.modelcontextprotocol.kotlin.test.utils.verifyDeserialization import io.modelcontextprotocol.kotlin.test.utils.verifySerialization import kotlinx.serialization.json.boolean import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.int -import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.put import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertFailsWith -import kotlin.test.assertNotNull -import kotlin.test.assertNull class ElicitationTest { + // ── Form mode ─────────────────────────────────────────────────────── + @Test - @Suppress("LongMethod") - fun `should serialize ElicitRequest with requested schema`() { + fun `should serialize form mode ElicitRequest`() { val request = ElicitRequest( - ElicitRequestParams( + ElicitRequestFormParams( message = "Provide repository details", requestedSchema = ElicitRequestParams.RequestedSchema( - properties = buildJsonObject { - put( - "owner", - buildJsonObject { - put("type", "string") - put("description", "GitHub organization") - }, - ) - put( - "repository", - buildJsonObject { - put("type", "string") - put("title", "Repository name") - }, - ) - put( - "private", - buildJsonObject { - put("type", "boolean") - put("description", "Is the repository private?") - }, - ) - }, + properties = mapOf( + "owner" to StringSchema(description = "GitHub organization"), + "repository" to StringSchema(title = "Repository name"), + "private" to BooleanSchema(description = "Is the repository private?"), + ), required = listOf("owner", "repository"), ), meta = RequestMeta( - buildJsonObject { - put("progressToken", "token-42") - }, + buildJsonObject { put("progressToken", "token-42") }, ), ), ) @@ -68,16 +49,16 @@ class ElicitationTest { "requestedSchema": { "properties": { "owner": { - "type": "string", - "description": "GitHub organization" + "description": "GitHub organization", + "type": "string" }, "repository": { - "type": "string", - "title": "Repository name" + "title": "Repository name", + "type": "string" }, "private": { - "type": "boolean", - "description": "Is the repository private?" + "description": "Is the repository private?", + "type": "boolean" } }, "required": ["owner", "repository"], @@ -85,7 +66,8 @@ class ElicitationTest { }, "_meta": { "progressToken": "token-42" - } + }, + "mode": "form" } } """.trimIndent(), @@ -93,22 +75,16 @@ class ElicitationTest { } @Test - fun `should deserialize ElicitRequest from JSON`() { + fun `should deserialize form mode ElicitRequest with explicit mode`() { val json = """ { "method": "elicitation/create", "params": { - "message": "Tell us about the repository", + "mode": "form", + "message": "Enter your name", "requestedSchema": { "properties": { - "name": { - "type": "string", - "title": "Repository name" - }, - "stars": { - "type": "number", - "description": "GitHub stars" - } + "name": {"type": "string", "title": "Full name"} }, "type": "object" } @@ -117,27 +93,121 @@ class ElicitationTest { """.trimIndent() val request = verifyDeserialization(McpJson, json) - assertEquals(Method.Defined.ElicitationCreate, request.method) + request.method shouldBe Method.Defined.ElicitationCreate + request.message shouldBe "Enter your name" - val params = request.params - assertEquals("Tell us about the repository", params.message) - assertNull(params.meta) - - val schema = params.requestedSchema - assertEquals("object", schema.type) - assertNull(schema.required) - - val nameDefinition = schema.properties["name"]?.jsonObject - assertNotNull(nameDefinition) - assertEquals("string", nameDefinition["type"]?.jsonPrimitive?.content) - assertEquals("Repository name", nameDefinition["title"]?.jsonPrimitive?.content) - - val starsDefinition = schema.properties["stars"]?.jsonObject - assertNotNull(starsDefinition) - assertEquals("number", starsDefinition["type"]?.jsonPrimitive?.content) - assertEquals("GitHub stars", starsDefinition["description"]?.jsonPrimitive?.content) + val params = request.params.shouldBeInstanceOf() + val nameSchema = params.requestedSchema.properties["name"].shouldBeInstanceOf() + nameSchema.title shouldBe "Full name" } + @Test + fun `should deserialize form mode ElicitRequest without mode field`() { + val json = """ + { + "method": "elicitation/create", + "params": { + "message": "Enter your name", + "requestedSchema": { + "properties": { + "name": {"type": "string"} + }, + "type": "object" + } + } + } + """.trimIndent() + + val request = McpJson.decodeFromString(json) + request.params.shouldBeInstanceOf() + request.params.message shouldBe "Enter your name" + } + + // ── URL mode ──────────────────────────────────────────────────────── + + @Test + fun `should serialize URL mode ElicitRequest`() { + val request = ElicitRequest( + ElicitRequestURLParams( + message = "Please provide your API key", + elicitationId = "550e8400-e29b-41d4-a716-446655440000", + url = "https://mcp.example.com/ui/set_api_key", + ), + ) + + verifySerialization( + request, + McpJson, + """ + { + "method": "elicitation/create", + "params": { + "message": "Please provide your API key", + "elicitationId": "550e8400-e29b-41d4-a716-446655440000", + "url": "https://mcp.example.com/ui/set_api_key", + "mode": "url" + } + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize URL mode ElicitRequest`() { + val json = """ + { + "method": "elicitation/create", + "params": { + "mode": "url", + "message": "Authorize access", + "elicitationId": "id-123", + "url": "https://example.com/auth" + } + } + """.trimIndent() + + val request = verifyDeserialization(McpJson, json) + val params = request.params.shouldBeInstanceOf() + params.message shouldBe "Authorize access" + params.elicitationId shouldBe "id-123" + params.url shouldBe "https://example.com/auth" + } + + // ── Deprecated compat ─────────────────────────────────────────────── + + @Test + @Suppress("DEPRECATION") + fun `deprecated factory function should create ElicitRequestFormParams`() { + val schema = ElicitRequestParams.RequestedSchema( + properties = mapOf("name" to StringSchema()), + ) + val params = ElicitRequestParams(message = "Test", requestedSchema = schema) + params.shouldBeInstanceOf() + params.message shouldBe "Test" + params.requestedSchema shouldBe schema + } + + @Test + @Suppress("DEPRECATION") + fun `deprecated requestedSchema should return schema for form mode`() { + val schema = ElicitRequestParams.RequestedSchema( + properties = mapOf("x" to BooleanSchema()), + ) + val request = ElicitRequest(ElicitRequestFormParams(message = "m", requestedSchema = schema)) + request.requestedSchema shouldBe schema + } + + @Test + @Suppress("DEPRECATION") + fun `deprecated requestedSchema should return null for URL mode`() { + val request = ElicitRequest( + ElicitRequestURLParams(message = "m", elicitationId = "id", url = "https://example.com"), + ) + request.requestedSchema.shouldBeNull() + } + + // ── ElicitResult ──────────────────────────────────────────────────── + @Test fun `should serialize and deserialize accept result with content`() { val result = ElicitResult( @@ -169,17 +239,15 @@ class ElicitationTest { """.trimIndent() val decoded = verifyDeserialization(McpJson, json) - assertEquals(ElicitResult.Action.Accept, decoded.action) + decoded.action shouldBe ElicitResult.Action.Accept - val content = decoded.content - assertNotNull(content) - assertEquals("kotlin-sdk", content["repository"]?.jsonPrimitive?.content) - assertEquals(128, content["stars"]?.jsonPrimitive?.int) - assertEquals(false, content["private"]?.jsonPrimitive?.boolean) + val content = decoded.content.shouldNotBeNull() + content["repository"]?.jsonPrimitive?.content shouldBe "kotlin-sdk" + content["stars"]?.jsonPrimitive?.int shouldBe 128 + content["private"]?.jsonPrimitive?.boolean shouldBe false - val meta = decoded.meta - assertNotNull(meta) - assertEquals("2025-01-12T15:00:58Z", meta["submittedAt"]?.jsonPrimitive?.content) + val meta = decoded.meta.shouldNotBeNull() + meta["submittedAt"]?.jsonPrimitive?.content shouldBe "2025-01-12T15:00:58Z" } @Test @@ -194,14 +262,14 @@ class ElicitationTest { """.trimIndent() val result = verifyDeserialization(McpJson, json) - assertEquals(ElicitResult.Action.Decline, result.action) - assertNull(result.content) - assertEquals("User skipped", result.meta?.get("reason")?.jsonPrimitive?.content) + result.action shouldBe ElicitResult.Action.Decline + result.content.shouldBeNull() + result.meta?.get("reason")?.jsonPrimitive?.content shouldBe "User skipped" } @Test fun `should require content only for accept action`() { - assertFailsWith { + shouldThrow { ElicitResult( action = ElicitResult.Action.Cancel, content = buildJsonObject { put("value", "ignored") }, diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/PrimitiveSchemaTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/PrimitiveSchemaTest.kt new file mode 100644 index 0000000..954fb1e --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/PrimitiveSchemaTest.kt @@ -0,0 +1,481 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.shouldBe +import io.kotest.matchers.string.shouldContain +import io.kotest.matchers.types.shouldBeInstanceOf +import io.modelcontextprotocol.kotlin.test.utils.verifyDeserialization +import io.modelcontextprotocol.kotlin.test.utils.verifySerialization +import kotlinx.serialization.SerializationException +import kotlin.test.Test + +class PrimitiveSchemaTest { + + // ── StringSchema ──────────────────────────────────────────────────── + + @Test + fun `should serialize StringSchema with minimal fields`() { + verifySerialization( + StringSchema() as PrimitiveSchemaDefinition, + McpJson, + """{"type": "string"}""", + ) + } + + @Test + fun `should serialize StringSchema with all fields`() { + val schema = StringSchema( + title = "Email address", + description = "User email", + minLength = 5, + maxLength = 100, + format = StringSchemaFormat.Email, + default = "user@example.com", + ) + + verifySerialization( + schema as PrimitiveSchemaDefinition, + McpJson, + """ + { + "title": "Email address", + "description": "User email", + "minLength": 5, + "maxLength": 100, + "format": "email", + "default": "user@example.com", + "type": "string" + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize StringSchema from JSON`() { + val json = """ + { + "type": "string", + "title": "Name", + "format": "uri" + } + """.trimIndent() + + val schema = verifyDeserialization(McpJson, json) + schema.shouldBeInstanceOf() + schema.title shouldBe "Name" + schema.format shouldBe StringSchemaFormat.Uri + } + + // ── StringSchemaFormat ────────────────────────────────────────────── + + @Test + fun `should serialize all StringSchemaFormat values`() { + val cases = mapOf( + StringSchemaFormat.Email to "email", + StringSchemaFormat.Uri to "uri", + StringSchemaFormat.Date to "date", + StringSchemaFormat.DateTime to "date-time", + ) + for ((format, expectedValue) in cases) { + val schema = StringSchema(format = format) + val json = McpJson.encodeToString(schema) + json shouldContain "\"format\":\"$expectedValue\"" + } + } + + // ── IntegerSchema ─────────────────────────────────────────────────── + + @Test + fun `should serialize IntegerSchema with minimal fields`() { + verifySerialization( + IntegerSchema() as PrimitiveSchemaDefinition, + McpJson, + """{"type": "integer"}""", + ) + } + + @Test + fun `should serialize IntegerSchema with all fields`() { + verifySerialization( + IntegerSchema( + title = "Age", + description = "User age", + minimum = 0, + maximum = 150, + default = 25, + ) as PrimitiveSchemaDefinition, + McpJson, + """ + { + "title": "Age", + "description": "User age", + "minimum": 0, + "maximum": 150, + "default": 25, + "type": "integer" + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize IntegerSchema from JSON`() { + val json = """{"type": "integer", "minimum": 1, "maximum": 10}""" + val schema = verifyDeserialization(McpJson, json) + schema.shouldBeInstanceOf() + schema.minimum shouldBe 1 + schema.maximum shouldBe 10 + } + + // ── DoubleSchema ──────────────────────────────────────────────────── + + @Test + fun `should serialize DoubleSchema with minimal fields`() { + verifySerialization( + DoubleSchema() as PrimitiveSchemaDefinition, + McpJson, + """{"type": "number"}""", + ) + } + + @Test + fun `should serialize DoubleSchema with all fields`() { + verifySerialization( + DoubleSchema( + title = "Score", + description = "Test score", + minimum = 0.0, + maximum = 100.0, + default = 50.0, + ) as PrimitiveSchemaDefinition, + McpJson, + """ + { + "title": "Score", + "description": "Test score", + "minimum": 0.0, + "maximum": 100.0, + "default": 50.0, + "type": "number" + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize DoubleSchema from JSON`() { + val json = """{"type": "number", "minimum": 0.5}""" + val schema = verifyDeserialization(McpJson, json) + schema.shouldBeInstanceOf() + schema.minimum shouldBe 0.5 + } + + // ── BooleanSchema ─────────────────────────────────────────────────── + + @Test + fun `should serialize BooleanSchema with minimal fields`() { + verifySerialization( + BooleanSchema() as PrimitiveSchemaDefinition, + McpJson, + """{"type": "boolean"}""", + ) + } + + @Test + fun `should serialize BooleanSchema with all fields`() { + verifySerialization( + BooleanSchema( + title = "Agree", + description = "Terms acceptance", + default = false, + ) as PrimitiveSchemaDefinition, + McpJson, + """ + { + "title": "Agree", + "description": "Terms acceptance", + "default": false, + "type": "boolean" + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize BooleanSchema from JSON`() { + val json = """{"type": "boolean", "default": true}""" + val schema = verifyDeserialization(McpJson, json) + schema.shouldBeInstanceOf() + schema.default shouldBe true + } + + // ── UntitledSingleSelectEnumSchema ────────────────────────────────── + + @Test + fun `should serialize UntitledSingleSelectEnumSchema`() { + verifySerialization( + UntitledSingleSelectEnumSchema( + title = "Color", + enumValues = listOf("Red", "Green", "Blue"), + default = "Red", + ) as PrimitiveSchemaDefinition, + McpJson, + """ + { + "title": "Color", + "enum": ["Red", "Green", "Blue"], + "default": "Red", + "type": "string" + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize UntitledSingleSelectEnumSchema from JSON`() { + val json = """ + { + "type": "string", + "enum": ["A", "B", "C"] + } + """.trimIndent() + + val schema = verifyDeserialization(McpJson, json) + schema.shouldBeInstanceOf() + schema.enumValues shouldBe listOf("A", "B", "C") + } + + // ── TitledSingleSelectEnumSchema ──────────────────────────────────── + + @Test + fun `should serialize TitledSingleSelectEnumSchema`() { + verifySerialization( + TitledSingleSelectEnumSchema( + title = "Color", + oneOf = listOf( + EnumOption(const = "#FF0000", title = "Red"), + EnumOption(const = "#00FF00", title = "Green"), + ), + default = "#FF0000", + ) as PrimitiveSchemaDefinition, + McpJson, + """ + { + "title": "Color", + "oneOf": [ + {"const": "#FF0000", "title": "Red"}, + {"const": "#00FF00", "title": "Green"} + ], + "default": "#FF0000", + "type": "string" + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize TitledSingleSelectEnumSchema from JSON`() { + val json = """ + { + "type": "string", + "oneOf": [ + {"const": "a", "title": "Alpha"}, + {"const": "b", "title": "Beta"} + ] + } + """.trimIndent() + + val schema = verifyDeserialization(McpJson, json) + schema.shouldBeInstanceOf() + schema.oneOf shouldHaveSize 2 + schema.oneOf[0].const shouldBe "a" + schema.oneOf[0].title shouldBe "Alpha" + } + + // ── UntitledMultiSelectEnumSchema ──────────────────────────────────── + + @Test + fun `should serialize UntitledMultiSelectEnumSchema`() { + verifySerialization( + UntitledMultiSelectEnumSchema( + title = "Colors", + minItems = 1, + maxItems = 3, + items = UntitledMultiSelectEnumSchema.Items(enumValues = listOf("Red", "Green", "Blue")), + default = listOf("Red"), + ) as PrimitiveSchemaDefinition, + McpJson, + """ + { + "title": "Colors", + "minItems": 1, + "maxItems": 3, + "items": { + "enum": ["Red", "Green", "Blue"], + "type": "string" + }, + "default": ["Red"], + "type": "array" + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize UntitledMultiSelectEnumSchema from JSON`() { + val json = """ + { + "type": "array", + "items": { + "type": "string", + "enum": ["X", "Y"] + } + } + """.trimIndent() + + val schema = verifyDeserialization(McpJson, json) + schema.shouldBeInstanceOf() + schema.items.enumValues shouldBe listOf("X", "Y") + } + + // ── TitledMultiSelectEnumSchema ────────────────────────────────────── + + @Test + fun `should serialize TitledMultiSelectEnumSchema`() { + verifySerialization( + TitledMultiSelectEnumSchema( + title = "Colors", + minItems = 1, + maxItems = 2, + items = TitledMultiSelectEnumSchema.Items( + anyOf = listOf( + EnumOption(const = "#FF0000", title = "Red"), + EnumOption(const = "#00FF00", title = "Green"), + ), + ), + default = listOf("#FF0000"), + ) as PrimitiveSchemaDefinition, + McpJson, + """ + { + "title": "Colors", + "minItems": 1, + "maxItems": 2, + "items": { + "anyOf": [ + {"const": "#FF0000", "title": "Red"}, + {"const": "#00FF00", "title": "Green"} + ] + }, + "default": ["#FF0000"], + "type": "array" + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize TitledMultiSelectEnumSchema from JSON`() { + val json = """ + { + "type": "array", + "items": { + "anyOf": [ + {"const": "x", "title": "X"}, + {"const": "y", "title": "Y"} + ] + } + } + """.trimIndent() + + val schema = verifyDeserialization(McpJson, json) + schema.shouldBeInstanceOf() + schema.items.anyOf shouldHaveSize 2 + schema.items.anyOf[0].const shouldBe "x" + } + + // ── LegacyTitledEnumSchema ──────────────────────────────────────────── + + @Suppress("DEPRECATION") + @Test + fun `should serialize LegacyTitledEnumSchema`() { + verifySerialization( + LegacyTitledEnumSchema( + title = "Status", + enumValues = listOf("opt1", "opt2", "opt3"), + enumNames = listOf("Option One", "Option Two", "Option Three"), + default = "opt1", + ) as PrimitiveSchemaDefinition, + McpJson, + """ + { + "title": "Status", + "enum": ["opt1", "opt2", "opt3"], + "enumNames": ["Option One", "Option Two", "Option Three"], + "default": "opt1", + "type": "string" + } + """.trimIndent(), + ) + } + + @Suppress("DEPRECATION") + @Test + fun `should deserialize LegacyTitledEnumSchema from JSON`() { + val json = """ + { + "type": "string", + "enum": ["a", "b"], + "enumNames": ["Alpha", "Beta"] + } + """.trimIndent() + + val schema = verifyDeserialization(McpJson, json) + schema.shouldBeInstanceOf() + schema.enumValues shouldBe listOf("a", "b") + schema.enumNames shouldBe listOf("Alpha", "Beta") + } + + // ── Error cases ───────────────────────────────────────────────────── + + @Test + fun `should throw on unknown type`() { + val json = """{"type": "unknown"}""" + shouldThrow { + McpJson.decodeFromString(json) + } + } + + // ── RequestedSchema with typed properties ─────────────────────────── + + @Test + fun `should round-trip RequestedSchema with mixed property types`() { + val schema = ElicitRequestParams.RequestedSchema( + properties = mapOf( + "name" to StringSchema(title = "Name"), + "age" to IntegerSchema(minimum = 0), + "confirmed" to BooleanSchema(default = false), + "color" to UntitledSingleSelectEnumSchema(enumValues = listOf("Red", "Blue")), + ), + required = listOf("name"), + ) + + verifySerialization( + schema, + McpJson, + """ + { + "properties": { + "name": {"title": "Name", "type": "string"}, + "age": {"minimum": 0, "type": "integer"}, + "confirmed": {"default": false, "type": "boolean"}, + "color": {"enum": ["Red", "Blue"], "type": "string"} + }, + "required": ["name"], + "type": "object" + } + """.trimIndent(), + ) + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/dsl/ElicitationDslTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/dsl/ElicitationDslTest.kt index e49e4d2..4a34bab 100644 --- a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/dsl/ElicitationDslTest.kt +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/dsl/ElicitationDslTest.kt @@ -2,8 +2,11 @@ package io.modelcontextprotocol.kotlin.sdk.types.dsl import io.kotest.assertions.throwables.shouldThrow import io.kotest.matchers.shouldBe +import io.kotest.matchers.types.shouldBeInstanceOf import io.modelcontextprotocol.kotlin.sdk.ExperimentalMcpApi +import io.modelcontextprotocol.kotlin.sdk.types.ElicitRequestFormParams import io.modelcontextprotocol.kotlin.sdk.types.ElicitRequestParams +import io.modelcontextprotocol.kotlin.sdk.types.StringSchema import io.modelcontextprotocol.kotlin.sdk.types.buildElicitRequest import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.put @@ -24,14 +27,15 @@ class ElicitationDslTest { } request.params.message shouldBe "Provide info" - request.params.requestedSchema.properties["email"] shouldBe buildJsonObject { put("type", "string") } - request.params.requestedSchema.required shouldBe listOf("email") + val formParams = request.params.shouldBeInstanceOf() + formParams.requestedSchema.properties["email"].shouldBeInstanceOf() + formParams.requestedSchema.required shouldBe listOf("email") } @Test fun `buildElicitRequest should support direct requestedSchema`() { val schema = ElicitRequestParams.RequestedSchema( - properties = buildJsonObject { put("name", buildJsonObject { put("type", "string") }) }, + properties = mapOf("name" to StringSchema()), required = listOf("name"), ) val request = buildElicitRequest { @@ -39,19 +43,20 @@ class ElicitationDslTest { requestedSchema(schema) } - request.params.requestedSchema shouldBe schema + val formParams = request.params.shouldBeInstanceOf() + formParams.requestedSchema shouldBe schema } @Test fun `ElicitRequestedSchemaBuilder should support direct properties assignment`() { - val props = buildJsonObject { put("key", "value") } val request = buildElicitRequest { message = "Test" requestedSchema { - properties(props) + properties(buildJsonObject { put("key", buildJsonObject { put("type", "string") }) }) } } - request.params.requestedSchema.properties shouldBe props + val formParams = request.params.shouldBeInstanceOf() + formParams.requestedSchema.properties["key"].shouldBeInstanceOf() } @Test diff --git a/kotlin-sdk-server/api/kotlin-sdk-server.api b/kotlin-sdk-server/api/kotlin-sdk-server.api index fef34b2..027af1c 100644 --- a/kotlin-sdk-server/api/kotlin-sdk-server.api +++ b/kotlin-sdk-server/api/kotlin-sdk-server.api @@ -1,8 +1,10 @@ public abstract interface class io/modelcontextprotocol/kotlin/sdk/server/ClientConnection { public abstract fun createElicitation (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public abstract fun createElicitation (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public abstract fun createElicitation (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static synthetic fun createElicitation$default (Lio/modelcontextprotocol/kotlin/sdk/server/ClientConnection;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public static synthetic fun createElicitation$default (Lio/modelcontextprotocol/kotlin/sdk/server/ClientConnection;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun createElicitation$default (Lio/modelcontextprotocol/kotlin/sdk/server/ClientConnection;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public abstract fun createMessage (Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static synthetic fun createMessage$default (Lio/modelcontextprotocol/kotlin/sdk/server/ClientConnection;Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public abstract fun getSessionId ()Ljava/lang/String; @@ -22,6 +24,7 @@ public abstract interface class io/modelcontextprotocol/kotlin/sdk/server/Client public final class io/modelcontextprotocol/kotlin/sdk/server/ClientConnection$DefaultImpls { public static synthetic fun createElicitation$default (Lio/modelcontextprotocol/kotlin/sdk/server/ClientConnection;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public static synthetic fun createElicitation$default (Lio/modelcontextprotocol/kotlin/sdk/server/ClientConnection;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun createElicitation$default (Lio/modelcontextprotocol/kotlin/sdk/server/ClientConnection;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public static synthetic fun createMessage$default (Lio/modelcontextprotocol/kotlin/sdk/server/ClientConnection;Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public static synthetic fun listRoots$default (Lio/modelcontextprotocol/kotlin/sdk/server/ClientConnection;Lio/modelcontextprotocol/kotlin/sdk/types/ListRootsRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public static synthetic fun notification$default (Lio/modelcontextprotocol/kotlin/sdk/server/ClientConnection;Lio/modelcontextprotocol/kotlin/sdk/types/ServerNotification;Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; @@ -108,7 +111,9 @@ public class io/modelcontextprotocol/kotlin/sdk/server/Server { public final fun clientConnection (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/server/ClientConnection; public final fun close (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun createElicitation (Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun createElicitation (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static synthetic fun createElicitation$default (Lio/modelcontextprotocol/kotlin/sdk/server/Server;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun createElicitation$default (Lio/modelcontextprotocol/kotlin/sdk/server/Server;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public final fun createMessage (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static synthetic fun createMessage$default (Lio/modelcontextprotocol/kotlin/sdk/server/Server;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public final fun createSession (Lio/modelcontextprotocol/kotlin/sdk/shared/Transport;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -159,7 +164,9 @@ public class io/modelcontextprotocol/kotlin/sdk/server/ServerSession : io/modelc protected fun assertNotificationCapability (Lio/modelcontextprotocol/kotlin/sdk/types/Method;)V public fun assertRequestHandlerCapability (Lio/modelcontextprotocol/kotlin/sdk/types/Method;)V public final fun createElicitation (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun createElicitation (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static synthetic fun createElicitation$default (Lio/modelcontextprotocol/kotlin/sdk/server/ServerSession;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun createElicitation$default (Lio/modelcontextprotocol/kotlin/sdk/server/ServerSession;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public final fun createMessage (Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static synthetic fun createMessage$default (Lio/modelcontextprotocol/kotlin/sdk/server/ServerSession;Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public fun equals (Ljava/lang/Object;)Z diff --git a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ClientConnection.kt b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ClientConnection.kt index 998d62c..96177ee 100644 --- a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ClientConnection.kt +++ b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ClientConnection.kt @@ -5,7 +5,9 @@ import io.modelcontextprotocol.kotlin.sdk.shared.RequestOptions import io.modelcontextprotocol.kotlin.sdk.types.CreateMessageRequest import io.modelcontextprotocol.kotlin.sdk.types.CreateMessageResult import io.modelcontextprotocol.kotlin.sdk.types.ElicitRequest +import io.modelcontextprotocol.kotlin.sdk.types.ElicitRequestFormParams import io.modelcontextprotocol.kotlin.sdk.types.ElicitRequestParams +import io.modelcontextprotocol.kotlin.sdk.types.ElicitRequestURLParams import io.modelcontextprotocol.kotlin.sdk.types.ElicitResult import io.modelcontextprotocol.kotlin.sdk.types.EmptyResult import io.modelcontextprotocol.kotlin.sdk.types.ListRootsRequest @@ -104,6 +106,24 @@ public interface ClientConnection { options: RequestOptions? = null, ): ElicitResult + /** + * Sends a URL mode elicitation request to the client, directing the user + * to an external URL for out-of-band interactions. + * + * @param message The message explaining why the interaction is needed. + * @param elicitationId A unique identifier for the elicitation. + * @param url The URL that the user should navigate to. + * @param options Optional request options. + * @return The result of the elicitation request. + * @throws IllegalStateException If the server or client does not support elicitation. + */ + public suspend fun createElicitation( + message: String, + elicitationId: String, + url: String, + options: RequestOptions? = null, + ): ElicitResult + /** * Sends a message to the client requesting elicitation. * This typically results in a form being displayed to the user. @@ -189,10 +209,16 @@ internal class ClientConnectionImpl(private val session: ServerSession) : Client } override suspend fun createElicitation(request: ElicitRequest, options: RequestOptions?): ElicitResult { - with(request.params) { - logger.debug { - "Creating elicitation with message length=${message.length}, " + - "schema properties count=${requestedSchema.properties.size}" + val params = request.params + logger.debug { + when (params) { + is ElicitRequestFormParams -> + "Creating form elicitation with message length=${params.message.length}, " + + "schema properties count=${params.requestedSchema.properties.size}" + + is ElicitRequestURLParams -> + "Creating URL elicitation with message length=${params.message.length}, " + + "elicitationId=${params.elicitationId}" } } logger.trace { "ElicitRequest: $request" } @@ -204,7 +230,19 @@ internal class ClientConnectionImpl(private val session: ServerSession) : Client requestedSchema: ElicitRequestParams.RequestedSchema, options: RequestOptions?, ): ElicitResult = createElicitation( - request = ElicitRequest(params = ElicitRequestParams(message, requestedSchema)), + request = ElicitRequest(params = ElicitRequestFormParams(message = message, requestedSchema = requestedSchema)), + options = options, + ) + + override suspend fun createElicitation( + message: String, + elicitationId: String, + url: String, + options: RequestOptions?, + ): ElicitResult = createElicitation( + request = ElicitRequest( + params = ElicitRequestURLParams(message = message, elicitationId = elicitationId, url = url), + ), options = options, ) diff --git a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt index e566d09..a3b2256 100644 --- a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt +++ b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt @@ -780,6 +780,30 @@ public open class Server( options = options, ) + /** + * Triggers URL mode [ClientConnection.createElicitation] request for session by provided [sessionId]. + * + * @param sessionId The session ID to create elicitation for. + * @param message The message explaining why the interaction is needed. + * @param elicitationId A unique identifier for the elicitation. + * @param url The URL that the user should navigate to. + * @param options Optional request options. + * @return The created elicitation result. + * @throws IllegalStateException If the server does not support elicitation or if the request fails. + */ + public suspend fun createElicitation( + sessionId: String, + message: String, + elicitationId: String, + url: String, + options: RequestOptions? = null, + ): ElicitResult = clientConnection(sessionId).createElicitation( + message = message, + elicitationId = elicitationId, + url = url, + options = options, + ) + /** * Triggers [ClientConnection.sendLoggingMessage] for session by provided [sessionId]. * diff --git a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerSession.kt b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerSession.kt index a8a34af..9e6553a 100644 --- a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerSession.kt +++ b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerSession.kt @@ -382,6 +382,24 @@ public open class ServerSession( options: RequestOptions? = null, ): ElicitResult = clientConnection.createElicitation(message, requestedSchema, options) + /** + * Sends a URL mode elicitation request to the client, directing the user + * to an external URL for out-of-band interactions. + * + * @param message The message explaining why the interaction is needed. + * @param elicitationId A unique identifier for the elicitation. + * @param url The URL that the user should navigate to. + * @param options Optional request options. + * @return The result of the elicitation request. + * @throws IllegalStateException If the server or client does not support elicitation. + */ + public suspend fun createElicitation( + message: String, + elicitationId: String, + url: String, + options: RequestOptions? = null, + ): ElicitResult = clientConnection.createElicitation(message, elicitationId, url, options) + /** * Sends a logging message notification to the client. * Messages are filtered based on the current logging level set by the client.