feat!: capabilities for tasks, elicitation (#732)

closes #544 

Replaces opaque `JsonObject?` modelling of `elicitation` with a typed
`ClientCapabilities.Elicitation` (`form`, `url`), and adds the new
`tasks` capability on both `ClientCapabilities` and `ServerCapabilities`
(with `list`, `cancel`, per-request-type augmentation). Wires capability
assertions for `tasks/*` methods and `notifications/tasks/status` into
`Client` and `ServerSession`

## How Has This Been Tested?
unit tests 

## Breaking Changes
yes
now elicitation is a specific class in capabilities 

## Types of changes
- [ ] Bug fix (non-breaking change which fixes an issue)
- [x] New feature (non-breaking change which adds functionality)
- [x] Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] Documentation update

## Checklist
- [x] I have read the [MCP
Documentation](https://modelcontextprotocol.io)
- [x] My code follows the repository's style guidelines
- [x] New and existing tests pass locally
- [x] I have added appropriate error handling
- [x] I have added or updated documentation as needed
This commit is contained in:
Pavel Gorgulov 2026-05-18 13:22:26 +02:00 • committed by GitHub
commit ebc53f0ded
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 872 additions and 65 deletions

View file

@ -1058,7 +1058,7 @@ class ClientTest {
Implementation(name = "test client", version = "1.0"),
ClientOptions(
capabilities = ClientCapabilities(
elicitation = EmptyJsonObject,
elicitation = ClientCapabilities.Elicitation(),
),
),
)
@ -1270,7 +1270,7 @@ class ClientTest {
): Pair<Client, ServerSession> = kotlinx.coroutines.coroutineScope {
val client = Client(
Implementation(name = "test client", version = "1.0"),
ClientOptions(capabilities = ClientCapabilities(elicitation = EmptyJsonObject)),
ClientOptions(capabilities = ClientCapabilities(elicitation = ClientCapabilities.Elicitation())),
)
client.setElicitationHandler(handler)

View file

@ -174,6 +174,7 @@ public open class Client(private val clientInfo: Implementation, options: Client
"prompts" -> caps?.prompts != null
"resources" -> caps?.resources != null
"tools" -> caps?.tools != null
"tasks" -> caps?.tasks != null
else -> true
}
@ -267,6 +268,12 @@ public open class Client(private val clientInfo: Implementation, options: Client
}
}
Method.Defined.TasksGet,
Method.Defined.TasksResult,
Method.Defined.TasksList,
Method.Defined.TasksCancel,
-> assertTasksCapabilityForMethod(method)
Method.Defined.Initialize, Method.Defined.Ping -> {
// No specific capability required
}
@ -277,6 +284,24 @@ public open class Client(private val clientInfo: Implementation, options: Client
}
}
private fun assertTasksCapabilityForMethod(method: Method) {
val tasks = serverCapabilities?.tasks
?: error("Server does not support tasks (required for $method)")
when (method) {
Method.Defined.TasksList -> checkNotNull(tasks.list) {
"Server does not support listing tasks (required for $method)"
}
Method.Defined.TasksCancel -> checkNotNull(tasks.cancel) {
"Server does not support cancelling tasks (required for $method)"
}
else -> {
// TasksGet, TasksResult: base tasks capability suffices.
}
}
}
override fun assertNotificationCapability(method: Method) {
when (method) {
Method.Defined.NotificationsRootsListChanged -> {
@ -285,6 +310,12 @@ public open class Client(private val clientInfo: Implementation, options: Client
}
}
Method.Defined.NotificationsTasksStatus -> {
checkNotNull(capabilities.tasks) {
"Client does not support tasks (required for $method)"
}
}
Method.Defined.NotificationsInitialized,
Method.Defined.NotificationsCancelled,
Method.Defined.NotificationsProgress,

View file

@ -0,0 +1,152 @@
package io.modelcontextprotocol.kotlin.sdk.client
import io.kotest.matchers.string.shouldContain
import io.modelcontextprotocol.kotlin.sdk.shared.Transport
import io.modelcontextprotocol.kotlin.sdk.shared.TransportSendOptions
import io.modelcontextprotocol.kotlin.sdk.types.ClientCapabilities
import io.modelcontextprotocol.kotlin.sdk.types.Implementation
import io.modelcontextprotocol.kotlin.sdk.types.InitializeResult
import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage
import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCRequest
import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCResponse
import io.modelcontextprotocol.kotlin.sdk.types.LATEST_PROTOCOL_VERSION
import io.modelcontextprotocol.kotlin.sdk.types.Method
import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities
import kotlinx.coroutines.test.runTest
import kotlin.test.Test
import kotlin.test.assertFailsWith
/**
* Tests for the protected helper [Client.assertCapability].
*
* `assertCapability(capability, method)` is `protected`, so this suite uses
* a small subclass [TestClient] that re-exports it via [TestClient.exposedAssertCapability].
* Server capabilities are seeded by completing the initialization handshake through
* [CapabilitiesTransport], which replays a configurable [ServerCapabilities] in its
* `initialize` response.
*/
class ClientAssertCapabilityTest {
@Test
fun `assertCapability tasks throws when server has no tasks capability`() = runTest {
val client = newTestClient(serverCapabilities = ServerCapabilities())
val ex = assertFailsWith<IllegalStateException> {
client.exposedAssertCapability("tasks", "tasks/list")
}
ex.message.orEmpty() shouldContain "Server does not support tasks"
}
@Test
fun `TasksGet throws when server has no tasks capability`() = runTest {
val client = newTestClient(serverCapabilities = ServerCapabilities())
val ex = assertFailsWith<IllegalStateException> {
client.exposedAssertCapabilityForMethod(Method.Defined.TasksGet)
}
ex.message.orEmpty() shouldContain "Server does not support tasks"
}
@Test
fun `TasksGet does not throw when server declared tasks`() = runTest {
val client = newTestClient(
serverCapabilities = ServerCapabilities(tasks = ServerCapabilities.Tasks()),
)
client.exposedAssertCapabilityForMethod(Method.Defined.TasksGet)
}
@Test
fun `TasksList throws when server tasks list is null`() = runTest {
val client = newTestClient(
serverCapabilities = ServerCapabilities(tasks = ServerCapabilities.Tasks()),
)
val ex = assertFailsWith<IllegalStateException> {
client.exposedAssertCapabilityForMethod(Method.Defined.TasksList)
}
ex.message.orEmpty() shouldContain "Server does not support listing tasks"
}
@Test
fun `TasksCancel throws when server tasks cancel is null`() = runTest {
val client = newTestClient(
serverCapabilities = ServerCapabilities(tasks = ServerCapabilities.Tasks()),
)
val ex = assertFailsWith<IllegalStateException> {
client.exposedAssertCapabilityForMethod(Method.Defined.TasksCancel)
}
ex.message.orEmpty() shouldContain "Server does not support cancelling tasks"
}
@Test
fun `NotificationsTasksStatus throws when client has no tasks capability`() = runTest {
val client = newTestClient(clientCapabilities = ClientCapabilities())
val ex = assertFailsWith<IllegalStateException> {
client.exposedAssertNotificationCapability(Method.Defined.NotificationsTasksStatus)
}
ex.message.orEmpty() shouldContain "Client does not support tasks"
}
private suspend fun newTestClient(
serverCapabilities: ServerCapabilities = ServerCapabilities(),
clientCapabilities: ClientCapabilities = ClientCapabilities(),
): TestClient {
val client = TestClient(
Implementation("test-client", "1.0.0"),
ClientOptions(capabilities = clientCapabilities),
)
val transport = CapabilitiesTransport(serverCapabilities)
client.connect(transport)
return client
}
/**
* Test-only [Client] subclass that exposes the protected
* [Client.assertCapability], [Client.assertCapabilityForMethod], and
* [Client.assertNotificationCapability] helpers to the test code.
*/
private class TestClient(clientInfo: Implementation, options: ClientOptions = ClientOptions()) :
Client(clientInfo, options) {
fun exposedAssertCapability(capability: String, method: String): Unit = assertCapability(capability, method)
fun exposedAssertCapabilityForMethod(method: Method): Unit = assertCapabilityForMethod(method)
fun exposedAssertNotificationCapability(method: Method): Unit = assertNotificationCapability(method)
}
/**
* Minimal in-memory [Transport] that responds to `initialize` with a configurable
* [ServerCapabilities]. Other JSON-RPC traffic (e.g. the `notifications/initialized`
* sent by [Client.connect]) is silently consumed.
*/
private class CapabilitiesTransport(private val serverCapabilities: ServerCapabilities) : Transport {
private var onMessageBlock: (suspend (JSONRPCMessage) -> Unit)? = null
private var onCloseBlock: (() -> Unit)? = null
override suspend fun start() = Unit
override suspend fun send(message: JSONRPCMessage, options: TransportSendOptions?) {
if (message is JSONRPCRequest && message.method == "initialize") {
onMessageBlock?.invoke(
JSONRPCResponse(
id = message.id,
result = InitializeResult(
protocolVersion = LATEST_PROTOCOL_VERSION,
capabilities = serverCapabilities,
serverInfo = Implementation("mock-server", "1.0.0"),
),
),
)
}
}
override suspend fun close() {
onCloseBlock?.invoke()
}
override fun onMessage(block: suspend (JSONRPCMessage) -> Unit) {
onMessageBlock = block
}
override fun onClose(block: () -> Unit) {
onCloseBlock = block
}
override fun onError(block: (Throwable) -> Unit) = Unit
}
}

View file

@ -607,23 +607,25 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/CancelledNotificatio
public final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities {
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Companion;
public fun <init> ()V
public fun <init> (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Sampling;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;)V
public synthetic fun <init> (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Sampling;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Sampling;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;)V
public synthetic fun <init> (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Sampling;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;)V
public synthetic fun <init> (Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Sampling;
public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;
public final fun component3 ()Lkotlinx/serialization/json/JsonObject;
public final fun component4 ()Lkotlinx/serialization/json/JsonObject;
public final fun component5 ()Ljava/util/Map;
public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Sampling;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Sampling;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;
public final fun component3 ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation;
public final fun component4 ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks;
public final fun component5 ()Lkotlinx/serialization/json/JsonObject;
public final fun component6 ()Ljava/util/Map;
public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Sampling;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Sampling;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;
public fun equals (Ljava/lang/Object;)Z
public final fun getElicitation ()Lkotlinx/serialization/json/JsonObject;
public final fun getElicitation ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation;
public final fun getExperimental ()Lkotlinx/serialization/json/JsonObject;
public final fun getExtensions ()Ljava/util/Map;
public final fun getRoots ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;
public final fun getSampling ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Sampling;
public final fun getTasks ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
@ -640,11 +642,42 @@ public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ClientCapa
}
public final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Companion {
public final fun getElicitation ()Lkotlinx/serialization/json/JsonObject;
public final fun getElicitation ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation;
public final fun getSampling ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Sampling;
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation {
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation$Companion;
public fun <init> ()V
public fun <init> (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;)V
public synthetic fun <init> (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Lkotlinx/serialization/json/JsonObject;
public final fun component2 ()Lkotlinx/serialization/json/JsonObject;
public final fun copy (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation;
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation;
public fun equals (Ljava/lang/Object;)Z
public final fun getForm ()Lkotlinx/serialization/json/JsonObject;
public final fun getUrl ()Lkotlinx/serialization/json/JsonObject;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation$$serializer;
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation;
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/ClientCapabilities$Elicitation;)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/ClientCapabilities$Elicitation$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots {
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots$Companion;
public fun <init> ()V
@ -705,11 +738,132 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$S
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks {
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Companion;
public fun <init> ()V
public fun <init> (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests;)V
public synthetic fun <init> (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Lkotlinx/serialization/json/JsonObject;
public final fun component2 ()Lkotlinx/serialization/json/JsonObject;
public final fun component3 ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests;
public final fun copy (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks;
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks;
public fun equals (Ljava/lang/Object;)Z
public final fun getCancel ()Lkotlinx/serialization/json/JsonObject;
public final fun getList ()Lkotlinx/serialization/json/JsonObject;
public final fun getRequests ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$$serializer;
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks;
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/ClientCapabilities$Tasks;)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/ClientCapabilities$Tasks$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests {
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Companion;
public fun <init> ()V
public fun <init> (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Sampling;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Elicitation;)V
public synthetic fun <init> (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Sampling;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Elicitation;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Sampling;
public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Elicitation;
public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Sampling;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Elicitation;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests;
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Sampling;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Elicitation;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests;
public fun equals (Ljava/lang/Object;)Z
public final fun getElicitation ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Elicitation;
public final fun getSampling ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Sampling;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$$serializer;
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests;
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/ClientCapabilities$Tasks$Requests;)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/ClientCapabilities$Tasks$Requests$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Elicitation {
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Elicitation$Companion;
public fun <init> ()V
public fun <init> (Lkotlinx/serialization/json/JsonObject;)V
public synthetic fun <init> (Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Lkotlinx/serialization/json/JsonObject;
public final fun copy (Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Elicitation;
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Elicitation;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Elicitation;
public fun equals (Ljava/lang/Object;)Z
public final fun getCreate ()Lkotlinx/serialization/json/JsonObject;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Elicitation$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Elicitation$$serializer;
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Elicitation;
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/ClientCapabilities$Tasks$Requests$Elicitation;)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/ClientCapabilities$Tasks$Requests$Elicitation$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Sampling {
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Sampling$Companion;
public fun <init> ()V
public fun <init> (Lkotlinx/serialization/json/JsonObject;)V
public synthetic fun <init> (Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Lkotlinx/serialization/json/JsonObject;
public final fun copy (Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Sampling;
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Sampling;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Sampling;
public fun equals (Ljava/lang/Object;)Z
public final fun getCreateMessage ()Lkotlinx/serialization/json/JsonObject;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Sampling$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Sampling$$serializer;
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks$Requests$Sampling;
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/ClientCapabilities$Tasks$Requests$Sampling;)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/ClientCapabilities$Tasks$Requests$Sampling$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilitiesBuilder {
public fun <init> ()V
public final fun build ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;
public final fun elicitation (Lkotlin/jvm/functions/Function1;)V
public final fun elicitation (Lkotlinx/serialization/json/JsonObject;)V
public final fun elicitation (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation;)V
public final fun experimental (Lkotlin/jvm/functions/Function1;)V
public final fun experimental (Lkotlinx/serialization/json/JsonObject;)V
public final fun extensions (Ljava/util/Map;)V
@ -4303,17 +4457,18 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/Sampling_dslKt {
public final class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities {
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Companion;
public fun <init> ()V
public fun <init> (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;)V
public synthetic fun <init> (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;)V
public synthetic fun <init> (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools;
public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources;
public final fun component3 ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts;
public final fun component4 ()Lkotlinx/serialization/json/JsonObject;
public final fun component5 ()Lkotlinx/serialization/json/JsonObject;
public final fun component6 ()Lkotlinx/serialization/json/JsonObject;
public final fun component7 ()Ljava/util/Map;
public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities;
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities;
public final fun component6 ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks;
public final fun component7 ()Lkotlinx/serialization/json/JsonObject;
public final fun component8 ()Ljava/util/Map;
public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities;
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities;
public fun equals (Ljava/lang/Object;)Z
public final fun getCompletions ()Lkotlinx/serialization/json/JsonObject;
public final fun getExperimental ()Lkotlinx/serialization/json/JsonObject;
@ -4321,6 +4476,7 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities {
public final fun getLogging ()Lkotlinx/serialization/json/JsonObject;
public final fun getPrompts ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts;
public final fun getResources ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources;
public final fun getTasks ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks;
public final fun getTools ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
@ -4403,6 +4559,97 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$R
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks {
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Companion;
public fun <init> ()V
public fun <init> (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests;)V
public synthetic fun <init> (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Lkotlinx/serialization/json/JsonObject;
public final fun component2 ()Lkotlinx/serialization/json/JsonObject;
public final fun component3 ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests;
public final fun copy (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks;
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks;
public fun equals (Ljava/lang/Object;)Z
public final fun getCancel ()Lkotlinx/serialization/json/JsonObject;
public final fun getList ()Lkotlinx/serialization/json/JsonObject;
public final fun getRequests ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$$serializer;
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks;
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/ServerCapabilities$Tasks;)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/ServerCapabilities$Tasks$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests {
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Companion;
public fun <init> ()V
public fun <init> (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Tools;)V
public synthetic fun <init> (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Tools;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Tools;
public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Tools;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests;
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Tools;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests;
public fun equals (Ljava/lang/Object;)Z
public final fun getTools ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Tools;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$$serializer;
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests;
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/ServerCapabilities$Tasks$Requests;)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/ServerCapabilities$Tasks$Requests$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Tools {
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Tools$Companion;
public fun <init> ()V
public fun <init> (Lkotlinx/serialization/json/JsonObject;)V
public synthetic fun <init> (Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Lkotlinx/serialization/json/JsonObject;
public final fun copy (Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Tools;
public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Tools;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Tools;
public fun equals (Ljava/lang/Object;)Z
public final fun getCall ()Lkotlinx/serialization/json/JsonObject;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Tools$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Tools$$serializer;
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks$Requests$Tools;
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/ServerCapabilities$Tasks$Requests$Tools;)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/ServerCapabilities$Tasks$Requests$Tools$Companion {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public final class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools {
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools$Companion;
public fun <init> ()V

View file

@ -38,7 +38,7 @@ import kotlinx.serialization.json.buildJsonObject
public class ClientCapabilitiesBuilder @PublishedApi internal constructor() {
private var sampling: ClientCapabilities.Sampling? = null
private var roots: ClientCapabilities.Roots? = null
private var elicitation: JsonObject? = null
private var elicitation: ClientCapabilities.Elicitation? = null
private var extensions: Map<String, JsonObject>? = null
private var experimental: JsonObject? = null
@ -47,7 +47,7 @@ public class ClientCapabilitiesBuilder @PublishedApi internal constructor() {
*
* Pass `ClientCapabilities.Sampling()` to enable base sampling with no sub-capabilities.
* Construct `ClientCapabilities.Sampling(tools = EmptyJsonObject, context = EmptyJsonObject)`
* directly to enable SEP-1577 sub-capabilities.
* directly to enable tools/context sub-capabilities.
*
* Example:
* ```kotlin
@ -99,26 +99,10 @@ public class ClientCapabilitiesBuilder @PublishedApi internal constructor() {
*
* @param value The elicitation capability configuration
*/
public fun elicitation(value: JsonObject) {
public fun elicitation(value: ClientCapabilities.Elicitation) {
this.elicitation = value
}
/**
* Indicates that the client supports elicitation from the server with custom configuration.
*
* Example:
* ```kotlin
* capabilities {
* elicitation {
* put("mode", JsonPrimitive("interactive"))
* }
* }
* ```
*
* @param block Lambda for building the elicitation configuration
*/
public fun elicitation(block: JsonObjectBuilder.() -> Unit): Unit = elicitation(buildJsonObject(block))
/**
* Defines extensions that the client supports.
*

View file

@ -41,9 +41,11 @@ public data class Implementation(
* supports that capability.
*
* @property sampling Present if the client supports sampling from an LLM.
* Use [ClientCapabilities.Sampling] to configure SEP-1577 sub-capabilities (tools, context).
* Use [ClientCapabilities.Sampling] to configure tools/context sub-capabilities.
* @property roots Present if the client supports listing roots.
* @property elicitation Present if the client supports elicitation from the server.
* Use [ClientCapabilities.Elicitation] to configure form/url mode sub-capabilities.
* @property tasks Present if the client supports task-augmented requests, listing, or cancellation.
* @property experimental Experimental, non-standard capabilities that the client supports.
* Keys are capability names, values are capability-specific configuration objects.
* @property extensions Optional extensions that the client supports.
@ -54,23 +56,33 @@ public data class Implementation(
public data class ClientCapabilities(
public val sampling: Sampling? = null,
public val roots: Roots? = null,
public val elicitation: JsonObject? = null,
public val elicitation: Elicitation? = null,
public val tasks: Tasks? = null,
public val experimental: JsonObject? = null,
public val extensions: Map<String, JsonObject>? = null,
) {
/**
* Source-compatibility constructor retaining the pre-SEP-1577 `sampling: JsonObject?`
* shape. Any non-null [sampling] is converted to an empty [Sampling] (sub-capabilities
* cannot be recovered from the old opaque `JsonObject`).
* Source-compatibility constructor retaining the older `sampling: JsonObject?` /
* `elicitation: JsonObject?` shapes. Any non-null [sampling] is converted to an
* empty [Sampling], and any non-null [elicitation] is converted to an empty
* [Elicitation] (sub-capabilities cannot be recovered from the old opaque
* `JsonObject`).
*/
@Deprecated(
"ClientCapabilities.sampling is now typed. Pass a ClientCapabilities.Sampling? " +
"ClientCapabilities.sampling and ClientCapabilities.elicitation are now typed. " +
"Pass typed ClientCapabilities.Sampling? / ClientCapabilities.Elicitation? " +
"instead of JsonObject?.",
ReplaceWith(
"ClientCapabilities(sampling?.let { ClientCapabilities.Sampling() }, " +
"roots, elicitation, experimental, extensions)",
"ClientCapabilities(" +
"sampling?.let { ClientCapabilities.Sampling() }, " +
"roots, " +
"elicitation?.let { ClientCapabilities.Elicitation() }, " +
"tasks = null, " +
"experimental = experimental, " +
"extensions = extensions)",
),
level = DeprecationLevel.WARNING,
)
public constructor(
sampling: JsonObject?,
@ -81,7 +93,8 @@ public data class ClientCapabilities(
) : this(
sampling = sampling?.let { Sampling() },
roots = roots,
elicitation = elicitation,
elicitation = elicitation?.let { Elicitation() },
tasks = null,
experimental = experimental,
extensions = extensions,
)
@ -101,11 +114,11 @@ public data class ClientCapabilities(
/**
* @property sampling convenience value to enable the base sampling capability with no sub-capabilities
* @property elicitation convenience value to enable the elicitation capability
* @property elicitation convenience value to enable the elicitation capability with default form mode
*/
public companion object {
public val sampling: Sampling = Sampling()
public val elicitation: JsonObject = EmptyJsonObject
public val elicitation: Elicitation = Elicitation()
}
/**
@ -120,6 +133,60 @@ public data class ClientCapabilities(
*/
@Serializable
public data class Roots(val listChanged: Boolean? = null)
/**
* Sub-capabilities for elicitation.
*
* An empty [Elicitation] (both fields null) is equivalent to declaring `form` mode only.
*
* @property form Present if the client supports form-mode elicitation
* (in-band structured data collection).
* @property url Present if the client supports url-mode elicitation
* (out-of-band interaction via URL navigation).
*/
@Serializable
public data class Elicitation(public val form: JsonObject? = null, public val url: JsonObject? = null)
/**
* Sub-capabilities for tasks (client side).
*
* Declares which client-side requests can be augmented with task execution,
* and whether the client supports listing and cancelling tasks.
*
* @property list Present if the client supports the `tasks/list` operation.
* @property cancel Present if the client supports the `tasks/cancel` operation.
* @property requests Present if the client supports task-augmented sampling and/or elicitation requests.
*/
@Serializable
public data class Tasks(
public val list: JsonObject? = null,
public val cancel: JsonObject? = null,
public val requests: Requests? = null,
) {
/**
* Task-augmentable client-side request categories.
*
* @property sampling Present if the client supports task-augmented `sampling/createMessage` requests.
* @property elicitation Present if the client supports task-augmented `elicitation/create` requests.
*/
@Serializable
public data class Requests(
public val sampling: Sampling? = null,
public val elicitation: Elicitation? = null,
) {
/**
* @property createMessage Present if the client supports task-augmented `sampling/createMessage` requests.
*/
@Serializable
public data class Sampling(public val createMessage: JsonObject? = null)
/**
* @property create Present if the client supports task-augmented `elicitation/create` requests.
*/
@Serializable
public data class Elicitation(public val create: JsonObject? = null)
}
}
}
/**
@ -137,6 +204,7 @@ public data class ClientCapabilities(
* @property logging Present if the server supports sending log messages to the client.
* @property completions Present if the server supports argument autocompletion suggestions.
* Keys are capability names, values are capability-specific configuration objects.
* @property tasks Present if the server supports task-augmented requests, listing, or cancellation.
* @property experimental Experimental, non-standard capabilities that the server supports.
* @property extensions Optional extensions that the server supports.
* Keys are extension identifiers (e.g., `"io.modelcontextprotocol/ui"`),
@ -149,6 +217,7 @@ public data class ServerCapabilities(
val prompts: Prompts? = null,
val logging: JsonObject? = null,
val completions: JsonObject? = null,
val tasks: Tasks? = null,
val experimental: JsonObject? = null,
val extensions: Map<String, JsonObject>? = null,
) {
@ -199,4 +268,35 @@ public data class ServerCapabilities(
*/
@Serializable
public data class Prompts(val listChanged: Boolean? = null)
/**
* Sub-capabilities for tasks (server side).
*
* Declares which server-side requests can be augmented with task execution,
* and whether the server supports listing and cancelling tasks.
*
* @property list Present if the server supports the `tasks/list` operation.
* @property cancel Present if the server supports the `tasks/cancel` operation.
* @property requests Present if the server supports task-augmented tool call requests.
*/
@Serializable
public data class Tasks(
public val list: JsonObject? = null,
public val cancel: JsonObject? = null,
public val requests: Requests? = null,
) {
/**
* Task-augmentable server-side request categories.
*
* @property tools Present if the server supports task-augmented `tools/call` requests.
*/
@Serializable
public data class Requests(public val tools: Tools? = null) {
/**
* @property call Present if the server supports task-augmented `tools/call` requests.
*/
@Serializable
public data class Tools(public val call: JsonObject? = null)
}
}
}

View file

@ -313,7 +313,7 @@ class CapabilitiesTest {
assertEquals(ClientCapabilities.Sampling(), capabilities.sampling)
assertEquals(true, capabilities.roots?.listChanged)
assertEquals(EmptyJsonObject, capabilities.elicitation)
assertEquals(ClientCapabilities.Elicitation(), capabilities.elicitation)
}
@Test
@ -804,4 +804,123 @@ class CapabilitiesTest {
val caps = ClientCapabilities()
caps.sampling shouldBe null
}
@Test
fun `should serialize ServerCapabilities with tasks`() {
val capabilities = ServerCapabilities(
tasks = ServerCapabilities.Tasks(
list = EmptyJsonObject,
cancel = EmptyJsonObject,
requests = ServerCapabilities.Tasks.Requests(
tools = ServerCapabilities.Tasks.Requests.Tools(call = EmptyJsonObject),
),
),
)
verifySerialization(
capabilities,
McpJson,
"""
{
"tasks": {
"list": {},
"cancel": {},
"requests": {
"tools": {
"call": {}
}
}
}
}
""".trimIndent(),
)
}
@Test
fun `should deserialize ServerCapabilities with tasks`() {
val json = """
{
"tasks": {
"list": {},
"requests": {"tools": {"call": {}}}
}
}
""".trimIndent()
val capabilities = verifyDeserialization<ServerCapabilities>(McpJson, json)
assertEquals(EmptyJsonObject, capabilities.tasks?.list)
assertNull(capabilities.tasks?.cancel)
assertEquals(EmptyJsonObject, capabilities.tasks?.requests?.tools?.call)
}
@Test
fun `should serialize ClientCapabilities with tasks`() {
val capabilities = ClientCapabilities(
tasks = ClientCapabilities.Tasks(
list = EmptyJsonObject,
cancel = EmptyJsonObject,
requests = ClientCapabilities.Tasks.Requests(
sampling = ClientCapabilities.Tasks.Requests.Sampling(createMessage = EmptyJsonObject),
elicitation = ClientCapabilities.Tasks.Requests.Elicitation(create = EmptyJsonObject),
),
),
)
verifySerialization(
capabilities,
McpJson,
"""
{
"tasks": {
"list": {},
"cancel": {},
"requests": {
"sampling": {"createMessage": {}},
"elicitation": {"create": {}}
}
}
}
""".trimIndent(),
)
}
@Test
fun `should serialize ClientCapabilities with structured elicitation form and url`() {
val capabilities = ClientCapabilities(
elicitation = ClientCapabilities.Elicitation(form = EmptyJsonObject, url = EmptyJsonObject),
)
verifySerialization(
capabilities,
McpJson,
"""
{
"elicitation": {
"form": {},
"url": {}
}
}
""".trimIndent(),
)
}
@Test
fun `should deserialize ClientCapabilities with elicitation and tasks`() {
val json = """
{
"elicitation": {"form": {}, "url": {}},
"tasks": {
"list": {},
"cancel": {},
"requests": {
"sampling": {"createMessage": {}},
"elicitation": {"create": {}}
}
}
}
""".trimIndent()
val capabilities = verifyDeserialization<ClientCapabilities>(McpJson, json)
assertEquals(EmptyJsonObject, capabilities.elicitation?.form)
assertEquals(EmptyJsonObject, capabilities.elicitation?.url)
assertEquals(EmptyJsonObject, capabilities.tasks?.list)
assertEquals(EmptyJsonObject, capabilities.tasks?.cancel)
assertEquals(EmptyJsonObject, capabilities.tasks?.requests?.sampling?.createMessage)
assertEquals(EmptyJsonObject, capabilities.tasks?.requests?.elicitation?.create)
}
}

View file

@ -44,11 +44,7 @@ class CapabilitiesDslTest {
capabilities {
sampling(ClientCapabilities.Sampling(tools = EmptyJsonObject))
roots(listChanged = true)
elicitation {
put("mode", "interactive")
put("timeout", 30)
put("retries", 3)
}
elicitation(ClientCapabilities.Elicitation(form = EmptyJsonObject, url = EmptyJsonObject))
experimental {
put("customFeature", true)
put("version", "1.0")
@ -74,9 +70,8 @@ class CapabilitiesDslTest {
listChanged shouldBe true
}
elicitation shouldNotBeNull {
get("mode")?.jsonPrimitive?.content shouldBe "interactive"
get("timeout")?.jsonPrimitive?.content shouldBe "30"
get("retries")?.jsonPrimitive?.content shouldBe "3"
form shouldBe EmptyJsonObject
url shouldBe EmptyJsonObject
}
experimental shouldNotBeNull {
get("customFeature")?.jsonPrimitive?.content shouldBe "true"

View file

@ -22,9 +22,7 @@ class InitializeDslTest {
capabilities {
sampling(ClientCapabilities.Sampling())
roots(listChanged = true)
elicitation {
put("mode", "interactive")
}
elicitation(ClientCapabilities.Elicitation(form = EmptyJsonObject))
experimental {
put("custom", true)
}
@ -46,7 +44,7 @@ class InitializeDslTest {
request.params.capabilities.shouldNotBeNull {
sampling shouldNotBeNull { }
roots?.listChanged shouldBe true
elicitation?.get("mode")?.jsonPrimitive?.content shouldBe "interactive"
elicitation?.form shouldBe EmptyJsonObject
experimental?.get("custom")?.jsonPrimitive?.content shouldBe "true"
extensions shouldNotBeNull {
get("io.modelcontextprotocol/ui") shouldBe EmptyJsonObject
@ -78,7 +76,7 @@ class InitializeDslTest {
@Test
fun `capabilities DSL should support direct typed values`() {
val samplingValue = ClientCapabilities.Sampling(tools = EmptyJsonObject)
val elicitationObj = buildJsonObject { put("key", "value") }
val elicitationValue = ClientCapabilities.Elicitation(form = EmptyJsonObject, url = EmptyJsonObject)
val experimentalObj = buildJsonObject { put("key", "value") }
val extensionsMap = mapOf(
"io.modelcontextprotocol/ui" to buildJsonObject { put("key", "value") },
@ -88,7 +86,7 @@ class InitializeDslTest {
protocolVersion = "1.0"
capabilities {
sampling(samplingValue)
elicitation(elicitationObj)
elicitation(elicitationValue)
experimental(experimentalObj)
extensions(extensionsMap)
}
@ -97,7 +95,7 @@ class InitializeDslTest {
request.params.capabilities.shouldNotBeNull {
sampling shouldBe samplingValue
elicitation shouldBe elicitationObj
elicitation shouldBe elicitationValue
experimental shouldBe experimentalObj
extensions shouldBe extensionsMap
}

View file

@ -172,6 +172,12 @@ public open class ServerSession(
}
}
Defined.TasksGet,
Defined.TasksResult,
Defined.TasksList,
Defined.TasksCancel,
-> assertTasksCapabilityForMethod(method)
Defined.Ping -> {
// No specific capability required
}
@ -182,6 +188,28 @@ public open class ServerSession(
}
}
private fun assertTasksCapabilityForMethod(method: Method) {
val tasks = clientCapabilities?.tasks
?: error("Client does not support tasks (required for ${method.value})")
when (method) {
Defined.TasksList -> {
if (tasks.list == null) {
error("Client does not support listing tasks (required for ${method.value})")
}
}
Defined.TasksCancel -> {
if (tasks.cancel == null) {
error("Client does not support cancelling tasks (required for ${method.value})")
}
}
else -> {
// TasksGet, TasksResult: base tasks capability suffices.
}
}
}
/**
* Asserts that the server can handle the specified notification method.
*
@ -225,6 +253,12 @@ public open class ServerSession(
}
}
Defined.NotificationsTasksStatus -> {
if (serverCapabilities.tasks == null) {
error("Server does not support tasks (required for ${method.value})")
}
}
Defined.NotificationsCancelled,
Defined.NotificationsProgress,
-> {

View file

@ -0,0 +1,147 @@
package io.modelcontextprotocol.kotlin.sdk.server
import io.kotest.matchers.string.shouldContain
import io.modelcontextprotocol.kotlin.sdk.shared.Transport
import io.modelcontextprotocol.kotlin.sdk.shared.TransportSendOptions
import io.modelcontextprotocol.kotlin.sdk.types.ClientCapabilities
import io.modelcontextprotocol.kotlin.sdk.types.Implementation
import io.modelcontextprotocol.kotlin.sdk.types.InitializeRequest
import io.modelcontextprotocol.kotlin.sdk.types.InitializeRequestParams
import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage
import io.modelcontextprotocol.kotlin.sdk.types.LATEST_PROTOCOL_VERSION
import io.modelcontextprotocol.kotlin.sdk.types.Method
import io.modelcontextprotocol.kotlin.sdk.types.RequestId
import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities
import io.modelcontextprotocol.kotlin.sdk.types.toJSON
import kotlinx.coroutines.test.runTest
import kotlin.test.Test
import kotlin.test.assertFailsWith
/**
* Tests for the protected helpers [ServerSession.assertCapabilityForMethod] and
* [ServerSession.assertNotificationCapability].
*
* Both helpers are `protected`, so this suite uses a small subclass [TestServerSession]
* that re-exports them via [TestServerSession.exposedAssertCapabilityForMethod] and
* [TestServerSession.exposedAssertNotificationCapability]. Client capabilities are
* seeded by replaying an [InitializeRequest] through [InitializeReplayTransport]:
* the transport drives the inbound side of the handshake on `start()`, which causes
* the session's internal [Method.Defined.Initialize] handler to populate
* [ServerSession.clientCapabilities].
*/
class ServerSessionAssertCapabilityTest {
@Test
fun `server TasksGet throws when client has no tasks capability`() = runTest {
val session = newTestServerSession(clientCapabilities = ClientCapabilities())
val ex = assertFailsWith<IllegalStateException> {
session.exposedAssertCapabilityForMethod(Method.Defined.TasksGet)
}
ex.message.orEmpty() shouldContain "Client does not support tasks"
}
@Test
fun `server TasksGet succeeds when client declared tasks`() = runTest {
val session = newTestServerSession(
clientCapabilities = ClientCapabilities(tasks = ClientCapabilities.Tasks()),
)
session.exposedAssertCapabilityForMethod(Method.Defined.TasksGet)
}
@Test
fun `server TasksList throws when client tasks list is null`() = runTest {
val session = newTestServerSession(
clientCapabilities = ClientCapabilities(tasks = ClientCapabilities.Tasks()),
)
val ex = assertFailsWith<IllegalStateException> {
session.exposedAssertCapabilityForMethod(Method.Defined.TasksList)
}
ex.message.orEmpty() shouldContain "Client does not support listing tasks"
}
@Test
fun `server TasksCancel throws when client tasks cancel is null`() = runTest {
val session = newTestServerSession(
clientCapabilities = ClientCapabilities(tasks = ClientCapabilities.Tasks()),
)
val ex = assertFailsWith<IllegalStateException> {
session.exposedAssertCapabilityForMethod(Method.Defined.TasksCancel)
}
ex.message.orEmpty() shouldContain "Client does not support cancelling tasks"
}
@Test
fun `server NotificationsTasksStatus throws when server has no tasks capability`() = runTest {
val session = newTestServerSession(serverCapabilities = ServerCapabilities())
val ex = assertFailsWith<IllegalStateException> {
session.exposedAssertNotificationCapability(Method.Defined.NotificationsTasksStatus)
}
ex.message.orEmpty() shouldContain "Server does not support tasks"
}
private suspend fun newTestServerSession(
clientCapabilities: ClientCapabilities = ClientCapabilities(),
serverCapabilities: ServerCapabilities = ServerCapabilities(),
): TestServerSession {
val session = TestServerSession(
serverInfo = Implementation("test-server", "1.0.0"),
options = ServerOptions(capabilities = serverCapabilities),
instructions = null,
)
val transport = InitializeReplayTransport(clientCapabilities)
session.connect(transport)
return session
}
/**
* Test-only [ServerSession] subclass that exposes the protected
* [ServerSession.assertCapabilityForMethod] and
* [ServerSession.assertNotificationCapability] helpers to the test code.
*/
private class TestServerSession(serverInfo: Implementation, options: ServerOptions, instructions: String?) :
ServerSession(serverInfo, options, instructions) {
fun exposedAssertCapabilityForMethod(method: Method): Unit = assertCapabilityForMethod(method)
fun exposedAssertNotificationCapability(method: Method): Unit = assertNotificationCapability(method)
}
/**
* Minimal in-memory [Transport] that drives the server-side initialize handshake.
*
* On [start], it dispatches an [InitializeRequest] carrying the configured
* [clientCapabilities] to the session via [onMessage]. The session's internal
* `initialize` handler runs synchronously and populates
* [ServerSession.clientCapabilities] before [start] returns. Other JSON-RPC
* traffic the session subsequently emits is silently consumed.
*/
private class InitializeReplayTransport(private val clientCapabilities: ClientCapabilities) : Transport {
private var onMessageBlock: (suspend (JSONRPCMessage) -> Unit)? = null
private var onCloseBlock: (() -> Unit)? = null
override suspend fun start() {
val initializeRequest = InitializeRequest(
params = InitializeRequestParams(
protocolVersion = LATEST_PROTOCOL_VERSION,
capabilities = clientCapabilities,
clientInfo = Implementation("mock-client", "1.0.0"),
),
).toJSON().copy(id = RequestId.NumberId(1))
onMessageBlock?.invoke(initializeRequest)
}
override suspend fun send(message: JSONRPCMessage, options: TransportSendOptions?) = Unit
override suspend fun close() {
onCloseBlock?.invoke()
}
override fun onMessage(block: suspend (JSONRPCMessage) -> Unit) {
onMessageBlock = block
}
override fun onClose(block: () -> Unit) {
onCloseBlock = block
}
override fun onError(block: (Throwable) -> Unit) = Unit
}
}