Skip to content

Commit 97f8c07

Browse files
committed
feat(client): add support for elicitation
Fixes #137
1 parent 958e5e5 commit 97f8c07

File tree

5 files changed

+299
-5
lines changed

5 files changed

+299
-5
lines changed

api/kotlin-sdk.api

Lines changed: 120 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,16 @@ public final class io/modelcontextprotocol/kotlin/sdk/CancelledNotification$Comp
167167
public final class io/modelcontextprotocol/kotlin/sdk/ClientCapabilities {
168168
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities$Companion;
169169
public fun <init> ()V
170-
public fun <init> (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities$Roots;)V
171-
public synthetic fun <init> (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities$Roots;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
170+
public fun <init> (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities$Roots;Lkotlinx/serialization/json/JsonObject;)V
171+
public synthetic fun <init> (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities$Roots;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
172172
public final fun component1 ()Lkotlinx/serialization/json/JsonObject;
173173
public final fun component2 ()Lkotlinx/serialization/json/JsonObject;
174174
public final fun component3 ()Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities$Roots;
175-
public final fun copy (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities$Roots;)Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities;
176-
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities$Roots;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities;
175+
public final fun component4 ()Lkotlinx/serialization/json/JsonObject;
176+
public final fun copy (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities$Roots;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities;
177+
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities$Roots;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities;
177178
public fun equals (Ljava/lang/Object;)Z
179+
public final fun getElicitation ()Lkotlinx/serialization/json/JsonObject;
178180
public final fun getExperimental ()Lkotlinx/serialization/json/JsonObject;
179181
public final fun getRoots ()Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities$Roots;
180182
public final fun getSampling ()Lkotlinx/serialization/json/JsonObject;
@@ -383,6 +385,117 @@ public final class io/modelcontextprotocol/kotlin/sdk/CompleteResult$Completion$
383385
public final fun serializer ()Lkotlinx/serialization/KSerializer;
384386
}
385387

388+
public final class io/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest : io/modelcontextprotocol/kotlin/sdk/ServerRequest, io/modelcontextprotocol/kotlin/sdk/WithMeta {
389+
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$Companion;
390+
public fun <init> (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;Lkotlinx/serialization/json/JsonObject;)V
391+
public synthetic fun <init> (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
392+
public final fun component1 ()Ljava/lang/String;
393+
public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;
394+
public final fun component3 ()Lkotlinx/serialization/json/JsonObject;
395+
public final fun copy (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest;
396+
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest;
397+
public fun equals (Ljava/lang/Object;)Z
398+
public final fun getMessage ()Ljava/lang/String;
399+
public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/Method;
400+
public final fun getRequestedSchema ()Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;
401+
public fun get_meta ()Lkotlinx/serialization/json/JsonObject;
402+
public fun hashCode ()I
403+
public fun toString ()Ljava/lang/String;
404+
}
405+
406+
public final synthetic class io/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
407+
public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$$serializer;
408+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
409+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest;
410+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
411+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
412+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest;)V
413+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
414+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
415+
}
416+
417+
public final class io/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$Companion {
418+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
419+
}
420+
421+
public final class io/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema {
422+
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema$Companion;
423+
public fun <init> ()V
424+
public fun <init> (Lkotlinx/serialization/json/JsonObject;Ljava/util/List;)V
425+
public synthetic fun <init> (Lkotlinx/serialization/json/JsonObject;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
426+
public final fun component1 ()Lkotlinx/serialization/json/JsonObject;
427+
public final fun component2 ()Ljava/util/List;
428+
public final fun copy (Lkotlinx/serialization/json/JsonObject;Ljava/util/List;)Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;
429+
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;Lkotlinx/serialization/json/JsonObject;Ljava/util/List;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;
430+
public fun equals (Ljava/lang/Object;)Z
431+
public final fun getProperties ()Lkotlinx/serialization/json/JsonObject;
432+
public final fun getRequired ()Ljava/util/List;
433+
public final fun getType ()Ljava/lang/String;
434+
public fun hashCode ()I
435+
public fun toString ()Ljava/lang/String;
436+
}
437+
438+
public final synthetic class io/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
439+
public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema$$serializer;
440+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
441+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;
442+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
443+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
444+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;)V
445+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
446+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
447+
}
448+
449+
public final class io/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema$Companion {
450+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
451+
}
452+
453+
public final class io/modelcontextprotocol/kotlin/sdk/CreateElicitationResult : io/modelcontextprotocol/kotlin/sdk/ClientResult {
454+
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Companion;
455+
public fun <init> (Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Action;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;)V
456+
public synthetic fun <init> (Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Action;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
457+
public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Action;
458+
public final fun component2 ()Lkotlinx/serialization/json/JsonObject;
459+
public final fun component3 ()Lkotlinx/serialization/json/JsonObject;
460+
public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Action;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult;
461+
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult;Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Action;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult;
462+
public fun equals (Ljava/lang/Object;)Z
463+
public final fun getAction ()Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Action;
464+
public final fun getContent ()Lkotlinx/serialization/json/JsonObject;
465+
public fun get_meta ()Lkotlinx/serialization/json/JsonObject;
466+
public fun hashCode ()I
467+
public fun toString ()Ljava/lang/String;
468+
}
469+
470+
public final synthetic class io/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
471+
public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$$serializer;
472+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
473+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult;
474+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
475+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
476+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult;)V
477+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
478+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
479+
}
480+
481+
public final class io/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Action : java/lang/Enum {
482+
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Action$Companion;
483+
public static final field accept Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Action;
484+
public static final field cancel Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Action;
485+
public static final field decline Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Action;
486+
public static fun getEntries ()Lkotlin/enums/EnumEntries;
487+
public static fun valueOf (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Action;
488+
public static fun values ()[Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Action;
489+
}
490+
491+
public final class io/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Action$Companion {
492+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
493+
}
494+
495+
public final class io/modelcontextprotocol/kotlin/sdk/CreateElicitationResult$Companion {
496+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
497+
}
498+
386499
public final class io/modelcontextprotocol/kotlin/sdk/CreateMessageRequest : io/modelcontextprotocol/kotlin/sdk/ServerRequest, io/modelcontextprotocol/kotlin/sdk/WithMeta {
387500
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/CreateMessageRequest$Companion;
388501
public fun <init> (Ljava/util/List;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/CreateMessageRequest$IncludeContext;Ljava/lang/Double;ILjava/util/List;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/ModelPreferences;Lkotlinx/serialization/json/JsonObject;)V
@@ -1381,6 +1494,7 @@ public final class io/modelcontextprotocol/kotlin/sdk/Method$Custom$Companion {
13811494
public final class io/modelcontextprotocol/kotlin/sdk/Method$Defined : java/lang/Enum, io/modelcontextprotocol/kotlin/sdk/Method {
13821495
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/Method$Defined$Companion;
13831496
public static final field CompletionComplete Lio/modelcontextprotocol/kotlin/sdk/Method$Defined;
1497+
public static final field ElicitationCreate Lio/modelcontextprotocol/kotlin/sdk/Method$Defined;
13841498
public static final field Initialize Lio/modelcontextprotocol/kotlin/sdk/Method$Defined;
13851499
public static final field LoggingSetLevel Lio/modelcontextprotocol/kotlin/sdk/Method$Defined;
13861500
public static final field NotificationsCancelled Lio/modelcontextprotocol/kotlin/sdk/Method$Defined;
@@ -2830,6 +2944,8 @@ public class io/modelcontextprotocol/kotlin/sdk/server/Server : io/modelcontextp
28302944
protected fun assertCapabilityForMethod (Lio/modelcontextprotocol/kotlin/sdk/Method;)V
28312945
protected fun assertNotificationCapability (Lio/modelcontextprotocol/kotlin/sdk/Method;)V
28322946
public fun assertRequestHandlerCapability (Lio/modelcontextprotocol/kotlin/sdk/Method;)V
2947+
public final fun createElicitation (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
2948+
public static synthetic fun createElicitation$default (Lio/modelcontextprotocol/kotlin/sdk/server/Server;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
28332949
public final fun createMessage (Lio/modelcontextprotocol/kotlin/sdk/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
28342950
public static synthetic fun createMessage$default (Lio/modelcontextprotocol/kotlin/sdk/server/Server;Lio/modelcontextprotocol/kotlin/sdk/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
28352951
public final fun getClientCapabilities ()Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities;

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/Client.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,14 @@ public open class Client(
255255
}
256256
}
257257

258+
Method.Defined.ElicitationCreate -> {
259+
if (capabilities.elicitation == null) {
260+
throw IllegalStateException(
261+
"Client does not support elicitation capability (required for $method)"
262+
)
263+
}
264+
}
265+
258266
Method.Defined.Ping -> {
259267
// No capability required
260268
}

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import io.github.oshai.kotlinlogging.KotlinLogging
44
import io.modelcontextprotocol.kotlin.sdk.CallToolRequest
55
import io.modelcontextprotocol.kotlin.sdk.CallToolResult
66
import io.modelcontextprotocol.kotlin.sdk.ClientCapabilities
7+
import io.modelcontextprotocol.kotlin.sdk.CreateElicitationRequest
8+
import io.modelcontextprotocol.kotlin.sdk.CreateElicitationRequest.RequestedSchema
9+
import io.modelcontextprotocol.kotlin.sdk.CreateElicitationResult
710
import io.modelcontextprotocol.kotlin.sdk.CreateMessageRequest
811
import io.modelcontextprotocol.kotlin.sdk.CreateMessageResult
912
import io.modelcontextprotocol.kotlin.sdk.EmptyJsonObject
@@ -511,6 +514,15 @@ public open class Server(
511514
return request<ListRootsResult>(ListRootsRequest(params), options)
512515
}
513516

517+
public suspend fun createElicitation(
518+
message: String,
519+
requestedSchema: RequestedSchema,
520+
options: RequestOptions? = null
521+
): CreateElicitationResult {
522+
logger.debug { "Creating elicitation with message: $message" }
523+
return request(CreateElicitationRequest(message, requestedSchema), options)
524+
}
525+
514526
/**
515527
* Sends a logging message notification to the client.
516528
*
@@ -652,6 +664,12 @@ public open class Server(
652664
}
653665
}
654666

667+
"elicitation/create" -> {
668+
if (clientCapabilities?.elicitation == null) {
669+
throw IllegalStateException("Client does not support elicitation (required for ${method.value})")
670+
}
671+
}
672+
655673
"ping" -> {
656674
// No specific capability required
657675
}

src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ public sealed interface Method {
9898
LoggingSetLevel("logging/setLevel"),
9999
SamplingCreateMessage("sampling/createMessage"),
100100
CompletionComplete("completion/complete"),
101-
RootsList("roots/list")
101+
RootsList("roots/list"),
102+
ElicitationCreate("elicitation/create"),
102103
}
103104

104105
/**
@@ -337,6 +338,10 @@ public data class ClientCapabilities(
337338
* Present if the client supports listing roots.
338339
*/
339340
val roots: Roots? = null,
341+
/**
342+
* Present if the client supports elicitation.
343+
*/
344+
val elicitation: JsonObject? = null,
340345
) {
341346
@Serializable
342347
public data class Roots(
@@ -1487,6 +1492,48 @@ public class RootsListChangedNotification : ClientNotification {
14871492
override val method: Method = Method.Defined.NotificationsRootsListChanged
14881493
}
14891494

1495+
/**
1496+
* Sent from the server to create an elicitation from the client.
1497+
*/
1498+
@Serializable
1499+
public data class CreateElicitationRequest(
1500+
public val message: String,
1501+
public val requestedSchema: RequestedSchema,
1502+
override val _meta: JsonObject = EmptyJsonObject,
1503+
) : ServerRequest, WithMeta {
1504+
override val method: Method = Method.Defined.ElicitationCreate
1505+
1506+
@Serializable
1507+
public data class RequestedSchema(
1508+
val properties: JsonObject = EmptyJsonObject,
1509+
val required: List<String>? = null,
1510+
) {
1511+
@OptIn(ExperimentalSerializationApi::class)
1512+
@EncodeDefault
1513+
val type: String = "object"
1514+
}
1515+
}
1516+
1517+
/**
1518+
* The client's response to an elicitation/create request from the server.
1519+
*/
1520+
@Serializable
1521+
public data class CreateElicitationResult(
1522+
public val action: Action,
1523+
public val content: JsonObject? = null,
1524+
override val _meta: JsonObject = EmptyJsonObject,
1525+
) : ClientResult {
1526+
1527+
init {
1528+
require(action == Action.accept || content == null) {
1529+
"Content can only be provided for an 'accept' action"
1530+
}
1531+
}
1532+
1533+
@Serializable
1534+
public enum class Action { accept, decline, cancel }
1535+
}
1536+
14901537
/**
14911538
* Represents an error specific to the MCP protocol.
14921539
*

0 commit comments

Comments
 (0)