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:
parent
664f51b9cc
commit
ebc53f0ded
11 changed files with 872 additions and 65 deletions
|
|
@ -1058,7 +1058,7 @@ class ClientTest {
|
||||||
Implementation(name = "test client", version = "1.0"),
|
Implementation(name = "test client", version = "1.0"),
|
||||||
ClientOptions(
|
ClientOptions(
|
||||||
capabilities = ClientCapabilities(
|
capabilities = ClientCapabilities(
|
||||||
elicitation = EmptyJsonObject,
|
elicitation = ClientCapabilities.Elicitation(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
@ -1270,7 +1270,7 @@ class ClientTest {
|
||||||
): Pair<Client, ServerSession> = kotlinx.coroutines.coroutineScope {
|
): Pair<Client, ServerSession> = kotlinx.coroutines.coroutineScope {
|
||||||
val client = Client(
|
val client = Client(
|
||||||
Implementation(name = "test client", version = "1.0"),
|
Implementation(name = "test client", version = "1.0"),
|
||||||
ClientOptions(capabilities = ClientCapabilities(elicitation = EmptyJsonObject)),
|
ClientOptions(capabilities = ClientCapabilities(elicitation = ClientCapabilities.Elicitation())),
|
||||||
)
|
)
|
||||||
client.setElicitationHandler(handler)
|
client.setElicitationHandler(handler)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -174,6 +174,7 @@ public open class Client(private val clientInfo: Implementation, options: Client
|
||||||
"prompts" -> caps?.prompts != null
|
"prompts" -> caps?.prompts != null
|
||||||
"resources" -> caps?.resources != null
|
"resources" -> caps?.resources != null
|
||||||
"tools" -> caps?.tools != null
|
"tools" -> caps?.tools != null
|
||||||
|
"tasks" -> caps?.tasks != null
|
||||||
else -> true
|
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 -> {
|
Method.Defined.Initialize, Method.Defined.Ping -> {
|
||||||
// No specific capability required
|
// 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) {
|
override fun assertNotificationCapability(method: Method) {
|
||||||
when (method) {
|
when (method) {
|
||||||
Method.Defined.NotificationsRootsListChanged -> {
|
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.NotificationsInitialized,
|
||||||
Method.Defined.NotificationsCancelled,
|
Method.Defined.NotificationsCancelled,
|
||||||
Method.Defined.NotificationsProgress,
|
Method.Defined.NotificationsProgress,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -607,23 +607,25 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/CancelledNotificatio
|
||||||
public final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities {
|
public final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities {
|
||||||
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Companion;
|
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Companion;
|
||||||
public fun <init> ()V
|
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 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;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)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 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 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 component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Sampling;
|
||||||
public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;
|
public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;
|
||||||
public final fun component3 ()Lkotlinx/serialization/json/JsonObject;
|
public final fun component3 ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation;
|
||||||
public final fun component4 ()Lkotlinx/serialization/json/JsonObject;
|
public final fun component4 ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Tasks;
|
||||||
public final fun component5 ()Ljava/util/Map;
|
public final fun component5 ()Lkotlinx/serialization/json/JsonObject;
|
||||||
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 final fun component6 ()Ljava/util/Map;
|
||||||
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 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 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 getExperimental ()Lkotlinx/serialization/json/JsonObject;
|
||||||
public final fun getExtensions ()Ljava/util/Map;
|
public final fun getExtensions ()Ljava/util/Map;
|
||||||
public final fun getRoots ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;
|
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 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 hashCode ()I
|
||||||
public fun toString ()Ljava/lang/String;
|
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 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 getSampling ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Sampling;
|
||||||
public final fun serializer ()Lkotlinx/serialization/KSerializer;
|
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 final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots {
|
||||||
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots$Companion;
|
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots$Companion;
|
||||||
public fun <init> ()V
|
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 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 final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilitiesBuilder {
|
||||||
public fun <init> ()V
|
public fun <init> ()V
|
||||||
public final fun build ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;
|
public final fun build ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;
|
||||||
public final fun elicitation (Lkotlin/jvm/functions/Function1;)V
|
public final fun elicitation (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Elicitation;)V
|
||||||
public final fun elicitation (Lkotlinx/serialization/json/JsonObject;)V
|
|
||||||
public final fun experimental (Lkotlin/jvm/functions/Function1;)V
|
public final fun experimental (Lkotlin/jvm/functions/Function1;)V
|
||||||
public final fun experimental (Lkotlinx/serialization/json/JsonObject;)V
|
public final fun experimental (Lkotlinx/serialization/json/JsonObject;)V
|
||||||
public final fun extensions (Ljava/util/Map;)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 final class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities {
|
||||||
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Companion;
|
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Companion;
|
||||||
public fun <init> ()V
|
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 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;Lkotlinx/serialization/json/JsonObject;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)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 component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools;
|
||||||
public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources;
|
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 component3 ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts;
|
||||||
public final fun component4 ()Lkotlinx/serialization/json/JsonObject;
|
public final fun component4 ()Lkotlinx/serialization/json/JsonObject;
|
||||||
public final fun component5 ()Lkotlinx/serialization/json/JsonObject;
|
public final fun component5 ()Lkotlinx/serialization/json/JsonObject;
|
||||||
public final fun component6 ()Lkotlinx/serialization/json/JsonObject;
|
public final fun component6 ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tasks;
|
||||||
public final fun component7 ()Ljava/util/Map;
|
public final fun component7 ()Lkotlinx/serialization/json/JsonObject;
|
||||||
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 final fun component8 ()Ljava/util/Map;
|
||||||
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 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 fun equals (Ljava/lang/Object;)Z
|
||||||
public final fun getCompletions ()Lkotlinx/serialization/json/JsonObject;
|
public final fun getCompletions ()Lkotlinx/serialization/json/JsonObject;
|
||||||
public final fun getExperimental ()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 getLogging ()Lkotlinx/serialization/json/JsonObject;
|
||||||
public final fun getPrompts ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts;
|
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 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 final fun getTools ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools;
|
||||||
public fun hashCode ()I
|
public fun hashCode ()I
|
||||||
public fun toString ()Ljava/lang/String;
|
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 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 final class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools {
|
||||||
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools$Companion;
|
public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools$Companion;
|
||||||
public fun <init> ()V
|
public fun <init> ()V
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ import kotlinx.serialization.json.buildJsonObject
|
||||||
public class ClientCapabilitiesBuilder @PublishedApi internal constructor() {
|
public class ClientCapabilitiesBuilder @PublishedApi internal constructor() {
|
||||||
private var sampling: ClientCapabilities.Sampling? = null
|
private var sampling: ClientCapabilities.Sampling? = null
|
||||||
private var roots: ClientCapabilities.Roots? = 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 extensions: Map<String, JsonObject>? = null
|
||||||
private var experimental: 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.
|
* Pass `ClientCapabilities.Sampling()` to enable base sampling with no sub-capabilities.
|
||||||
* Construct `ClientCapabilities.Sampling(tools = EmptyJsonObject, context = EmptyJsonObject)`
|
* Construct `ClientCapabilities.Sampling(tools = EmptyJsonObject, context = EmptyJsonObject)`
|
||||||
* directly to enable SEP-1577 sub-capabilities.
|
* directly to enable tools/context sub-capabilities.
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
* ```kotlin
|
* ```kotlin
|
||||||
|
|
@ -99,26 +99,10 @@ public class ClientCapabilitiesBuilder @PublishedApi internal constructor() {
|
||||||
*
|
*
|
||||||
* @param value The elicitation capability configuration
|
* @param value The elicitation capability configuration
|
||||||
*/
|
*/
|
||||||
public fun elicitation(value: JsonObject) {
|
public fun elicitation(value: ClientCapabilities.Elicitation) {
|
||||||
this.elicitation = value
|
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.
|
* Defines extensions that the client supports.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -41,9 +41,11 @@ public data class Implementation(
|
||||||
* supports that capability.
|
* supports that capability.
|
||||||
*
|
*
|
||||||
* @property sampling Present if the client supports sampling from an LLM.
|
* @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 roots Present if the client supports listing roots.
|
||||||
* @property elicitation Present if the client supports elicitation from the server.
|
* @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.
|
* @property experimental Experimental, non-standard capabilities that the client supports.
|
||||||
* Keys are capability names, values are capability-specific configuration objects.
|
* Keys are capability names, values are capability-specific configuration objects.
|
||||||
* @property extensions Optional extensions that the client supports.
|
* @property extensions Optional extensions that the client supports.
|
||||||
|
|
@ -54,23 +56,33 @@ public data class Implementation(
|
||||||
public data class ClientCapabilities(
|
public data class ClientCapabilities(
|
||||||
public val sampling: Sampling? = null,
|
public val sampling: Sampling? = null,
|
||||||
public val roots: Roots? = 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 experimental: JsonObject? = null,
|
||||||
public val extensions: Map<String, JsonObject>? = null,
|
public val extensions: Map<String, JsonObject>? = null,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Source-compatibility constructor retaining the pre-SEP-1577 `sampling: JsonObject?`
|
* Source-compatibility constructor retaining the older `sampling: JsonObject?` /
|
||||||
* shape. Any non-null [sampling] is converted to an empty [Sampling] (sub-capabilities
|
* `elicitation: JsonObject?` shapes. Any non-null [sampling] is converted to an
|
||||||
* cannot be recovered from the old opaque `JsonObject`).
|
* empty [Sampling], and any non-null [elicitation] is converted to an empty
|
||||||
|
* [Elicitation] (sub-capabilities cannot be recovered from the old opaque
|
||||||
|
* `JsonObject`).
|
||||||
*/
|
*/
|
||||||
@Deprecated(
|
@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?.",
|
"instead of JsonObject?.",
|
||||||
ReplaceWith(
|
ReplaceWith(
|
||||||
"ClientCapabilities(sampling?.let { ClientCapabilities.Sampling() }, " +
|
"ClientCapabilities(" +
|
||||||
"roots, elicitation, experimental, extensions)",
|
"sampling?.let { ClientCapabilities.Sampling() }, " +
|
||||||
|
"roots, " +
|
||||||
|
"elicitation?.let { ClientCapabilities.Elicitation() }, " +
|
||||||
|
"tasks = null, " +
|
||||||
|
"experimental = experimental, " +
|
||||||
|
"extensions = extensions)",
|
||||||
),
|
),
|
||||||
|
level = DeprecationLevel.WARNING,
|
||||||
)
|
)
|
||||||
public constructor(
|
public constructor(
|
||||||
sampling: JsonObject?,
|
sampling: JsonObject?,
|
||||||
|
|
@ -81,7 +93,8 @@ public data class ClientCapabilities(
|
||||||
) : this(
|
) : this(
|
||||||
sampling = sampling?.let { Sampling() },
|
sampling = sampling?.let { Sampling() },
|
||||||
roots = roots,
|
roots = roots,
|
||||||
elicitation = elicitation,
|
elicitation = elicitation?.let { Elicitation() },
|
||||||
|
tasks = null,
|
||||||
experimental = experimental,
|
experimental = experimental,
|
||||||
extensions = extensions,
|
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 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 companion object {
|
||||||
public val sampling: Sampling = Sampling()
|
public val sampling: Sampling = Sampling()
|
||||||
public val elicitation: JsonObject = EmptyJsonObject
|
public val elicitation: Elicitation = Elicitation()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -120,6 +133,60 @@ public data class ClientCapabilities(
|
||||||
*/
|
*/
|
||||||
@Serializable
|
@Serializable
|
||||||
public data class Roots(val listChanged: Boolean? = null)
|
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 logging Present if the server supports sending log messages to the client.
|
||||||
* @property completions Present if the server supports argument autocompletion suggestions.
|
* @property completions Present if the server supports argument autocompletion suggestions.
|
||||||
* Keys are capability names, values are capability-specific configuration objects.
|
* 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 experimental Experimental, non-standard capabilities that the server supports.
|
||||||
* @property extensions Optional extensions that the server supports.
|
* @property extensions Optional extensions that the server supports.
|
||||||
* Keys are extension identifiers (e.g., `"io.modelcontextprotocol/ui"`),
|
* Keys are extension identifiers (e.g., `"io.modelcontextprotocol/ui"`),
|
||||||
|
|
@ -149,6 +217,7 @@ public data class ServerCapabilities(
|
||||||
val prompts: Prompts? = null,
|
val prompts: Prompts? = null,
|
||||||
val logging: JsonObject? = null,
|
val logging: JsonObject? = null,
|
||||||
val completions: JsonObject? = null,
|
val completions: JsonObject? = null,
|
||||||
|
val tasks: Tasks? = null,
|
||||||
val experimental: JsonObject? = null,
|
val experimental: JsonObject? = null,
|
||||||
val extensions: Map<String, JsonObject>? = null,
|
val extensions: Map<String, JsonObject>? = null,
|
||||||
) {
|
) {
|
||||||
|
|
@ -199,4 +268,35 @@ public data class ServerCapabilities(
|
||||||
*/
|
*/
|
||||||
@Serializable
|
@Serializable
|
||||||
public data class Prompts(val listChanged: Boolean? = null)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -313,7 +313,7 @@ class CapabilitiesTest {
|
||||||
|
|
||||||
assertEquals(ClientCapabilities.Sampling(), capabilities.sampling)
|
assertEquals(ClientCapabilities.Sampling(), capabilities.sampling)
|
||||||
assertEquals(true, capabilities.roots?.listChanged)
|
assertEquals(true, capabilities.roots?.listChanged)
|
||||||
assertEquals(EmptyJsonObject, capabilities.elicitation)
|
assertEquals(ClientCapabilities.Elicitation(), capabilities.elicitation)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -804,4 +804,123 @@ class CapabilitiesTest {
|
||||||
val caps = ClientCapabilities()
|
val caps = ClientCapabilities()
|
||||||
caps.sampling shouldBe null
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -44,11 +44,7 @@ class CapabilitiesDslTest {
|
||||||
capabilities {
|
capabilities {
|
||||||
sampling(ClientCapabilities.Sampling(tools = EmptyJsonObject))
|
sampling(ClientCapabilities.Sampling(tools = EmptyJsonObject))
|
||||||
roots(listChanged = true)
|
roots(listChanged = true)
|
||||||
elicitation {
|
elicitation(ClientCapabilities.Elicitation(form = EmptyJsonObject, url = EmptyJsonObject))
|
||||||
put("mode", "interactive")
|
|
||||||
put("timeout", 30)
|
|
||||||
put("retries", 3)
|
|
||||||
}
|
|
||||||
experimental {
|
experimental {
|
||||||
put("customFeature", true)
|
put("customFeature", true)
|
||||||
put("version", "1.0")
|
put("version", "1.0")
|
||||||
|
|
@ -74,9 +70,8 @@ class CapabilitiesDslTest {
|
||||||
listChanged shouldBe true
|
listChanged shouldBe true
|
||||||
}
|
}
|
||||||
elicitation shouldNotBeNull {
|
elicitation shouldNotBeNull {
|
||||||
get("mode")?.jsonPrimitive?.content shouldBe "interactive"
|
form shouldBe EmptyJsonObject
|
||||||
get("timeout")?.jsonPrimitive?.content shouldBe "30"
|
url shouldBe EmptyJsonObject
|
||||||
get("retries")?.jsonPrimitive?.content shouldBe "3"
|
|
||||||
}
|
}
|
||||||
experimental shouldNotBeNull {
|
experimental shouldNotBeNull {
|
||||||
get("customFeature")?.jsonPrimitive?.content shouldBe "true"
|
get("customFeature")?.jsonPrimitive?.content shouldBe "true"
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,7 @@ class InitializeDslTest {
|
||||||
capabilities {
|
capabilities {
|
||||||
sampling(ClientCapabilities.Sampling())
|
sampling(ClientCapabilities.Sampling())
|
||||||
roots(listChanged = true)
|
roots(listChanged = true)
|
||||||
elicitation {
|
elicitation(ClientCapabilities.Elicitation(form = EmptyJsonObject))
|
||||||
put("mode", "interactive")
|
|
||||||
}
|
|
||||||
experimental {
|
experimental {
|
||||||
put("custom", true)
|
put("custom", true)
|
||||||
}
|
}
|
||||||
|
|
@ -46,7 +44,7 @@ class InitializeDslTest {
|
||||||
request.params.capabilities.shouldNotBeNull {
|
request.params.capabilities.shouldNotBeNull {
|
||||||
sampling shouldNotBeNull { }
|
sampling shouldNotBeNull { }
|
||||||
roots?.listChanged shouldBe true
|
roots?.listChanged shouldBe true
|
||||||
elicitation?.get("mode")?.jsonPrimitive?.content shouldBe "interactive"
|
elicitation?.form shouldBe EmptyJsonObject
|
||||||
experimental?.get("custom")?.jsonPrimitive?.content shouldBe "true"
|
experimental?.get("custom")?.jsonPrimitive?.content shouldBe "true"
|
||||||
extensions shouldNotBeNull {
|
extensions shouldNotBeNull {
|
||||||
get("io.modelcontextprotocol/ui") shouldBe EmptyJsonObject
|
get("io.modelcontextprotocol/ui") shouldBe EmptyJsonObject
|
||||||
|
|
@ -78,7 +76,7 @@ class InitializeDslTest {
|
||||||
@Test
|
@Test
|
||||||
fun `capabilities DSL should support direct typed values`() {
|
fun `capabilities DSL should support direct typed values`() {
|
||||||
val samplingValue = ClientCapabilities.Sampling(tools = EmptyJsonObject)
|
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 experimentalObj = buildJsonObject { put("key", "value") }
|
||||||
val extensionsMap = mapOf(
|
val extensionsMap = mapOf(
|
||||||
"io.modelcontextprotocol/ui" to buildJsonObject { put("key", "value") },
|
"io.modelcontextprotocol/ui" to buildJsonObject { put("key", "value") },
|
||||||
|
|
@ -88,7 +86,7 @@ class InitializeDslTest {
|
||||||
protocolVersion = "1.0"
|
protocolVersion = "1.0"
|
||||||
capabilities {
|
capabilities {
|
||||||
sampling(samplingValue)
|
sampling(samplingValue)
|
||||||
elicitation(elicitationObj)
|
elicitation(elicitationValue)
|
||||||
experimental(experimentalObj)
|
experimental(experimentalObj)
|
||||||
extensions(extensionsMap)
|
extensions(extensionsMap)
|
||||||
}
|
}
|
||||||
|
|
@ -97,7 +95,7 @@ class InitializeDslTest {
|
||||||
|
|
||||||
request.params.capabilities.shouldNotBeNull {
|
request.params.capabilities.shouldNotBeNull {
|
||||||
sampling shouldBe samplingValue
|
sampling shouldBe samplingValue
|
||||||
elicitation shouldBe elicitationObj
|
elicitation shouldBe elicitationValue
|
||||||
experimental shouldBe experimentalObj
|
experimental shouldBe experimentalObj
|
||||||
extensions shouldBe extensionsMap
|
extensions shouldBe extensionsMap
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -172,6 +172,12 @@ public open class ServerSession(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Defined.TasksGet,
|
||||||
|
Defined.TasksResult,
|
||||||
|
Defined.TasksList,
|
||||||
|
Defined.TasksCancel,
|
||||||
|
-> assertTasksCapabilityForMethod(method)
|
||||||
|
|
||||||
Defined.Ping -> {
|
Defined.Ping -> {
|
||||||
// No specific capability required
|
// 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.
|
* 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.NotificationsCancelled,
|
||||||
Defined.NotificationsProgress,
|
Defined.NotificationsProgress,
|
||||||
-> {
|
-> {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue