diff --git a/build.gradle.kts b/build.gradle.kts index 616b514e..f7f3ef4c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -38,8 +38,11 @@ kover { reports { filters { includes.classes("io.modelcontextprotocol.kotlin.sdk.*") - excludes.classes("io.modelcontextprotocol.kotlin.sdk.models.*") // temporary - excludes.classes("io.modelcontextprotocol.kotlin.sdk.models.infrastructure.*") // generated + excludes { + annotatedBy("kotlin.Deprecated") + classes("io.modelcontextprotocol.kotlin.sdk.models.*") // temporary + classes("io.modelcontextprotocol.kotlin.sdk.models.infrastructure.*") // generated + } } total { log { diff --git a/kotlin-sdk-client/api/kotlin-sdk-client.api b/kotlin-sdk-client/api/kotlin-sdk-client.api index 46a7b60d..7a1e0fad 100644 --- a/kotlin-sdk-client/api/kotlin-sdk-client.api +++ b/kotlin-sdk-client/api/kotlin-sdk-client.api @@ -1,53 +1,53 @@ public class io/modelcontextprotocol/kotlin/sdk/client/Client : io/modelcontextprotocol/kotlin/sdk/shared/Protocol { - public fun (Lio/modelcontextprotocol/kotlin/sdk/Implementation;Lio/modelcontextprotocol/kotlin/sdk/client/ClientOptions;)V - public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/Implementation;Lio/modelcontextprotocol/kotlin/sdk/client/ClientOptions;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Lio/modelcontextprotocol/kotlin/sdk/client/ClientOptions;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Lio/modelcontextprotocol/kotlin/sdk/client/ClientOptions;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun addRoot (Ljava/lang/String;Ljava/lang/String;)V public final fun addRoots (Ljava/util/List;)V protected final fun assertCapability (Ljava/lang/String;Ljava/lang/String;)V - protected fun assertCapabilityForMethod (Lio/modelcontextprotocol/kotlin/sdk/Method;)V - protected fun assertNotificationCapability (Lio/modelcontextprotocol/kotlin/sdk/Method;)V - public fun assertRequestHandlerCapability (Lio/modelcontextprotocol/kotlin/sdk/Method;)V - public final fun callTool (Lio/modelcontextprotocol/kotlin/sdk/CallToolRequest;ZLio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun callTool (Ljava/lang/String;Ljava/util/Map;Ljava/util/Map;ZLio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun callTool$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/CallToolRequest;ZLio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public static synthetic fun callTool$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Ljava/lang/String;Ljava/util/Map;Ljava/util/Map;ZLio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public final fun complete (Lio/modelcontextprotocol/kotlin/sdk/CompleteRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun complete$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/CompleteRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + protected fun assertCapabilityForMethod (Lio/modelcontextprotocol/kotlin/sdk/types/Method;)V + protected fun assertNotificationCapability (Lio/modelcontextprotocol/kotlin/sdk/types/Method;)V + public fun assertRequestHandlerCapability (Lio/modelcontextprotocol/kotlin/sdk/types/Method;)V + public final fun callTool (Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun callTool (Ljava/lang/String;Ljava/util/Map;Ljava/util/Map;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun callTool$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun callTool$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Ljava/lang/String;Ljava/util/Map;Ljava/util/Map;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun complete (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun complete$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public fun connect (Lio/modelcontextprotocol/kotlin/sdk/shared/Transport;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun getPrompt (Lio/modelcontextprotocol/kotlin/sdk/GetPromptRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun getPrompt$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/GetPromptRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public final fun getServerCapabilities ()Lio/modelcontextprotocol/kotlin/sdk/ServerCapabilities; + public final fun getPrompt (Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun getPrompt$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun getServerCapabilities ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities; public final fun getServerInstructions ()Ljava/lang/String; - public final fun getServerVersion ()Lio/modelcontextprotocol/kotlin/sdk/Implementation; - public final fun listPrompts (Lio/modelcontextprotocol/kotlin/sdk/ListPromptsRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun listPrompts$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/ListPromptsRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public final fun listResourceTemplates (Lio/modelcontextprotocol/kotlin/sdk/ListResourceTemplatesRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun listResourceTemplates$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/ListResourceTemplatesRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public final fun listResources (Lio/modelcontextprotocol/kotlin/sdk/ListResourcesRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun listResources$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/ListResourcesRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public final fun listTools (Lio/modelcontextprotocol/kotlin/sdk/ListToolsRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun listTools$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/ListToolsRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun getServerVersion ()Lio/modelcontextprotocol/kotlin/sdk/types/Implementation; + public final fun listPrompts (Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun listPrompts$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun listResourceTemplates (Lio/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun listResourceTemplates$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun listResources (Lio/modelcontextprotocol/kotlin/sdk/types/ListResourcesRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun listResources$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/types/ListResourcesRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun listTools (Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun listTools$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public final fun ping (Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static synthetic fun ping$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public final fun readResource (Lio/modelcontextprotocol/kotlin/sdk/ReadResourceRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun readResource$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/ReadResourceRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun readResource (Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun readResource$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public final fun removeRoot (Ljava/lang/String;)Z public final fun removeRoots (Ljava/util/List;)I public final fun sendRootsListChanged (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun setElicitationHandler (Lkotlin/jvm/functions/Function1;)V - public final fun setLoggingLevel (Lio/modelcontextprotocol/kotlin/sdk/LoggingLevel;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun setLoggingLevel$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/LoggingLevel;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public final fun subscribeResource (Lio/modelcontextprotocol/kotlin/sdk/SubscribeRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun subscribeResource$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/SubscribeRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public final fun unsubscribeResource (Lio/modelcontextprotocol/kotlin/sdk/UnsubscribeRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun unsubscribeResource$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/UnsubscribeRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun setLoggingLevel (Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun setLoggingLevel$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun subscribeResource (Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun subscribeResource$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun unsubscribeResource (Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun unsubscribeResource$default (Lio/modelcontextprotocol/kotlin/sdk/client/Client;Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; } public final class io/modelcontextprotocol/kotlin/sdk/client/ClientOptions : io/modelcontextprotocol/kotlin/sdk/shared/ProtocolOptions { public fun ()V - public fun (Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities;Z)V - public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getCapabilities ()Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;Z)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getCapabilities ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities; } public final class io/modelcontextprotocol/kotlin/sdk/client/KtorClientKt { @@ -61,14 +61,14 @@ public final class io/modelcontextprotocol/kotlin/sdk/client/SseClientTransport public synthetic fun (Lio/ktor/client/HttpClient;Ljava/lang/String;Lkotlin/time/Duration;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public synthetic fun (Lio/ktor/client/HttpClient;Ljava/lang/String;Lkotlin/time/Duration;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun close (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun send (Lio/modelcontextprotocol/kotlin/sdk/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun send (Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public fun start (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } public final class io/modelcontextprotocol/kotlin/sdk/client/StdioClientTransport : io/modelcontextprotocol/kotlin/sdk/shared/AbstractTransport { public fun (Lkotlinx/io/Source;Lkotlinx/io/Sink;)V public fun close (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun send (Lio/modelcontextprotocol/kotlin/sdk/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun send (Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public fun start (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } @@ -78,9 +78,9 @@ public final class io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClien public fun close (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun getProtocolVersion ()Ljava/lang/String; public final fun getSessionId ()Ljava/lang/String; - public final fun send (Lio/modelcontextprotocol/kotlin/sdk/JSONRPCMessage;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun send (Lio/modelcontextprotocol/kotlin/sdk/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun send$default (Lio/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransport;Lio/modelcontextprotocol/kotlin/sdk/JSONRPCMessage;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun send (Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun send (Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun send$default (Lio/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransport;Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public final fun setProtocolVersion (Ljava/lang/String;)V public fun start (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun terminateSession (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; diff --git a/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/Client.kt b/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/Client.kt index 8eb8957a..f0283c91 100644 --- a/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/Client.kt +++ b/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/Client.kt @@ -1,63 +1,59 @@ package io.modelcontextprotocol.kotlin.sdk.client import io.github.oshai.kotlinlogging.KotlinLogging -import io.modelcontextprotocol.kotlin.sdk.CallToolRequest -import io.modelcontextprotocol.kotlin.sdk.CallToolResult -import io.modelcontextprotocol.kotlin.sdk.CallToolResultBase -import io.modelcontextprotocol.kotlin.sdk.ClientCapabilities -import io.modelcontextprotocol.kotlin.sdk.CompatibilityCallToolResult -import io.modelcontextprotocol.kotlin.sdk.CompleteRequest -import io.modelcontextprotocol.kotlin.sdk.CompleteResult -import io.modelcontextprotocol.kotlin.sdk.CreateElicitationRequest -import io.modelcontextprotocol.kotlin.sdk.CreateElicitationResult -import io.modelcontextprotocol.kotlin.sdk.EmptyRequestResult -import io.modelcontextprotocol.kotlin.sdk.GetPromptRequest -import io.modelcontextprotocol.kotlin.sdk.GetPromptResult -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.InitializeRequest -import io.modelcontextprotocol.kotlin.sdk.InitializeResult -import io.modelcontextprotocol.kotlin.sdk.InitializedNotification -import io.modelcontextprotocol.kotlin.sdk.LATEST_PROTOCOL_VERSION -import io.modelcontextprotocol.kotlin.sdk.ListPromptsRequest -import io.modelcontextprotocol.kotlin.sdk.ListPromptsResult -import io.modelcontextprotocol.kotlin.sdk.ListResourceTemplatesRequest -import io.modelcontextprotocol.kotlin.sdk.ListResourceTemplatesResult -import io.modelcontextprotocol.kotlin.sdk.ListResourcesRequest -import io.modelcontextprotocol.kotlin.sdk.ListResourcesResult -import io.modelcontextprotocol.kotlin.sdk.ListRootsRequest -import io.modelcontextprotocol.kotlin.sdk.ListRootsResult -import io.modelcontextprotocol.kotlin.sdk.ListToolsRequest -import io.modelcontextprotocol.kotlin.sdk.ListToolsResult -import io.modelcontextprotocol.kotlin.sdk.LoggingLevel -import io.modelcontextprotocol.kotlin.sdk.LoggingMessageNotification.SetLevelRequest -import io.modelcontextprotocol.kotlin.sdk.Method -import io.modelcontextprotocol.kotlin.sdk.PingRequest -import io.modelcontextprotocol.kotlin.sdk.ReadResourceRequest -import io.modelcontextprotocol.kotlin.sdk.ReadResourceResult -import io.modelcontextprotocol.kotlin.sdk.Root -import io.modelcontextprotocol.kotlin.sdk.RootsListChangedNotification -import io.modelcontextprotocol.kotlin.sdk.SUPPORTED_PROTOCOL_VERSIONS -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities -import io.modelcontextprotocol.kotlin.sdk.SubscribeRequest -import io.modelcontextprotocol.kotlin.sdk.UnsubscribeRequest import io.modelcontextprotocol.kotlin.sdk.shared.Protocol import io.modelcontextprotocol.kotlin.sdk.shared.ProtocolOptions import io.modelcontextprotocol.kotlin.sdk.shared.RequestOptions import io.modelcontextprotocol.kotlin.sdk.shared.Transport +import io.modelcontextprotocol.kotlin.sdk.types.CallToolRequest +import io.modelcontextprotocol.kotlin.sdk.types.CallToolRequestParams +import io.modelcontextprotocol.kotlin.sdk.types.CallToolResult +import io.modelcontextprotocol.kotlin.sdk.types.ClientCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.CompleteRequest +import io.modelcontextprotocol.kotlin.sdk.types.CompleteResult +import io.modelcontextprotocol.kotlin.sdk.types.ElicitRequest +import io.modelcontextprotocol.kotlin.sdk.types.ElicitResult +import io.modelcontextprotocol.kotlin.sdk.types.EmptyResult +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptRequest +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptResult +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.InitializeResult +import io.modelcontextprotocol.kotlin.sdk.types.InitializedNotification +import io.modelcontextprotocol.kotlin.sdk.types.LATEST_PROTOCOL_VERSION +import io.modelcontextprotocol.kotlin.sdk.types.ListPromptsRequest +import io.modelcontextprotocol.kotlin.sdk.types.ListPromptsResult +import io.modelcontextprotocol.kotlin.sdk.types.ListResourceTemplatesRequest +import io.modelcontextprotocol.kotlin.sdk.types.ListResourceTemplatesResult +import io.modelcontextprotocol.kotlin.sdk.types.ListResourcesRequest +import io.modelcontextprotocol.kotlin.sdk.types.ListResourcesResult +import io.modelcontextprotocol.kotlin.sdk.types.ListRootsRequest +import io.modelcontextprotocol.kotlin.sdk.types.ListRootsResult +import io.modelcontextprotocol.kotlin.sdk.types.ListToolsRequest +import io.modelcontextprotocol.kotlin.sdk.types.ListToolsResult +import io.modelcontextprotocol.kotlin.sdk.types.LoggingLevel +import io.modelcontextprotocol.kotlin.sdk.types.Method +import io.modelcontextprotocol.kotlin.sdk.types.PingRequest +import io.modelcontextprotocol.kotlin.sdk.types.ReadResourceRequest +import io.modelcontextprotocol.kotlin.sdk.types.ReadResourceResult +import io.modelcontextprotocol.kotlin.sdk.types.RequestMeta +import io.modelcontextprotocol.kotlin.sdk.types.Root +import io.modelcontextprotocol.kotlin.sdk.types.RootsListChangedNotification +import io.modelcontextprotocol.kotlin.sdk.types.SUPPORTED_PROTOCOL_VERSIONS +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.SetLevelRequest +import io.modelcontextprotocol.kotlin.sdk.types.SetLevelRequestParams +import io.modelcontextprotocol.kotlin.sdk.types.SubscribeRequest +import io.modelcontextprotocol.kotlin.sdk.types.UnsubscribeRequest +import io.modelcontextprotocol.kotlin.sdk.types.toJson import kotlinx.atomicfu.atomic import kotlinx.atomicfu.getAndUpdate import kotlinx.atomicfu.update import kotlinx.collections.immutable.minus import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toPersistentSet -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.json.JsonElement -import kotlinx.serialization.json.JsonNull import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.json.JsonPrimitive -import kotlinx.serialization.json.add -import kotlinx.serialization.json.buildJsonArray -import kotlinx.serialization.json.buildJsonObject import kotlin.coroutines.cancellation.CancellationException private val logger = KotlinLogging.logger {} @@ -152,9 +148,11 @@ public open class Client(private val clientInfo: Implementation, options: Client try { val message = InitializeRequest( - protocolVersion = LATEST_PROTOCOL_VERSION, - capabilities = capabilities, - clientInfo = clientInfo, + InitializeRequestParams( + protocolVersion = LATEST_PROTOCOL_VERSION, + capabilities = capabilities, + clientInfo = clientInfo, + ), ) val result = request(message) @@ -293,8 +291,7 @@ public open class Client(private val clientInfo: Implementation, options: Client * @param options Optional request options. * @throws IllegalStateException If the server does not support the ping method (unlikely). */ - public suspend fun ping(options: RequestOptions? = null): EmptyRequestResult = - request(PingRequest(), options) + public suspend fun ping(options: RequestOptions? = null): EmptyResult = request(PingRequest(), options) /** * Sends a completion request to the server, typically to generate or complete some content. @@ -314,8 +311,8 @@ public open class Client(private val clientInfo: Implementation, options: Client * @param options Optional request options. * @throws IllegalStateException If the server does not support logging. */ - public suspend fun setLoggingLevel(level: LoggingLevel, options: RequestOptions? = null): EmptyRequestResult = - request(SetLevelRequest(level), options) + public suspend fun setLoggingLevel(level: LoggingLevel, options: RequestOptions? = null): EmptyResult = + request(SetLevelRequest(SetLevelRequestParams(level)), options) /** * Retrieves a prompt by name from the server. @@ -387,10 +384,8 @@ public open class Client(private val clientInfo: Implementation, options: Client * @param options Optional request options. * @throws IllegalStateException If the server does not support resource subscriptions. */ - public suspend fun subscribeResource( - request: SubscribeRequest, - options: RequestOptions? = null, - ): EmptyRequestResult = request(request, options) + public suspend fun subscribeResource(request: SubscribeRequest, options: RequestOptions? = null): EmptyResult = + request(request, options) /** * Unsubscribes from resource changes on the server. @@ -399,10 +394,8 @@ public open class Client(private val clientInfo: Implementation, options: Client * @param options Optional request options. * @throws IllegalStateException If the server does not support resource subscriptions. */ - public suspend fun unsubscribeResource( - request: UnsubscribeRequest, - options: RequestOptions? = null, - ): EmptyRequestResult = request(request, options) + public suspend fun unsubscribeResource(request: UnsubscribeRequest, options: RequestOptions? = null): EmptyResult = + request(request, options) /** * Calls a tool on the server by name, passing the specified arguments and metadata. @@ -413,7 +406,6 @@ public open class Client(private val clientInfo: Implementation, options: Client * - Optional prefix: dot-separated labels followed by slash (e.g., "api.example.com/") * - Name: alphanumeric start/end, may contain hyphens, underscores, dots, alphanumerics * - Reserved prefixes starting with "mcp" or "modelcontextprotocol" are forbidden - * @param compatibility Whether to use compatibility mode for older protocol versions. * @param options Optional request options. * @return The result of the tool call, or `null` if none. * @throws IllegalStateException If the server does not support tools. @@ -422,40 +414,33 @@ public open class Client(private val clientInfo: Implementation, options: Client name: String, arguments: Map, meta: Map = emptyMap(), - compatibility: Boolean = false, options: RequestOptions? = null, - ): CallToolResultBase? { + ): CallToolResult { validateMetaKeys(meta.keys) - val jsonArguments = convertToJsonMap(arguments) - val jsonMeta = convertToJsonMap(meta) + val jsonArguments = arguments.toJson() + val jsonMeta = meta.toJson() val request = CallToolRequest( - name = name, - arguments = JsonObject(jsonArguments), - _meta = JsonObject(jsonMeta), + CallToolRequestParams( + name = name, + arguments = JsonObject(jsonArguments), + meta = RequestMeta(JsonObject(jsonMeta)), + ), ) - return callTool(request, compatibility, options) + return callTool(request, options) } /** * Calls a tool on the server using a [CallToolRequest] object. * * @param request The request object containing the tool name and arguments. - * @param compatibility Whether to use compatibility mode for older protocol versions. * @param options Optional request options. * @return The result of the tool call, or `null` if none. * @throws IllegalStateException If the server does not support tools. */ - public suspend fun callTool( - request: CallToolRequest, - compatibility: Boolean = false, - options: RequestOptions? = null, - ): CallToolResultBase? = if (compatibility) { - request(request, options) - } else { - request(request, options) - } + public suspend fun callTool(request: CallToolRequest, options: RequestOptions? = null): CallToolResult = + request(request, options) /** * Lists all available tools on the server. @@ -570,14 +555,14 @@ public open class Client(private val clientInfo: Implementation, options: Client * @param handler The elicitation handler. * @throws IllegalStateException if the client does not support elicitation. */ - public fun setElicitationHandler(handler: (CreateElicitationRequest) -> CreateElicitationResult) { + public fun setElicitationHandler(handler: (ElicitRequest) -> ElicitResult) { if (capabilities.elicitation == null) { logger.error { "Failed to set elicitation handler: Client does not support elicitation" } throw IllegalStateException("Client does not support elicitation.") } logger.info { "Setting the elicitation handler" } - setRequestHandler(Method.Defined.ElicitationCreate) { request, _ -> + setRequestHandler(Method.Defined.ElicitationCreate) { request, _ -> handler(request) } } @@ -637,67 +622,4 @@ public open class Client(private val clientInfo: Implementation, options: Client } } } - - private fun convertToJsonMap(map: Map): Map = map.mapValues { (key, value) -> - try { - convertToJsonElement(value) - } catch (e: Exception) { - logger.warn { "Failed to convert value for key '$key': ${e.message}. Using string representation." } - JsonPrimitive(value.toString()) - } - } - - @OptIn(ExperimentalUnsignedTypes::class, ExperimentalSerializationApi::class) - private fun convertToJsonElement(value: Any?): JsonElement = when (value) { - null -> JsonNull - - is JsonElement -> value - - is String -> JsonPrimitive(value) - - is Number -> JsonPrimitive(value) - - is Boolean -> JsonPrimitive(value) - - is Char -> JsonPrimitive(value.toString()) - - is Enum<*> -> JsonPrimitive(value.name) - - is Map<*, *> -> buildJsonObject { value.forEach { (k, v) -> put(k.toString(), convertToJsonElement(v)) } } - - is Collection<*> -> buildJsonArray { value.forEach { add(convertToJsonElement(it)) } } - - is Array<*> -> buildJsonArray { value.forEach { add(convertToJsonElement(it)) } } - - // Primitive arrays - is IntArray -> buildJsonArray { value.forEach { add(it) } } - - is LongArray -> buildJsonArray { value.forEach { add(it) } } - - is FloatArray -> buildJsonArray { value.forEach { add(it) } } - - is DoubleArray -> buildJsonArray { value.forEach { add(it) } } - - is BooleanArray -> buildJsonArray { value.forEach { add(it) } } - - is ShortArray -> buildJsonArray { value.forEach { add(it) } } - - is ByteArray -> buildJsonArray { value.forEach { add(it) } } - - is CharArray -> buildJsonArray { value.forEach { add(it.toString()) } } - - // Unsigned arrays - is UIntArray -> buildJsonArray { value.forEach { add(JsonPrimitive(it)) } } - - is ULongArray -> buildJsonArray { value.forEach { add(JsonPrimitive(it)) } } - - is UShortArray -> buildJsonArray { value.forEach { add(JsonPrimitive(it)) } } - - is UByteArray -> buildJsonArray { value.forEach { add(JsonPrimitive(it)) } } - - else -> { - logger.debug { "Converting unknown type ${value::class} to string: $value" } - JsonPrimitive(value.toString()) - } - } } diff --git a/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/KtorClient.kt b/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/KtorClient.kt index ccc1496e..fe92e15f 100644 --- a/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/KtorClient.kt +++ b/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/KtorClient.kt @@ -2,9 +2,9 @@ package io.modelcontextprotocol.kotlin.sdk.client import io.ktor.client.HttpClient import io.ktor.client.request.HttpRequestBuilder -import io.modelcontextprotocol.kotlin.sdk.Implementation import io.modelcontextprotocol.kotlin.sdk.LIB_VERSION import io.modelcontextprotocol.kotlin.sdk.shared.IMPLEMENTATION_NAME +import io.modelcontextprotocol.kotlin.sdk.types.Implementation import kotlin.time.Duration /** diff --git a/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/SSEClientTransport.kt b/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/SSEClientTransport.kt index c0bcd546..f2b7d3dd 100644 --- a/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/SSEClientTransport.kt +++ b/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/SSEClientTransport.kt @@ -14,9 +14,9 @@ import io.ktor.http.Url import io.ktor.http.append import io.ktor.http.isSuccess import io.ktor.http.protocolWithAuthority -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage import io.modelcontextprotocol.kotlin.sdk.shared.AbstractTransport -import io.modelcontextprotocol.kotlin.sdk.shared.McpJson +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.McpJson import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineName diff --git a/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StdioClientTransport.kt b/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StdioClientTransport.kt index 583cec63..6e272eb3 100644 --- a/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StdioClientTransport.kt +++ b/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StdioClientTransport.kt @@ -1,11 +1,11 @@ package io.modelcontextprotocol.kotlin.sdk.client import io.github.oshai.kotlinlogging.KotlinLogging -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage import io.modelcontextprotocol.kotlin.sdk.internal.IODispatcher import io.modelcontextprotocol.kotlin.sdk.shared.AbstractTransport import io.modelcontextprotocol.kotlin.sdk.shared.ReadBuffer import io.modelcontextprotocol.kotlin.sdk.shared.serializeMessage +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job diff --git a/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransport.kt b/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransport.kt index f0939a3c..a4028745 100644 --- a/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransport.kt +++ b/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransport.kt @@ -21,13 +21,13 @@ import io.ktor.http.HttpStatusCode import io.ktor.http.contentType import io.ktor.http.isSuccess import io.ktor.utils.io.readUTF8Line -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage -import io.modelcontextprotocol.kotlin.sdk.JSONRPCNotification -import io.modelcontextprotocol.kotlin.sdk.JSONRPCRequest -import io.modelcontextprotocol.kotlin.sdk.JSONRPCResponse -import io.modelcontextprotocol.kotlin.sdk.RequestId import io.modelcontextprotocol.kotlin.sdk.shared.AbstractTransport -import io.modelcontextprotocol.kotlin.sdk.shared.McpJson +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCNotification +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCRequest +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCResponse +import io.modelcontextprotocol.kotlin.sdk.types.McpJson +import io.modelcontextprotocol.kotlin.sdk.types.RequestId import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope diff --git a/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpMcpKtorClientExtensions.kt b/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpMcpKtorClientExtensions.kt index 1a600a3a..b64a2206 100644 --- a/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpMcpKtorClientExtensions.kt +++ b/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpMcpKtorClientExtensions.kt @@ -2,9 +2,9 @@ package io.modelcontextprotocol.kotlin.sdk.client import io.ktor.client.HttpClient import io.ktor.client.request.HttpRequestBuilder -import io.modelcontextprotocol.kotlin.sdk.Implementation import io.modelcontextprotocol.kotlin.sdk.LIB_VERSION import io.modelcontextprotocol.kotlin.sdk.shared.IMPLEMENTATION_NAME +import io.modelcontextprotocol.kotlin.sdk.types.Implementation import kotlin.time.Duration /** diff --git a/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/WebSocketMcpKtorClientExtensions.kt b/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/WebSocketMcpKtorClientExtensions.kt index 86479533..a0df47c8 100644 --- a/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/WebSocketMcpKtorClientExtensions.kt +++ b/kotlin-sdk-client/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/client/WebSocketMcpKtorClientExtensions.kt @@ -3,9 +3,9 @@ package io.modelcontextprotocol.kotlin.sdk.client import io.github.oshai.kotlinlogging.KotlinLogging import io.ktor.client.HttpClient import io.ktor.client.request.HttpRequestBuilder -import io.modelcontextprotocol.kotlin.sdk.Implementation import io.modelcontextprotocol.kotlin.sdk.LIB_VERSION import io.modelcontextprotocol.kotlin.sdk.shared.IMPLEMENTATION_NAME +import io.modelcontextprotocol.kotlin.sdk.types.Implementation private val logger = KotlinLogging.logger {} diff --git a/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/ClientMetaParameterTest.kt b/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/ClientMetaParameterTest.kt index e7061073..600859fb 100644 --- a/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/ClientMetaParameterTest.kt +++ b/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/ClientMetaParameterTest.kt @@ -1,7 +1,7 @@ package io.modelcontextprotocol.kotlin.sdk.client -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.JSONRPCRequest +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCRequest import kotlinx.coroutines.test.runTest import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.boolean diff --git a/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/MockTransport.kt b/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/MockTransport.kt index c987619d..860ed147 100644 --- a/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/MockTransport.kt +++ b/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/MockTransport.kt @@ -1,13 +1,13 @@ package io.modelcontextprotocol.kotlin.sdk.client -import io.modelcontextprotocol.kotlin.sdk.CallToolResult -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.InitializeResult -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage -import io.modelcontextprotocol.kotlin.sdk.JSONRPCRequest -import io.modelcontextprotocol.kotlin.sdk.JSONRPCResponse -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities import io.modelcontextprotocol.kotlin.sdk.shared.Transport +import io.modelcontextprotocol.kotlin.sdk.types.CallToolResult +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.ServerCapabilities import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock diff --git a/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransportTest.kt b/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransportTest.kt index a72bd853..fea1de19 100644 --- a/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransportTest.kt +++ b/kotlin-sdk-client/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTransportTest.kt @@ -12,12 +12,12 @@ import io.ktor.http.HttpStatusCode import io.ktor.http.content.TextContent import io.ktor.http.headersOf import io.ktor.utils.io.ByteReadChannel -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage -import io.modelcontextprotocol.kotlin.sdk.JSONRPCNotification -import io.modelcontextprotocol.kotlin.sdk.JSONRPCRequest -import io.modelcontextprotocol.kotlin.sdk.RequestId -import io.modelcontextprotocol.kotlin.sdk.shared.McpJson +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCNotification +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCRequest +import io.modelcontextprotocol.kotlin.sdk.types.McpJson +import io.modelcontextprotocol.kotlin.sdk.types.RequestId import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.test.runTest diff --git a/kotlin-sdk-client/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/MockMcp.kt b/kotlin-sdk-client/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/MockMcp.kt index eef77f16..49d448d1 100644 --- a/kotlin-sdk-client/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/MockMcp.kt +++ b/kotlin-sdk-client/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/MockMcp.kt @@ -7,8 +7,8 @@ import io.ktor.http.ContentType import io.ktor.http.HttpMethod import io.ktor.http.HttpStatusCode import io.ktor.sse.ServerSentEvent -import io.modelcontextprotocol.kotlin.sdk.JSONRPCRequest -import io.modelcontextprotocol.kotlin.sdk.RequestId +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCRequest +import io.modelcontextprotocol.kotlin.sdk.types.RequestId import kotlinx.coroutines.flow.Flow import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject @@ -139,7 +139,7 @@ internal class MockMcp(verbose: Boolean = false) { is RequestId.NumberId -> (request.body.id as RequestId.NumberId).value.toString() is RequestId.StringId -> "\"${(request.body.id as RequestId.StringId).value}\"" } - val resultObject = result!!.invoke() + val resultObject = result.invoke() // language=json body = """ { diff --git a/kotlin-sdk-client/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTest.kt b/kotlin-sdk-client/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTest.kt index 010b79ae..37f5a307 100644 --- a/kotlin-sdk-client/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTest.kt +++ b/kotlin-sdk-client/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/StreamableHttpClientTest.kt @@ -5,9 +5,11 @@ import io.ktor.http.ContentType import io.ktor.http.HttpMethod import io.ktor.http.HttpStatusCode import io.ktor.sse.ServerSentEvent -import io.modelcontextprotocol.kotlin.sdk.ClientCapabilities -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.Tool +import io.modelcontextprotocol.kotlin.sdk.types.ClientCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.EmptyJsonObject +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.Tool +import io.modelcontextprotocol.kotlin.sdk.types.ToolSchema import kotlinx.coroutines.delay import kotlinx.coroutines.flow.flow import kotlinx.coroutines.runBlocking @@ -21,12 +23,6 @@ import kotlin.time.Duration.Companion.seconds import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid -/** - * Integration tests for the `StreamableHttpClientTransport` implementation - * using the [Mokksy](https://mokksy.dev) library - * to simulate Streaming HTTP with server-sent events (SSE). - * @author Konstantin Pavlov - */ @OptIn(ExperimentalUuidApi::class) @TestInstance(TestInstance.Lifecycle.PER_CLASS) @Suppress("LongMethod") @@ -129,7 +125,7 @@ internal class StreamableHttpClientTest : AbstractStreamableHttpClientTest() { name = "get_weather", title = "Weather Information Provider", description = "Get current weather information for a location", - inputSchema = Tool.Input( + inputSchema = ToolSchema( properties = buildJsonObject { putJsonObject("location") { put("type", "string") @@ -138,7 +134,7 @@ internal class StreamableHttpClientTest : AbstractStreamableHttpClientTest() { }, required = listOf("location"), ), - outputSchema = Tool.Output( + outputSchema = ToolSchema( properties = buildJsonObject { putJsonObject("temperature") { put("type", "number") @@ -148,6 +144,7 @@ internal class StreamableHttpClientTest : AbstractStreamableHttpClientTest() { required = listOf("temperature"), ), annotations = null, + meta = EmptyJsonObject, ) mockMcp.mockUnsubscribeRequest(sessionId = sessionId) diff --git a/kotlin-sdk-core/api/kotlin-sdk-core.api b/kotlin-sdk-core/api/kotlin-sdk-core.api index 4f230ab4..b09ad1ba 100644 --- a/kotlin-sdk-core/api/kotlin-sdk-core.api +++ b/kotlin-sdk-core/api/kotlin-sdk-core.api @@ -3275,9 +3275,9 @@ public abstract class io/modelcontextprotocol/kotlin/sdk/shared/AbstractTranspor public abstract class io/modelcontextprotocol/kotlin/sdk/shared/Protocol { public fun (Lio/modelcontextprotocol/kotlin/sdk/shared/ProtocolOptions;)V - protected abstract fun assertCapabilityForMethod (Lio/modelcontextprotocol/kotlin/sdk/Method;)V - protected abstract fun assertNotificationCapability (Lio/modelcontextprotocol/kotlin/sdk/Method;)V - public abstract fun assertRequestHandlerCapability (Lio/modelcontextprotocol/kotlin/sdk/Method;)V + protected abstract fun assertCapabilityForMethod (Lio/modelcontextprotocol/kotlin/sdk/types/Method;)V + protected abstract fun assertNotificationCapability (Lio/modelcontextprotocol/kotlin/sdk/types/Method;)V + public abstract fun assertRequestHandlerCapability (Lio/modelcontextprotocol/kotlin/sdk/types/Method;)V public final fun close (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public fun connect (Lio/modelcontextprotocol/kotlin/sdk/shared/Transport;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun getFallbackNotificationHandler ()Lkotlin/jvm/functions/Function2; @@ -3288,17 +3288,17 @@ public abstract class io/modelcontextprotocol/kotlin/sdk/shared/Protocol { public final fun getRequestHandlers ()Ljava/util/Map; public final fun getResponseHandlers ()Ljava/util/Map; public final fun getTransport ()Lio/modelcontextprotocol/kotlin/sdk/shared/Transport; - public final fun notification (Lio/modelcontextprotocol/kotlin/sdk/Notification;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun notification (Lio/modelcontextprotocol/kotlin/sdk/types/Notification;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public fun onClose ()V public fun onError (Ljava/lang/Throwable;)V - public final fun removeNotificationHandler (Lio/modelcontextprotocol/kotlin/sdk/Method;)V - public final fun removeRequestHandler (Lio/modelcontextprotocol/kotlin/sdk/Method;)V - public final fun request (Lio/modelcontextprotocol/kotlin/sdk/Request;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun request$default (Lio/modelcontextprotocol/kotlin/sdk/shared/Protocol;Lio/modelcontextprotocol/kotlin/sdk/Request;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun removeNotificationHandler (Lio/modelcontextprotocol/kotlin/sdk/types/Method;)V + public final fun removeRequestHandler (Lio/modelcontextprotocol/kotlin/sdk/types/Method;)V + public final fun request (Lio/modelcontextprotocol/kotlin/sdk/types/Request;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun request$default (Lio/modelcontextprotocol/kotlin/sdk/shared/Protocol;Lio/modelcontextprotocol/kotlin/sdk/types/Request;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public final fun setFallbackNotificationHandler (Lkotlin/jvm/functions/Function2;)V public final fun setFallbackRequestHandler (Lkotlin/jvm/functions/Function3;)V - public final fun setNotificationHandler (Lio/modelcontextprotocol/kotlin/sdk/Method;Lkotlin/jvm/functions/Function1;)V - public final fun setRequestHandler (Lkotlin/reflect/KType;Lio/modelcontextprotocol/kotlin/sdk/Method;Lkotlin/jvm/functions/Function3;)V + public final fun setNotificationHandler (Lio/modelcontextprotocol/kotlin/sdk/types/Method;Lkotlin/jvm/functions/Function1;)V + public final fun setRequestHandlerInternal (Lio/modelcontextprotocol/kotlin/sdk/types/Method;Lkotlin/jvm/functions/Function3;)V } public final class io/modelcontextprotocol/kotlin/sdk/shared/ProtocolKt { @@ -3320,11 +3320,11 @@ public final class io/modelcontextprotocol/kotlin/sdk/shared/ReadBuffer { public fun ()V public final fun append ([B)V public final fun clear ()V - public final fun readMessage ()Lio/modelcontextprotocol/kotlin/sdk/JSONRPCMessage; + public final fun readMessage ()Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage; } public final class io/modelcontextprotocol/kotlin/sdk/shared/ReadBufferKt { - public static final fun serializeMessage (Lio/modelcontextprotocol/kotlin/sdk/JSONRPCMessage;)Ljava/lang/String; + public static final fun serializeMessage (Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage;)Ljava/lang/String; } public final class io/modelcontextprotocol/kotlin/sdk/shared/RequestHandlerExtra { @@ -3350,7 +3350,7 @@ public abstract interface class io/modelcontextprotocol/kotlin/sdk/shared/Transp public abstract fun onClose (Lkotlin/jvm/functions/Function0;)V public abstract fun onError (Lkotlin/jvm/functions/Function1;)V public abstract fun onMessage (Lkotlin/jvm/functions/Function2;)V - public abstract fun send (Lio/modelcontextprotocol/kotlin/sdk/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public abstract fun send (Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public abstract fun start (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } @@ -3359,7 +3359,7 @@ public abstract class io/modelcontextprotocol/kotlin/sdk/shared/WebSocketMcpTran public fun close (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; protected abstract fun getSession ()Lio/ktor/websocket/WebSocketSession; protected abstract fun initializeSession (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun send (Lio/modelcontextprotocol/kotlin/sdk/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun send (Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public fun start (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } @@ -3367,3 +3367,3663 @@ public final class io/modelcontextprotocol/kotlin/sdk/shared/WebSocketMcpTranspo public static final field MCP_SUBPROTOCOL Ljava/lang/String; } +public final class io/modelcontextprotocol/kotlin/sdk/types/Annotations { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Annotations$Companion; + public fun ()V + public fun (Ljava/util/List;Ljava/lang/Double;Ljava/lang/String;)V + public synthetic fun (Ljava/util/List;Ljava/lang/Double;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Ljava/lang/Double; + public final fun component3 ()Ljava/lang/String; + public final fun copy (Ljava/util/List;Ljava/lang/Double;Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Ljava/util/List;Ljava/lang/Double;Ljava/lang/String;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public fun equals (Ljava/lang/Object;)Z + public final fun getAudience ()Ljava/util/List; + public final fun getLastModified ()Ljava/lang/String; + public final fun getPriority ()Ljava/lang/Double; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/Annotations$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/Annotations$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + 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/Annotations;)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/Annotations$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/AudioContent : io/modelcontextprotocol/kotlin/sdk/types/MediaContent { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/AudioContent$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public final fun component4 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/AudioContent; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/AudioContent;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/AudioContent; + public fun equals (Ljava/lang/Object;)Z + public final fun getAnnotations ()Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public final fun getData ()Ljava/lang/String; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getMimeType ()Ljava/lang/String; + public fun getType ()Lio/modelcontextprotocol/kotlin/sdk/types/ContentTypes; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/AudioContent$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/AudioContent$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/AudioContent; + 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/AudioContent;)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/AudioContent$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams : io/modelcontextprotocol/kotlin/sdk/types/NotificationParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams$Companion; + public fun ()V + public fun (Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (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/BaseNotificationParams; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams; + 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/BaseNotificationParams;)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/BaseNotificationParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams$Companion; + public synthetic fun (Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-mJxasco (Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams; + public static synthetic fun copy-mJxasco$default (Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams; + 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/BaseRequestParams;)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/BaseRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/BlobResourceContents : io/modelcontextprotocol/kotlin/sdk/types/ResourceContents { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/BlobResourceContents$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/BlobResourceContents; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/BlobResourceContents;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/BlobResourceContents; + public fun equals (Ljava/lang/Object;)Z + public final fun getBlob ()Ljava/lang/String; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun getMimeType ()Ljava/lang/String; + public fun getUri ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/BlobResourceContents$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/BlobResourceContents$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/BlobResourceContents; + 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/BlobResourceContents;)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/BlobResourceContents$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CallToolRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequest$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequestParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequest;Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CallToolRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequest; + 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/CallToolRequest;)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/CallToolRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CallToolRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequestParams$Companion; + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lkotlinx/serialization/json/JsonObject; + public final fun component3-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-EDEVuBg (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequestParams; + public static synthetic fun copy-EDEVuBg$default (Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequestParams;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequestParams; + public fun equals (Ljava/lang/Object;)Z + public final fun getArguments ()Lkotlinx/serialization/json/JsonObject; + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun getName ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CallToolRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CallToolRequestParams; + 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/CallToolRequestParams;)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/CallToolRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CallToolResult : io/modelcontextprotocol/kotlin/sdk/types/ServerResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CallToolResult$Companion; + public fun (Ljava/util/List;Ljava/lang/Boolean;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/util/List;Ljava/lang/Boolean;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Ljava/lang/Boolean; + public final fun component3 ()Lkotlinx/serialization/json/JsonObject; + public final fun component4 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/util/List;Ljava/lang/Boolean;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/CallToolResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/CallToolResult;Ljava/util/List;Ljava/lang/Boolean;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CallToolResult; + public fun equals (Ljava/lang/Object;)Z + public final fun getContent ()Ljava/util/List; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getStructuredContent ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public final fun isError ()Ljava/lang/Boolean; + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CallToolResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CallToolResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CallToolResult; + 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/CallToolResult;)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/CallToolResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CancelledNotification : io/modelcontextprotocol/kotlin/sdk/types/ClientNotification, io/modelcontextprotocol/kotlin/sdk/types/ServerNotification { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotification$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotificationParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotificationParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotificationParams;)Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotification; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotification;Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotificationParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotification; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotificationParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/NotificationParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CancelledNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotification; + 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/CancelledNotification;)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/CancelledNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CancelledNotificationParams : io/modelcontextprotocol/kotlin/sdk/types/NotificationParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotificationParams$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotificationParams; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotificationParams;Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotificationParams; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getReason ()Ljava/lang/String; + public final fun getRequestId ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CancelledNotificationParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotificationParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotificationParams; + 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/CancelledNotificationParams;)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/CancelledNotificationParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Companion; + public fun ()V + public fun (Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;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 ()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 copy (Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;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 getExperimental ()Lkotlinx/serialization/json/JsonObject; + public final fun getRoots ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots; + public final fun getSampling ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities; + 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;)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$Companion { + public final fun getElicitation ()Lkotlinx/serialization/json/JsonObject; + public final fun getSampling ()Lkotlinx/serialization/json/JsonObject; + 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 ()V + public fun (Ljava/lang/Boolean;)V + public synthetic fun (Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/Boolean; + public final fun copy (Ljava/lang/Boolean;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots;Ljava/lang/Boolean;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots; + public fun equals (Ljava/lang/Object;)Z + public final fun getListChanged ()Ljava/lang/Boolean; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities$Roots; + 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$Roots;)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$Roots$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/ClientNotification : io/modelcontextprotocol/kotlin/sdk/types/Notification { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientNotification$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ClientNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/ClientRequest : io/modelcontextprotocol/kotlin/sdk/types/Request { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientRequest$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ClientRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/ClientResult : io/modelcontextprotocol/kotlin/sdk/types/RequestResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ClientResult$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ClientResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CommonKt { + public static final field LATEST_PROTOCOL_VERSION Ljava/lang/String; + public static final fun ProgressToken (J)Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public static final fun ProgressToken (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public static final fun getSUPPORTED_PROTOCOL_VERSIONS ()[Ljava/lang/String; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CompleteRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequest$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequest;Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CompleteRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequest; + 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/CompleteRequest;)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/CompleteRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Companion; + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Argument;Lio/modelcontextprotocol/kotlin/sdk/types/Reference;Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Context;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Argument;Lio/modelcontextprotocol/kotlin/sdk/types/Reference;Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Context;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Argument; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/Reference; + public final fun component3 ()Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Context; + public final fun component4-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-6R815Ik (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Argument;Lio/modelcontextprotocol/kotlin/sdk/types/Reference;Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Context;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams; + public static synthetic fun copy-6R815Ik$default (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams;Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Argument;Lio/modelcontextprotocol/kotlin/sdk/types/Reference;Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Context;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams; + public fun equals (Ljava/lang/Object;)Z + public final fun getArgument ()Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Argument; + public final fun getContext ()Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Context; + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun getRef ()Lio/modelcontextprotocol/kotlin/sdk/types/Reference; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams; + 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/CompleteRequestParams;)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/CompleteRequestParams$Argument { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Argument$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Argument; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Argument;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Argument; + public fun equals (Ljava/lang/Object;)Z + public final fun getName ()Ljava/lang/String; + public final fun getValue ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Argument$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Argument$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Argument; + 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/CompleteRequestParams$Argument;)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/CompleteRequestParams$Argument$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Context { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Context$Companion; + public fun ()V + public fun (Ljava/util/Map;)V + public synthetic fun (Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/Map; + public final fun copy (Ljava/util/Map;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Context; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Context;Ljava/util/Map;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Context; + public fun equals (Ljava/lang/Object;)Z + public final fun getArguments ()Ljava/util/Map; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Context$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Context$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteRequestParams$Context; + 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/CompleteRequestParams$Context;)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/CompleteRequestParams$Context$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CompleteResult : io/modelcontextprotocol/kotlin/sdk/types/ServerResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Completion;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Completion;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Completion; + public final fun component2 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Completion;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult;Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Completion;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult; + public fun equals (Ljava/lang/Object;)Z + public final fun getCompletion ()Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Completion; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CompleteResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult; + 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/CompleteResult;)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/CompleteResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Completion { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Completion$Companion; + public fun (Ljava/util/List;Ljava/lang/Integer;Ljava/lang/Boolean;)V + public synthetic fun (Ljava/util/List;Ljava/lang/Integer;Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Ljava/lang/Integer; + public final fun component3 ()Ljava/lang/Boolean; + public final fun copy (Ljava/util/List;Ljava/lang/Integer;Ljava/lang/Boolean;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Completion; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Completion;Ljava/util/List;Ljava/lang/Integer;Ljava/lang/Boolean;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Completion; + public fun equals (Ljava/lang/Object;)Z + public final fun getHasMore ()Ljava/lang/Boolean; + public final fun getTotal ()Ljava/lang/Integer; + public final fun getValues ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Completion$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Completion$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CompleteResult$Completion; + 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/CompleteResult$Completion;)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/CompleteResult$Completion$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/ContentBlock : io/modelcontextprotocol/kotlin/sdk/types/WithMeta { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ContentBlock$Companion; + public abstract fun getType ()Lio/modelcontextprotocol/kotlin/sdk/types/ContentTypes; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ContentBlock$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ContentTypes : java/lang/Enum { + public static final field AUDIO Lio/modelcontextprotocol/kotlin/sdk/types/ContentTypes; + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ContentTypes$Companion; + public static final field EMBEDDED_RESOURCE Lio/modelcontextprotocol/kotlin/sdk/types/ContentTypes; + public static final field IMAGE Lio/modelcontextprotocol/kotlin/sdk/types/ContentTypes; + public static final field RESOURCE_LINK Lio/modelcontextprotocol/kotlin/sdk/types/ContentTypes; + public static final field TEXT Lio/modelcontextprotocol/kotlin/sdk/types/ContentTypes; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getValue ()Ljava/lang/String; + public static fun valueOf (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/ContentTypes; + public static fun values ()[Lio/modelcontextprotocol/kotlin/sdk/types/ContentTypes; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ContentTypes$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest : io/modelcontextprotocol/kotlin/sdk/types/ServerRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequestParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest; + 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/CreateMessageRequest;)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/CreateMessageRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequestParams$Companion; + public synthetic fun (ILjava/util/List;Lio/modelcontextprotocol/kotlin/sdk/types/ModelPreferences;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/IncludeContext;Ljava/lang/Double;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILjava/util/List;Lio/modelcontextprotocol/kotlin/sdk/types/ModelPreferences;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/IncludeContext;Ljava/lang/Double;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()I + public final fun component2 ()Ljava/util/List; + public final fun component3 ()Lio/modelcontextprotocol/kotlin/sdk/types/ModelPreferences; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Lio/modelcontextprotocol/kotlin/sdk/types/IncludeContext; + public final fun component6 ()Ljava/lang/Double; + public final fun component7 ()Ljava/util/List; + public final fun component8 ()Lkotlinx/serialization/json/JsonObject; + public final fun component9-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-qtvSJzw (ILjava/util/List;Lio/modelcontextprotocol/kotlin/sdk/types/ModelPreferences;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/IncludeContext;Ljava/lang/Double;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequestParams; + public static synthetic fun copy-qtvSJzw$default (Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequestParams;ILjava/util/List;Lio/modelcontextprotocol/kotlin/sdk/types/ModelPreferences;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/IncludeContext;Ljava/lang/Double;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequestParams; + public fun equals (Ljava/lang/Object;)Z + public final fun getIncludeContext ()Lio/modelcontextprotocol/kotlin/sdk/types/IncludeContext; + public final fun getMaxTokens ()I + public final fun getMessages ()Ljava/util/List; + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun getMetadata ()Lkotlinx/serialization/json/JsonObject; + public final fun getModelPreferences ()Lio/modelcontextprotocol/kotlin/sdk/types/ModelPreferences; + public final fun getStopSequences ()Ljava/util/List; + public final fun getSystemPrompt ()Ljava/lang/String; + public final fun getTemperature ()Ljava/lang/Double; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequestParams; + 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/CreateMessageRequestParams;)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/CreateMessageRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CreateMessageResult : io/modelcontextprotocol/kotlin/sdk/types/ClientResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageResult$Companion; + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/Role;Lio/modelcontextprotocol/kotlin/sdk/types/MediaContent;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/Role;Lio/modelcontextprotocol/kotlin/sdk/types/MediaContent;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/Role; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/MediaContent; + public final fun component3 ()Ljava/lang/String; + public final fun component4-6olV-UY ()Ljava/lang/String; + public final fun component5 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-ctVX1tw (Lio/modelcontextprotocol/kotlin/sdk/types/Role;Lio/modelcontextprotocol/kotlin/sdk/types/MediaContent;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageResult; + public static synthetic fun copy-ctVX1tw$default (Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageResult;Lio/modelcontextprotocol/kotlin/sdk/types/Role;Lio/modelcontextprotocol/kotlin/sdk/types/MediaContent;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageResult; + public fun equals (Ljava/lang/Object;)Z + public final fun getContent ()Lio/modelcontextprotocol/kotlin/sdk/types/MediaContent; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getModel ()Ljava/lang/String; + public final fun getRole ()Lio/modelcontextprotocol/kotlin/sdk/types/Role; + public final fun getStopReason-6olV-UY ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CreateMessageResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageResult; + 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/CreateMessageResult;)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/CreateMessageResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CustomNotification : io/modelcontextprotocol/kotlin/sdk/types/ClientNotification, io/modelcontextprotocol/kotlin/sdk/types/ServerNotification { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CustomNotification$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/Method;Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/Method;Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/Method;Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;)Lio/modelcontextprotocol/kotlin/sdk/types/CustomNotification; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/CustomNotification;Lio/modelcontextprotocol/kotlin/sdk/types/Method;Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CustomNotification; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/NotificationParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CustomNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CustomNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CustomNotification; + 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/CustomNotification;)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/CustomNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public class io/modelcontextprotocol/kotlin/sdk/types/CustomRequest : io/modelcontextprotocol/kotlin/sdk/types/Request { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CustomRequest$Companion; + public synthetic fun (ILio/modelcontextprotocol/kotlin/sdk/types/Method;Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/Method;Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams;)V + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public static final synthetic fun write$Self (Lio/modelcontextprotocol/kotlin/sdk/types/CustomRequest;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CustomRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CustomRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CustomRequest; + 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/CustomRequest;)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/CustomRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequest : io/modelcontextprotocol/kotlin/sdk/types/ServerRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequest$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequest;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequest; + 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/ElicitRequest;)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/ElicitRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$Companion; + public synthetic fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema; + public final fun component3-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-EDEVuBg (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams; + public static synthetic fun copy-EDEVuBg$default (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams; + public fun equals (Ljava/lang/Object;)Z + public final fun getMessage ()Ljava/lang/String; + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun getRequestedSchema ()Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams;)V + public 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/ElicitRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema$Companion; + public fun (Lkotlinx/serialization/json/JsonObject;Ljava/util/List;)V + public synthetic fun (Lkotlinx/serialization/json/JsonObject;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lkotlinx/serialization/json/JsonObject; + public final fun component2 ()Ljava/util/List; + public final fun copy (Lkotlinx/serialization/json/JsonObject;Ljava/util/List;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lkotlinx/serialization/json/JsonObject;Ljava/util/List;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getProperties ()Lkotlinx/serialization/json/JsonObject; + public final fun getRequired ()Ljava/util/List; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;)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/ElicitRequestParams$RequestedSchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitResult : io/modelcontextprotocol/kotlin/sdk/types/ClientResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Action;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Action;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Action; + public final fun component2 ()Lkotlinx/serialization/json/JsonObject; + public final fun component3 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Action;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Action;Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult; + public fun equals (Ljava/lang/Object;)Z + public final fun getAction ()Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Action; + public final fun getContent ()Lkotlinx/serialization/json/JsonObject; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ElicitResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult; + 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/ElicitResult;)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/ElicitResult$Action : java/lang/Enum { + public static final field Accept Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Action; + public static final field Cancel Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Action; + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Action$Companion; + public static final field Decline Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Action; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Action; + public static fun values ()[Lio/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Action; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Action$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ElicitResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/EmbeddedResource : io/modelcontextprotocol/kotlin/sdk/types/ContentBlock { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/EmbeddedResource$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/ResourceContents;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/ResourceContents;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/ResourceContents; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public final fun component3 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/ResourceContents;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/EmbeddedResource; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/EmbeddedResource;Lio/modelcontextprotocol/kotlin/sdk/types/ResourceContents;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/EmbeddedResource; + public fun equals (Ljava/lang/Object;)Z + public final fun getAnnotations ()Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getResource ()Lio/modelcontextprotocol/kotlin/sdk/types/ResourceContents; + public fun getType ()Lio/modelcontextprotocol/kotlin/sdk/types/ContentTypes; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/EmbeddedResource$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/EmbeddedResource$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/EmbeddedResource; + 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/EmbeddedResource;)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/EmbeddedResource$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/EmptyResult : io/modelcontextprotocol/kotlin/sdk/types/ClientResult, io/modelcontextprotocol/kotlin/sdk/types/ServerResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/EmptyResult$Companion; + public fun ()V + public fun (Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (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/EmptyResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/EmptyResult;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/EmptyResult; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/EmptyResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/EmptyResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/EmptyResult; + 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/EmptyResult;)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/EmptyResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/GetPromptRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequest$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequestParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequest;Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/GetPromptRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequest; + 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/GetPromptRequest;)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/GetPromptRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/GetPromptRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequestParams$Companion; + public synthetic fun (Ljava/lang/String;Ljava/util/Map;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ljava/util/Map;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/util/Map; + public final fun component3-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-EDEVuBg (Ljava/lang/String;Ljava/util/Map;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequestParams; + public static synthetic fun copy-EDEVuBg$default (Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequestParams;Ljava/lang/String;Ljava/util/Map;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequestParams; + public fun equals (Ljava/lang/Object;)Z + public final fun getArguments ()Ljava/util/Map; + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun getName ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/GetPromptRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptRequestParams; + 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/GetPromptRequestParams;)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/GetPromptRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/GetPromptResult : io/modelcontextprotocol/kotlin/sdk/types/ServerResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptResult$Companion; + public fun (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptResult;Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptResult; + public fun equals (Ljava/lang/Object;)Z + public final fun getDescription ()Ljava/lang/String; + public final fun getMessages ()Ljava/util/List; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/GetPromptResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/GetPromptResult; + 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/GetPromptResult;)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/GetPromptResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Icon { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Icon$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lio/modelcontextprotocol/kotlin/sdk/types/Icon$Theme;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lio/modelcontextprotocol/kotlin/sdk/types/Icon$Theme;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/util/List; + public final fun component4 ()Lio/modelcontextprotocol/kotlin/sdk/types/Icon$Theme; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lio/modelcontextprotocol/kotlin/sdk/types/Icon$Theme;)Lio/modelcontextprotocol/kotlin/sdk/types/Icon; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/Icon;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lio/modelcontextprotocol/kotlin/sdk/types/Icon$Theme;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/Icon; + public fun equals (Ljava/lang/Object;)Z + public final fun getMimeType ()Ljava/lang/String; + public final fun getSizes ()Ljava/util/List; + public final fun getSrc ()Ljava/lang/String; + public final fun getTheme ()Lio/modelcontextprotocol/kotlin/sdk/types/Icon$Theme; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/Icon$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/Icon$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/Icon; + 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/Icon;)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/Icon$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Icon$Theme : java/lang/Enum { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Icon$Theme$Companion; + public static final field Dark Lio/modelcontextprotocol/kotlin/sdk/types/Icon$Theme; + public static final field Light Lio/modelcontextprotocol/kotlin/sdk/types/Icon$Theme; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/Icon$Theme; + public static fun values ()[Lio/modelcontextprotocol/kotlin/sdk/types/Icon$Theme; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Icon$Theme$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ImageContent : io/modelcontextprotocol/kotlin/sdk/types/MediaContent { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ImageContent$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public final fun component4 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ImageContent; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ImageContent;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ImageContent; + public fun equals (Ljava/lang/Object;)Z + public final fun getAnnotations ()Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public final fun getData ()Ljava/lang/String; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getMimeType ()Ljava/lang/String; + public fun getType ()Lio/modelcontextprotocol/kotlin/sdk/types/ContentTypes; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ImageContent$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ImageContent$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ImageContent; + 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/ImageContent;)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/ImageContent$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Implementation { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Implementation$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/util/List; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lio/modelcontextprotocol/kotlin/sdk/types/Implementation; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/Implementation; + public fun equals (Ljava/lang/Object;)Z + public final fun getIcons ()Ljava/util/List; + public final fun getName ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public final fun getVersion ()Ljava/lang/String; + public final fun getWebsiteUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/Implementation$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/Implementation$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/Implementation; + 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/Implementation;)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/Implementation$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/IncludeContext : java/lang/Enum { + public static final field AllServers Lio/modelcontextprotocol/kotlin/sdk/types/IncludeContext; + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/IncludeContext$Companion; + public static final field None Lio/modelcontextprotocol/kotlin/sdk/types/IncludeContext; + public static final field ThisServer Lio/modelcontextprotocol/kotlin/sdk/types/IncludeContext; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/IncludeContext; + public static fun values ()[Lio/modelcontextprotocol/kotlin/sdk/types/IncludeContext; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/IncludeContext$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/InitializeRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequest$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequestParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequest;Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/InitializeRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequest; + 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/InitializeRequest;)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/InitializeRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/InitializeRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequestParams$Companion; + public synthetic fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities; + public final fun component3 ()Lio/modelcontextprotocol/kotlin/sdk/types/Implementation; + public final fun component4-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-6R815Ik (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequestParams; + public static synthetic fun copy-6R815Ik$default (Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequestParams;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities;Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequestParams; + public fun equals (Ljava/lang/Object;)Z + public final fun getCapabilities ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities; + public final fun getClientInfo ()Lio/modelcontextprotocol/kotlin/sdk/types/Implementation; + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun getProtocolVersion ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/InitializeRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/InitializeRequestParams; + 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/InitializeRequestParams;)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/InitializeRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/InitializeResult : io/modelcontextprotocol/kotlin/sdk/types/ServerResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/InitializeResult$Companion; + public fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities;Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities;Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities; + public final fun component3 ()Lio/modelcontextprotocol/kotlin/sdk/types/Implementation; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities;Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/InitializeResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/InitializeResult;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities;Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/InitializeResult; + public fun equals (Ljava/lang/Object;)Z + public final fun getCapabilities ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities; + public final fun getInstructions ()Ljava/lang/String; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getProtocolVersion ()Ljava/lang/String; + public final fun getServerInfo ()Lio/modelcontextprotocol/kotlin/sdk/types/Implementation; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/InitializeResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/InitializeResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/InitializeResult; + 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/InitializeResult;)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/InitializeResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/InitializedNotification : io/modelcontextprotocol/kotlin/sdk/types/ClientNotification { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/InitializedNotification$Companion; + public fun ()V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;)Lio/modelcontextprotocol/kotlin/sdk/types/InitializedNotification; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/InitializedNotification;Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/InitializedNotification; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/NotificationParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/InitializedNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/InitializedNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/InitializedNotification; + 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/InitializedNotification;)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/InitializedNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/JSONRPCError : io/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCError$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Lio/modelcontextprotocol/kotlin/sdk/types/RPCError;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/RPCError; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Lio/modelcontextprotocol/kotlin/sdk/types/RPCError;)Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCError; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCError;Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Lio/modelcontextprotocol/kotlin/sdk/types/RPCError;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCError; + public fun equals (Ljava/lang/Object;)Z + public final fun getError ()Lio/modelcontextprotocol/kotlin/sdk/types/RPCError; + public final fun getId ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public fun getJsonrpc ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/JSONRPCError$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCError$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCError; + 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/JSONRPCError;)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/JSONRPCError$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage$Companion; + public abstract fun getJsonrpc ()Ljava/lang/String; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/JSONRPCNotification : io/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCNotification$Companion; + public fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCNotification; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCNotification;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCNotification; + public fun equals (Ljava/lang/Object;)Z + public fun getJsonrpc ()Ljava/lang/String; + public final fun getMethod ()Ljava/lang/String; + public final fun getParams ()Lkotlinx/serialization/json/JsonElement; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/JSONRPCNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCNotification; + 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/JSONRPCNotification;)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/JSONRPCNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/JSONRPCRequest : io/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCRequest$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCRequest;Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCRequest; + public fun equals (Ljava/lang/Object;)Z + public final fun getId ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public fun getJsonrpc ()Ljava/lang/String; + public final fun getMethod ()Ljava/lang/String; + public final fun getParams ()Lkotlinx/serialization/json/JsonElement; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/JSONRPCRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCRequest; + 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/JSONRPCRequest;)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/JSONRPCRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/JSONRPCResponse : io/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCResponse$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Lio/modelcontextprotocol/kotlin/sdk/types/RequestResult;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Lio/modelcontextprotocol/kotlin/sdk/types/RequestResult;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestResult; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Lio/modelcontextprotocol/kotlin/sdk/types/RequestResult;)Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCResponse; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCResponse;Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;Lio/modelcontextprotocol/kotlin/sdk/types/RequestResult;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCResponse; + public fun equals (Ljava/lang/Object;)Z + public final fun getId ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public fun getJsonrpc ()Ljava/lang/String; + public final fun getResult ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestResult; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/JSONRPCResponse$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCResponse$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCResponse; + 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/JSONRPCResponse;)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/JSONRPCResponse$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/JsonRpcKt { + public static final field JSONRPC_VERSION Ljava/lang/String; + public static final fun RequestId (J)Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public static final fun RequestId (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public static final fun fromJSON (Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCRequest;)Lio/modelcontextprotocol/kotlin/sdk/types/Request; + public static final fun toJSON (Lio/modelcontextprotocol/kotlin/sdk/types/Notification;)Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCNotification; + public static final fun toJSON (Lio/modelcontextprotocol/kotlin/sdk/types/Request;)Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCRequest; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/JsonUtilsKt { + public static final fun getEmptyJsonObject ()Lkotlinx/serialization/json/JsonObject; + public static final fun getMcpJson ()Lkotlinx/serialization/json/Json; + public static final fun toJson (Ljava/util/Map;)Ljava/util/Map; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ListPromptsRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest, io/modelcontextprotocol/kotlin/sdk/types/PaginatedRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsRequest$Companion; + public fun ()V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsRequest;Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ListPromptsRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsRequest; + 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/ListPromptsRequest;)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/ListPromptsRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ListPromptsResult : io/modelcontextprotocol/kotlin/sdk/types/PaginatedResult, io/modelcontextprotocol/kotlin/sdk/types/ServerResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsResult$Companion; + public fun (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsResult;Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsResult; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun getNextCursor ()Ljava/lang/String; + public final fun getPrompts ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ListPromptsResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ListPromptsResult; + 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/ListPromptsResult;)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/ListPromptsResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest, io/modelcontextprotocol/kotlin/sdk/types/PaginatedRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesRequest$Companion; + public fun ()V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesRequest;Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesRequest; + 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/ListResourceTemplatesRequest;)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/ListResourceTemplatesRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesResult : io/modelcontextprotocol/kotlin/sdk/types/PaginatedResult, io/modelcontextprotocol/kotlin/sdk/types/ServerResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesResult$Companion; + public fun (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesResult;Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesResult; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun getNextCursor ()Ljava/lang/String; + public final fun getResourceTemplates ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ListResourceTemplatesResult; + 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/ListResourceTemplatesResult;)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/ListResourceTemplatesResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ListResourcesRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest, io/modelcontextprotocol/kotlin/sdk/types/PaginatedRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ListResourcesRequest$Companion; + public fun ()V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/ListResourcesRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ListResourcesRequest;Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ListResourcesRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ListResourcesRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ListResourcesRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ListResourcesRequest; + 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/ListResourcesRequest;)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/ListResourcesRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ListResourcesResult : io/modelcontextprotocol/kotlin/sdk/types/PaginatedResult, io/modelcontextprotocol/kotlin/sdk/types/ServerResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ListResourcesResult$Companion; + public fun (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ListResourcesResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ListResourcesResult;Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ListResourcesResult; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun getNextCursor ()Ljava/lang/String; + public final fun getResources ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ListResourcesResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ListResourcesResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ListResourcesResult; + 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/ListResourcesResult;)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/ListResourcesResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ListRootsRequest : io/modelcontextprotocol/kotlin/sdk/types/ServerRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ListRootsRequest$Companion; + public fun ()V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/ListRootsRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ListRootsRequest;Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ListRootsRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ListRootsRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ListRootsRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ListRootsRequest; + 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/ListRootsRequest;)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/ListRootsRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ListRootsResult : io/modelcontextprotocol/kotlin/sdk/types/ClientResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ListRootsResult$Companion; + public fun (Ljava/util/List;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/util/List;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/util/List;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ListRootsResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ListRootsResult;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ListRootsResult; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getRoots ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ListRootsResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ListRootsResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ListRootsResult; + 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/ListRootsResult;)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/ListRootsResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ListToolsRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest, io/modelcontextprotocol/kotlin/sdk/types/PaginatedRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsRequest$Companion; + public fun ()V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsRequest;Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ListToolsRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsRequest; + 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/ListToolsRequest;)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/ListToolsRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ListToolsResult : io/modelcontextprotocol/kotlin/sdk/types/PaginatedResult, io/modelcontextprotocol/kotlin/sdk/types/ServerResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsResult$Companion; + public fun (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsResult;Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsResult; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun getNextCursor ()Ljava/lang/String; + public final fun getTools ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ListToolsResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsResult; + 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/ListToolsResult;)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/ListToolsResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/LoggingLevel : java/lang/Enum { + public static final field Alert Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel; + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel$Companion; + public static final field Critical Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel; + public static final field Debug Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel; + public static final field Emergency Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel; + public static final field Error Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel; + public static final field Info Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel; + public static final field Notice Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel; + public static final field Warning Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel; + public static fun values ()[Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/LoggingLevel$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotification : io/modelcontextprotocol/kotlin/sdk/types/ServerNotification { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotification$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotificationParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotificationParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotificationParams;)Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotification; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotification;Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotificationParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotification; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotificationParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/NotificationParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotification; + 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/LoggingMessageNotification;)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/LoggingMessageNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotificationParams : io/modelcontextprotocol/kotlin/sdk/types/NotificationParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotificationParams$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel;Lkotlinx/serialization/json/JsonElement;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel;Lkotlinx/serialization/json/JsonElement;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel; + public final fun component2 ()Lkotlinx/serialization/json/JsonElement; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel;Lkotlinx/serialization/json/JsonElement;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotificationParams; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotificationParams;Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel;Lkotlinx/serialization/json/JsonElement;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotificationParams; + public fun equals (Ljava/lang/Object;)Z + public final fun getData ()Lkotlinx/serialization/json/JsonElement; + public final fun getLevel ()Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel; + public final fun getLogger ()Ljava/lang/String; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotificationParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotificationParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotificationParams; + 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/LoggingMessageNotificationParams;)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/LoggingMessageNotificationParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/McpException : java/lang/Exception { + public fun (ILjava/lang/String;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (ILjava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getCode ()I + public final fun getData ()Lkotlinx/serialization/json/JsonElement; + public fun getMessage ()Ljava/lang/String; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/MediaContent : io/modelcontextprotocol/kotlin/sdk/types/ContentBlock { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/MediaContent$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/MediaContent$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/Method { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Method$Companion; + public abstract fun getValue ()Ljava/lang/String; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Method$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Method$Custom : io/modelcontextprotocol/kotlin/sdk/types/Method { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Method$Custom$Companion; + public fun (Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/Method$Custom; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/Method$Custom;Ljava/lang/String;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/Method$Custom; + public fun equals (Ljava/lang/Object;)Z + public fun getValue ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/Method$Custom$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/Method$Custom$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/Method$Custom; + 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/Method$Custom;)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/Method$Custom$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Method$Defined : java/lang/Enum, io/modelcontextprotocol/kotlin/sdk/types/Method { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined$Companion; + public static final field CompletionComplete Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field ElicitationCreate Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field Initialize Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field LoggingSetLevel Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field NotificationsCancelled Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field NotificationsInitialized Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field NotificationsMessage Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field NotificationsProgress Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field NotificationsPromptsListChanged Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field NotificationsResourcesListChanged Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field NotificationsResourcesUpdated Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field NotificationsRootsListChanged Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field NotificationsToolsListChanged Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field Ping Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field PromptsGet Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field PromptsList Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field ResourcesList Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field ResourcesRead Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field ResourcesSubscribe Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field ResourcesTemplatesList Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field ResourcesUnsubscribe Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field RootsList Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field SamplingCreateMessage Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field ToolsCall Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field ToolsList Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public fun getValue ()Ljava/lang/String; + public static fun valueOf (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static fun values ()[Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Method$Defined$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ModelHint { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ModelHint$Companion; + public fun (Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/ModelHint; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ModelHint;Ljava/lang/String;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ModelHint; + public fun equals (Ljava/lang/Object;)Z + public final fun getName ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ModelHint$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ModelHint$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ModelHint; + 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/ModelHint;)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/ModelHint$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ModelPreferences { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ModelPreferences$Companion; + public fun ()V + public fun (Ljava/util/List;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;)V + public synthetic fun (Ljava/util/List;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Ljava/lang/Double; + public final fun component3 ()Ljava/lang/Double; + public final fun component4 ()Ljava/lang/Double; + public final fun copy (Ljava/util/List;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;)Lio/modelcontextprotocol/kotlin/sdk/types/ModelPreferences; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ModelPreferences;Ljava/util/List;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ModelPreferences; + public fun equals (Ljava/lang/Object;)Z + public final fun getCostPriority ()Ljava/lang/Double; + public final fun getHints ()Ljava/util/List; + public final fun getIntelligencePriority ()Ljava/lang/Double; + public final fun getSpeedPriority ()Ljava/lang/Double; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ModelPreferences$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ModelPreferences$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ModelPreferences; + 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/ModelPreferences;)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/ModelPreferences$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/Notification { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Notification$Companion; + public abstract fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public abstract fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/NotificationParams; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Notification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/NotificationParams : io/modelcontextprotocol/kotlin/sdk/types/WithMeta { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/NotificationParams$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/NotificationParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/PaginatedRequest : io/modelcontextprotocol/kotlin/sdk/types/Request { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequest$Companion; + public abstract fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/PaginatedRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams$Companion; + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-D-90kyg (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams; + public static synthetic fun copy-D-90kyg$default (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams; + public fun equals (Ljava/lang/Object;)Z + public final fun getCursor ()Ljava/lang/String; + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams; + 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/PaginatedRequestParams;)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/PaginatedRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/PaginatedResult : io/modelcontextprotocol/kotlin/sdk/types/RequestResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedResult$Companion; + public abstract fun getNextCursor ()Ljava/lang/String; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/PaginatedResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/PingRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest, io/modelcontextprotocol/kotlin/sdk/types/ServerRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/PingRequest$Companion; + public fun ()V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/PingRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/PingRequest;Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/PingRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/PingRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/PingRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/PingRequest; + 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/PingRequest;)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/PingRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Progress { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Progress$Companion; + public fun (DLjava/lang/Double;Ljava/lang/String;)V + public synthetic fun (DLjava/lang/Double;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getMessage ()Ljava/lang/String; + public final fun getProgress ()D + public final fun getTotal ()Ljava/lang/Double; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/Progress$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/Progress$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/Progress; + 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/Progress;)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/Progress$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ProgressNotification : io/modelcontextprotocol/kotlin/sdk/types/ClientNotification, io/modelcontextprotocol/kotlin/sdk/types/ServerNotification { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotification$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotificationParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotificationParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotificationParams;)Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotification; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotification;Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotificationParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotification; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/NotificationParams; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotificationParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ProgressNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotification; + 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/ProgressNotification;)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/ProgressNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ProgressNotificationParams : io/modelcontextprotocol/kotlin/sdk/types/NotificationParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotificationParams$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;DLjava/lang/Double;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;DLjava/lang/Double;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public final fun component2 ()D + public final fun component3 ()Ljava/lang/Double; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;DLjava/lang/Double;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotificationParams; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotificationParams;Lio/modelcontextprotocol/kotlin/sdk/types/RequestId;DLjava/lang/Double;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotificationParams; + public fun equals (Ljava/lang/Object;)Z + public final fun getMessage ()Ljava/lang/String; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getProgress ()D + public final fun getProgressToken ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public final fun getTotal ()Ljava/lang/Double; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ProgressNotificationParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotificationParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ProgressNotificationParams; + 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/ProgressNotificationParams;)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/ProgressNotificationParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Prompt : io/modelcontextprotocol/kotlin/sdk/types/WithMeta { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Prompt$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/util/List; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/util/List; + public final fun component6 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/Prompt; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/Prompt;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/Prompt; + public fun equals (Ljava/lang/Object;)Z + public final fun getArguments ()Ljava/util/List; + public final fun getDescription ()Ljava/lang/String; + public final fun getIcons ()Ljava/util/List; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getName ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/Prompt$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/Prompt$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/Prompt; + 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/Prompt;)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/Prompt$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/PromptArgument { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/PromptArgument$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Boolean; + public final fun component4 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/PromptArgument; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/PromptArgument;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/PromptArgument; + public fun equals (Ljava/lang/Object;)Z + public final fun getDescription ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun getRequired ()Ljava/lang/Boolean; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/PromptArgument$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/PromptArgument$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/PromptArgument; + 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/PromptArgument;)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/PromptArgument$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/PromptListChangedNotification : io/modelcontextprotocol/kotlin/sdk/types/ServerNotification { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/PromptListChangedNotification$Companion; + public fun ()V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;)Lio/modelcontextprotocol/kotlin/sdk/types/PromptListChangedNotification; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/PromptListChangedNotification;Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/PromptListChangedNotification; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/NotificationParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/PromptListChangedNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/PromptListChangedNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/PromptListChangedNotification; + 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/PromptListChangedNotification;)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/PromptListChangedNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/PromptMessage { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/PromptMessage$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/Role;Lio/modelcontextprotocol/kotlin/sdk/types/ContentBlock;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/Role; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/ContentBlock; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/Role;Lio/modelcontextprotocol/kotlin/sdk/types/ContentBlock;)Lio/modelcontextprotocol/kotlin/sdk/types/PromptMessage; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/PromptMessage;Lio/modelcontextprotocol/kotlin/sdk/types/Role;Lio/modelcontextprotocol/kotlin/sdk/types/ContentBlock;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/PromptMessage; + public fun equals (Ljava/lang/Object;)Z + public final fun getContent ()Lio/modelcontextprotocol/kotlin/sdk/types/ContentBlock; + public final fun getRole ()Lio/modelcontextprotocol/kotlin/sdk/types/Role; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/PromptMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/PromptMessage$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/PromptMessage; + 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/PromptMessage;)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/PromptMessage$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/PromptReference : io/modelcontextprotocol/kotlin/sdk/types/Reference { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/PromptReference$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/PromptReference; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/PromptReference;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/PromptReference; + public fun equals (Ljava/lang/Object;)Z + public final fun getName ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public fun getType ()Lio/modelcontextprotocol/kotlin/sdk/types/ReferenceType; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/PromptReference$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/PromptReference$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/PromptReference; + 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/PromptReference;)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/PromptReference$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/RPCError { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/RPCError$Companion; + public fun (ILjava/lang/String;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (ILjava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()I + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (ILjava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lio/modelcontextprotocol/kotlin/sdk/types/RPCError; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/RPCError;ILjava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/RPCError; + public fun equals (Ljava/lang/Object;)Z + public final fun getCode ()I + public final fun getData ()Lkotlinx/serialization/json/JsonElement; + public final fun getMessage ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/RPCError$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/RPCError$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/RPCError; + 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/RPCError;)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/RPCError$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/RPCError$ErrorCode { + public static final field CONNECTION_CLOSED I + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/RPCError$ErrorCode; + public static final field INTERNAL_ERROR I + public static final field INVALID_PARAMS I + public static final field INVALID_REQUEST I + public static final field METHOD_NOT_FOUND I + public static final field PARSE_ERROR I + public static final field REQUEST_TIMEOUT I +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequest$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequestParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequest;Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequest; + 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/ReadResourceRequest;)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/ReadResourceRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequestParams$Companion; + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-D-90kyg (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequestParams; + public static synthetic fun copy-D-90kyg$default (Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequestParams;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequestParams; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun getUri ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceRequestParams; + 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/ReadResourceRequestParams;)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/ReadResourceRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ReadResourceResult : io/modelcontextprotocol/kotlin/sdk/types/ServerResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceResult$Companion; + public fun (Ljava/util/List;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/util/List;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/util/List;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceResult;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceResult; + public fun equals (Ljava/lang/Object;)Z + public final fun getContents ()Ljava/util/List; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ReadResourceResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ReadResourceResult; + 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/ReadResourceResult;)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/ReadResourceResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/Reference { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Reference$Companion; + public abstract fun getType ()Lio/modelcontextprotocol/kotlin/sdk/types/ReferenceType; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Reference$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ReferenceType : java/lang/Enum { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ReferenceType$Companion; + public static final field Prompt Lio/modelcontextprotocol/kotlin/sdk/types/ReferenceType; + public static final field ResourceTemplate Lio/modelcontextprotocol/kotlin/sdk/types/ReferenceType; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getValue ()Ljava/lang/String; + public static fun valueOf (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/ReferenceType; + public static fun values ()[Lio/modelcontextprotocol/kotlin/sdk/types/ReferenceType; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ReferenceType$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/Request { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Request$Companion; + public abstract fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public abstract fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Request$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/RequestId { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/RequestId$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/RequestId$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/RequestId$NumberId : io/modelcontextprotocol/kotlin/sdk/types/RequestId { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/RequestId$NumberId$Companion; + public static final synthetic fun box-impl (J)Lio/modelcontextprotocol/kotlin/sdk/types/RequestId$NumberId; + public static fun constructor-impl (J)J + public fun equals (Ljava/lang/Object;)Z + public static fun equals-impl (JLjava/lang/Object;)Z + public static final fun equals-impl0 (JJ)Z + public final fun getValue ()J + public fun hashCode ()I + public static fun hashCode-impl (J)I + public fun toString ()Ljava/lang/String; + public static fun toString-impl (J)Ljava/lang/String; + public final synthetic fun unbox-impl ()J +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/RequestId$NumberId$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/RequestId$NumberId$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun deserialize-Nt6Vbyc (Lkotlinx/serialization/encoding/Decoder;)J + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public final fun serialize-T5IKJsA (Lkotlinx/serialization/encoding/Encoder;J)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/RequestId$NumberId$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/RequestId$StringId : io/modelcontextprotocol/kotlin/sdk/types/RequestId { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/RequestId$StringId$Companion; + public static final synthetic fun box-impl (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/RequestId$StringId; + public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String; + public fun equals (Ljava/lang/Object;)Z + public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z + public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z + public final fun getValue ()Ljava/lang/String; + public fun hashCode ()I + public static fun hashCode-impl (Ljava/lang/String;)I + public fun toString ()Ljava/lang/String; + public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String; + public final synthetic fun unbox-impl ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/RequestId$StringId$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/RequestId$StringId$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun deserialize-QNUQp7g (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/String; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public final fun serialize-i2Jt6-s (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/String;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/RequestId$StringId$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/RequestMeta { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/RequestMeta$Companion; + public static final synthetic fun box-impl (Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/RequestMeta; + public static fun constructor-impl (Lkotlinx/serialization/json/JsonObject;)Lkotlinx/serialization/json/JsonObject; + public fun equals (Ljava/lang/Object;)Z + public static fun equals-impl (Lkotlinx/serialization/json/JsonObject;Ljava/lang/Object;)Z + public static final fun equals-impl0 (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;)Z + public static final fun get-impl (Lkotlinx/serialization/json/JsonObject;Ljava/lang/String;)Lkotlinx/serialization/json/JsonElement; + public final fun getJson ()Lkotlinx/serialization/json/JsonObject; + public static final fun getProgressToken-impl (Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public fun hashCode ()I + public static fun hashCode-impl (Lkotlinx/serialization/json/JsonObject;)I + public fun toString ()Ljava/lang/String; + public static fun toString-impl (Lkotlinx/serialization/json/JsonObject;)Ljava/lang/String; + public final synthetic fun unbox-impl ()Lkotlinx/serialization/json/JsonObject; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/RequestMeta$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/RequestMeta$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun deserialize-6WR2xV8 (Lkotlinx/serialization/encoding/Decoder;)Lkotlinx/serialization/json/JsonObject; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public final fun serialize-qqtNtwg (Lkotlinx/serialization/encoding/Encoder;Lkotlinx/serialization/json/JsonObject;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/RequestMeta$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams$Companion; + public abstract fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/RequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/RequestResult : io/modelcontextprotocol/kotlin/sdk/types/WithMeta { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/RequestResult$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/RequestResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Resource : io/modelcontextprotocol/kotlin/sdk/types/ResourceLike { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Resource$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/Long; + public final fun component6 ()Ljava/lang/String; + public final fun component7 ()Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public final fun component8 ()Ljava/util/List; + public final fun component9 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/Resource; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/Resource;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/Resource; + public fun equals (Ljava/lang/Object;)Z + public final fun getAnnotations ()Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public final fun getDescription ()Ljava/lang/String; + public final fun getIcons ()Ljava/util/List; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getMimeType ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun getSize ()Ljava/lang/Long; + public final fun getTitle ()Ljava/lang/String; + public final fun getUri ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/Resource$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/Resource$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/Resource; + 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/Resource;)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/Resource$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/ResourceContents : io/modelcontextprotocol/kotlin/sdk/types/WithMeta { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ResourceContents$Companion; + public abstract fun getMimeType ()Ljava/lang/String; + public abstract fun getUri ()Ljava/lang/String; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ResourceContents$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/ResourceLike : io/modelcontextprotocol/kotlin/sdk/types/WithMeta { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ResourceLike$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ResourceLike$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ResourceLink : io/modelcontextprotocol/kotlin/sdk/types/ContentBlock, io/modelcontextprotocol/kotlin/sdk/types/ResourceLike { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ResourceLink$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/Long; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/util/List; + public final fun component7 ()Ljava/lang/String; + public final fun component8 ()Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public final fun component9 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceLink; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ResourceLink;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceLink; + public fun equals (Ljava/lang/Object;)Z + public final fun getAnnotations ()Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public final fun getDescription ()Ljava/lang/String; + public final fun getIcons ()Ljava/util/List; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getMimeType ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun getSize ()Ljava/lang/Long; + public final fun getTitle ()Ljava/lang/String; + public fun getType ()Lio/modelcontextprotocol/kotlin/sdk/types/ContentTypes; + public final fun getUri ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ResourceLink$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ResourceLink$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceLink; + 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/ResourceLink;)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/ResourceLink$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ResourceListChangedNotification : io/modelcontextprotocol/kotlin/sdk/types/ServerNotification { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ResourceListChangedNotification$Companion; + public fun ()V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceListChangedNotification; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ResourceListChangedNotification;Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceListChangedNotification; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/NotificationParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ResourceListChangedNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ResourceListChangedNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceListChangedNotification; + 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/ResourceListChangedNotification;)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/ResourceListChangedNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ResourceTemplate : io/modelcontextprotocol/kotlin/sdk/types/WithMeta { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ResourceTemplate$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public final fun component7 ()Ljava/util/List; + public final fun component8 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceTemplate; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ResourceTemplate;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceTemplate; + public fun equals (Ljava/lang/Object;)Z + public final fun getAnnotations ()Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public final fun getDescription ()Ljava/lang/String; + public final fun getIcons ()Ljava/util/List; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getMimeType ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public final fun getUriTemplate ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ResourceTemplate$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ResourceTemplate$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceTemplate; + 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/ResourceTemplate;)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/ResourceTemplate$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ResourceTemplateReference : io/modelcontextprotocol/kotlin/sdk/types/Reference { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ResourceTemplateReference$Companion; + public fun (Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceTemplateReference; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ResourceTemplateReference;Ljava/lang/String;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceTemplateReference; + public fun equals (Ljava/lang/Object;)Z + public fun getType ()Lio/modelcontextprotocol/kotlin/sdk/types/ReferenceType; + public final fun getUri ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ResourceTemplateReference$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ResourceTemplateReference$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceTemplateReference; + 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/ResourceTemplateReference;)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/ResourceTemplateReference$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotification : io/modelcontextprotocol/kotlin/sdk/types/ServerNotification { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotification$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotificationParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotificationParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotificationParams;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotification; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotification;Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotificationParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotification; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/NotificationParams; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotificationParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotification; + 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/ResourceUpdatedNotification;)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/ResourceUpdatedNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotificationParams : io/modelcontextprotocol/kotlin/sdk/types/NotificationParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotificationParams$Companion; + public fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotificationParams; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotificationParams;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotificationParams; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getUri ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotificationParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotificationParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotificationParams; + 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/ResourceUpdatedNotificationParams;)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/ResourceUpdatedNotificationParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Role : java/lang/Enum { + public static final field Assistant Lio/modelcontextprotocol/kotlin/sdk/types/Role; + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Role$Companion; + public static final field User Lio/modelcontextprotocol/kotlin/sdk/types/Role; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/Role; + public static fun values ()[Lio/modelcontextprotocol/kotlin/sdk/types/Role; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Role$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Root : io/modelcontextprotocol/kotlin/sdk/types/WithMeta { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Root$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/Root; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/Root;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/Root; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getName ()Ljava/lang/String; + public final fun getUri ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/Root$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/Root$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/Root; + 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/Root;)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/Root$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/RootsListChangedNotification : io/modelcontextprotocol/kotlin/sdk/types/ClientNotification { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/RootsListChangedNotification$Companion; + public fun ()V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;)Lio/modelcontextprotocol/kotlin/sdk/types/RootsListChangedNotification; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/RootsListChangedNotification;Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/RootsListChangedNotification; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/NotificationParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/RootsListChangedNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/RootsListChangedNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/RootsListChangedNotification; + 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/RootsListChangedNotification;)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/RootsListChangedNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/SamplingMessage { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/SamplingMessage$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/Role;Lio/modelcontextprotocol/kotlin/sdk/types/MediaContent;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/Role; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/MediaContent; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/Role;Lio/modelcontextprotocol/kotlin/sdk/types/MediaContent;)Lio/modelcontextprotocol/kotlin/sdk/types/SamplingMessage; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/SamplingMessage;Lio/modelcontextprotocol/kotlin/sdk/types/Role;Lio/modelcontextprotocol/kotlin/sdk/types/MediaContent;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/SamplingMessage; + public fun equals (Ljava/lang/Object;)Z + public final fun getContent ()Lio/modelcontextprotocol/kotlin/sdk/types/MediaContent; + public final fun getRole ()Lio/modelcontextprotocol/kotlin/sdk/types/Role; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/SamplingMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/SamplingMessage$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/SamplingMessage; + 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/SamplingMessage;)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/SamplingMessage$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Companion; + public fun ()V + public fun (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;)V + public synthetic fun (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;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 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;)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;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; + 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 getTools ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities; + 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;)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$Companion { + public final fun getCompletions ()Lkotlinx/serialization/json/JsonObject; + public final fun getLogging ()Lkotlinx/serialization/json/JsonObject; + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts$Companion; + public fun ()V + public fun (Ljava/lang/Boolean;)V + public synthetic fun (Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/Boolean; + public final fun copy (Ljava/lang/Boolean;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts;Ljava/lang/Boolean;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts; + public fun equals (Ljava/lang/Object;)Z + public final fun getListChanged ()Ljava/lang/Boolean; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Prompts; + 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$Prompts;)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$Prompts$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources$Companion; + public fun ()V + public fun (Ljava/lang/Boolean;Ljava/lang/Boolean;)V + public synthetic fun (Ljava/lang/Boolean;Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/Boolean; + public final fun component2 ()Ljava/lang/Boolean; + public final fun copy (Ljava/lang/Boolean;Ljava/lang/Boolean;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources; + public fun equals (Ljava/lang/Object;)Z + public final fun getListChanged ()Ljava/lang/Boolean; + public final fun getSubscribe ()Ljava/lang/Boolean; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Resources; + 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$Resources;)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$Resources$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 ()V + public fun (Ljava/lang/Boolean;)V + public synthetic fun (Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/Boolean; + public final fun copy (Ljava/lang/Boolean;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools;Ljava/lang/Boolean;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools; + public fun equals (Ljava/lang/Object;)Z + public final fun getListChanged ()Ljava/lang/Boolean; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$Tools$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities$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$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$Tools$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/ServerNotification : io/modelcontextprotocol/kotlin/sdk/types/Notification { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerNotification$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ServerNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/ServerRequest : io/modelcontextprotocol/kotlin/sdk/types/Request { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerRequest$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ServerRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/ServerResult : io/modelcontextprotocol/kotlin/sdk/types/RequestResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ServerResult$Companion; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ServerResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/SetLevelRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequest$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequestParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequest;Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/SetLevelRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequest; + 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/SetLevelRequest;)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/SetLevelRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/SetLevelRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequestParams$Companion; + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel; + public final fun component2-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-D-90kyg (Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequestParams; + public static synthetic fun copy-D-90kyg$default (Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequestParams;Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequestParams; + public fun equals (Ljava/lang/Object;)Z + public final fun getLevel ()Lio/modelcontextprotocol/kotlin/sdk/types/LoggingLevel; + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/SetLevelRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/SetLevelRequestParams; + 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/SetLevelRequestParams;)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/SetLevelRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/StopReason { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/StopReason$Companion; + public static final synthetic fun box-impl (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/StopReason; + public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String; + public fun equals (Ljava/lang/Object;)Z + public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z + public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z + public final fun getValue ()Ljava/lang/String; + public fun hashCode ()I + public static fun hashCode-impl (Ljava/lang/String;)I + public fun toString ()Ljava/lang/String; + public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String; + public final synthetic fun unbox-impl ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/StopReason$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/StopReason$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun deserialize-_6z6jHk (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/String; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public final fun serialize-OgWWgxw (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/String;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/StopReason$Companion { + public final fun getEndTurn--MeDoko ()Ljava/lang/String; + public final fun getMaxTokens--MeDoko ()Ljava/lang/String; + public final fun getStopSequence--MeDoko ()Ljava/lang/String; + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/SubscribeRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequest$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequest;Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/SubscribeRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequest; + 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/SubscribeRequest;)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/SubscribeRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestParams$Companion; + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-D-90kyg (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestParams; + public static synthetic fun copy-D-90kyg$default (Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestParams;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestParams; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun getUri ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestParams; + 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/SubscribeRequestParams;)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/SubscribeRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TextContent : io/modelcontextprotocol/kotlin/sdk/types/MediaContent { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/TextContent$Companion; + public fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public final fun component3 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/TextContent; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/TextContent;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/TextContent; + public fun equals (Ljava/lang/Object;)Z + public final fun getAnnotations ()Lio/modelcontextprotocol/kotlin/sdk/types/Annotations; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getText ()Ljava/lang/String; + public fun getType ()Lio/modelcontextprotocol/kotlin/sdk/types/ContentTypes; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/TextContent$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/TextContent$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/TextContent; + 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/TextContent;)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/TextContent$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TextResourceContents : io/modelcontextprotocol/kotlin/sdk/types/ResourceContents { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/TextResourceContents$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/TextResourceContents; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/TextResourceContents;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/TextResourceContents; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun getMimeType ()Ljava/lang/String; + public final fun getText ()Ljava/lang/String; + public fun getUri ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/TextResourceContents$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/TextResourceContents$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/TextResourceContents; + 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/TextResourceContents;)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/TextResourceContents$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Tool : io/modelcontextprotocol/kotlin/sdk/types/WithMeta { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Tool$Companion; + public fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations; + public final fun component7 ()Ljava/util/List; + public final fun component8 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/Tool; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/Tool;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/Tool; + public fun equals (Ljava/lang/Object;)Z + public final fun getAnnotations ()Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations; + public final fun getDescription ()Ljava/lang/String; + public final fun getIcons ()Ljava/util/List; + public final fun getInputSchema ()Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getName ()Ljava/lang/String; + public final fun getOutputSchema ()Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/Tool$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/Tool$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/Tool; + 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/Tool;)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/Tool$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/Boolean; + public final fun component3 ()Ljava/lang/Boolean; + public final fun component4 ()Ljava/lang/Boolean; + public final fun component5 ()Ljava/lang/Boolean; + public final fun copy (Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations; + public fun equals (Ljava/lang/Object;)Z + public final fun getDestructiveHint ()Ljava/lang/Boolean; + public final fun getIdempotentHint ()Ljava/lang/Boolean; + public final fun getOpenWorldHint ()Ljava/lang/Boolean; + public final fun getReadOnlyHint ()Ljava/lang/Boolean; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations; + 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/ToolAnnotations;)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/ToolAnnotations$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ToolListChangedNotification : io/modelcontextprotocol/kotlin/sdk/types/ServerNotification { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ToolListChangedNotification$Companion; + public fun ()V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;)Lio/modelcontextprotocol/kotlin/sdk/types/ToolListChangedNotification; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ToolListChangedNotification;Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ToolListChangedNotification; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/NotificationParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ToolListChangedNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ToolListChangedNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ToolListChangedNotification; + 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/ToolListChangedNotification;)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/ToolListChangedNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ToolSchema { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema$Companion; + public fun ()V + public fun (Lkotlinx/serialization/json/JsonObject;Ljava/util/List;)V + public synthetic fun (Lkotlinx/serialization/json/JsonObject;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lkotlinx/serialization/json/JsonObject; + public final fun component2 ()Ljava/util/List; + public final fun copy (Lkotlinx/serialization/json/JsonObject;Ljava/util/List;)Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Lkotlinx/serialization/json/JsonObject;Ljava/util/List;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getProperties ()Lkotlinx/serialization/json/JsonObject; + public final fun getRequired ()Ljava/util/List; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ToolSchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema; + 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/ToolSchema;)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/ToolSchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ToolsKt { + public static final fun error (Lio/modelcontextprotocol/kotlin/sdk/types/CallToolResult$Companion;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/CallToolResult; + public static synthetic fun error$default (Lio/modelcontextprotocol/kotlin/sdk/types/CallToolResult$Companion;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CallToolResult; + public static final fun success (Lio/modelcontextprotocol/kotlin/sdk/types/CallToolResult$Companion;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/CallToolResult; + public static synthetic fun success$default (Lio/modelcontextprotocol/kotlin/sdk/types/CallToolResult$Companion;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CallToolResult; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/UnknownResourceContents : io/modelcontextprotocol/kotlin/sdk/types/ResourceContents { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/UnknownResourceContents$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/UnknownResourceContents; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/UnknownResourceContents;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/UnknownResourceContents; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun getMimeType ()Ljava/lang/String; + public fun getUri ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/UnknownResourceContents$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/UnknownResourceContents$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/UnknownResourceContents; + 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/UnknownResourceContents;)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/UnknownResourceContents$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequest$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequestParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequest;Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequest; + 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/UnsubscribeRequest;)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/UnsubscribeRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequestParams$Companion; + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-D-90kyg (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequestParams; + public static synthetic fun copy-D-90kyg$default (Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequestParams;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequestParams; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun getUri ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/UnsubscribeRequestParams; + 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/UnsubscribeRequestParams;)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/UnsubscribeRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/WithMeta { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/WithMeta$Companion; + public abstract fun getMeta ()Lkotlinx/serialization/json/JsonObject; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/WithMeta$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt index 6eedfe62..7d559246 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt @@ -1,24 +1,27 @@ package io.modelcontextprotocol.kotlin.sdk.shared import io.github.oshai.kotlinlogging.KotlinLogging -import io.modelcontextprotocol.kotlin.sdk.CancelledNotification -import io.modelcontextprotocol.kotlin.sdk.EmptyRequestResult -import io.modelcontextprotocol.kotlin.sdk.ErrorCode -import io.modelcontextprotocol.kotlin.sdk.JSONRPCError -import io.modelcontextprotocol.kotlin.sdk.JSONRPCNotification -import io.modelcontextprotocol.kotlin.sdk.JSONRPCRequest -import io.modelcontextprotocol.kotlin.sdk.JSONRPCResponse -import io.modelcontextprotocol.kotlin.sdk.McpError -import io.modelcontextprotocol.kotlin.sdk.Method -import io.modelcontextprotocol.kotlin.sdk.Notification -import io.modelcontextprotocol.kotlin.sdk.PingRequest -import io.modelcontextprotocol.kotlin.sdk.Progress -import io.modelcontextprotocol.kotlin.sdk.ProgressNotification -import io.modelcontextprotocol.kotlin.sdk.Request -import io.modelcontextprotocol.kotlin.sdk.RequestId -import io.modelcontextprotocol.kotlin.sdk.RequestResult -import io.modelcontextprotocol.kotlin.sdk.fromJSON -import io.modelcontextprotocol.kotlin.sdk.toJSON +import io.modelcontextprotocol.kotlin.sdk.types.CancelledNotification +import io.modelcontextprotocol.kotlin.sdk.types.CancelledNotificationParams +import io.modelcontextprotocol.kotlin.sdk.types.EmptyResult +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCError +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCNotification +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCRequest +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCResponse +import io.modelcontextprotocol.kotlin.sdk.types.McpException +import io.modelcontextprotocol.kotlin.sdk.types.McpJson +import io.modelcontextprotocol.kotlin.sdk.types.Method +import io.modelcontextprotocol.kotlin.sdk.types.Notification +import io.modelcontextprotocol.kotlin.sdk.types.PingRequest +import io.modelcontextprotocol.kotlin.sdk.types.Progress +import io.modelcontextprotocol.kotlin.sdk.types.ProgressNotification +import io.modelcontextprotocol.kotlin.sdk.types.ProgressToken +import io.modelcontextprotocol.kotlin.sdk.types.RPCError +import io.modelcontextprotocol.kotlin.sdk.types.Request +import io.modelcontextprotocol.kotlin.sdk.types.RequestId +import io.modelcontextprotocol.kotlin.sdk.types.RequestResult +import io.modelcontextprotocol.kotlin.sdk.types.fromJSON +import io.modelcontextprotocol.kotlin.sdk.types.toJSON import kotlinx.atomicfu.AtomicRef import kotlinx.atomicfu.atomic import kotlinx.atomicfu.getAndUpdate @@ -35,9 +38,6 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.encodeToJsonElement -import kotlinx.serialization.serializer -import kotlin.reflect.KType -import kotlin.reflect.typeOf import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds @@ -51,6 +51,11 @@ public const val IMPLEMENTATION_NAME: String = "mcp-ktor" public typealias ProgressCallback = (Progress) -> Unit @OptIn(ExperimentalSerializationApi::class) +@Deprecated( + message = "Use McpJson instead", + replaceWith = ReplaceWith("McpJson", "io.modelcontextprotocol.kotlin.sdk.types.McpJson"), + level = DeprecationLevel.WARNING, +) public val McpJson: Json by lazy { Json { ignoreUnknownKeys = true @@ -143,9 +148,9 @@ public abstract class Protocol(@PublishedApi internal val options: ProtocolOptio public val responseHandlers: Map Unit> get() = _responseHandlers.value - private val _progressHandlers: AtomicRef> = + private val _progressHandlers: AtomicRef> = atomic(persistentMapOf()) - public val progressHandlers: Map + public val progressHandlers: Map get() = _progressHandlers.value /** @@ -183,7 +188,7 @@ public abstract class Protocol(@PublishedApi internal val options: ProtocolOptio } setRequestHandler(Method.Defined.Ping) { _, _ -> - EmptyRequestResult() + EmptyResult() } } @@ -222,7 +227,7 @@ public abstract class Protocol(@PublishedApi internal val options: ProtocolOptio transport = null onClose() - val error = McpError(ErrorCode.Defined.ConnectionClosed.code, "Connection closed") + val error = McpException(RPCError.ErrorCode.CONNECTION_CLOSED, "Connection closed") for (handler in handlersToNotify) { handler(null, error) } @@ -254,10 +259,10 @@ public abstract class Protocol(@PublishedApi internal val options: ProtocolOptio logger.trace { "No handler found for request: ${request.method}" } try { transport?.send( - JSONRPCResponse( + JSONRPCError( id = request.id, - error = JSONRPCError( - ErrorCode.Defined.MethodNotFound, + error = RPCError( + code = RPCError.ErrorCode.METHOD_NOT_FOUND, message = "Server does not support ${request.method}", ), ), @@ -276,7 +281,7 @@ public abstract class Protocol(@PublishedApi internal val options: ProtocolOptio transport?.send( JSONRPCResponse( id = request.id, - result = result, + result = result ?: EmptyResult(), ), ) } catch (cause: Throwable) { @@ -284,10 +289,10 @@ public abstract class Protocol(@PublishedApi internal val options: ProtocolOptio try { transport?.send( - JSONRPCResponse( + JSONRPCError( id = request.id, - error = JSONRPCError( - code = ErrorCode.Defined.InternalError, + error = RPCError( + code = RPCError.ErrorCode.INTERNAL_ERROR, message = cause.message ?: "Internal error", ), ), @@ -324,7 +329,7 @@ public abstract class Protocol(@PublishedApi internal val options: ProtocolOptio } private fun onResponse(response: JSONRPCResponse?, error: JSONRPCError?) { - val messageId = response?.id + val messageId = response?.id ?: error?.id val oldResponseHandlers = _responseHandlers.getAndUpdate { current -> if (messageId != null && messageId in current) { @@ -347,10 +352,10 @@ public abstract class Protocol(@PublishedApi internal val options: ProtocolOptio handler(response, null) } else { check(error != null) - val error = McpError( - error.code.code, - error.message, - error.data, + val error = McpException( + code = error.error.code, + message = error.error.message, + data = error.error.data, ) handler(null, error) } @@ -415,11 +420,6 @@ public abstract class Protocol(@PublishedApi internal val options: ProtocolOptio return@put } - if (response?.error != null) { - result.completeExceptionally(IllegalStateException(response.error.toString())) - return@put - } - try { @Suppress("UNCHECKED_CAST") result.complete(response!!.result as T) @@ -434,7 +434,7 @@ public abstract class Protocol(@PublishedApi internal val options: ProtocolOptio _progressHandlers.update { current -> current.remove(messageId) } val notification = CancelledNotification( - params = CancelledNotification.Params( + params = CancelledNotificationParams( requestId = messageId, reason = reason.message ?: "Unknown", ), @@ -459,10 +459,10 @@ public abstract class Protocol(@PublishedApi internal val options: ProtocolOptio } catch (cause: TimeoutCancellationException) { logger.error { "Request timed out after ${timeout.inWholeMilliseconds}ms: ${request.method}" } cancel( - McpError( - ErrorCode.Defined.RequestTimeout.code, - "Request timed out", - JsonObject(mutableMapOf("timeout" to JsonPrimitive(timeout.inWholeMilliseconds))), + McpException( + code = RPCError.ErrorCode.REQUEST_TIMEOUT, + message = "Request timed out", + data = JsonObject(mutableMapOf("timeout" to JsonPrimitive(timeout.inWholeMilliseconds))), ), ) result.cancel(cause) @@ -491,28 +491,21 @@ public abstract class Protocol(@PublishedApi internal val options: ProtocolOptio method: Method, noinline block: suspend (T, RequestHandlerExtra) -> RequestResult?, ) { - setRequestHandler(typeOf(), method, block) + setRequestHandlerInternal(method, block) } @PublishedApi - internal fun setRequestHandler( - requestType: KType, + @Suppress("UNCHECKED_CAST") + internal fun setRequestHandlerInternal( method: Method, block: suspend (T, RequestHandlerExtra) -> RequestResult?, ) { assertRequestHandlerCapability(method) - val serializer = McpJson.serializersModule.serializer(requestType) - _requestHandlers.update { current -> - current.put(method.value) { request, extraHandler -> - val result = McpJson.decodeFromJsonElement(serializer, request.params) - val response = if (result != null) { - @Suppress("UNCHECKED_CAST") - block(result as T, extraHandler) - } else { - EmptyRequestResult() - } + current.put(method.value) { jSONRPCRequest, extraHandler -> + val request = jSONRPCRequest.fromJSON() + val response = block(request as T, extraHandler) response } } diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/ReadBuffer.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/ReadBuffer.kt index 014e0eee..d991e7fe 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/ReadBuffer.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/ReadBuffer.kt @@ -1,7 +1,8 @@ package io.modelcontextprotocol.kotlin.sdk.shared import io.github.oshai.kotlinlogging.KotlinLogging -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.McpJson import kotlinx.io.Buffer import kotlinx.io.indexOf import kotlinx.io.readString diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Transport.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Transport.kt index ba460f94..0ce13ecb 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Transport.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Transport.kt @@ -1,6 +1,6 @@ package io.modelcontextprotocol.kotlin.sdk.shared -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage import kotlinx.coroutines.CompletableDeferred /** diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/WebSocketMcpTransport.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/WebSocketMcpTransport.kt index 85c60c05..4b209261 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/WebSocketMcpTransport.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/WebSocketMcpTransport.kt @@ -5,7 +5,8 @@ import io.ktor.websocket.Frame import io.ktor.websocket.WebSocketSession import io.ktor.websocket.close import io.ktor.websocket.readText -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.McpJson import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.InternalCoroutinesApi @@ -58,7 +59,7 @@ public abstract class WebSocketMcpTransport : AbstractTransport() { while (true) { val message = try { session.incoming.receive() - } catch (e: ClosedReceiveChannelException) { + } catch (_: ClosedReceiveChannelException) { logger.debug { "Closed receive channel, exiting" } return@launch } diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt index 60adcca4..45226199 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt @@ -20,33 +20,74 @@ import kotlin.jvm.JvmInline import kotlin.time.ExperimentalTime import kotlin.time.Instant +@Deprecated( + message = "Use `LATEST_PROTOCOL_VERSION` instead", + replaceWith = ReplaceWith( + "LATEST_PROTOCOL_VERSION", + "io.modelcontextprotocol.kotlin.sdk.types.LATEST_PROTOCOL_VERSION", + ), + level = DeprecationLevel.WARNING, +) public const val LATEST_PROTOCOL_VERSION: String = "2025-03-26" +@Deprecated( + message = "Use `SUPPORTED_PROTOCOL_VERSIONS` instead", + replaceWith = ReplaceWith( + "SUPPORTED_PROTOCOL_VERSIONS", + "io.modelcontextprotocol.kotlin.sdk.types.SUPPORTED_PROTOCOL_VERSIONS", + ), + level = DeprecationLevel.WARNING, +) public val SUPPORTED_PROTOCOL_VERSIONS: Array = arrayOf( LATEST_PROTOCOL_VERSION, "2024-11-05", ) +@Deprecated( + message = "Use `JSONRPC_VERSION` instead", + replaceWith = ReplaceWith("JSONRPC_VERSION", "io.modelcontextprotocol.kotlin.sdk.types.JSONRPC_VERSION"), + level = DeprecationLevel.WARNING, +) public const val JSONRPC_VERSION: String = "2.0" @OptIn(ExperimentalAtomicApi::class) +@Deprecated( + message = "Use `REQUEST_MESSAGE_ID` instead", + replaceWith = ReplaceWith("REQUEST_MESSAGE_ID", "io.modelcontextprotocol.kotlin.sdk.types.REQUEST_MESSAGE_ID"), + level = DeprecationLevel.WARNING, +) private val REQUEST_MESSAGE_ID: AtomicLong = AtomicLong(0L) /** * A progress token, used to associate progress notifications with the original request. * Stores message ID. */ +@Deprecated( + message = "Use `ProgressToken` instead", + replaceWith = ReplaceWith("ProgressToken", "io.modelcontextprotocol.kotlin.sdk.types.ProgressToken"), + level = DeprecationLevel.WARNING, +) public typealias ProgressToken = RequestId /** * An opaque token used to represent a cursor for pagination. */ +@Deprecated( + message = "This alias will be removed. Use String directly instead.", + replaceWith = ReplaceWith("String"), + level = DeprecationLevel.WARNING, +) public typealias Cursor = String /** * Represents an entity that includes additional metadata in its responses. */ @Serializable +@Deprecated( + message = "Use `WithMeta` instead", + replaceWith = ReplaceWith("WithMeta", "io.modelcontextprotocol.kotlin.sdk.types.WithMeta"), + level = DeprecationLevel.WARNING, +) public sealed interface WithMeta { /** * The protocol reserves this result property @@ -66,12 +107,22 @@ public sealed interface WithMeta { * @param _meta The JSON object holding metadata. Defaults to an empty JSON object. */ @Serializable +@Deprecated( + message = "This class will be removed. Use `WithMeta` instead", + replaceWith = ReplaceWith("WithMeta", "io.modelcontextprotocol.kotlin.sdk.types.WithMeta"), + level = DeprecationLevel.WARNING, +) public class CustomMeta(override val _meta: JsonObject = EmptyJsonObject) : WithMeta /** * Represents a method in the protocol, which can be predefined or custom. */ @Serializable(with = RequestMethodSerializer::class) +@Deprecated( + message = "Use `Method` instead", + replaceWith = ReplaceWith("Method", "io.modelcontextprotocol.kotlin.sdk.types.Method"), + level = DeprecationLevel.WARNING, +) public sealed interface Method { public val value: String @@ -118,6 +169,11 @@ public sealed interface Method { * Represents a request in the protocol. */ @Serializable(with = RequestPolymorphicSerializer::class) +@Deprecated( + message = "Use `Request` instead", + replaceWith = ReplaceWith("Request", "io.modelcontextprotocol.kotlin.sdk.types.Request"), + level = DeprecationLevel.WARNING, +) public sealed interface Request { public val method: Method } @@ -127,6 +183,11 @@ public sealed interface Request { * * @return The JSON-RPC request representation. */ +@Deprecated( + message = "Use `toJSON` instead", + replaceWith = ReplaceWith("toJSON", "io.modelcontextprotocol.kotlin.sdk.types.toJSON"), + level = DeprecationLevel.WARNING, +) public fun Request.toJSON(): JSONRPCRequest { val fullJson = McpJson.encodeToJsonElement(this).jsonObject val params = JsonObject(fullJson.filterKeys { it != "method" }) @@ -142,6 +203,11 @@ public fun Request.toJSON(): JSONRPCRequest { * * @return The decoded [Request] or null */ +@Deprecated( + message = "Use `fromJSON` instead", + replaceWith = ReplaceWith("fromJSON", "io.modelcontextprotocol.kotlin.sdk.types.fromJSON"), + level = DeprecationLevel.WARNING, +) internal fun JSONRPCRequest.fromJSON(): Request { val requestData = JsonObject(params.jsonObject + ("method" to JsonPrimitive(method))) val deserializer = selectRequestDeserializer(method) @@ -154,12 +220,22 @@ internal fun JSONRPCRequest.fromJSON(): Request { * @param method The method associated with the request. */ @Serializable +@Deprecated( + message = "Use `CustomRequest` instead", + replaceWith = ReplaceWith("CustomRequest", "io.modelcontextprotocol.kotlin.sdk.types.CustomRequest"), + level = DeprecationLevel.WARNING, +) public open class CustomRequest(override val method: Method) : Request /** * Represents a notification in the protocol. */ @Serializable(with = NotificationPolymorphicSerializer::class) +@Deprecated( + message = "Use `Notification` instead", + replaceWith = ReplaceWith("Notification", "io.modelcontextprotocol.kotlin.sdk.types.Notification"), + level = DeprecationLevel.WARNING, +) public sealed interface Notification { public val method: Method public val params: NotificationParams? @@ -170,6 +246,11 @@ public sealed interface Notification { * * @return The JSON-RPC notification representation. */ +@Deprecated( + message = "Use `toJSON` instead", + replaceWith = ReplaceWith("toJSON", "io.modelcontextprotocol.kotlin.sdk.types.toJSON"), + level = DeprecationLevel.WARNING, +) public fun Notification.toJSON(): JSONRPCNotification = JSONRPCNotification( method = method.value, params = McpJson.encodeToJsonElement(params), @@ -180,6 +261,11 @@ public fun Notification.toJSON(): JSONRPCNotification = JSONRPCNotification( * * @return The decoded [Notification]. */ +@Deprecated( + message = "Use `fromJSON` instead", + replaceWith = ReplaceWith("toJSON", "io.modelcontextprotocol.kotlin.sdk.types.fromJSON"), + level = DeprecationLevel.WARNING, +) internal fun JSONRPCNotification.fromJSON(): Notification { val data = buildJsonObject { put("method", JsonPrimitive(method)) @@ -192,6 +278,11 @@ internal fun JSONRPCNotification.fromJSON(): Notification { * Represents the result of a request, including additional metadata. */ @Serializable(with = RequestResultPolymorphicSerializer::class) +@Deprecated( + message = "Use `RequestResult` instead", + replaceWith = ReplaceWith("RequestResult", "io.modelcontextprotocol.kotlin.sdk.types.RequestResult"), + level = DeprecationLevel.WARNING, +) public sealed interface RequestResult : WithMeta /** @@ -200,6 +291,11 @@ public sealed interface RequestResult : WithMeta * @param _meta Additional metadata for the response. Defaults to an empty JSON object. */ @Serializable +@Deprecated( + message = "Use `EmptyResult` instead", + replaceWith = ReplaceWith("EmptyResult", "io.modelcontextprotocol.kotlin.sdk.types.EmptyResult"), + level = DeprecationLevel.WARNING, +) public data class EmptyRequestResult(override val _meta: JsonObject = EmptyJsonObject) : ServerResult, ClientResult @@ -208,6 +304,11 @@ public data class EmptyRequestResult(override val _meta: JsonObject = EmptyJsonO * A uniquely identifying ID for a request in JSON-RPC. */ @Serializable(with = RequestIdSerializer::class) +@Deprecated( + message = "Use `RequestId` instead", + replaceWith = ReplaceWith("RequestId", "io.modelcontextprotocol.kotlin.sdk.types.RequestId"), + level = DeprecationLevel.WARNING, +) public sealed interface RequestId { @Serializable public data class StringId(val value: String) : RequestId @@ -220,6 +321,11 @@ public sealed interface RequestId { * Represents a JSON-RPC message in the protocol. */ @Serializable(with = JSONRPCMessagePolymorphicSerializer::class) +@Deprecated( + message = "Use `JSONRPCMessage` instead", + replaceWith = ReplaceWith("JSONRPCMessage", "io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage"), + level = DeprecationLevel.WARNING, +) public sealed interface JSONRPCMessage /** @@ -227,6 +333,11 @@ public sealed interface JSONRPCMessage */ @OptIn(ExperimentalAtomicApi::class) @Serializable +@Deprecated( + message = "Use `JSONRPCRequest` instead", + replaceWith = ReplaceWith("JSONRPCRequest", "io.modelcontextprotocol.kotlin.sdk.types.JSONRPCRequest"), + level = DeprecationLevel.WARNING, +) public data class JSONRPCRequest( val id: RequestId = RequestId.NumberId(REQUEST_MESSAGE_ID.incrementAndFetch()), val method: String, @@ -238,6 +349,11 @@ public data class JSONRPCRequest( * A notification which does not expect a response. */ @Serializable +@Deprecated( + message = "Use `JSONRPCNotification` instead", + replaceWith = ReplaceWith("JSONRPCNotification", "io.modelcontextprotocol.kotlin.sdk.types.JSONRPCNotification"), + level = DeprecationLevel.WARNING, +) public data class JSONRPCNotification( val method: String, val params: JsonElement = EmptyJsonObject, @@ -248,6 +364,11 @@ public data class JSONRPCNotification( * A successful (non-error) response to a request. */ @Serializable +@Deprecated( + message = "Use `JSONRPCResponse` instead", + replaceWith = ReplaceWith("JSONRPCResponse", "io.modelcontextprotocol.kotlin.sdk.types.JSONRPCResponse"), + level = DeprecationLevel.WARNING, +) public class JSONRPCResponse( public val id: RequestId, public val jsonrpc: String = JSONRPC_VERSION, @@ -267,6 +388,11 @@ public class JSONRPCResponse( * An incomplete set of error codes that may appear in JSON-RPC responses. */ @Serializable(with = ErrorCodeSerializer::class) +@Deprecated( + message = "Use `RPCError` instead", + replaceWith = ReplaceWith("RPCError", "io.modelcontextprotocol.kotlin.sdk.types.RPCError"), + level = DeprecationLevel.WARNING, +) public sealed interface ErrorCode { public val code: Int @@ -292,6 +418,11 @@ public sealed interface ErrorCode { * A response to a request that indicates an error occurred. */ @Serializable +@Deprecated( + message = "Use `JSONRPCError` instead", + replaceWith = ReplaceWith("JSONRPCError", "io.modelcontextprotocol.kotlin.sdk.types.JSONRPCError"), + level = DeprecationLevel.WARNING, +) public data class JSONRPCError(val code: ErrorCode, val message: String, val data: JsonObject = EmptyJsonObject) : JSONRPCMessage @@ -299,6 +430,11 @@ public data class JSONRPCError(val code: ErrorCode, val message: String, val dat * Base interface for notification parameters with optional metadata. */ @Serializable +@Deprecated( + message = "Use `NotificationParams` instead", + replaceWith = ReplaceWith("NotificationParams", "io.modelcontextprotocol.kotlin.sdk.types.NotificationParams"), + level = DeprecationLevel.WARNING, +) public sealed interface NotificationParams : WithMeta /* Cancellation */ @@ -312,6 +448,14 @@ public sealed interface NotificationParams : WithMeta * A client MUST NOT attempt to cancel its `initialize` request. */ @Serializable +@Deprecated( + message = "Use `CancelledNotification` instead", + replaceWith = ReplaceWith( + "CancelledNotification", + "io.modelcontextprotocol.kotlin.sdk.types.CancelledNotification", + ), + level = DeprecationLevel.WARNING, +) public data class CancelledNotification(override val params: Params) : ClientNotification, ServerNotification { @@ -338,6 +482,11 @@ public data class CancelledNotification(override val params: Params) : * Describes the name and version of an MCP implementation. */ @Serializable +@Deprecated( + message = "Use `Implementation` instead", + replaceWith = ReplaceWith("Implementation", "io.modelcontextprotocol.kotlin.sdk.types.Implementation"), + level = DeprecationLevel.WARNING, +) public data class Implementation(val name: String, val version: String) /** @@ -346,6 +495,11 @@ public data class Implementation(val name: String, val version: String) * any client can define its own, additional capabilities. */ @Serializable +@Deprecated( + message = "Use `ClientCapabilities` instead", + replaceWith = ReplaceWith("ClientCapabilities", "io.modelcontextprotocol.kotlin.sdk.types.ClientCapabilities"), + level = DeprecationLevel.WARNING, +) public data class ClientCapabilities( /** * Experimental, non-standard capabilities that the client supports. @@ -377,36 +531,66 @@ public data class ClientCapabilities( * Represents a request sent by the client. */ // @Serializable(with = ClientRequestPolymorphicSerializer::class) +@Deprecated( + message = "Use `ClientRequest` instead", + replaceWith = ReplaceWith("ClientRequest", "io.modelcontextprotocol.kotlin.sdk.types.ClientRequest"), + level = DeprecationLevel.WARNING, +) public interface ClientRequest : Request /** * Represents a notification sent by the client. */ @Serializable(with = ClientNotificationPolymorphicSerializer::class) +@Deprecated( + message = "Use `ClientNotification` instead", + replaceWith = ReplaceWith("ClientNotification", "io.modelcontextprotocol.kotlin.sdk.types.ClientNotification"), + level = DeprecationLevel.WARNING, +) public sealed interface ClientNotification : Notification /** * Represents a result returned to the client. */ @Serializable(with = ClientResultPolymorphicSerializer::class) +@Deprecated( + message = "Use `ClientResult` instead", + replaceWith = ReplaceWith("ClientResult", "io.modelcontextprotocol.kotlin.sdk.types.ClientResult"), + level = DeprecationLevel.WARNING, +) public sealed interface ClientResult : RequestResult /** * Represents a request sent by the server. */ // @Serializable(with = ServerRequestPolymorphicSerializer::class) +@Deprecated( + message = "Use `ServerRequest` instead", + replaceWith = ReplaceWith("ServerRequest", "io.modelcontextprotocol.kotlin.sdk.types.ServerRequest"), + level = DeprecationLevel.WARNING, +) public sealed interface ServerRequest : Request /** * Represents a notification sent by the server. */ @Serializable(with = ServerNotificationPolymorphicSerializer::class) +@Deprecated( + message = "Use `ServerNotification` instead", + replaceWith = ReplaceWith("ServerNotification", "io.modelcontextprotocol.kotlin.sdk.types.ServerNotification"), + level = DeprecationLevel.WARNING, +) public sealed interface ServerNotification : Notification /** * Represents a result returned by the server. */ @Serializable(with = ServerResultPolymorphicSerializer::class) +@Deprecated( + message = "Use `ServerResult` instead", + replaceWith = ReplaceWith("ServerResult", "io.modelcontextprotocol.kotlin.sdk.types.ServerResult"), + level = DeprecationLevel.WARNING, +) public sealed interface ServerResult : RequestResult /** @@ -415,6 +599,10 @@ public sealed interface ServerResult : RequestResult * @param method The method that is unknown. */ @Serializable +@Deprecated( + message = "This class will be removed", + level = DeprecationLevel.WARNING, +) public data class UnknownMethodRequestOrNotification( override val method: Method, override val params: NotificationParams? = null, @@ -427,6 +615,11 @@ public data class UnknownMethodRequestOrNotification( * This request is sent from the client to the server when it first connects, asking it to begin initialization. */ @Serializable +@Deprecated( + message = "Use `InitializeRequest` instead", + replaceWith = ReplaceWith("InitializeRequest", "io.modelcontextprotocol.kotlin.sdk.types.InitializeRequest"), + level = DeprecationLevel.WARNING, +) public data class InitializeRequest( val protocolVersion: String, val capabilities: ClientCapabilities, @@ -448,6 +641,11 @@ public data class InitializeRequest( * @property tools Capabilities related to tools that can be called on the server. */ @Serializable +@Deprecated( + message = "Use `ServerCapabilities` instead", + replaceWith = ReplaceWith("ServerCapabilities", "io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities"), + level = DeprecationLevel.WARNING, +) public data class ServerCapabilities( val experimental: JsonObject? = EmptyJsonObject, val sampling: JsonObject? = EmptyJsonObject, @@ -505,6 +703,11 @@ public data class ServerCapabilities( * After receiving an initialized request from the client, the server sends this response. */ @Serializable +@Deprecated( + message = "Use `InitializeResult` instead", + replaceWith = ReplaceWith("InitializeResult", "io.modelcontextprotocol.kotlin.sdk.types.InitializeResult"), + level = DeprecationLevel.WARNING, +) public data class InitializeResult( /** * The version of the Model Context Protocol that the server wants to use. This may not match the version that the client requested. If the client cannot support this version, it MUST disconnect. @@ -523,6 +726,14 @@ public data class InitializeResult( * This notification is sent from the client to the server after initialization has finished. */ @Serializable +@Deprecated( + message = "Use `InitializedNotification` instead", + replaceWith = ReplaceWith( + "InitializedNotification", + "io.modelcontextprotocol.kotlin.sdk.types.InitializedNotification", + ), + level = DeprecationLevel.WARNING, +) public data class InitializedNotification(override val params: Params = Params()) : ClientNotification { override val method: Method = Method.Defined.NotificationsInitialized @@ -536,6 +747,11 @@ public data class InitializedNotification(override val params: Params = Params() * The receiver must promptly respond, or else it may be disconnected. */ @Serializable +@Deprecated( + message = "Use `PingRequest` instead", + replaceWith = ReplaceWith("PingRequest", "io.modelcontextprotocol.kotlin.sdk.types.PingRequest"), + level = DeprecationLevel.WARNING, +) public class PingRequest : ServerRequest, ClientRequest { @@ -546,6 +762,10 @@ public class PingRequest : * Represents the base interface for progress tracking. */ @Serializable +@Deprecated( + message = "This interface will be removed", + level = DeprecationLevel.WARNING, +) public sealed interface ProgressBase { /** * The progress thus far. This should increase every time progress is made, even if the total is unknown. @@ -571,6 +791,11 @@ public sealed interface ProgressBase { * @property total The total progress required, if known. */ @Serializable +@Deprecated( + message = "Use `Progress` instead", + replaceWith = ReplaceWith("Progress", "io.modelcontextprotocol.kotlin.sdk.types.Progress"), + level = DeprecationLevel.WARNING, +) public open class Progress( /** * The progress thus far. This should increase every time progress is made, even if the total is unknown. @@ -592,6 +817,11 @@ public open class Progress( * An out-of-band notification used to inform the receiver of a progress update for a long-running request. */ @Serializable +@Deprecated( + message = "Use `ProgressNotification` instead", + replaceWith = ReplaceWith("ProgressNotification", "io.modelcontextprotocol.kotlin.sdk.types.ProgressNotification"), + level = DeprecationLevel.WARNING, +) public data class ProgressNotification(override val params: Params) : ClientNotification, ServerNotification { @@ -627,6 +857,11 @@ public data class ProgressNotification(override val params: Params) : * Represents a request supporting pagination. */ @Serializable +@Deprecated( + message = "Use `PaginatedRequest` instead", + replaceWith = ReplaceWith("PaginatedRequest", "io.modelcontextprotocol.kotlin.sdk.types.PaginatedRequest"), + level = DeprecationLevel.WARNING, +) public sealed interface PaginatedRequest : Request, WithMeta { @@ -641,6 +876,11 @@ public sealed interface PaginatedRequest : * Represents a paginated result of a request. */ @Serializable +@Deprecated( + message = "Use `PaginatedResult` instead", + replaceWith = ReplaceWith("PaginatedResult", "io.modelcontextprotocol.kotlin.sdk.types.PaginatedResult"), + level = DeprecationLevel.WARNING, +) public sealed interface PaginatedResult : RequestResult { /** * An opaque token representing the pagination position after the last returned result. @@ -654,6 +894,11 @@ public sealed interface PaginatedResult : RequestResult { * The contents of a specific resource or sub-resource. */ @Serializable(with = ResourceContentsPolymorphicSerializer::class) +@Deprecated( + message = "Use `ResourceContents` instead", + replaceWith = ReplaceWith("ResourceContents", "io.modelcontextprotocol.kotlin.sdk.types.ResourceContents"), + level = DeprecationLevel.WARNING, +) public sealed interface ResourceContents { /** * The URI of this resource. @@ -672,6 +917,11 @@ public sealed interface ResourceContents { * @property text The text of the item. This must only be set if the item can actually be represented as text (not binary data). */ @Serializable +@Deprecated( + message = "Use `TextResourceContents` instead", + replaceWith = ReplaceWith("TextResourceContents", "io.modelcontextprotocol.kotlin.sdk.types.TextResourceContents"), + level = DeprecationLevel.WARNING, +) public data class TextResourceContents(val text: String, override val uri: String, override val mimeType: String?) : ResourceContents @@ -681,6 +931,11 @@ public data class TextResourceContents(val text: String, override val uri: Strin * @property blob A base64-encoded string representing the binary data of the item. */ @Serializable +@Deprecated( + message = "Use `BlobResourceContents` instead", + replaceWith = ReplaceWith("BlobResourceContents", "io.modelcontextprotocol.kotlin.sdk.types.BlobResourceContents"), + level = DeprecationLevel.WARNING, +) public data class BlobResourceContents(val blob: String, override val uri: String, override val mimeType: String?) : ResourceContents @@ -688,12 +943,25 @@ public data class BlobResourceContents(val blob: String, override val uri: Strin * Represents resource contents with unknown or unspecified data. */ @Serializable +@Deprecated( + message = "Use `UnknownResourceContents` instead", + replaceWith = ReplaceWith( + "UnknownResourceContents", + "io.modelcontextprotocol.kotlin.sdk.types.UnknownResourceContents", + ), + level = DeprecationLevel.WARNING, +) public data class UnknownResourceContents(override val uri: String, override val mimeType: String?) : ResourceContents /** * A known resource that the server is capable of reading. */ @Serializable +@Deprecated( + message = "Use `Resource` instead", + replaceWith = ReplaceWith("Resource", "io.modelcontextprotocol.kotlin.sdk.types.Resource"), + level = DeprecationLevel.WARNING, +) public data class Resource( /** * The URI of this resource. @@ -734,6 +1002,11 @@ public data class Resource( * A template description for resources available on the server. */ @Serializable +@Deprecated( + message = "Use `ResourceTemplate` instead", + replaceWith = ReplaceWith("ResourceTemplate", "io.modelcontextprotocol.kotlin.sdk.types.ResourceTemplate"), + level = DeprecationLevel.WARNING, +) public data class ResourceTemplate( /** * A URI template (according to RFC 6570) that can be used to construct resource URIs. @@ -770,6 +1043,11 @@ public data class ResourceTemplate( * Sent from the client to request a list of resources the server has. */ @Serializable +@Deprecated( + message = "Use `ListResourcesRequest` instead", + replaceWith = ReplaceWith("ListResourcesRequest", "io.modelcontextprotocol.kotlin.sdk.types.ListResourcesRequest"), + level = DeprecationLevel.WARNING, +) public data class ListResourcesRequest( override val cursor: Cursor? = null, override val _meta: JsonObject = EmptyJsonObject, @@ -782,6 +1060,11 @@ public data class ListResourcesRequest( * The server's response to a resources/list request from the client. */ @Serializable +@Deprecated( + message = "Use `ListResourcesResult` instead", + replaceWith = ReplaceWith("ListResourcesResult", "io.modelcontextprotocol.kotlin.sdk.types.ListResourcesResult"), + level = DeprecationLevel.WARNING, +) public class ListResourcesResult( public val resources: List, override val nextCursor: Cursor? = null, @@ -793,6 +1076,14 @@ public class ListResourcesResult( * Sent from the client to request a list of resource templates the server has. */ @Serializable +@Deprecated( + message = "Use `ListResourceTemplatesRequest` instead", + replaceWith = ReplaceWith( + "ListResourceTemplatesRequest", + "io.modelcontextprotocol.kotlin.sdk.types.ListResourceTemplatesRequest", + ), + level = DeprecationLevel.WARNING, +) public data class ListResourceTemplatesRequest( override val cursor: Cursor?, override val _meta: JsonObject = EmptyJsonObject, @@ -805,6 +1096,14 @@ public data class ListResourceTemplatesRequest( * The server's response to a resources/templates/list request from the client. */ @Serializable +@Deprecated( + message = "Use `ListResourceTemplatesResult` instead", + replaceWith = ReplaceWith( + "ListResourceTemplatesResult", + "io.modelcontextprotocol.kotlin.sdk.types.ListResourceTemplatesResult", + ), + level = DeprecationLevel.WARNING, +) public class ListResourceTemplatesResult( public val resourceTemplates: List, override val nextCursor: Cursor? = null, @@ -816,6 +1115,11 @@ public class ListResourceTemplatesResult( * Sent from the client to the server to read a specific resource URI. */ @Serializable +@Deprecated( + message = "Use `ReadResourceRequest` instead", + replaceWith = ReplaceWith("ReadResourceRequest", "io.modelcontextprotocol.kotlin.sdk.types.ReadResourceRequest"), + level = DeprecationLevel.WARNING, +) public data class ReadResourceRequest(val uri: String, override val _meta: JsonObject = EmptyJsonObject) : ClientRequest, WithMeta { @@ -826,6 +1130,11 @@ public data class ReadResourceRequest(val uri: String, override val _meta: JsonO * The server's response to a resources/read request from the client. */ @Serializable +@Deprecated( + message = "Use `ReadResourceResult` instead", + replaceWith = ReplaceWith("ReadResourceResult", "io.modelcontextprotocol.kotlin.sdk.types.ReadResourceResult"), + level = DeprecationLevel.WARNING, +) public class ReadResourceResult( public val contents: List, override val _meta: JsonObject = EmptyJsonObject, @@ -837,6 +1146,14 @@ public class ReadResourceResult( * Servers may issue this without any previous subscription from the client. */ @Serializable +@Deprecated( + message = "Use `ResourceListChangedNotification` instead", + replaceWith = ReplaceWith( + "ResourceListChangedNotification", + "io.modelcontextprotocol.kotlin.sdk.types.ResourceListChangedNotification", + ), + level = DeprecationLevel.WARNING, +) public data class ResourceListChangedNotification(override val params: Params = Params()) : ServerNotification { override val method: Method = Method.Defined.NotificationsResourcesListChanged @@ -848,6 +1165,11 @@ public data class ResourceListChangedNotification(override val params: Params = * Sent from the client to request resources/updated notifications from the server whenever a particular resource changes. */ @Serializable +@Deprecated( + message = "Use `SubscribeRequest` instead", + replaceWith = ReplaceWith("SubscribeRequest", "io.modelcontextprotocol.kotlin.sdk.types.SubscribeRequest"), + level = DeprecationLevel.WARNING, +) public data class SubscribeRequest( /** * The URI of the resource to subscribe to. The URI can use any protocol; it is up to the server how to interpret it. @@ -863,6 +1185,11 @@ public data class SubscribeRequest( * Sent from the client to request cancellation of resources/updated notifications from the server. This should follow a previous resources/subscribe request. */ @Serializable +@Deprecated( + message = "Use `UnsubscribeRequest` instead", + replaceWith = ReplaceWith("UnsubscribeRequest", "io.modelcontextprotocol.kotlin.sdk.types.UnsubscribeRequest"), + level = DeprecationLevel.WARNING, +) public data class UnsubscribeRequest( /** * The URI of the resource to unsubscribe from. @@ -878,6 +1205,14 @@ public data class UnsubscribeRequest( * A notification from the server to the client, informing it that a resource has changed and may need to be read again. This should only be sent if the client previously sent a resources/subscribe request. */ @Serializable +@Deprecated( + message = "Use `ResourceUpdatedNotification` instead", + replaceWith = ReplaceWith( + "ResourceUpdatedNotification", + "io.modelcontextprotocol.kotlin.sdk.types.ResourceUpdatedNotification", + ), + level = DeprecationLevel.WARNING, +) public data class ResourceUpdatedNotification(override val params: Params) : ServerNotification { override val method: Method = Method.Defined.NotificationsResourcesUpdated @@ -896,6 +1231,11 @@ public data class ResourceUpdatedNotification(override val params: Params) : Ser * Describes an argument that a prompt can accept. */ @Serializable +@Deprecated( + message = "Use `PromptArgument` instead", + replaceWith = ReplaceWith("PromptArgument", "io.modelcontextprotocol.kotlin.sdk.types.PromptArgument"), + level = DeprecationLevel.WARNING, +) public data class PromptArgument( /** * The name of the argument. @@ -915,6 +1255,11 @@ public data class PromptArgument( * A prompt or prompt template that the server offers. */ @Serializable +@Deprecated( + message = "Use `Prompt` instead", + replaceWith = ReplaceWith("Prompt", "io.modelcontextprotocol.kotlin.sdk.types.Prompt"), + level = DeprecationLevel.WARNING, +) public class Prompt( /** * The name of the prompt or prompt template. @@ -934,6 +1279,11 @@ public class Prompt( * Sent from the client to request a list of prompts and prompt templates the server has. */ @Serializable +@Deprecated( + message = "Use `ListPromptsRequest` instead", + replaceWith = ReplaceWith("ListPromptsRequest", "io.modelcontextprotocol.kotlin.sdk.types.ListPromptsRequest"), + level = DeprecationLevel.WARNING, +) public data class ListPromptsRequest( override val cursor: Cursor? = null, override val _meta: JsonObject = EmptyJsonObject, @@ -946,6 +1296,11 @@ public data class ListPromptsRequest( * The server's response to a prompts/list request from the client. */ @Serializable +@Deprecated( + message = "Use `ListPromptsResult` instead", + replaceWith = ReplaceWith("ListPromptsResult", "io.modelcontextprotocol.kotlin.sdk.types.ListPromptsResult"), + level = DeprecationLevel.WARNING, +) public class ListPromptsResult( public val prompts: List, override val nextCursor: Cursor? = null, @@ -957,6 +1312,11 @@ public class ListPromptsResult( * Used by the client to get a prompt provided by the server. */ @Serializable +@Deprecated( + message = "Use `GetPromptRequest` instead", + replaceWith = ReplaceWith("GetPromptRequest", "io.modelcontextprotocol.kotlin.sdk.types.GetPromptRequest"), + level = DeprecationLevel.WARNING, +) public data class GetPromptRequest( /** * The name of the prompt or prompt template. @@ -978,6 +1338,11 @@ public data class GetPromptRequest( * Represents the content of a prompt message. */ @Serializable(with = PromptMessageContentPolymorphicSerializer::class) +@Deprecated( + message = "Use `ContentBlock` instead", + replaceWith = ReplaceWith("ContentBlock"), + level = DeprecationLevel.WARNING, +) public sealed interface PromptMessageContent { public val type: String } @@ -986,12 +1351,22 @@ public sealed interface PromptMessageContent { * Represents prompt message content that is either text, image or audio. */ @Serializable(with = PromptMessageContentMultimodalPolymorphicSerializer::class) +@Deprecated( + message = "Use `MediaContent` instead", + replaceWith = ReplaceWith("MediaContent"), + level = DeprecationLevel.WARNING, +) public sealed interface PromptMessageContentMultimodal : PromptMessageContent /** * Text provided to or from an LLM. */ @Serializable +@Deprecated( + message = "Use `TextContent` instead", + replaceWith = ReplaceWith("TextContent", "io.modelcontextprotocol.kotlin.sdk.types.TextContent"), + level = DeprecationLevel.WARNING, +) public data class TextContent( /** * The text content of the message. @@ -1014,6 +1389,11 @@ public data class TextContent( * An image provided to or from an LLM. */ @Serializable +@Deprecated( + message = "Use `ImageContent` instead", + replaceWith = ReplaceWith("ImageContent", "io.modelcontextprotocol.kotlin.sdk.types.ImageContent"), + level = DeprecationLevel.WARNING, +) public data class ImageContent( /** * The base64-encoded image data. @@ -1041,6 +1421,11 @@ public data class ImageContent( * Audio provided to or from an LLM. */ @Serializable +@Deprecated( + message = "Use `AudioContent` instead", + replaceWith = ReplaceWith("AudioContent", "io.modelcontextprotocol.kotlin.sdk.types.AudioContent"), + level = DeprecationLevel.WARNING, +) public data class AudioContent( /** * The base64-encoded audio data. @@ -1068,12 +1453,22 @@ public data class AudioContent( * Unknown content provided to or from an LLM. */ @Serializable +@Deprecated( + message = "This class will be removed.", + replaceWith = ReplaceWith("MediaContent"), + level = DeprecationLevel.WARNING, +) public data class UnknownContent(override val type: String) : PromptMessageContentMultimodal /** * The contents of a resource, embedded into a prompt or tool call result. */ @Serializable +@Deprecated( + message = "Use `EmbeddedResource` instead", + replaceWith = ReplaceWith("EmbeddedResource", "io.modelcontextprotocol.kotlin.sdk.types.EmbeddedResource"), + level = DeprecationLevel.WARNING, +) public data class EmbeddedResource( /** * The contents of the embedded resource. @@ -1097,6 +1492,11 @@ public data class EmbeddedResource( */ @Suppress("EnumEntryName") @Serializable +@Deprecated( + message = "Use `Role` instead", + replaceWith = ReplaceWith("Role", "io.modelcontextprotocol.kotlin.sdk.types.Role"), + level = DeprecationLevel.WARNING, +) public enum class Role { user, assistant, @@ -1107,6 +1507,11 @@ public enum class Role { * The client can use annotations to inform how objects are used or displayed. */ @Serializable +@Deprecated( + message = "Use `Annotations` instead", + replaceWith = ReplaceWith("Annotations", "io.modelcontextprotocol.kotlin.sdk.types.Annotations"), + level = DeprecationLevel.WARNING, +) public data class Annotations( /** * Describes who the intended customer of this object or data is. @@ -1134,12 +1539,22 @@ public data class Annotations( * Describes a message returned as part of a prompt. */ @Serializable +@Deprecated( + message = "Use `PromptMessage` instead", + replaceWith = ReplaceWith("PromptMessage", "io.modelcontextprotocol.kotlin.sdk.types.PromptMessage"), + level = DeprecationLevel.WARNING, +) public data class PromptMessage(val role: Role, val content: PromptMessageContent) /** * The server's response to a prompts/get request from the client. */ @Serializable +@Deprecated( + message = "Use `GetPromptResult` instead", + replaceWith = ReplaceWith("GetPromptResult", "io.modelcontextprotocol.kotlin.sdk.types.GetPromptResult"), + level = DeprecationLevel.WARNING, +) public class GetPromptResult( /** * An optional description for the prompt. @@ -1154,6 +1569,14 @@ public class GetPromptResult( * Servers may issue this without any previous subscription from the client. */ @Serializable +@Deprecated( + message = "Use `PromptListChangedNotification` instead", + replaceWith = ReplaceWith( + "PromptListChangedNotification", + "io.modelcontextprotocol.kotlin.sdk.types.PromptListChangedNotification", + ), + level = DeprecationLevel.WARNING, +) public data class PromptListChangedNotification(override val params: Params = Params()) : ServerNotification { override val method: Method = Method.Defined.NotificationsPromptsListChanged @@ -1173,6 +1596,11 @@ public data class PromptListChangedNotification(override val params: Params = Pa * received from untrusted servers. */ @Serializable +@Deprecated( + message = "Use `ToolAnnotations` instead", + replaceWith = ReplaceWith("ToolAnnotations", "io.modelcontextprotocol.kotlin.sdk.types.ToolAnnotations"), + level = DeprecationLevel.WARNING, +) public data class ToolAnnotations( /** * A human-readable title for the tool. @@ -1217,6 +1645,11 @@ public data class ToolAnnotations( * Definition for a tool the client can call. */ @Serializable +@Deprecated( + message = "Use `Tool` instead", + replaceWith = ReplaceWith("Tool", "io.modelcontextprotocol.kotlin.sdk.types.Tool"), + level = DeprecationLevel.WARNING, +) public data class Tool( /** * The name of the tool. @@ -1267,6 +1700,11 @@ public data class Tool( * Sent from the client to request a list of tools the server has. */ @Serializable +@Deprecated( + message = "Use `ListToolsRequest` instead", + replaceWith = ReplaceWith("ListToolsRequest", "io.modelcontextprotocol.kotlin.sdk.types.ListToolsRequest"), + level = DeprecationLevel.WARNING, +) public data class ListToolsRequest( override val cursor: Cursor? = null, override val _meta: JsonObject = EmptyJsonObject, @@ -1279,6 +1717,11 @@ public data class ListToolsRequest( * The server's response to a tools/list request from the client. */ @Serializable +@Deprecated( + message = "Use `ListToolsResult` instead", + replaceWith = ReplaceWith("ListToolsResult", "io.modelcontextprotocol.kotlin.sdk.types.ListToolsResult"), + level = DeprecationLevel.WARNING, +) public class ListToolsResult( public val tools: List, override val nextCursor: Cursor?, @@ -1290,6 +1733,11 @@ public class ListToolsResult( * The server's response to a tool call. */ @Serializable +@Deprecated( + message = "This interface will be removed.", + replaceWith = ReplaceWith("ToolCallResult"), + level = DeprecationLevel.WARNING, +) public sealed interface CallToolResultBase : ServerResult { public val content: List public val structuredContent: JsonObject? @@ -1300,6 +1748,11 @@ public sealed interface CallToolResultBase : ServerResult { * The server's response to a tool call. */ @Serializable +@Deprecated( + message = "Use `CallToolResult` instead", + replaceWith = ReplaceWith("CallToolResult", "io.modelcontextprotocol.kotlin.sdk.types.CallToolResult"), + level = DeprecationLevel.WARNING, +) public class CallToolResult( override val content: List, override val structuredContent: JsonObject? = null, @@ -1311,6 +1764,11 @@ public class CallToolResult( * [CallToolResult] extended with backwards compatibility to protocol version 2024-11-05. */ @Serializable +@Deprecated( + message = "This class will be removed.", + replaceWith = ReplaceWith("ToolCallResult"), + level = DeprecationLevel.WARNING, +) public class CompatibilityCallToolResult( override val content: List, override val structuredContent: JsonObject? = null, @@ -1323,6 +1781,11 @@ public class CompatibilityCallToolResult( * Used by the client to invoke a tool provided by the server. */ @Serializable +@Deprecated( + message = "Use `CallToolRequest` instead", + replaceWith = ReplaceWith("CallToolRequest", "io.modelcontextprotocol.kotlin.sdk.types.CallToolRequest"), + level = DeprecationLevel.WARNING, +) public data class CallToolRequest( val name: String, val arguments: JsonObject = EmptyJsonObject, @@ -1337,6 +1800,14 @@ public data class CallToolRequest( * Servers may issue this without any previous subscription from the client. */ @Serializable +@Deprecated( + message = "Use `ToolListChangedNotification` instead", + replaceWith = ReplaceWith( + "ToolListChangedNotification", + "io.modelcontextprotocol.kotlin.sdk.types.ToolListChangedNotification", + ), + level = DeprecationLevel.WARNING, +) public data class ToolListChangedNotification(override val params: Params = Params()) : ServerNotification { override val method: Method = Method.Defined.NotificationsToolsListChanged @@ -1350,6 +1821,11 @@ public data class ToolListChangedNotification(override val params: Params = Para */ @Suppress("EnumEntryName") @Serializable +@Deprecated( + message = "Use `LoggingLevel` instead", + replaceWith = ReplaceWith("LoggingLevel", "io.modelcontextprotocol.kotlin.sdk.types.LoggingLevel"), + level = DeprecationLevel.WARNING, +) public enum class LoggingLevel { debug, info, @@ -1367,6 +1843,14 @@ public enum class LoggingLevel { * the server MAY decide which messages to send automatically. */ @Serializable +@Deprecated( + message = "Use `LoggingMessageNotification` instead", + replaceWith = ReplaceWith( + "LoggingMessageNotification", + "io.modelcontextprotocol.kotlin.sdk.types.LoggingMessageNotification", + ), + level = DeprecationLevel.WARNING, +) public data class LoggingMessageNotification(override val params: Params) : ServerNotification { override val method: Method = Method.Defined.NotificationsMessage @@ -1408,6 +1892,11 @@ public data class LoggingMessageNotification(override val params: Params) : Serv * Hints to use for model selection. */ @Serializable +@Deprecated( + message = "Use `ModelHint` instead", + replaceWith = ReplaceWith("ModelHint", "io.modelcontextprotocol.kotlin.sdk.types.ModelHint"), + level = DeprecationLevel.WARNING, +) public data class ModelHint( /** * A hint for a model name. @@ -1420,6 +1909,11 @@ public data class ModelHint( */ @Suppress("CanBeParameter") @Serializable +@Deprecated( + message = "Use `ModelPreferences` instead", + replaceWith = ReplaceWith("ModelPreferences", "io.modelcontextprotocol.kotlin.sdk.types.ModelPreferences"), + level = DeprecationLevel.WARNING, +) public class ModelPreferences( /** * Optional hints to use for model selection. @@ -1457,6 +1951,11 @@ public class ModelPreferences( * Describes a message issued to or received from an LLM API. */ @Serializable +@Deprecated( + message = "Use `SamplingMessage` instead", + replaceWith = ReplaceWith("SamplingMessage", "io.modelcontextprotocol.kotlin.sdk.types.SamplingMessage"), + level = DeprecationLevel.WARNING, +) public data class SamplingMessage(val role: Role, val content: PromptMessageContentMultimodal) /** @@ -1466,6 +1965,11 @@ public data class SamplingMessage(val role: Role, val content: PromptMessageCont * (human in the loop) and decide whether to approve it. */ @Serializable +@Deprecated( + message = "Use `CreateMessageRequest` instead", + replaceWith = ReplaceWith("CreateMessageRequest", "io.modelcontextprotocol.kotlin.sdk.types.CreateMessageRequest"), + level = DeprecationLevel.WARNING, +) public data class CreateMessageRequest( val messages: List, /** @@ -1500,6 +2004,11 @@ public data class CreateMessageRequest( } @Serializable(with = StopReasonSerializer::class) +@Deprecated( + message = "Use `StopReason` instead", + replaceWith = ReplaceWith("StopReason", "io.modelcontextprotocol.kotlin.sdk.types.StopReason"), + level = DeprecationLevel.WARNING, +) public sealed interface StopReason { public val value: String @@ -1529,6 +2038,11 @@ public sealed interface StopReason { * (human in the loop) and decide whether to allow the server to see it. */ @Serializable +@Deprecated( + message = "Use `CreateMessageResult` instead", + replaceWith = ReplaceWith("CreateMessageResult", "io.modelcontextprotocol.kotlin.sdk.types.CreateMessageResult"), + level = DeprecationLevel.WARNING, +) public data class CreateMessageResult( /** * The name of the model that generated the message. @@ -1545,6 +2059,11 @@ public data class CreateMessageResult( /* Autocomplete */ @Serializable(with = ReferencePolymorphicSerializer::class) +@Deprecated( + message = "Use `Reference` instead", + replaceWith = ReplaceWith("Reference", "io.modelcontextprotocol.kotlin.sdk.types.Reference"), + level = DeprecationLevel.WARNING, +) public sealed interface Reference { public val type: String } @@ -1553,6 +2072,14 @@ public sealed interface Reference { * A reference to a resource or resource template definition. */ @Serializable +@Deprecated( + message = "Use `ResourceTemplateReference` instead", + replaceWith = ReplaceWith( + "ResourceTemplateReference", + "io.modelcontextprotocol.kotlin.sdk.types.ResourceTemplateReference", + ), + level = DeprecationLevel.WARNING, +) public data class ResourceTemplateReference( /** * The URI or URI template of the resource. @@ -1570,6 +2097,11 @@ public data class ResourceTemplateReference( * Identifies a prompt. */ @Serializable +@Deprecated( + message = "Use `PromptReference` instead", + replaceWith = ReplaceWith("PromptReference", "io.modelcontextprotocol.kotlin.sdk.types.PromptReference"), + level = DeprecationLevel.WARNING, +) public data class PromptReference( /** * The name of the prompt or prompt template @@ -1587,12 +2119,21 @@ public data class PromptReference( * Identifies a prompt. */ @Serializable +@Deprecated( + message = "This class will be removed.", + level = DeprecationLevel.WARNING, +) public data class UnknownReference(override val type: String) : Reference /** * A request from the client to the server to ask for completion options. */ @Serializable +@Deprecated( + message = "Use `CompleteRequest` instead", + replaceWith = ReplaceWith("CompleteRequest", "io.modelcontextprotocol.kotlin.sdk.types.CompleteRequest"), + level = DeprecationLevel.WARNING, +) public data class CompleteRequest( val ref: Reference, /** @@ -1621,6 +2162,11 @@ public data class CompleteRequest( * The server's response to a completion/complete request */ @Serializable +@Deprecated( + message = "Use `CompleteResult` instead", + replaceWith = ReplaceWith("CompleteResult", "io.modelcontextprotocol.kotlin.sdk.types.CompleteResult"), + level = DeprecationLevel.WARNING, +) public data class CompleteResult(val completion: Completion, override val _meta: JsonObject = EmptyJsonObject) : ServerResult { @Suppress("CanBeParameter") @@ -1652,6 +2198,11 @@ public data class CompleteResult(val completion: Completion, override val _meta: * Represents a root directory or file that the server can operate on. */ @Serializable +@Deprecated( + message = "Use `Root` instead", + replaceWith = ReplaceWith("Root", "io.modelcontextprotocol.kotlin.sdk.types.Root"), + level = DeprecationLevel.WARNING, +) public data class Root( /** * The URI identifying the root. This *must* start with file:// for now. @@ -1674,6 +2225,11 @@ public data class Root( * Sent from the server to request a list of root URIs from the client. */ @Serializable +@Deprecated( + message = "Use `ListRootsRequest` instead", + replaceWith = ReplaceWith("ListRootsRequest", "io.modelcontextprotocol.kotlin.sdk.types.ListRootsRequest"), + level = DeprecationLevel.WARNING, +) public class ListRootsRequest(override val _meta: JsonObject = EmptyJsonObject) : ServerRequest, WithMeta { @@ -1684,6 +2240,11 @@ public class ListRootsRequest(override val _meta: JsonObject = EmptyJsonObject) * The client's response to a roots/list request from the server. */ @Serializable +@Deprecated( + message = "Use `ListRootsResult` instead", + replaceWith = ReplaceWith("ListRootsResult", "io.modelcontextprotocol.kotlin.sdk.types.ListRootsResult"), + level = DeprecationLevel.WARNING, +) public class ListRootsResult(public val roots: List, override val _meta: JsonObject = EmptyJsonObject) : ClientResult @@ -1691,6 +2252,14 @@ public class ListRootsResult(public val roots: List, override val _meta: J * A notification from the client to the server, informing it that the list of roots has changed. */ @Serializable +@Deprecated( + message = "Use `RootsListChangedNotification` instead", + replaceWith = ReplaceWith( + "RootsListChangedNotification", + "io.modelcontextprotocol.kotlin.sdk.types.RootsListChangedNotification", + ), + level = DeprecationLevel.WARNING, +) public data class RootsListChangedNotification(override val params: Params = Params()) : ClientNotification { override val method: Method = Method.Defined.NotificationsRootsListChanged @@ -1702,6 +2271,14 @@ public data class RootsListChangedNotification(override val params: Params = Par * Sent from the server to create an elicitation from the client. */ @Serializable +@Deprecated( + message = "Use `CreateElicitationRequest` instead", + replaceWith = ReplaceWith( + "CreateElicitationRequest", + "io.modelcontextprotocol.kotlin.sdk.types.CreateElicitationRequest", + ), + level = DeprecationLevel.WARNING, +) public data class CreateElicitationRequest( public val message: String, public val requestedSchema: RequestedSchema, @@ -1725,6 +2302,14 @@ public data class CreateElicitationRequest( * The client's response to an elicitation/create request from the server. */ @Serializable +@Deprecated( + message = "Use `CreateElicitationResult` instead", + replaceWith = ReplaceWith( + "CreateElicitationResult", + "io.modelcontextprotocol.kotlin.sdk.types.CreateElicitationResult", + ), + level = DeprecationLevel.WARNING, +) public data class CreateElicitationResult( public val action: Action, public val content: JsonObject? = null, @@ -1748,6 +2333,11 @@ public data class CreateElicitationResult( * @property message The error message. * @property data Additional error data as a JSON object. */ +@Deprecated( + message = "Use `McpException` instead", + replaceWith = ReplaceWith("McpException"), + level = DeprecationLevel.WARNING, +) public class McpError(public val code: Int, message: String, public val data: JsonObject = EmptyJsonObject) : Exception() { override val message: String = "MCP error $code: $message" diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.util.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.util.kt index 07a0bf4c..f5b4d6ab 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.util.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.util.kt @@ -23,6 +23,10 @@ import kotlinx.serialization.json.longOrNull private val logger = KotlinLogging.logger {} +@Deprecated( + message = "This object will be removed in future versions", + level = DeprecationLevel.WARNING, +) internal object ErrorCodeSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("io.modelcontextprotocol.kotlin.sdk.ErrorCode", PrimitiveKind.INT) @@ -38,6 +42,11 @@ internal object ErrorCodeSerializer : KSerializer { } } +@Deprecated( + message = "Use `MethodSerializer` instead", + replaceWith = ReplaceWith("MethodSerializer"), + level = DeprecationLevel.WARNING, +) internal object RequestMethodSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("io.modelcontextprotocol.kotlin.sdk.Method", PrimitiveKind.STRING) @@ -53,6 +62,10 @@ internal object RequestMethodSerializer : KSerializer { } } +@Deprecated( + message = "This object will be removed in future versions", + level = DeprecationLevel.WARNING, +) internal object StopReasonSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("io.modelcontextprotocol.kotlin.sdk.StopReason", PrimitiveKind.STRING) @@ -72,6 +85,11 @@ internal object StopReasonSerializer : KSerializer { } } +@Deprecated( + message = "Use `ReferencePolymorphicSerializer` instead", + replaceWith = ReplaceWith("ReferencePolymorphicSerializer"), + level = DeprecationLevel.WARNING, +) internal object ReferencePolymorphicSerializer : JsonContentPolymorphicSerializer(Reference::class) { override fun selectDeserializer(element: JsonElement): DeserializationStrategy = when (element.jsonObject.getValue("type").jsonPrimitive.content) { @@ -81,6 +99,11 @@ internal object ReferencePolymorphicSerializer : JsonContentPolymorphicSerialize } } +@Deprecated( + message = "Use `ContentBlockPolymorphicSerializer` instead", + replaceWith = ReplaceWith("ContentBlockPolymorphicSerializer"), + level = DeprecationLevel.WARNING, +) internal object PromptMessageContentPolymorphicSerializer : JsonContentPolymorphicSerializer(PromptMessageContent::class) { override fun selectDeserializer(element: JsonElement): DeserializationStrategy = @@ -93,6 +116,11 @@ internal object PromptMessageContentPolymorphicSerializer : } } +@Deprecated( + message = "Use `MediaContentPolymorphicSerializer` instead", + replaceWith = ReplaceWith("MediaContentPolymorphicSerializer"), + level = DeprecationLevel.WARNING, +) internal object PromptMessageContentMultimodalPolymorphicSerializer : JsonContentPolymorphicSerializer(PromptMessageContentMultimodal::class) { override fun selectDeserializer(element: JsonElement): DeserializationStrategy = @@ -104,6 +132,11 @@ internal object PromptMessageContentMultimodalPolymorphicSerializer : } } +@Deprecated( + message = "Use `ResourceContentsPolymorphicSerializer` instead", + replaceWith = ReplaceWith("ResourceContentsPolymorphicSerializer"), + level = DeprecationLevel.WARNING, +) internal object ResourceContentsPolymorphicSerializer : JsonContentPolymorphicSerializer(ResourceContents::class) { override fun selectDeserializer(element: JsonElement): DeserializationStrategy { @@ -116,12 +149,21 @@ internal object ResourceContentsPolymorphicSerializer : } } +@Deprecated( + message = "This method will be removed in future versions", + level = DeprecationLevel.WARNING, +) internal fun selectRequestDeserializer(method: String): DeserializationStrategy { selectClientRequestDeserializer(method)?.let { return it } selectServerRequestDeserializer(method)?.let { return it } return CustomRequest.serializer() } +@Deprecated( + message = "Use `selectClientRequestDeserializer` instead", + replaceWith = ReplaceWith("selectClientRequestDeserializer"), + level = DeprecationLevel.WARNING, +) internal fun selectClientRequestDeserializer(method: String): DeserializationStrategy? = when (method) { Method.Defined.Ping.value -> PingRequest.serializer() Method.Defined.Initialize.value -> InitializeRequest.serializer() @@ -139,6 +181,11 @@ internal fun selectClientRequestDeserializer(method: String): DeserializationStr else -> null } +@Deprecated( + message = "Use `selectClientNotificationDeserializer` instead", + replaceWith = ReplaceWith("selectClientNotificationDeserializer"), + level = DeprecationLevel.WARNING, +) private fun selectClientNotificationDeserializer(element: JsonElement): DeserializationStrategy? = when (element.jsonObject.getValue("method").jsonPrimitive.content) { Method.Defined.NotificationsCancelled.value -> CancelledNotification.serializer() @@ -148,6 +195,11 @@ private fun selectClientNotificationDeserializer(element: JsonElement): Deserial else -> null } +@Deprecated( + message = "Use `ClientNotificationPolymorphicSerializer` instead", + replaceWith = ReplaceWith("ClientNotificationPolymorphicSerializer"), + level = DeprecationLevel.WARNING, +) internal object ClientNotificationPolymorphicSerializer : JsonContentPolymorphicSerializer(ClientNotification::class) { override fun selectDeserializer(element: JsonElement): DeserializationStrategy = @@ -155,6 +207,11 @@ internal object ClientNotificationPolymorphicSerializer : ?: UnknownMethodRequestOrNotification.serializer() } +@Deprecated( + message = "Use `selectServerRequestDeserializer` instead", + replaceWith = ReplaceWith("selectServerRequestDeserializer"), + level = DeprecationLevel.WARNING, +) internal fun selectServerRequestDeserializer(method: String): DeserializationStrategy? = when (method) { Method.Defined.Ping.value -> PingRequest.serializer() Method.Defined.SamplingCreateMessage.value -> CreateMessageRequest.serializer() @@ -162,6 +219,11 @@ internal fun selectServerRequestDeserializer(method: String): DeserializationStr else -> null } +@Deprecated( + message = "Use `selectServerNotificationDeserializer` instead", + replaceWith = ReplaceWith("selectServerNotificationDeserializer"), + level = DeprecationLevel.WARNING, +) internal fun selectServerNotificationDeserializer(element: JsonElement): DeserializationStrategy? = when (element.jsonObject.getValue("method").jsonPrimitive.content) { Method.Defined.NotificationsCancelled.value -> CancelledNotification.serializer() @@ -174,6 +236,11 @@ internal fun selectServerNotificationDeserializer(element: JsonElement): Deseria else -> null } +@Deprecated( + message = "Use `ServerNotificationPolymorphicSerializer` instead", + replaceWith = ReplaceWith("ServerNotificationPolymorphicSerializer"), + level = DeprecationLevel.WARNING, +) internal object ServerNotificationPolymorphicSerializer : JsonContentPolymorphicSerializer(ServerNotification::class) { override fun selectDeserializer(element: JsonElement): DeserializationStrategy = @@ -181,6 +248,11 @@ internal object ServerNotificationPolymorphicSerializer : ?: UnknownMethodRequestOrNotification.serializer() } +@Deprecated( + message = "Use `NotificationPolymorphicSerializer` instead", + replaceWith = ReplaceWith("NotificationPolymorphicSerializer"), + level = DeprecationLevel.WARNING, +) internal object NotificationPolymorphicSerializer : JsonContentPolymorphicSerializer(Notification::class) { override fun selectDeserializer(element: JsonElement): DeserializationStrategy = @@ -189,6 +261,11 @@ internal object NotificationPolymorphicSerializer : ?: UnknownMethodRequestOrNotification.serializer() } +@Deprecated( + message = "Use `RequestPolymorphicSerializer` instead", + replaceWith = ReplaceWith("RequestPolymorphicSerializer"), + level = DeprecationLevel.WARNING, +) internal object RequestPolymorphicSerializer : JsonContentPolymorphicSerializer(Request::class) { override fun selectDeserializer(element: JsonElement): DeserializationStrategy { @@ -203,6 +280,11 @@ internal object RequestPolymorphicSerializer : } } +@Deprecated( + message = "Use `selectServerResultDeserializer` instead", + replaceWith = ReplaceWith("selectServerResultDeserializer"), + level = DeprecationLevel.WARNING, +) private fun selectServerResultDeserializer(element: JsonElement): DeserializationStrategy? { val jsonObject = element.jsonObject return when { @@ -220,6 +302,11 @@ private fun selectServerResultDeserializer(element: JsonElement): Deserializatio } } +@Deprecated( + message = "Use `selectClientResultDeserializer` instead", + replaceWith = ReplaceWith("selectClientResultDeserializer"), + level = DeprecationLevel.WARNING, +) private fun selectClientResultDeserializer(element: JsonElement): DeserializationStrategy? { val jsonObject = element.jsonObject return when { @@ -230,6 +317,11 @@ private fun selectClientResultDeserializer(element: JsonElement): Deserializatio } } +@Deprecated( + message = "Use `ServerResultPolymorphicSerializer` instead", + replaceWith = ReplaceWith("ServerResultPolymorphicSerializer"), + level = DeprecationLevel.WARNING, +) internal object ServerResultPolymorphicSerializer : JsonContentPolymorphicSerializer(ServerResult::class) { override fun selectDeserializer(element: JsonElement): DeserializationStrategy = @@ -237,6 +329,11 @@ internal object ServerResultPolymorphicSerializer : ?: EmptyRequestResult.serializer() } +@Deprecated( + message = "Use `ClientResultPolymorphicSerializer` instead", + replaceWith = ReplaceWith("ClientResultPolymorphicSerializer"), + level = DeprecationLevel.WARNING, +) internal object ClientResultPolymorphicSerializer : JsonContentPolymorphicSerializer(ClientResult::class) { override fun selectDeserializer(element: JsonElement): DeserializationStrategy = @@ -244,6 +341,11 @@ internal object ClientResultPolymorphicSerializer : ?: EmptyRequestResult.serializer() } +@Deprecated( + message = "Use `RequestResultPolymorphicSerializer` instead", + replaceWith = ReplaceWith("RequestResultPolymorphicSerializer"), + level = DeprecationLevel.WARNING, +) internal object RequestResultPolymorphicSerializer : JsonContentPolymorphicSerializer(RequestResult::class) { override fun selectDeserializer(element: JsonElement): DeserializationStrategy = @@ -252,6 +354,11 @@ internal object RequestResultPolymorphicSerializer : ?: EmptyRequestResult.serializer() } +@Deprecated( + message = "Use `JSONRPCMessagePolymorphicSerializer` instead", + replaceWith = ReplaceWith("JSONRPCMessagePolymorphicSerializer"), + level = DeprecationLevel.WARNING, +) internal object JSONRPCMessagePolymorphicSerializer : JsonContentPolymorphicSerializer(JSONRPCMessage::class) { override fun selectDeserializer(element: JsonElement): DeserializationStrategy { @@ -265,8 +372,18 @@ internal object JSONRPCMessagePolymorphicSerializer : } } +@Deprecated( + message = "Use `io.modelcontextprotocol.kotlin.sdk.types.EmptyJsonObject` instead", + replaceWith = ReplaceWith("EmptyJsonObject", "io.modelcontextprotocol.kotlin.sdk.types.EmptyJsonObject"), + level = DeprecationLevel.WARNING, +) public val EmptyJsonObject: JsonObject = JsonObject(emptyMap()) +@Deprecated( + message = "Use `RequestIdPolymorphicSerializer` instead", + replaceWith = ReplaceWith("RequestIdPolymorphicSerializer"), + level = DeprecationLevel.WARNING, +) public class RequestIdSerializer : KSerializer { override val descriptor: SerialDescriptor = buildClassSerialDescriptor("RequestId") @@ -297,6 +414,11 @@ public class RequestIdSerializer : KSerializer { /** * Creates a [CallToolResult] with single [TextContent] and [meta]. */ +@Deprecated( + message = "Use `CallToolResult.success` instead", + replaceWith = ReplaceWith("CallToolResult.Companion.success"), + level = DeprecationLevel.WARNING, +) public fun CallToolResult.Companion.ok(content: String, meta: JsonObject = EmptyJsonObject): CallToolResult = CallToolResult( content = listOf(TextContent(content)), @@ -307,6 +429,11 @@ public fun CallToolResult.Companion.ok(content: String, meta: JsonObject = Empty /** * Creates a [CallToolResult] with single [TextContent] and [meta], with `isError` being true. */ +@Deprecated( + message = "Use `CallToolResult.error` instead", + replaceWith = ReplaceWith("CallToolResult.Companion.error"), + level = DeprecationLevel.WARNING, +) public fun CallToolResult.Companion.error(content: String, meta: JsonObject = EmptyJsonObject): CallToolResult = CallToolResult( content = listOf(TextContent(content)), diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/McpException.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/McpException.kt new file mode 100644 index 00000000..fb6e1ee5 --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/McpException.kt @@ -0,0 +1,14 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.json.JsonElement + +/** + * Represents an error specific to the MCP protocol. + * + * @property code The error code. + * @property message The error message. + * @property data Additional error data as a JSON object. + */ +public class McpException(public val code: Int, message: String, public val data: JsonElement? = null) : Exception() { + override val message: String = "MCP error $code: $message" +} diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/PingRequest.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/PingRequest.kt new file mode 100644 index 00000000..575d3dbd --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/PingRequest.kt @@ -0,0 +1,14 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable + +@Serializable +public data class PingRequest(override val params: BaseRequestParams? = null) : + ClientRequest, + ServerRequest { + @OptIn(ExperimentalSerializationApi::class) + @EncodeDefault + override val method: Method = Method.Defined.Ping +} diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/capabilities.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/capabilities.kt new file mode 100644 index 00000000..cff3b890 --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/capabilities.kt @@ -0,0 +1,145 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject + +/** + * Describes an MCP (Model Context Protocol) implementation. + * + * This metadata helps clients identify and display information about servers or clients, + * including their name, version, and optional branding elements like icons and website links. + * + * @property name The programmatic identifier for this implementation. + * Intended for logical use and API identification. If [title] is not provided, + * this should be used as a fallback display name. + * @property version The version string of this implementation (e.g., "1.0.0", "2.1.3-beta"). + * @property title Optional human-readable display name for this implementation. + * Intended for UI and end-user contexts, optimized to be easily understood + * even by those unfamiliar with domain-specific terminology. + * If not provided, [name] should be used for display purposes. + * @property websiteUrl Optional URL of the website for this implementation. + * Can be used to provide documentation, support, or additional information. + * @property icons Optional set of sized icons that clients can display in their user interface. + * See [Icon] for supported formats and requirements. + */ +@Serializable +public data class Implementation( + val name: String, + val version: String, + val title: String? = null, + val websiteUrl: String? = null, + val icons: List? = null, +) + +/** + * Capabilities that a client may support. + * + * Known capabilities are defined here, but this is not a closed set: any client + * can define its own additional capabilities through the [experimental] field. + * + * The presence of a capability object (non-null value) indicates that the client + * supports that capability. + * + * @property sampling Present if the client supports sampling from an LLM. + * @property roots Present if the client supports listing roots. + * @property elicitation Present if the client supports elicitation from the server. + * @property experimental Experimental, non-standard capabilities that the client supports. + * Keys are capability names, values are capability-specific configuration objects. + */ +@Serializable +public data class ClientCapabilities( + public val sampling: JsonObject? = null, + public val roots: Roots? = null, + public val elicitation: JsonObject? = null, + public val experimental: JsonObject? = null, +) { + + public companion object { + public val sampling: JsonObject = EmptyJsonObject + public val elicitation: JsonObject = EmptyJsonObject + } + + /** + * Indicates that the client supports listing roots. + * + * Roots are the top-level directories or locations that the server can access. + * When present (non-null), the server can query available roots and optionally + * receive notifications when the roots list changes. + * + * @property listChanged Whether the client supports notifications for changes to the roots list. + * If true, the client will send notifications when roots are added or removed. + */ + @Serializable + public data class Roots(val listChanged: Boolean? = null) +} + +/** + * Capabilities that a server may support. + * + * Known capabilities are defined here, but this is not a closed set: any server + * can define its own additional capabilities through the [experimental] field. + * + * The presence of a capability object (non-null value) indicates that the server + * supports that capability. + * + * @property tools Present if the server offers any tools to call. + * @property resources Present if the server offers any resources to read. + * @property prompts Present if the server offers any prompt templates. + * @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 experimental Experimental, non-standard capabilities that the server supports. + */ +@Serializable +public data class ServerCapabilities( + val tools: Tools? = null, + val resources: Resources? = null, + val prompts: Prompts? = null, + val logging: JsonObject? = null, + val completions: JsonObject? = null, + val experimental: JsonObject? = null, +) { + + public companion object { + public val Logging: JsonObject = EmptyJsonObject + public val Completions: JsonObject = EmptyJsonObject + } + + /** + * Indicates that the server offers tools to call. + * + * When present (non-null), clients can list and invoke tools (functions, actions, etc.) + * provided by the server. + * + * @property listChanged Whether this server supports notifications for changes to the tool list. + * If true, the server will send notifications when tools are added, modified, or removed. + */ + @Serializable + public data class Tools(val listChanged: Boolean? = null) + + /** + * Indicates that the server offers resources to read. + * + * When present (non-null), clients can list and read resources (files, data sources, etc.) + * provided by the server. + * + * @property listChanged Whether this server supports notifications for changes to the resource list. + * If true, the server will send notifications when resources are added or removed. + * @property subscribe Whether this server supports subscribing to resource updates. + * If true, clients can subscribe to receive notifications when specific + * resources are modified. + */ + @Serializable + public data class Resources(val listChanged: Boolean? = null, val subscribe: Boolean? = null) + + /** + * Indicates that the server offers prompt templates. + * + * When present (non-null), clients can list and invoke prompts provided by the server. + * + * @property listChanged Whether this server supports notifications for changes to the prompt list. + * If true, the server will send notifications when prompts are added, modified, or removed. + */ + @Serializable + public data class Prompts(val listChanged: Boolean? = null) +} diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/common.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/common.kt new file mode 100644 index 00000000..e7cb8f6c --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/common.kt @@ -0,0 +1,164 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject + +// ============================================================================ +// Protocol Version Constants +// ============================================================================ + +public const val LATEST_PROTOCOL_VERSION: String = "2025-03-26" + +public val SUPPORTED_PROTOCOL_VERSIONS: Array = arrayOf( + LATEST_PROTOCOL_VERSION, + "2024-11-05", +) + +// ============================================================================ +// Base Interfaces +// ============================================================================ + +/** + * Represents an entity that includes additional metadata in its responses. + */ +@Serializable +public sealed interface WithMeta { + @SerialName("_meta") + public val meta: JsonObject? +} + +// ============================================================================ +// Tokens +// ============================================================================ + +/** + * A progress token, used to associate progress notifications with the original request. + */ +public typealias ProgressToken = RequestId + +public fun ProgressToken(value: String): ProgressToken = RequestId(value) + +public fun ProgressToken(value: Long): ProgressToken = RequestId(value) + +// ============================================================================ +// Visual Elements +// ============================================================================ + +/** + * An optionally sized icon that can be displayed in a user interface. + * + * Icons help clients provide visual branding and identification for MCP implementations. + * + * **Security considerations:** + * - Consumers SHOULD ensure URLs serving icons are from the same domain as the client/server + * or a trusted domain to prevent malicious content. + * - Consumers SHOULD take appropriate precautions when rendering SVGs as they can contain + * executable JavaScript. Consider sanitizing SVG content or rendering in isolated contexts. + * + * @property src A standard URI pointing to an icon resource. + * Maybe an HTTP/HTTPS URL or a data: URI with Base64-encoded image data. + * Example: "https://example.com/icon.png" or "data:image/png;base64,iVBORw0KG..." + * @property mimeType Optional MIME type override if the source MIME type is missing or generic. + * For example, "image/png", "image/jpeg", or "image/svg+xml". + * Useful when the URL doesn't include a file extension or uses a generic MIME type. + * @property sizes Optional array of strings that specify sizes at which the icon can be used. + * Each string should be in WxH format (e.g., "48x48", "96x96") or "any" for + * scalable formats like SVG. If not provided, the client should assume that + * the icon can be used at any size. + * @property theme Optional specifier for the theme this icon is designed for. + * [Theme.Light] indicates the icon is designed for a light background, + * [Theme.Dark] indicates the icon is designed for a dark background. + * If not provided, the client should assume the icon can be used with any theme. + */ +@Serializable +public data class Icon( + val src: String, + val mimeType: String? = null, + val sizes: List? = null, + val theme: Theme? = null, +) { + /** + * The theme context for which an icon is designed. + * + * @property Light Icon designed for use with a light background (typically darker icon). + * @property Dark Icon designed for use with a dark background (typically lighter icon). + */ + @Serializable + public enum class Theme { + /** Icon designed for use with a light background */ + @SerialName("light") + Light, + + /** Icon designed for use with a dark background */ + @SerialName("dark") + Dark, + } +} + +// ============================================================================ +// Roles and References +// ============================================================================ + +/** + * The sender or recipient of messages and data in a conversation. + */ +@Serializable +public enum class Role { + @SerialName("user") + User, + + @SerialName("assistant") + Assistant, +} + +/** + * Base interface for reference types in the protocol. + * + * References are used to point to other entities (prompts, resources, etc.) + * without including their full definitions. + */ +@Serializable(with = ReferencePolymorphicSerializer::class) +public sealed interface Reference { + public val type: ReferenceType +} + +@Serializable +public enum class ReferenceType(public val value: String) { + @SerialName("ref/prompt") + Prompt("ref/prompt"), + + @SerialName("ref/resource") + ResourceTemplate("ref/resource"), +} + +// ============================================================================ +// Annotations and Metadata +// ============================================================================ + +/** + * Optional annotations for the client. + * + * The client can use annotations to inform how objects are used or displayed. + * + * @property audience Describes who the intended customer of this object or data is. + * Can include multiple entries to indicate content useful for multiple audiences + * (e.g., [Role.user, Role.assistant]). + * @property priority Describes how important this data is for operating the server. + * A value of 1.0 means "most important" and indicates that the data is effectively required, + * while 0.0 means "least important" and indicates that the data is entirely optional. + * Should be a value between 0.0 and 1.0. + * @property lastModified The moment the resource was last modified, as an ISO 8601 formatted string + * (e.g., "2025-01-12T15:00:58Z"). + * Examples: last activity timestamp in an open file, timestamp when the resource was attached, etc. + */ +@Serializable +public data class Annotations( + val audience: List? = null, + val priority: Double? = null, + val lastModified: String? = null, +) { + init { + require(priority == null || priority in 0.0..1.0) { "Priority must be between 0.0 and 1.0" } + } +} diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/completion.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/completion.kt new file mode 100644 index 00000000..e0c4295e --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/completion.kt @@ -0,0 +1,93 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject + +/** + * A request from the client to the server to ask for completion options. + * + * @property params The request parameters containing the argument to complete and its context. + */ +@Serializable +public data class CompleteRequest(override val params: CompleteRequestParams) : ClientRequest { + @OptIn(ExperimentalSerializationApi::class) + @EncodeDefault + public override val method: Method = Method.Defined.CompletionComplete +} + +/** + * Parameters for the completion request. + * + * @property argument The argument's information for which completion options are requested. + * @property ref A reference to either a prompt or resource template to complete within. + * @property context Additional, optional context for generating completions. + */ +@Serializable +public data class CompleteRequestParams( + val argument: Argument, + val ref: Reference, + val context: Context? = null, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : RequestParams { + /** + * The argument for which completion is being requested. + * + * @property name The name of the argument being completed. + * @property value The partial value of the argument to use for completion matching. + * This is typically the text the user has typed so far. + */ + @Serializable + public data class Argument(val name: String, val value: String) + + /** + * Additional context to help generate more relevant completions. + * + * @property arguments Previously-resolved variables in a URI template or prompt. + * These can be used to provide context-aware completions. + * For example, if completing a file path, this might contain the repository or directory context. + */ + @Serializable + public data class Context(val arguments: Map? = null) +} + +/** + * The server's response to a [CompleteRequest]. + * + * Provides completion options for prompt or resource template arguments, + * along with pagination information if there are many possible completions. + * + * @property completion The completion options and metadata about available results. + * @property meta Optional metadata for this response. See MCP specification for details on _meta usage. + */ +@Serializable +public data class CompleteResult( + public val completion: Completion, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ServerResult { + + /** + * Completion options and pagination information. + * + * @property values An array of completion values. Must not exceed 100 items. + * Each value represents a possible completion for the requested argument. + * @property total The total number of completion options available. + * This can exceed the number of values actually sent in the response, + * indicating that pagination or filtering may be needed. + * @property hasMore Indicates whether there are additional completion options beyond + * those provided in the current response, even if the exact total is unknown. + * Use this when the complete set of completions is too large to calculate upfront. + */ + @Serializable + public data class Completion(val values: List, val total: Int? = null, val hasMore: Boolean? = null) { + init { + require(values.size <= 100) { + "Completion 'values' must not exceed 100 items, got ${values.size}" + } + } + } +} diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/content.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/content.kt new file mode 100644 index 00000000..0e6377f5 --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/content.kt @@ -0,0 +1,163 @@ +@file:OptIn(ExperimentalSerializationApi::class) + +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject + +@Serializable +public enum class ContentTypes(public val value: String) { + @SerialName("text") + TEXT("text"), + + @SerialName("image") + IMAGE("image"), + + @SerialName("audio") + AUDIO("audio"), + + @SerialName("resource_link") + RESOURCE_LINK("resource_link"), + + @SerialName("resource") + EMBEDDED_RESOURCE("resource"), +} + +@Serializable(with = ContentBlockPolymorphicSerializer::class) +public sealed interface ContentBlock : WithMeta { + public val type: ContentTypes +} + +@Serializable(with = MediaContentPolymorphicSerializer::class) +public sealed interface MediaContent : ContentBlock + +/** + * Text provided to or from an LLM. + * + * @property text The text content of the message. + * @property annotations Optional annotations for the client. + * @property meta property/parameter is reserved by MCP to allow clients and servers + * to attach additional metadata to their interactions. + */ +@Serializable +public data class TextContent( + val text: String, + val annotations: Annotations? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : MediaContent { + @EncodeDefault + public override val type: ContentTypes = ContentTypes.TEXT +} + +/** + * An image provided to or from an LLM. + * + * @property data The base64-encoded image data. + * @property mimeType The MIME type of the image. Different providers may support different image types. + * @property annotations Optional annotations for the client. + * @property meta property/parameter is reserved by MCP to allow clients and servers + * to attach additional metadata to their interactions. + */ +@Serializable +public data class ImageContent( + val data: String, + val mimeType: String, + val annotations: Annotations? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : MediaContent { + @EncodeDefault + public override val type: ContentTypes = ContentTypes.IMAGE +} + +/** + * Audio provided to or from an LLM. + * + * @property data The base64-encoded audio data. + * @property mimeType The MIME type of the audio. Different providers may support different audio types. + * @property annotations Optional annotations for the client. + * @property meta property/parameter is reserved by MCP to allow clients and servers + * to attach additional metadata to their interactions. + */ +@Serializable +public data class AudioContent( + val data: String, + val mimeType: String, + val annotations: Annotations? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : MediaContent { + @EncodeDefault + public override val type: ContentTypes = ContentTypes.AUDIO +} + +/** + * A resource that the server is capable of reading, included in a prompt or tool call result. + * + * Note: resource links returned by tools are not guaranteed to appear in the results of `resources/list` requests. + * + * @property name Intended for programmatic or logical use + * but used as a display name in past specs or fallback (if the title isn’t present). + * @property uri The URI of this resource. + * @property title Intended for UI and end-user contexts — optimized to be human-readable and easily understood, + * even by those unfamiliar with domain-specific terminology. + * + * If not provided, the name should be used for display + * (except for Tool, where `annotations.title` should be given precedence over using `name`, if present). + * @property size The size of the raw resource content, in bytes (i.e., before base64 encoding or any tokenization), + * if known. + * + * Hosts can use this to display file sizes and estimate context window usage. + * @property mimeType The MIME type of this resource, if known. + * @property icons Optional set of sized icons that clients can display in their user interface. + * See [Icon] for supported formats and requirements. + * @property description A description of what this resource represents. + * + * Clients can use this to improve the LLM’s understanding of available resources. + * It can be thought of as a "hint" to the model. + * @property annotations Optional annotations for the client. + * @property meta property/parameter is reserved by MCP to allow clients and servers + * to attach additional metadata to their interactions. + */ +@Serializable +public data class ResourceLink( + val name: String, + val uri: String, + val title: String? = null, + val size: Long? = null, + val mimeType: String? = null, + val icons: List? = null, + val description: String? = null, + val annotations: Annotations? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ContentBlock, + ResourceLike { + @EncodeDefault + public override val type: ContentTypes = ContentTypes.RESOURCE_LINK +} + +/** + * The contents of a resource, embedded into a prompt or tool call result. + * + * It is up to the client how best to render embedded resources for the benefit of the LLM and/or the user. + * + * @property resource The resource contents. + * @property annotations Optional annotations for the client. + * @property meta property/parameter is reserved by MCP to allow clients and servers + * to attach additional metadata to their interactions. + */ +@Serializable +public data class EmbeddedResource( + val resource: ResourceContents, + val annotations: Annotations? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ContentBlock { + @EncodeDefault + public override val type: ContentTypes = ContentTypes.EMBEDDED_RESOURCE +} diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/elicitation.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/elicitation.kt new file mode 100644 index 00000000..75faa42b --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/elicitation.kt @@ -0,0 +1,111 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject + +/** + * A request from the server to elicit additional information from the user via the client. + * + * This request type allows servers to prompt users for structured input through forms + * or dialogs presented by the client. The server defines a schema for the requested data, + * and the client presents an appropriate UI to collect this information. + * + * @property params The elicitation parameters including the message and requested schema. + */ +@Serializable +public data class ElicitRequest(override val params: ElicitRequestParams) : ServerRequest { + @OptIn(ExperimentalSerializationApi::class) + @EncodeDefault + public override val method: Method = Method.Defined.ElicitationCreate +} + +/** + * Parameters for an elicitation/create request. + * + * @property message The message to present to the user. This should clearly explain + * what information is being requested and why. + * @property requestedSchema A restricted subset of JSON Schema defining the structure + * of the requested data. Only top-level properties are allowed, + * without nesting. + * @property meta Optional metadata for this request. May include a progressToken for + * out-of-band progress notifications. + */ +@Serializable +public data class ElicitRequestParams( + val message: String, + val requestedSchema: RequestedSchema, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : RequestParams { + + /** + * A restricted JSON Schema for elicitation requests. + * + * Only supports top-level primitive properties without nesting. Each property + * represents a field in the form or dialog presented to the user. + * + * @property properties A map of property names to their schema definitions. + * Each property must be a primitive type (string, number, boolean). + * @property required Optional list of property names that must be provided by the user. + * If omitted, all fields are considered optional. + * @property type Always "object" for elicitation schemas. + */ + @Serializable + public data class RequestedSchema(val properties: JsonObject, val required: List? = null) { + @OptIn(ExperimentalSerializationApi::class) + @EncodeDefault + val type: String = "object" + } +} + +/** + * The client's response to an [ElicitRequest]. + * + * Represents the user's action and, if accepted, the submitted form data. + * + * @property action The user action in response to the elicitation prompt. + * @property content The submitted form data, only present when [action] is [Action.Accept]. + * Contains values matching the requested schema, where keys correspond + * to property names and values are primitives (string, number, or boolean). + * @property meta Optional metadata for this response. + * @throws IllegalArgumentException if content is provided with a non-accept action. + */ +@Serializable +public data class ElicitResult( + val action: Action, + val content: JsonObject? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ClientResult { + + init { + require(action == Action.Accept || content == null) { + "Content can only be provided when action is 'accept', got action=$action with content" + } + } + + /** + * The user's response action to an elicitation request. + * + * @property Accept User submitted the form/confirmed the action. Content will be provided. + * @property Decline User explicitly declined the action. No content provided. + * @property Cancel User dismissed the dialog without making an explicit choice. No content provided. + */ + @Serializable + public enum class Action { + /** User submitted the form/confirmed the action */ + @SerialName("accept") + Accept, + + /** User explicitly declined the action */ + @SerialName("decline") + Decline, + + /** User dismissed without making an explicit choice */ + @SerialName("cancel") + Cancel, + } +} diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/initialize.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/initialize.kt new file mode 100644 index 00000000..6a2fd5bd --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/initialize.kt @@ -0,0 +1,74 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject + +/** + * This request is sent from the client to the server when it first connects, + * asking it to begin initialization. + * + * The initialize request is the first message exchanged in the MCP protocol handshake. + * It allows the client to communicate its capabilities and protocol version to the server, + * and receive the server's capabilities in response. + * + * @property params The initialization parameters including protocol version and client capabilities. + */ +@Serializable +public data class InitializeRequest(override val params: InitializeRequestParams) : ClientRequest { + @OptIn(ExperimentalSerializationApi::class) + @EncodeDefault + override val method: Method = Method.Defined.Initialize +} + +/** + * Parameters for an initialize request. + * + * @property protocolVersion The latest version of the Model Context Protocol that the client supports. + * The client MAY decide to support older versions as well. + * The server will respond with its preferred version, which may differ. + * @property capabilities The capabilities that this client supports. + * Describes which optional features the client has implemented. + * @property clientInfo Information about the client implementation, including name, version, and branding. + * @property meta Optional metadata for this request. May include a progressToken for + * out-of-band progress notifications. + */ +@Serializable +public data class InitializeRequestParams( + val protocolVersion: String, + val capabilities: ClientCapabilities, + val clientInfo: Implementation, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : RequestParams + +/** + * After receiving an [InitializeRequest] from the client, the server sends this response. + * + * The server communicates its chosen protocol version, capabilities, and optional + * instructions for how to effectively use its features. + * + * @property protocolVersion The version of the Model Context Protocol that the server wants to use. + * This may not match the version that the client requested. + * If the client cannot support this version, it MUST disconnect. + * @property capabilities The capabilities that this server supports. + * Describes which optional features the server has implemented. + * @property serverInfo Information about the server implementation, including name, version, and branding. + * @property instructions Optional instructions describing how to use the server and its features. + * Clients can use this to improve the LLM's understanding of available + * tools, resources, etc. It can be thought of as a "hint" to the model. + * For example, this information MAY be added to the system prompt to help + * the LLM make better use of the server's capabilities. + * @property meta Optional metadata for this response. + */ +@Serializable +public data class InitializeResult( + val protocolVersion: String = LATEST_PROTOCOL_VERSION, + val capabilities: ServerCapabilities, + val serverInfo: Implementation, + val instructions: String? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ServerResult diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/jsonRpc.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/jsonRpc.kt new file mode 100644 index 00000000..66229001 --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/jsonRpc.kt @@ -0,0 +1,225 @@ +@file:OptIn(ExperimentalAtomicApi::class, ExperimentalSerializationApi::class) + +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.decodeFromJsonElement +import kotlinx.serialization.json.encodeToJsonElement +import kotlin.concurrent.atomics.AtomicLong +import kotlin.concurrent.atomics.ExperimentalAtomicApi +import kotlin.concurrent.atomics.incrementAndFetch +import kotlin.jvm.JvmInline + +public const val JSONRPC_VERSION: String = "2.0" + +private val REQUEST_MESSAGE_ID: AtomicLong = AtomicLong(0L) + +public fun RequestId(value: String): RequestId = RequestId.StringId(value) + +public fun RequestId(value: Long): RequestId = RequestId.NumberId(value) + +/** + * A uniquely identifying ID for a request in JSON-RPC. + */ +@Serializable(with = RequestIdPolymorphicSerializer::class) +public sealed interface RequestId { + + @JvmInline + @Serializable + public value class StringId(public val value: String) : RequestId + + @JvmInline + @Serializable + public value class NumberId(public val value: Long) : RequestId +} + +/** + * Converts the request to a JSON-RPC request. + * + * @return The JSON-RPC request representation. + */ +public fun Request.toJSON(): JSONRPCRequest = JSONRPCRequest( + method = method.value, + params = this.params?.let { + McpJson.encodeToJsonElement(it) + }, +) + +/** + * Decodes a JSON-RPC request into a protocol-specific [Request]. + * + * @return The decoded [Request] + */ +public fun JSONRPCRequest.fromJSON(): Request = + McpJson.decodeFromJsonElement(McpJson.encodeToJsonElement(this)) + +/** + * Converts the notification to a JSON-RPC notification. + * + * @return The JSON-RPC notification representation. + */ +public fun Notification.toJSON(): JSONRPCNotification = JSONRPCNotification( + method = method.value, + params = this.params?.let { + McpJson.encodeToJsonElement(it) + }, +) + +/** + * Decodes a JSON-RPC notification into a protocol-specific [Notification]. + * + * @return The decoded [Notification]. + */ +internal fun JSONRPCNotification.fromJSON(): Notification = + McpJson.decodeFromJsonElement(McpJson.encodeToJsonElement(this)) + +/** + * Base interface for all JSON-RPC 2.0 messages. + * + * All messages in the MCP protocol follow the JSON-RPC 2.0 specification. + */ +@Serializable(with = JSONRPCMessagePolymorphicSerializer::class) +public sealed interface JSONRPCMessage { + public val jsonrpc: String +} + +// ============================================================================ +// JSONRPCRequest +// ============================================================================ + +/** + * A request that expects a response. + * + * Requests are identified by a unique [id] and specify a [method] to invoke. + * The server or client (depending on direction) must respond with either a + * [JSONRPCResponse] or [JSONRPCError] that has the same [id]. + * + * @property jsonrpc Always "2.0" to indicate JSON-RPC 2.0 protocol. + * @property id A unique identifier for this request. The response will include the same ID. + * Can be a string or number. + * @property method The name of the method to invoke (e.g., "tools/list", "resources/read"). + * @property params Optional parameters for the method. Structure depends on the specific method. + */ +@Serializable +public data class JSONRPCRequest( + val id: RequestId = RequestId(REQUEST_MESSAGE_ID.incrementAndFetch()), + val method: String, + val params: JsonElement? = null, +) : JSONRPCMessage { + @EncodeDefault + override val jsonrpc: String = JSONRPC_VERSION +} + +// ============================================================================ +// JSONRPCNotification +// ============================================================================ + +/** + * A notification which does not expect a response. + * + * Notifications are fire-and-forget messages. They do not have an `id` and + * the recipient does not send any response (neither success nor error). + * + * Examples: progress updates, resource change notifications, log messages. + * + * @property jsonrpc Always "2.0" to indicate JSON-RPC 2.0 protocol. + * @property method The name of the notification method (e.g., "notifications/progress", + * "notifications/resources/updated"). + * @property params Optional parameters for the notification. Structure depends on the specific method. + */ +@Serializable +public data class JSONRPCNotification(val method: String, val params: JsonElement? = null) : JSONRPCMessage { + @EncodeDefault + override val jsonrpc: String = JSONRPC_VERSION +} + +// ============================================================================ +// JSONRPCResponse +// ============================================================================ + +/** + * A successful (non-error) response to a request. + * + * Sent in response to a [JSONRPCRequest] when the method execution succeeds. + * The [id] must match the [id] of the original request. + * + * @property jsonrpc Always "2.0" to indicate JSON-RPC 2.0 protocol. + * @property id The identifier from the original request. Used to match responses to requests. + * @property result The result of the method execution. Structure depends on the method that was called. + */ +@Serializable +public data class JSONRPCResponse(val id: RequestId, val result: RequestResult = EmptyResult()) : JSONRPCMessage { + @EncodeDefault + override val jsonrpc: String = JSONRPC_VERSION +} + +// ============================================================================ +// JSONRPCError +// ============================================================================ + +/** + * A response to a request that indicates an error occurred. + * + * Sent in response to a [JSONRPCRequest] when the method execution fails. + * The [id] must match the [id] of the original request. + * + * @property jsonrpc Always "2.0" to indicate JSON-RPC 2.0 protocol. + * @property id The identifier from the original request. Used to match error responses to requests. + * @property error Details about the error that occurred, including error code and message. + */ +@Serializable +public data class JSONRPCError(val id: RequestId, val error: RPCError) : JSONRPCMessage { + @EncodeDefault + override val jsonrpc: String = JSONRPC_VERSION +} + +/** + * Error information for a failed JSON-RPC request. + * + * @property code The error type that occurred. A number indicating the error category. + * See standard JSON-RPC 2.0 error codes: + * - -32700: Parse error (invalid JSON) + * - -32600: Invalid request (not valid JSON-RPC) + * - -32601: Method not found + * - -32602: Invalid params + * - -32603: Internal error + * - -32000 to -32099: Server-defined errors + * @property message A short description of the error. + * The message SHOULD be limited to a concise single sentence. + * @property data Additional information about the error. + * The value of this member is defined by the sender + * (e.g., detailed error information, nested errors, etc.). + */ +@Serializable +public data class RPCError(val code: Int, val message: String, val data: JsonElement? = null) { + /** + * Standard JSON-RPC 2.0 and MCP SDK error codes. + */ + public object ErrorCode { + // SDK-specific error codes + /** Connection was closed */ + public const val CONNECTION_CLOSED: Int = -32000 + + /** Request timed out */ + public const val REQUEST_TIMEOUT: Int = -32001 + + // Standard JSON-RPC 2.0 error codes + /** Invalid JSON was received */ + public const val PARSE_ERROR: Int = -32700 + + /** The JSON sent is not a valid Request object */ + public const val INVALID_REQUEST: Int = -32600 + + /** The method does not exist or is not available */ + public const val METHOD_NOT_FOUND: Int = -32601 + + /** Invalid method parameter(s) */ + public const val INVALID_PARAMS: Int = -32602 + + /** Internal JSON-RPC error */ + public const val INTERNAL_ERROR: Int = -32603 + } +} diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/jsonUtils.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/jsonUtils.kt new file mode 100644 index 00000000..b9fce4a7 --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/jsonUtils.kt @@ -0,0 +1,83 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.json.ClassDiscriminatorMode +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonNull +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.add +import kotlinx.serialization.json.buildJsonArray +import kotlinx.serialization.json.buildJsonObject + +public val EmptyJsonObject: JsonObject = JsonObject(emptyMap()) + +@OptIn(ExperimentalSerializationApi::class) +public val McpJson: Json by lazy { + Json { + ignoreUnknownKeys = true + encodeDefaults = true + isLenient = true + classDiscriminatorMode = ClassDiscriminatorMode.NONE + explicitNulls = false + } +} + +public fun Map.toJson(): Map = this.mapValues { (_, value) -> + runCatching { convertToJsonElement(value) } + .getOrElse { JsonPrimitive(value.toString()) } +} + +@OptIn(ExperimentalUnsignedTypes::class, ExperimentalSerializationApi::class) +private fun convertToJsonElement(value: Any?): JsonElement = when (value) { + null -> JsonNull + + is JsonElement -> value + + is String -> JsonPrimitive(value) + + is Number -> JsonPrimitive(value) + + is Boolean -> JsonPrimitive(value) + + is Char -> JsonPrimitive(value.toString()) + + is Enum<*> -> JsonPrimitive(value.name) + + is Map<*, *> -> buildJsonObject { value.forEach { (k, v) -> put(k.toString(), convertToJsonElement(v)) } } + + is Collection<*> -> buildJsonArray { value.forEach { add(convertToJsonElement(it)) } } + + is Array<*> -> buildJsonArray { value.forEach { add(convertToJsonElement(it)) } } + + // Primitive arrays + is IntArray -> buildJsonArray { value.forEach { add(it) } } + + is LongArray -> buildJsonArray { value.forEach { add(it) } } + + is FloatArray -> buildJsonArray { value.forEach { add(it) } } + + is DoubleArray -> buildJsonArray { value.forEach { add(it) } } + + is BooleanArray -> buildJsonArray { value.forEach { add(it) } } + + is ShortArray -> buildJsonArray { value.forEach { add(it) } } + + is ByteArray -> buildJsonArray { value.forEach { add(it) } } + + is CharArray -> buildJsonArray { value.forEach { add(it.toString()) } } + + // Unsigned arrays + is UIntArray -> buildJsonArray { value.forEach { add(JsonPrimitive(it)) } } + + is ULongArray -> buildJsonArray { value.forEach { add(JsonPrimitive(it)) } } + + is UShortArray -> buildJsonArray { value.forEach { add(JsonPrimitive(it)) } } + + is UByteArray -> buildJsonArray { value.forEach { add(JsonPrimitive(it)) } } + + else -> { + JsonPrimitive(value.toString()) + } +} diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/logging.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/logging.kt new file mode 100644 index 00000000..2966b0cb --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/logging.kt @@ -0,0 +1,84 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * The severity of a log message. + * + * These levels map to syslog message severities, as specified in + * [RFC-5424](https://datatracker.ietf.org/doc/html/rfc5424#section-6.2.1). + * + * Levels are ordered from least to most severe: + * [Debug] < [Info] < [Notice] < [Warning] < [Error] < [Critical] < [Alert] < [Emergency] + */ +@Serializable +public enum class LoggingLevel { + /** Detailed debug information for troubleshooting (RFC-5424: Debug) */ + @SerialName("debug") + Debug, + + /** Informational messages about normal operations (RFC-5424: Informational) */ + @SerialName("info") + Info, + + /** Normal but significant conditions (RFC-5424: Notice) */ + @SerialName("notice") + Notice, + + /** Warning conditions that may require attention (RFC-5424: Warning) */ + @SerialName("warning") + Warning, + + /** Error conditions that require attention (RFC-5424: Error) */ + @SerialName("error") + Error, + + /** Critical conditions requiring immediate action (RFC-5424: Critical) */ + @SerialName("critical") + Critical, + + /** Action must be taken immediately (RFC-5424: Alert) */ + @SerialName("alert") + Alert, + + /** System is unusable, highest severity (RFC-5424: Emergency) */ + @SerialName("emergency") + Emergency, +} + +/** + * A request from the client to the server to enable or adjust logging. + * + * After receiving this request, the server should send log messages at the specified + * [level][SetLevelRequestParams.level] and higher (more severe) to the client as + * notifications/message events. + * + * @property params The parameters specifying the desired logging level. + */ +@Serializable +public data class SetLevelRequest(override val params: SetLevelRequestParams) : ClientRequest { + @OptIn(ExperimentalSerializationApi::class) + @EncodeDefault + override val method: Method = Method.Defined.LoggingSetLevel +} + +/** + * Parameters for a logging/setLevel request. + * + * @property level The minimum severity level of logging that the client wants to receive + * from the server. The server should send all logs at this level and higher + * (i.e., more severe) to the client as notifications/message. + * For example, if [level] is [LoggingLevel.Warning], the server should send + * warning, error, critical, alert, and emergency messages, but not info, notice, or debug. + * @property meta Optional metadata for this request. May include a progressToken for + * out-of-band progress notifications. + */ +@Serializable +public data class SetLevelRequestParams( + val level: LoggingLevel, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : RequestParams diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/methods.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/methods.kt new file mode 100644 index 00000000..99700156 --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/methods.kt @@ -0,0 +1,49 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.Serializable + +/** + * Represents a method in the protocol, which can be predefined or custom. + */ +@Serializable(with = MethodSerializer::class) +public sealed interface Method { + public val value: String + + /** + * Enum of predefined methods supported by the protocol. + */ + @Serializable + public enum class Defined(override val value: String) : Method { + Initialize("initialize"), + Ping("ping"), + ResourcesList("resources/list"), + ResourcesTemplatesList("resources/templates/list"), + ResourcesRead("resources/read"), + ResourcesSubscribe("resources/subscribe"), + ResourcesUnsubscribe("resources/unsubscribe"), + PromptsList("prompts/list"), + PromptsGet("prompts/get"), + NotificationsCancelled("notifications/cancelled"), + NotificationsInitialized("notifications/initialized"), + NotificationsProgress("notifications/progress"), + NotificationsMessage("notifications/message"), + NotificationsResourcesUpdated("notifications/resources/updated"), + NotificationsResourcesListChanged("notifications/resources/list_changed"), + NotificationsToolsListChanged("notifications/tools/list_changed"), + NotificationsRootsListChanged("notifications/roots/list_changed"), + NotificationsPromptsListChanged("notifications/prompts/list_changed"), + ToolsList("tools/list"), + ToolsCall("tools/call"), + LoggingSetLevel("logging/setLevel"), + SamplingCreateMessage("sampling/createMessage"), + CompletionComplete("completion/complete"), + RootsList("roots/list"), + ElicitationCreate("elicitation/create"), + } + + /** + * Represents a custom method defined by the user. + */ + @Serializable + public data class Custom(override val value: String) : Method +} diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/notification.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/notification.kt new file mode 100644 index 00000000..23215845 --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/notification.kt @@ -0,0 +1,327 @@ +@file:OptIn(ExperimentalSerializationApi::class) + +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonObject + +/** + * Represents a notification in the protocol. + */ +@Serializable(with = NotificationPolymorphicSerializer::class) +public sealed interface Notification { + public val method: Method + public val params: NotificationParams? +} + +/** + * Represents a notification sent by the client. + */ +@Serializable(with = ClientNotificationPolymorphicSerializer::class) +public sealed interface ClientNotification : Notification + +/** + * Represents a notification sent by the server. + */ +@Serializable(with = ServerNotificationPolymorphicSerializer::class) +public sealed interface ServerNotification : Notification + +/** + * Interface for notification parameter types. + * + * @property meta Optional metadata for the notification. + */ +@Serializable +public sealed interface NotificationParams : WithMeta + +/** + * Base parameters for notifications that only contain metadata. + */ +@Serializable +public data class BaseNotificationParams(@SerialName("_meta") override val meta: JsonObject? = null) : + NotificationParams + +/** + * Represents a progress notification. + * + * @property progress The progress thus far. This should increase every time progress is made, + * even if the total is unknown. + * @property total Total number of items to a process (or total progress required), if known. + * @property message An optional message describing the current progress. + */ +@Serializable +public class Progress( + public val progress: Double, + public val total: Double? = null, + public val message: String? = null, +) + +// ============================================================================ +// Custom Notification +// ============================================================================ + +/** + * Represents a custom notification method that is not part of the core MCP specification. + * + * The MCP protocol allows implementations to define custom methods for extending functionality. + * This class captures such custom notifications while preserving all their data. + * + * @property method The custom method name. By convention, custom methods often contain + * organization-specific prefixes (e.g., "mycompany/custom_event"). + * @property params Raw JSON parameters for the custom notification, if present. + */ +@Serializable +public data class CustomNotification(override val method: Method, override val params: BaseNotificationParams? = null) : + ClientNotification, + ServerNotification + +// ============================================================================ +// Cancelled Notification +// ============================================================================ + +/** + * This notification can be sent by either side to indicate that it is cancelling a previously-issued request. + * + * The request SHOULD still be in-flight, but due to communication latency, + * it is always possible that this notification MAY arrive after the request has already finished. + * + * This notification indicates that the result will be unused, so any associated processing SHOULD cease. + * + * A client MUST NOT attempt to cancel its `initialize` request. + * + * @property params Details of the cancellation request. + */ +@Serializable +public data class CancelledNotification(override val params: CancelledNotificationParams) : + ClientNotification, + ServerNotification { + @EncodeDefault + override val method: Method = Method.Defined.NotificationsCancelled +} + +/** + * Parameters for a notifications/cancelled notification. + * + * @property requestId The ID of the request to cancel. + * This MUST correspond to the ID of a request previously issued in the same direction. + * @property reason An optional string describing the reason for the cancellation. + * This MAY be logged or presented to the user. + * @property meta Optional metadata for this notification. + */ +@Serializable +public data class CancelledNotificationParams( + val requestId: RequestId, + val reason: String? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : NotificationParams + +// ============================================================================ +// Initialized Notification +// ============================================================================ + +/** + * This notification is sent from the client to the server after initialization has finished. + * + * The client sends this after receiving the [InitializeResult] to signal that it is ready + * to begin normal operations. + * + * @property params Optional notification parameters containing metadata. + */ +@Serializable +public data class InitializedNotification(override val params: BaseNotificationParams? = null) : ClientNotification { + @EncodeDefault + override val method: Method = Method.Defined.NotificationsInitialized +} + +// ============================================================================ +// Logging Message Notification +// ============================================================================ + +/** + * A notification of a log message passed from server to client. + * + * If no [SetLevelRequest] has been sent from the client, the server MAY decide + * which messages to send automatically. + * + * @property params The log message parameters including level and data. + */ +@Serializable +public data class LoggingMessageNotification(override val params: LoggingMessageNotificationParams) : + ServerNotification { + @EncodeDefault + override val method: Method = Method.Defined.NotificationsMessage +} + +/** + * Parameters for a notifications/message notification. + * + * @property level The severity of this log message. + * @property data The data to be logged, such as a string message or an object. + * Any JSON serializable type is allowed here. + * @property logger An optional name of the logger issuing this message. + * @property meta Optional metadata for this notification. + */ +@Serializable +public data class LoggingMessageNotificationParams( + val level: LoggingLevel, + val data: JsonElement, + val logger: String? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : NotificationParams + +// ============================================================================ +// Progress Notification +// ============================================================================ + +/** + * An out-of-band notification used to inform the receiver of a progress update for a long-running request. + * + * This notification can be sent by either the client or server to provide progress updates + * for requests that include a progressToken in their _meta field. + * + * @property params The progress update parameters. + */ +@Serializable +public data class ProgressNotification(override val params: ProgressNotificationParams) : + ClientNotification, + ServerNotification { + @EncodeDefault + override val method: Method = Method.Defined.NotificationsProgress +} + +/** + * Parameters for a notifications/progress notification. + * + * @property progressToken The progress token which was given in the initial request, + * used to associate this notification with the request that is proceeding. + * @property progress The progress thus far. This should increase every time progress is made, + * even if the total is unknown. + * @property total Total number of items to process (or total progress required), if known. + * @property message An optional message describing the current progress. + * @property meta Optional metadata for this notification. + */ +@Serializable +public data class ProgressNotificationParams( + val progressToken: ProgressToken, + val progress: Double, + val total: Double? = null, + val message: String? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : NotificationParams + +// ============================================================================ +// Prompts List Changed Notification +// ============================================================================ + +/** + * An optional notification from the server to the client, informing it that the list of prompts it offers has changed. + * + * Servers may issue this without any previous subscription from the client. + * Sent only if the server's [ServerCapabilities.prompts] has `listChanged = true`. + * + * @property params Optional notification parameters containing metadata. + */ +@Serializable +public data class PromptListChangedNotification(override val params: BaseNotificationParams? = null) : + ServerNotification { + @EncodeDefault + override val method: Method = Method.Defined.NotificationsPromptsListChanged +} + +// ============================================================================ +// Resources List Changed Notification +// ============================================================================ + +/** + * An optional notification from the server to the client, informing it that the list of resources it can read from has changed. + * + * Servers may issue this without any previous subscription from the client. + * Sent only if the server's [ServerCapabilities.resources] has `listChanged = true`. + * + * @property params Optional notification parameters containing metadata. + */ +@Serializable +public data class ResourceListChangedNotification(override val params: BaseNotificationParams? = null) : + ServerNotification { + @EncodeDefault + override val method: Method = Method.Defined.NotificationsResourcesListChanged +} + +// ============================================================================ +// Resource Updated Notification +// ============================================================================ + +/** + * A notification from the server to the client, informing it that a resource has changed and may need to be read again. + * + * This should only be sent if the client previously sent a resources/subscribe request + * and the server's [ServerCapabilities.resources] has `subscribe = true`. + * + * @property params Parameters identifying which resource was updated. + */ +@Serializable +public data class ResourceUpdatedNotification(override val params: ResourceUpdatedNotificationParams) : + ServerNotification { + @EncodeDefault + override val method: Method = Method.Defined.NotificationsResourcesUpdated +} + +/** + * Parameters for a notifications/resources/updated notification. + * + * @property uri The URI of the resource that has been updated. + * This might be a sub-resource of the one that the client actually subscribed to. + * @property meta Optional metadata for this notification. + */ +@Serializable +public data class ResourceUpdatedNotificationParams( + val uri: String, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : NotificationParams + +// ============================================================================ +// Roots List Changed Notification +// ============================================================================ + +/** + * A notification from the client to the server, informing it that the list of roots has changed. + * + * This notification should be sent whenever the client adds, removes, or modifies any root. + * The server should then request an updated list of roots using the ListRootsRequest. + * Sent only if the client's [ClientCapabilities.roots] has `listChanged = true`. + * + * @property params Optional notification parameters containing metadata. + */ +@Serializable +public data class RootsListChangedNotification(override val params: BaseNotificationParams? = null) : + ClientNotification { + @EncodeDefault + override val method: Method = Method.Defined.NotificationsRootsListChanged +} + +// ============================================================================ +// Tools List Changed Notification +// ============================================================================ + +/** + * An optional notification from the server to the client, informing it that the list of tools it offers has changed. + * + * Servers may issue this without any previous subscription from the client. + * Sent only if the server's [ServerCapabilities.tools] has `listChanged = true`. + * + * @property params Optional notification parameters containing metadata. + */ +@Serializable +public data class ToolListChangedNotification(override val params: BaseNotificationParams? = null) : + ServerNotification { + @EncodeDefault + override val method: Method = Method.Defined.NotificationsToolsListChanged +} diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/prompts.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/prompts.kt new file mode 100644 index 00000000..c35f183e --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/prompts.kt @@ -0,0 +1,193 @@ +@file:OptIn(ExperimentalSerializationApi::class) + +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject + +/** + * Describes an argument that a prompt can accept. + * + * Arguments allow prompts to be templated with user-provided values. + * + * @property name The programmatic identifier for this argument. + * Intended for logical use and API identification. If [title] is not provided, + * this should be used as a fallback display name. + * @property description A human-readable description of the argument, explaining what it's for + * and what values are expected. + * @property required Whether this argument must be provided when using the prompt. + * If true, the client must supply a value for this argument. + * @property title Optional human-readable display name for this argument. + * Intended for UI and end-user contexts, optimized to be easily understood + * even by those unfamiliar with domain-specific terminology. + * If not provided, [name] should be used for display purposes. + */ +@Serializable +public data class PromptArgument( + val name: String, + val description: String? = null, + val required: Boolean? = null, + val title: String? = null, +) + +/** + * A prompt or prompt template that the server offers. + * + * Prompts can be static messages or templates that accept arguments for dynamic content generation. + * + * @property name The programmatic identifier for this prompt. + * Intended for logical use and API identification. If [title] is not provided, + * this should be used as a fallback display name. + * @property description An optional description of what this prompt provides and when to use it. + * @property arguments Optional list of arguments to use for templating the prompt. + * If present, the prompt is a template that requires these arguments to be filled in. + * @property title Optional human-readable display name for this prompt. + * Intended for UI and end-user contexts, optimized to be easily understood + * even by those unfamiliar with domain-specific terminology. + * If not provided, [name] should be used for display purposes. + * @property icons Optional set of sized icons that clients can display in their user interface. + * Clients MUST support at least PNG and JPEG formats. + * Clients SHOULD also support SVG and WebP formats. + * @property meta Optional metadata for this prompt. + */ +@Serializable +public data class Prompt( + val name: String, + val description: String? = null, + val arguments: List? = null, + val title: String? = null, + val icons: List? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : WithMeta + +/** + * Describes a message returned as part of a prompt. + * + * This is similar to SamplingMessage, but also supports the embedding of resources from the MCP server. + * + * @property role The role of the message sender (e.g., user, assistant, or system). + * @property content The content of the message. Can include text, images, resources, and other content types. + */ +@Serializable +public data class PromptMessage(val role: Role, val content: ContentBlock) + +/** + * Identifies a prompt by reference. + * + * Used in completion requests and other contexts where a prompt needs to be referenced + * without including its full definition. + * + * @property name The programmatic identifier of the prompt being referenced. + * Intended for logical use and API identification. If [title] is not provided, + * this should be used as a fallback display name. + * @property title Optional human-readable display name for the referenced prompt. + * Intended for UI and end-user contexts, optimized to be easily understood + * even by those unfamiliar with domain-specific terminology. + * If not provided, [name] should be used for display purposes. + */ +@Serializable +public data class PromptReference(val name: String, val title: String? = null) : Reference { + @EncodeDefault + public override val type: ReferenceType = ReferenceType.Prompt +} + +// ============================================================================ +// prompts/get +// ============================================================================ + +/** + * Used by the client to get a prompt provided by the server. + * + * Prompts can be static text or templates that accept arguments. When arguments + * are provided, the server will substitute them into the prompt template before + * returning the result. + * + * @property params The parameters specifying which prompt to retrieve and any template arguments. + */ +@Serializable +public data class GetPromptRequest(override val params: GetPromptRequestParams) : ClientRequest { + @EncodeDefault + override val method: Method = Method.Defined.PromptsGet +} + +/** + * Parameters for a prompts/get request. + * + * @property name The name of the prompt or prompt template to retrieve. + * @property arguments Optional arguments to use for templating the prompt. + * Keys are argument names, values are the argument values to substitute. + * @property meta Optional metadata for this request. May include a progressToken for + * out-of-band progress notifications. + */ +@Serializable +public data class GetPromptRequestParams( + val name: String, + val arguments: Map? = null, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : RequestParams + +/** + * The server's response to a [GetPromptRequest] from the client. + * + * Contains the prompt's messages and optional description. If the prompt was a template, + * the messages will have arguments already substituted. + * + * @property messages The list of messages that make up this prompt. + * Each message has a role (e.g., "user", "assistant") and content. + * @property description An optional description for the prompt, explaining its purpose or usage. + * @property meta Optional metadata for this response. + */ +@Serializable +public data class GetPromptResult( + val messages: List, + val description: String? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ServerResult + +// ============================================================================ +// prompts/list +// ============================================================================ + +/** + * Sent from the client to request a list of prompts and prompt templates the server has. + * + * This request supports pagination through the cursor parameter. If the server has many + * prompts, it may return a subset along with a cursor to fetch the next page. + * + * @property params Optional pagination parameters to control which page of results to return. + */ +@Serializable +public data class ListPromptsRequest(override val params: PaginatedRequestParams? = null) : + ClientRequest, + PaginatedRequest { + @EncodeDefault + override val method: Method = Method.Defined.PromptsList +} + +/** + * The server's response to a [ListPromptsRequest] from the client. + * + * Returns the available prompts and prompt templates, along with pagination information + * if there are more results available. + * + * @property prompts The list of available prompts. Each prompt includes its name, optional description, + * and information about any arguments it accepts. + * @property nextCursor An opaque token representing the pagination position after the last returned result. + * If present, there may be more results available. The client can pass this token + * in a subsequent request to fetch the next page. + * @property meta Optional metadata for this response. + */ +@Serializable +public data class ListPromptsResult( + val prompts: List, + override val nextCursor: String? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ServerResult, + PaginatedResult diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/request.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/request.kt new file mode 100644 index 00000000..855e2f27 --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/request.kt @@ -0,0 +1,116 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.long +import kotlinx.serialization.json.longOrNull +import kotlin.jvm.JvmInline + +@JvmInline +@Serializable +public value class RequestMeta(public val json: JsonObject) { + public val progressToken: ProgressToken? + get() = json["progressToken"]?.let { element -> + when (element) { + is JsonPrimitive if (element.isString) -> ProgressToken(element.content) + is JsonPrimitive if (element.longOrNull != null) -> ProgressToken(element.long) + else -> null + } + } + + public operator fun get(key: String): JsonElement? = json[key] +} + +@Serializable +public sealed interface RequestParams { + @SerialName("_meta") + public val meta: RequestMeta? +} + +@Serializable +public data class BaseRequestParams(@SerialName("_meta") override val meta: RequestMeta? = null) : RequestParams + +/** + * Represents a request in the protocol. + */ +@OptIn(ExperimentalSerializationApi::class) +@Serializable(with = RequestPolymorphicSerializer::class) +public sealed interface Request { + public val method: Method + public val params: RequestParams? +} + +/** + * A custom request with a specified method. + */ +@Serializable +public open class CustomRequest(override val method: Method, override val params: BaseRequestParams?) : Request + +/** + * Represents a request sent by the client. + */ +@Serializable +public sealed interface ClientRequest : Request + +/** + * Represents a request sent by the server. + */ +@Serializable +public sealed interface ServerRequest : Request + +/** + * Represents a request supporting pagination. + */ +@Serializable +public sealed interface PaginatedRequest : Request { + public override val params: PaginatedRequestParams? +} + +/** + * Represents the result of a request, including additional metadata. + */ +@Serializable(with = RequestResultPolymorphicSerializer::class) +public sealed interface RequestResult : WithMeta + +@Serializable(with = ClientResultPolymorphicSerializer::class) +public sealed interface ClientResult : RequestResult + +@Serializable(with = ServerResultPolymorphicSerializer::class) +public sealed interface ServerResult : RequestResult + +/** + * An empty result for a request containing optional metadata. + * + * @param meta Additional metadata for the response. Defaults to an empty JSON object. + */ +@Serializable +public data class EmptyResult(@SerialName("_meta") override val meta: JsonObject? = null) : + ClientResult, + ServerResult + +/** + * Represents a request supporting pagination. + */ +@Serializable +public sealed interface PaginatedResult : RequestResult { + public val nextCursor: String? +} + +/** + * Common parameters for paginated requests. + * + * @property cursor An opaque token representing the current pagination position. + * If provided, the server should return results starting after this cursor. + * @property meta Optional metadata for this request. May include a progressToken for + * out-of-band progress notifications. + */ +@Serializable +public data class PaginatedRequestParams( + val cursor: String? = null, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : RequestParams diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/resources.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/resources.kt new file mode 100644 index 00000000..91a2cadd --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/resources.kt @@ -0,0 +1,376 @@ +@file:OptIn(ExperimentalSerializationApi::class) + +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject + +@Serializable +public sealed interface ResourceLike : WithMeta + +/** + * A known resource that the server is capable of reading. + * + * Resources represent data sources such as files, database entries, API responses, + * or other structured data that can be read by clients. + * + * @property uri The URI of this resource. Can use any protocol scheme (file://, http://, etc.). + * @property name The programmatic identifier for this resource. + * Intended for logical use and API identification. If [title] is not provided, + * this should be used as a fallback display name. + * @property description A description of what this resource represents. + * Clients can use this to improve the LLM's understanding of available resources. + * It can be thought of like a "hint" to the model. + * @property mimeType The MIME type of this resource, if known (e.g., "text/plain", "application/json", "image/png"). + * @property size The size of the raw resource content in bytes (i.e., before base64 encoding or any tokenization), if known. + * Hosts can use this to display file sizes and estimate context window usage. + * @property title Optional human-readable display name for this resource. + * Intended for UI and end-user contexts, optimized to be easily understood + * even by those unfamiliar with domain-specific terminology. + * If not provided, [name] should be used for display purposes. + * @property annotations Optional annotations for the client. Provides additional metadata and hints + * about how to use or display this resource. + * @property icons Optional set of sized icons that clients can display in their user interface. + * Clients MUST support at least PNG and JPEG formats. + * Clients SHOULD also support SVG and WebP formats. + * @property meta Optional metadata for this resource. + */ +@Serializable +public data class Resource( + val uri: String, + val name: String, + val description: String? = null, + val mimeType: String? = null, + val size: Long? = null, + val title: String? = null, + val annotations: Annotations? = null, + val icons: List? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ResourceLike + +/** + * A template description for resources available on the server. + * + * Resource templates allow servers to expose parameterized resources that clients can + * instantiate with specific values. Templates use RFC 6570 URI template syntax, + * where parameters are indicated with curly braces (e.g., `file:///{directory}/{filename}`). + * + * @property uriTemplate A URI template (according to RFC 6570) that can be used to construct resource URIs. + * Parameters are indicated with curly braces, e.g., `file:///{path}` or `db://users/{userId}`. + * @property name The programmatic identifier for this template. + * Intended for logical use and API identification. If [title] is not provided, + * this should be used as a fallback display name. + * @property description A description of what this template is for. + * Clients can use this to improve the LLM's understanding of available resources. + * It can be thought of like a "hint" to the model. + * @property mimeType The MIME type for all resources that match this template. + * This should only be included if all resources matching this template have the same type. + * For example, a file template might not have a MIME type since files can be of any type, + * but a database record template might always return JSON. + * @property title Optional human-readable display name for this template. + * Intended for UI and end-user contexts, optimized to be easily understood + * even by those unfamiliar with domain-specific terminology. + * If not provided, [name] should be used for display purposes. + * @property annotations Optional annotations for the client. Provides additional metadata and hints + * about how to use or display resources created from this template. + * @property icons Optional set of sized icons that clients can display in their user interface. + * Clients MUST support at least PNG and JPEG formats. + * Clients SHOULD also support SVG and WebP formats. + * @property meta Optional metadata for this template. + */ +@Serializable +public data class ResourceTemplate( + val uriTemplate: String, + val name: String, + val description: String? = null, + val mimeType: String? = null, + val title: String? = null, + val annotations: Annotations? = null, + val icons: List? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : WithMeta + +/** + * A reference to a resource or resource template definition. + * + * Used in completion requests and other contexts where a resource needs to be referenced + * without including its full definition. The URI can be either a specific resource URI + * or a URI template pattern. + * + * @property uri The URI or URI template of the resource. + * Can be a specific resource URI (e.g., `file:///home/user/doc.txt`) + * or a URI template with parameters (e.g., `file:///{path}`). + */ +@Serializable +public data class ResourceTemplateReference(val uri: String) : Reference { + @EncodeDefault + public override val type: ReferenceType = ReferenceType.ResourceTemplate +} + +/** + * The contents of a specific resource or sub-resource. + * + * @property uri The URI of this resource. + * @property mimeType The MIME type of this resource, if known. + * @property meta Optional metadata for this response. + */ +@Serializable(with = ResourceContentsPolymorphicSerializer::class) +public sealed interface ResourceContents : WithMeta { + public val uri: String + public val mimeType: String? +} + +/** + * Represents the text contents of a resource. + * + * @property text The text of the item. + * This must only be set if the item can actually be represented as text (not binary data). + * @property uri The URI of this resource. + * @property mimeType The MIME type of this resource, if known. + */ +@Serializable +public data class TextResourceContents( + val text: String, + override val uri: String, + override val mimeType: String? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ResourceContents + +/** + * The contents of a specific resource or sub-resource. + * + * @property blob A base64-encoded string representing the binary data of the item. + * @property uri The URI of this resource. + * @property mimeType The MIME type of this resource, if known. + */ +@Serializable +public data class BlobResourceContents( + val blob: String, + override val uri: String, + override val mimeType: String? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ResourceContents + +/** + * Represents resource contents with unknown or unspecified data. + * + * @property uri The URI of this resource. + * @property mimeType The MIME type of this resource, if known. + */ +@Serializable +public data class UnknownResourceContents( + override val uri: String, + override val mimeType: String? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ResourceContents + +// ============================================================================ +// resources/list +// ============================================================================ + +/** + * Sent from the client to request a list of resources the server has. + * + * Resources are data sources that the server can provide access to, such as files, + * database entries, API responses, or other structured data. + * + * @property params Optional pagination parameters to control which page of results to return. + */ +@Serializable +public data class ListResourcesRequest(override val params: PaginatedRequestParams? = null) : + ClientRequest, + PaginatedRequest { + @EncodeDefault + override val method: Method = Method.Defined.ResourcesList +} + +/** + * The server's response to a [ListResourcesRequest] from the client. + * + * Returns the available resources along with pagination information if there are more results. + * + * @property resources The list of available resources. Each resource includes its URI, name, + * optional description, and MIME type information. + * @property nextCursor An opaque token representing the pagination position after the last returned result. + * If present, there may be more results available. The client can pass this token + * in a subsequent request to fetch the next page. + * @property meta Optional metadata for this response. + */ +@Serializable +public data class ListResourcesResult( + val resources: List, + override val nextCursor: String? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ServerResult, + PaginatedResult + +// ============================================================================ +// resources/read +// ============================================================================ + +/** + * Parameters for a resources/read request. + * + * @property uri The URI of the resource to read. The URI can use any protocol; + * it is up to the server how to interpret it. Common schemes include + * file://, http://, https://, or custom application-specific schemes. + * @property meta Optional metadata for this request. May include a progressToken for + * out-of-band progress notifications. + */ +@Serializable +public data class ReadResourceRequestParams( + val uri: String, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : RequestParams + +/** + * Sent from the client to the server to read a specific resource URI. + * + * The server will return the resource's contents, which can be either text or binary data. + * + * @property params The parameters specifying which resource URI to read. + */ +@Serializable +public data class ReadResourceRequest(override val params: ReadResourceRequestParams) : ClientRequest { + @EncodeDefault + override val method: Method = Method.Defined.ResourcesRead +} + +/** + * The server's response to a [ReadResourceRequest] from the client. + * + * Contains the resource contents, which can be a mix of text and binary data. + * A single resource can return multiple content blocks if it contains multiple parts. + * + * @property contents The contents of the resource. Can include text content (with MIME type and text data) + * or binary/blob content (with MIME type and Base64-encoded data). + * Multiple content blocks can be returned for resources with multiple parts. + * @property meta Optional metadata for this response. + */ +@Serializable +public data class ReadResourceResult( + val contents: List, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ServerResult + +// ============================================================================ +// resources/subscribe +// ============================================================================ + +/** + * Parameters for a resources/subscribe request. + * + * @property uri The URI of the resource to subscribe to. The URI can use any protocol; + * it is up to the server how to interpret it. + * @property meta Optional metadata for this request. May include a progressToken for + * out-of-band progress notifications. + */ +@Serializable +public data class SubscribeRequestParams( + val uri: String, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : RequestParams + +/** + * Sent from the client to request resources/updated notifications from the server + * whenever a particular resource changes. + * + * After subscribing, the server will send [ResourceUpdatedNotification] messages + * whenever the subscribed resource is modified. This requires the server to support + * the `subscribe` capability in [ServerCapabilities.resources]. + * + * @property params The parameters specifying which resource URI to subscribe to. + */ +@Serializable +public data class SubscribeRequest(override val params: SubscribeRequestParams) : ClientRequest { + @EncodeDefault + override val method: Method = Method.Defined.ResourcesSubscribe +} + +// ============================================================================ +// resources/unsubscribe +// ============================================================================ + +/** + * Parameters for a resources/unsubscribe request. + * + * @property uri The URI of the resource to unsubscribe from. This should match + * a URI from a previous [SubscribeRequest]. + * @property meta Optional metadata for this request. May include a progressToken for + * out-of-band progress notifications. + */ +@Serializable +public data class UnsubscribeRequestParams( + val uri: String, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : RequestParams + +/** + * Sent from the client to request cancellation of resources/updated notifications from the server. + * + * This should follow a previous [SubscribeRequest]. After unsubscribing, the server will + * stop sending [ResourceUpdatedNotification] messages for this resource. + * + * @property params The parameters specifying which resource URI to unsubscribe from. + */ +@Serializable +public data class UnsubscribeRequest(override val params: UnsubscribeRequestParams) : ClientRequest { + @EncodeDefault + override val method: Method = Method.Defined.ResourcesUnsubscribe +} + +// ============================================================================ +// resources/templates/list +// ============================================================================ + +/** + * Sent from the client to request a list of resource templates the server has. + * + * Resource templates are parameterized resource URIs that can be instantiated with + * specific argument values. For example, a template like `file:///{path}` allows + * clients to construct URIs for any file path. + * + * @property params Optional pagination parameters to control which page of results to return. + */ +@Serializable +public data class ListResourceTemplatesRequest(override val params: PaginatedRequestParams? = null) : + ClientRequest, + PaginatedRequest { + @EncodeDefault + override val method: Method = Method.Defined.ResourcesTemplatesList +} + +/** + * The server's response to a [ListResourceTemplatesRequest] from the client. + * + * Returns the available resource templates along with pagination information if there are more results. + * + * @property resourceTemplates The list of available resource templates. Each template includes + * its URI template pattern, name, optional description, and information + * about the arguments it accepts. + * @property nextCursor An opaque token representing the pagination position after the last returned result. + * If present, there may be more results available. The client can pass this token + * in a subsequent request to fetch the next page. + * @property meta Optional metadata for this response. + */ +@Serializable +public data class ListResourceTemplatesResult( + val resourceTemplates: List, + override val nextCursor: String? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ServerResult, + PaginatedResult diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/roots.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/roots.kt new file mode 100644 index 00000000..2d7ddbcc --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/roots.kt @@ -0,0 +1,81 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject + +/** + * Represents a root directory or file that the server can operate on. + * + * Roots define the top-level locations that a server has access to. They act as + * boundaries for the server's operations, ensuring it only accesses permitted locations. + * + * @property uri The URI identifying the root. This **must** start with `file://` for now. + * This restriction may be relaxed in future versions of the protocol to allow other URI schemes. + * Examples: "file:///home/user/projects", "file:///workspace/repo", "file:///C:/Documents" + * @property name An optional name for the root. This can be used to provide a human-readable + * identifier for the root, which may be useful for display purposes or for + * referencing the root in other parts of the application. + * @property meta Optional metadata for this root. + */ +@Serializable +public data class Root( + val uri: String, + val name: String? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : WithMeta { + init { + require(uri.startsWith("file://")) { + "Root URI must start with 'file://', got: $uri" + } + } +} + +// ============================================================================ +// roots/list +// ============================================================================ + +/** + * Sent from the server to request a list of root URIs from the client. + * + * Roots allow servers to ask for specific directories or files to operate on. + * A common example for roots is providing a set of repositories or directories + * a server should operate on. + * + * This request is typically used when the server needs to understand the file system + * structure or access specific locations that the client has permission to read from. + * + * **Note:** Unlike most other requests, this is sent from the **server to the client**, + * not from client to server. The client must support the `roots` capability with + * `listChanged = true` to receive these requests. + * + * @property params Optional request parameters containing metadata. + */ +@Serializable +public data class ListRootsRequest(override val params: BaseRequestParams? = null) : ServerRequest { + @OptIn(ExperimentalSerializationApi::class) + @EncodeDefault + override val method: Method = Method.Defined.RootsList +} + +/** + * The client's response to a [ListRootsRequest] from the server. + * + * This result contains an array of Root objects, each representing a root directory + * or file that the server can operate on. Roots define the boundaries of what + * the server is allowed to access. + * + * @property roots The list of root URIs that the server can access. + * Each root represents a top-level directory, file, or other location + * that the server has permission to work with. + * @property meta Optional metadata for this response. + */ +@Serializable +public data class ListRootsResult( + val roots: List, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ClientResult diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/sampling.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/sampling.kt new file mode 100644 index 00000000..22d9239c --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/sampling.kt @@ -0,0 +1,200 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject +import kotlin.jvm.JvmInline + +/** + * Hints to use for model selection. + */ +@Serializable +public data class ModelHint( + /** + * A hint for a model name. + */ + val name: String?, +) + +/** + * The server's preferences for model selection, requested of the client during sampling. + * + * Because LLMs can vary along multiple dimensions, choosing the "best" model is rarely straightforward. + * Different models excel in different areas—some are faster but less capable, others are more capable + * but more expensive, and so on. This interface allows servers to express their priorities across + * multiple dimensions to help clients make an appropriate selection for their use case. + * + * **Important:** These preferences are always advisory. The client MAY ignore them completely. + * It is also up to the client to decide how to interpret these preferences and how to balance + * them against other considerations. + * + * @property hints Optional hints to use for model selection. + * If multiple hints are specified, the client MUST evaluate them in order + * (such that the first match is taken). + * The client SHOULD prioritize these hints over the numeric priorities, + * but MAY still use the priorities to select from ambiguous matches. + * @property costPriority How much to prioritize cost when selecting a model. + * A value of 0.0 means cost is not important, while a value of 1.0 means + * cost is the most important factor. + * Should be between 0.0 and 1.0. + * @property speedPriority How much to prioritize sampling speed (latency) when selecting a model. + * A value of 0.0 means speed is not important, while a value of 1.0 means + * speed is the most important factor. + * Should be between 0.0 and 1.0. + * @property intelligencePriority How much to prioritize intelligence and capabilities when selecting a model. + * A value of 0.0 means intelligence is not important, while a value of 1.0 + * means intelligence is the most important factor. + * Should be between 0.0 and 1.0. + */ +@Serializable +public data class ModelPreferences( + val hints: List? = null, + val costPriority: Double? = null, + val speedPriority: Double? = null, + val intelligencePriority: Double? = null, +) { + init { + require(costPriority == null || costPriority in 0.0..1.0) { + "costPriority must be in 0.0 <= x <= 1.0 value range" + } + + require(speedPriority == null || speedPriority in 0.0..1.0) { + "costPriority must be in 0.0 <= x <= 1.0 value range" + } + + require(intelligencePriority == null || intelligencePriority in 0.0..1.0) { + "intelligencePriority must be in 0.0 <= x <= 1.0 value range" + } + } +} + +/** + * Describes a message issued to or received from an LLM API. + * + * Used in sampling requests to provide conversation context and history to the LLM. + * + * @property role The role of the message sender (user, assistant, or system). + * @property content The content of the message. Can be text, image, or audio content. + */ +@Serializable +public data class SamplingMessage(val role: Role, val content: MediaContent) + +// ============================================================================ +// sampling/createMessage +// ============================================================================ + +/** + * A request from the server to sample an LLM via the client. + * + * The client has full discretion over which model to select. The client should also + * inform the user before beginning sampling, to allow them to inspect the request + * (human in the loop) and decide whether to approve it. + * + * **Important:** This is a request from **server to client**, not client to server. + * The server is asking the client to use its LLM to generate a completion. + * + * **Human-in-the-loop:** Clients should: + * 1. Show the sampling request to the user before executing it + * 2. Allow the user to approve or reject the request + * 3. Show the generated response to the user before sending it back to the server + * + * @property params The parameters for the sampling request, including messages and model preferences. + */ +@Serializable +public data class CreateMessageRequest(override val params: CreateMessageRequestParams) : ServerRequest { + @OptIn(ExperimentalSerializationApi::class) + @EncodeDefault + override val method: Method = Method.Defined.SamplingCreateMessage +} + +/** + * Parameters for a sampling/createMessage request. + * + * @property maxTokens The requested maximum number of tokens to sample (to prevent runaway completions). + * The client MAY choose to sample fewer tokens than the requested maximum. + * @property messages The messages to use as context for sampling. Typically includes conversation history + * and the current user message. + * @property modelPreferences The server's preferences for which model to select. + * The client MAY ignore these preferences and choose any model. + * @property systemPrompt An optional system prompt the server wants to use for sampling. + * The client MAY modify or omit this prompt. + * @property includeContext A request to include context from one or more MCP servers (including the caller), + * to be attached to the prompt. The client MAY ignore this request. + * - "none": Don't include any server context + * - "thisServer": Include context only from the requesting server + * - "allServers": Include context from all connected MCP servers + * @property temperature Optional temperature parameter for sampling (typically 0.0-2.0). + * Higher values make output more random, lower values make it more deterministic. + * @property stopSequences Optional list of sequences that will stop generation if encountered. + * @property metadata Optional metadata to pass through to the LLM provider. + * The format of this metadata is provider-specific. + * @property meta Optional metadata for this request. May include a progressToken for + * out-of-band progress notifications. + */ +@Serializable +public data class CreateMessageRequestParams( + val maxTokens: Int, + val messages: List, + val modelPreferences: ModelPreferences? = null, + val systemPrompt: String? = null, + val includeContext: IncludeContext? = null, + val temperature: Double? = null, + val stopSequences: List? = null, + val metadata: JsonObject? = null, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : RequestParams + +/** + * Specifies which MCP server context to include in the sampling request. + */ +@Serializable +public enum class IncludeContext { + /** Don't include any server context */ + @SerialName("none") + None, + + /** Include context only from the requesting server */ + @SerialName("thisServer") + ThisServer, + + /** Include context from all connected MCP servers */ + @SerialName("allServers") + AllServers, +} + +/** + * The client's response to a [CreateMessageRequest] from the server. + * + * The client should inform the user before returning the sampled message, to allow them + * to inspect the response (human in the loop) and decide whether to allow the server to see it. + * + * @property role The role of the message sender. Typically [Role.Assistant] for LLM-generated responses. + * @property content The generated content. Can be text, image, or audio content. + * @property model The name of the model that generated the message (e.g., "claude-3-opus-20240229", + * "gpt-4-turbo-preview"). This helps the server understand which model was used. + * @property stopReason The reason why sampling stopped, if known. + * Common values: "end_turn", "max_tokens", "stop_sequence", "content_filter" + * @property meta Optional metadata for this response. + */ +@Serializable +public data class CreateMessageResult( + val role: Role, + val content: MediaContent, + val model: String, + val stopReason: StopReason? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ClientResult + +@JvmInline +@Serializable +public value class StopReason(public val value: String) { + public companion object { + public val EndTurn: StopReason = StopReason("endTurn") + public val StopSequence: StopReason = StopReason("stopSequence") + public val MaxTokens: StopReason = StopReason("maxTokens") + } +} diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt new file mode 100644 index 00000000..721a2aac --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt @@ -0,0 +1,402 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.github.oshai.kotlinlogging.KotlinLogging +import kotlinx.serialization.DeserializationStrategy +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerializationException +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.JsonContentPolymorphicSerializer +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.longOrNull + +private val logger = KotlinLogging.logger {} + +// ============================================================================ +// Utility Functions +// ============================================================================ + +/** + * Safely extracts the method field from a JSON element. + * Returns null if the method field is not present. + */ +private fun JsonElement.getMethodOrNull(): String? = jsonObject["method"]?.jsonPrimitive?.content + +/** + * Safely extracts the type field from a JSON element. + * Returns null if the type field is not present. + */ +private fun JsonElement.getTypeOrNull(): String? = jsonObject["type"]?.jsonPrimitive?.content + +/** + * Extracts the type field from a JSON element. + * Throws [SerializationException] if the type field is not present. + */ +private fun JsonElement.getType(): String = requireNotNull(getTypeOrNull()) { "Missing required 'type' field" } + +// ============================================================================ +// Method Serializer +// ============================================================================ + +/** + * Custom serializer for [Method] that handles both defined and custom methods. + * Defined methods are deserialized to [Method.Defined], while unknown methods + * are deserialized to [Method.Custom]. + */ +internal object MethodSerializer : KSerializer { + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("io.modelcontextprotocol.kotlin.sdk.types.Method", PrimitiveKind.STRING) + + private val definedMethods: Map by lazy { + Method.Defined.entries.associateBy { it.value } + } + + override fun serialize(encoder: Encoder, value: Method) { + encoder.encodeString(value.value) + } + + override fun deserialize(decoder: Decoder): Method { + val decodedString = decoder.decodeString() + return definedMethods[decodedString] ?: Method.Custom(decodedString) + } +} + +// ============================================================================ +// Reference Serializers +// ============================================================================ + +/** + * Polymorphic serializer for [Reference] types. + * Determines the concrete type based on the "type" field in JSON. + */ +internal object ReferencePolymorphicSerializer : JsonContentPolymorphicSerializer(Reference::class) { + override fun selectDeserializer(element: JsonElement): DeserializationStrategy = + when (element.getType()) { + ReferenceType.Prompt.value -> PromptReference.serializer() + ReferenceType.ResourceTemplate.value -> ResourceTemplateReference.serializer() + else -> throw SerializationException("Unknown reference type: ${element.getTypeOrNull()}") + } +} + +// ============================================================================ +// Content Serializers +// ============================================================================ + +/** + * Polymorphic serializer for [ContentBlock] types. + * Determines the concrete type based on the "type" field in JSON. + */ +internal object ContentBlockPolymorphicSerializer : + JsonContentPolymorphicSerializer(ContentBlock::class) { + override fun selectDeserializer(element: JsonElement): DeserializationStrategy = + when (element.getType()) { + ContentTypes.TEXT.value -> TextContent.serializer() + ContentTypes.IMAGE.value -> ImageContent.serializer() + ContentTypes.AUDIO.value -> AudioContent.serializer() + ContentTypes.RESOURCE_LINK.value -> ResourceLink.serializer() + ContentTypes.EMBEDDED_RESOURCE.value -> EmbeddedResource.serializer() + else -> throw SerializationException("Unknown content block type: ${element.getTypeOrNull()}") + } +} + +/** + * Polymorphic serializer for [MediaContent] types (text, image, audio). + * Determines the concrete type based on the "type" field in JSON. + */ +internal object MediaContentPolymorphicSerializer : + JsonContentPolymorphicSerializer(MediaContent::class) { + override fun selectDeserializer(element: JsonElement): DeserializationStrategy = + when (element.getType()) { + ContentTypes.TEXT.value -> TextContent.serializer() + ContentTypes.IMAGE.value -> ImageContent.serializer() + ContentTypes.AUDIO.value -> AudioContent.serializer() + else -> throw SerializationException("Unknown media content type: ${element.getTypeOrNull()}") + } +} + +// ============================================================================ +// Resource Serializers +// ============================================================================ + +/** + * Polymorphic serializer for [ResourceContents] types. + * Determines the concrete type based on the presence of "text" or "blob" fields. + */ +internal object ResourceContentsPolymorphicSerializer : + JsonContentPolymorphicSerializer(ResourceContents::class) { + override fun selectDeserializer(element: JsonElement): DeserializationStrategy { + val jsonObject = element.jsonObject + return when { + "text" in jsonObject -> TextResourceContents.serializer() + "blob" in jsonObject -> BlobResourceContents.serializer() + else -> UnknownResourceContents.serializer() + } + } +} + +// ============================================================================ +// Request Serializers +// ============================================================================ + +private val clientRequestDeserializers: Map> by lazy { + mapOf( + Method.Defined.CompletionComplete.value to CompleteRequest.serializer(), + Method.Defined.Initialize.value to InitializeRequest.serializer(), + Method.Defined.Ping.value to PingRequest.serializer(), + Method.Defined.LoggingSetLevel.value to SetLevelRequest.serializer(), + Method.Defined.PromptsGet.value to GetPromptRequest.serializer(), + Method.Defined.PromptsList.value to ListPromptsRequest.serializer(), + Method.Defined.ResourcesList.value to ListResourcesRequest.serializer(), + Method.Defined.ResourcesRead.value to ReadResourceRequest.serializer(), + Method.Defined.ResourcesSubscribe.value to SubscribeRequest.serializer(), + Method.Defined.ResourcesUnsubscribe.value to UnsubscribeRequest.serializer(), + Method.Defined.ResourcesTemplatesList.value to ListResourceTemplatesRequest.serializer(), + Method.Defined.ToolsCall.value to CallToolRequest.serializer(), + Method.Defined.ToolsList.value to ListToolsRequest.serializer(), + ) +} + +/** + * Selects the appropriate deserializer for client requests based on the method name. + * Returns null if the method is not a known client request method. + */ +internal fun selectClientRequestDeserializer(method: String): DeserializationStrategy? = + clientRequestDeserializers[method] + +private val serverRequestDeserializers: Map> by lazy { + mapOf( + Method.Defined.ElicitationCreate.value to ElicitRequest.serializer(), + Method.Defined.Ping.value to PingRequest.serializer(), + Method.Defined.RootsList.value to ListRootsRequest.serializer(), + Method.Defined.SamplingCreateMessage.value to CreateMessageRequest.serializer(), + ) +} + +/** + * Selects the appropriate deserializer for server requests based on the method name. + * Returns null if the method is not a known server request method. + */ +internal fun selectServerRequestDeserializer(method: String): DeserializationStrategy? = + serverRequestDeserializers[method] + +/** + * Polymorphic serializer for [Request] types. + * Supports both client and server requests, as well as custom requests. + */ +internal object RequestPolymorphicSerializer : JsonContentPolymorphicSerializer(Request::class) { + override fun selectDeserializer(element: JsonElement): DeserializationStrategy { + val method = element.getMethodOrNull() ?: run { + logger.error { "Missing 'method' for Request: $element" } + throw SerializationException("Missing 'method' for Request: $element") + } + + return selectClientRequestDeserializer(method) + ?: selectServerRequestDeserializer(method) + ?: CustomRequest.serializer() + } +} + +// ============================================================================ +// Notification Serializers +// ============================================================================ + +private val clientNotificationDeserializers: Map> by lazy { + mapOf( + Method.Defined.NotificationsCancelled.value to CancelledNotification.serializer(), + Method.Defined.NotificationsProgress.value to ProgressNotification.serializer(), + Method.Defined.NotificationsInitialized.value to InitializedNotification.serializer(), + Method.Defined.NotificationsRootsListChanged.value to RootsListChangedNotification.serializer(), + ) +} + +/** + * Selects the appropriate deserializer for client notifications based on the method name. + * Returns null if the method is not a known client notification method. + */ +private fun selectClientNotificationDeserializer(element: JsonElement): DeserializationStrategy? = + element.getMethodOrNull()?.let(clientNotificationDeserializers::get) + +private val serverNotificationDeserializers: Map> by lazy { + mapOf( + Method.Defined.NotificationsCancelled.value to CancelledNotification.serializer(), + Method.Defined.NotificationsProgress.value to ProgressNotification.serializer(), + Method.Defined.NotificationsMessage.value to LoggingMessageNotification.serializer(), + Method.Defined.NotificationsResourcesUpdated.value to ResourceUpdatedNotification.serializer(), + Method.Defined.NotificationsResourcesListChanged.value to ResourceListChangedNotification.serializer(), + Method.Defined.NotificationsToolsListChanged.value to ToolListChangedNotification.serializer(), + Method.Defined.NotificationsPromptsListChanged.value to PromptListChangedNotification.serializer(), + ) +} + +/** + * Selects the appropriate deserializer for server notifications based on the method name. + * Returns null if the method is not a known server notification method. + */ +internal fun selectServerNotificationDeserializer(element: JsonElement): DeserializationStrategy? = + element.getMethodOrNull()?.let(serverNotificationDeserializers::get) + +/** + * Polymorphic serializer for [Notification] types. + * Supports both client and server notifications, as well as custom notifications. + */ +internal object NotificationPolymorphicSerializer : + JsonContentPolymorphicSerializer(Notification::class) { + override fun selectDeserializer(element: JsonElement): DeserializationStrategy = + selectClientNotificationDeserializer(element) + ?: selectServerNotificationDeserializer(element) + ?: CustomNotification.serializer() +} + +/** + * Polymorphic serializer for [ClientNotification] types. + * Falls back to [CustomNotification] for unknown methods. + */ +internal object ClientNotificationPolymorphicSerializer : + JsonContentPolymorphicSerializer(ClientNotification::class) { + override fun selectDeserializer(element: JsonElement): DeserializationStrategy = + selectClientNotificationDeserializer(element) + ?: CustomNotification.serializer() +} + +/** + * Polymorphic serializer for [ServerNotification] types. + * Falls back to [CustomNotification] for unknown methods. + */ +internal object ServerNotificationPolymorphicSerializer : + JsonContentPolymorphicSerializer(ServerNotification::class) { + override fun selectDeserializer(element: JsonElement): DeserializationStrategy = + selectServerNotificationDeserializer(element) + ?: CustomNotification.serializer() +} + +// ============================================================================ +// Result Serializers +// ============================================================================ + +/** + * Selects the appropriate deserializer for empty results. + * Returns EmptyResult serializer if the JSON object is empty or contains only metadata. + */ +private fun selectEmptyResult(element: JsonElement): DeserializationStrategy? { + val jsonObject = element.jsonObject + return when { + jsonObject.isEmpty() || (jsonObject.size == 1 && "_meta" in jsonObject) -> EmptyResult.serializer() + else -> null + } +} + +/** + * Selects the appropriate deserializer for client results based on JSON content. + * Returns null if the structure doesn't match any known client result type. + */ +private fun selectClientResultDeserializer(element: JsonElement): DeserializationStrategy? { + val jsonObject = element.jsonObject + return when { + "model" in jsonObject && "role" in jsonObject -> CreateMessageResult.serializer() + "roots" in jsonObject -> ListRootsResult.serializer() + "action" in jsonObject -> ElicitResult.serializer() + else -> null + } +} + +/** + * Selects the appropriate deserializer for server results based on JSON content. + * Returns null if the structure doesn't match any known server result type. + */ +private fun selectServerResultDeserializer(element: JsonElement): DeserializationStrategy? { + val jsonObject = element.jsonObject + return when { + "protocolVersion" in jsonObject && "capabilities" in jsonObject -> InitializeResult.serializer() + "completion" in jsonObject -> CompleteResult.serializer() + "tools" in jsonObject -> ListToolsResult.serializer() + "resources" in jsonObject -> ListResourcesResult.serializer() + "resourceTemplates" in jsonObject -> ListResourceTemplatesResult.serializer() + "prompts" in jsonObject -> ListPromptsResult.serializer() + "messages" in jsonObject -> GetPromptResult.serializer() + "contents" in jsonObject -> ReadResourceResult.serializer() + "content" in jsonObject -> CallToolResult.serializer() + else -> null + } +} + +/** + * Polymorphic serializer for [RequestResult] types. + * Supports both client and server results. + * Throws [SerializationException] if the result type cannot be determined. + */ +internal object RequestResultPolymorphicSerializer : + JsonContentPolymorphicSerializer(RequestResult::class) { + override fun selectDeserializer(element: JsonElement): DeserializationStrategy = + selectClientResultDeserializer(element) + ?: selectServerResultDeserializer(element) + ?: selectEmptyResult(element) + ?: throw SerializationException("Cannot determine RequestResult type from JSON: ${element.jsonObject.keys}") +} + +/** + * Polymorphic serializer for [ClientResult] types. + * Throws [SerializationException] if the result type cannot be determined. + */ +internal object ClientResultPolymorphicSerializer : + JsonContentPolymorphicSerializer(ClientResult::class) { + override fun selectDeserializer(element: JsonElement): DeserializationStrategy = + selectClientResultDeserializer(element) + ?: selectEmptyResult(element) + ?: throw SerializationException("Cannot determine RequestResult type from JSON: ${element.jsonObject.keys}") +} + +/** + * Polymorphic serializer for [ServerResult] types. + * Throws [SerializationException] if the result type cannot be determined. + */ +internal object ServerResultPolymorphicSerializer : + JsonContentPolymorphicSerializer(ServerResult::class) { + override fun selectDeserializer(element: JsonElement): DeserializationStrategy = + selectServerResultDeserializer(element) + ?: selectEmptyResult(element) + ?: throw SerializationException("Cannot determine RequestResult type from JSON: ${element.jsonObject.keys}") +} + +// ============================================================================ +// JSON-RPC Serializers +// ============================================================================ + +/** + * Polymorphic serializer for [JSONRPCMessage] types. + * Determines the message type based on the presence of specific fields: + * - "error" -> JSONRPCError + * - "result" -> JSONRPCResponse + * - "method" + "id" -> JSONRPCRequest + * - "method" -> JSONRPCNotification + */ +internal object JSONRPCMessagePolymorphicSerializer : + JsonContentPolymorphicSerializer(JSONRPCMessage::class) { + override fun selectDeserializer(element: JsonElement): DeserializationStrategy { + val jsonObject = element.jsonObject + return when { + "error" in jsonObject -> JSONRPCError.serializer() + "result" in jsonObject -> JSONRPCResponse.serializer() + "method" in jsonObject && "id" in jsonObject -> JSONRPCRequest.serializer() + "method" in jsonObject -> JSONRPCNotification.serializer() + else -> throw SerializationException("Invalid JSONRPCMessage type: ${jsonObject.keys}") + } + } +} + +/** + * Polymorphic serializer for [RequestId] types. + * Supports both string and number IDs. + */ +internal object RequestIdPolymorphicSerializer : JsonContentPolymorphicSerializer(RequestId::class) { + override fun selectDeserializer(element: JsonElement): DeserializationStrategy = when (element) { + is JsonPrimitive if (element.isString) -> RequestId.StringId.serializer() + is JsonPrimitive if (element.longOrNull != null) -> RequestId.NumberId.serializer() + else -> throw SerializationException("Invalid RequestId type: $element") + } +} diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/tools.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/tools.kt new file mode 100644 index 00000000..6a30fcb8 --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/tools.kt @@ -0,0 +1,231 @@ +@file:OptIn(ExperimentalSerializationApi::class) + +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject + +/** + * Creates a [CallToolResult] with single [TextContent] and [meta]. + */ +public fun CallToolResult.Companion.success(content: String, meta: JsonObject? = null): CallToolResult = CallToolResult( + content = listOf(TextContent(content)), + isError = false, + meta = meta, +) + +/** + * Creates a [CallToolResult] with single [TextContent] and [meta], with `isError` being true. + */ +public fun CallToolResult.Companion.error(content: String, meta: JsonObject? = null): CallToolResult = CallToolResult( + content = listOf(TextContent(content)), + isError = true, + meta = meta, +) + +/** + * Definition for a tool the client can call. + * + * Tools allow servers to expose functionality that can be invoked by clients and LLMs. + * Each tool has a name, description, and schema defining its input (and optionally output) parameters. + * + * **Display name precedence order:** [title] → [annotations].[title] → [name] + * + * @property name The programmatic identifier for this tool. + * Intended for logical use and API identification. Used as a display name fallback + * if both [title] and [annotations].[title] are not provided. + * @property inputSchema A JSON Schema object defining the expected parameters for the tool. + * Must be an object type schema. Defines what arguments the tool accepts. + * @property description A human-readable description of the tool and when to use it. + * Clients can use this to improve the LLM's understanding of available tools. + * It can be thought of like a "hint" to the model. + * @property outputSchema An optional JSON Schema object defining the structure of the tool's output + * returned in the [structuredContent][CallToolResult.structuredContent] field of a [CallToolResult]. + * Must be an object type schema if provided. + * @property title Optional human-readable display name for this tool. + * Intended for UI and end-user contexts, optimized to be easily understood + * even by those unfamiliar with domain-specific terminology. + * Note: For Tool specifically, [annotations].[title] takes precedence over this field. + * @property annotations Optional additional tool information providing hints about tool behavior. + * All properties in [ToolAnnotations] are hints and not guaranteed to provide + * a faithful description of tool behavior. + * @property icons Optional set of sized icons that clients can display in their user interface. + * Clients MUST support at least PNG and JPEG formats. + * Clients SHOULD also support SVG and WebP formats. + * @property meta Optional metadata for this tool. + */ +@Serializable +public data class Tool( + val name: String, + val inputSchema: ToolSchema, + val description: String? = null, + val outputSchema: ToolSchema? = null, + val title: String? = null, + val annotations: ToolAnnotations? = null, + val icons: List? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : WithMeta + +/** + * A JSON Schema for tool input or output parameters. + * + * This is a simplified schema structure that must be of type "object". + * + * @property type Always "object" for tool schemas. + * @property properties Optional map of property names to their schema definitions. + * @property required Optional list of property names that are required. + */ +@Serializable +public data class ToolSchema(val properties: JsonObject? = null, val required: List? = null) { + @OptIn(ExperimentalSerializationApi::class) + @EncodeDefault + val type: String = "object" +} + +/** + * Additional properties describing a Tool to clients. + * + * **IMPORTANT:** All properties in ToolAnnotations are **hints**. They are NOT guaranteed to provide + * a faithful description of tool behavior (including descriptive properties like [title]). + * + * **Security warning:** Clients should NEVER make tool use decisions based on ToolAnnotations + * received from untrusted servers. + * + * @property title A human-readable title for the tool. + * Takes precedence over [Tool.title] and [Tool.name] for display purposes. + * @property readOnlyHint If true, the tool does not modify its environment. + * If false, the tool may perform modifications. + * Default: false + * @property destructiveHint If true, the tool may perform destructive updates to its environment. + * If false, the tool performs only additive updates. + * This property is meaningful only when [readOnlyHint] == false. + * Default: true + * @property idempotentHint If true, calling the tool repeatedly with the same arguments will have + * no additional effect on its environment. + * This property is meaningful only when [readOnlyHint] == false. + * Default: false + * @property openWorldHint If true, this tool may interact with an "open world" of external entities. + * If false, the tool's domain of interaction is closed. + * For example, the world of a web search tool is open, whereas that of a + * memory tool is not. + * Default: true + */ +@Serializable +public data class ToolAnnotations( + val title: String? = null, + val readOnlyHint: Boolean? = null, + val destructiveHint: Boolean? = null, + val idempotentHint: Boolean? = null, + val openWorldHint: Boolean? = null, +) + +// ============================================================================ +// tools/call +// ============================================================================ + +/** + * Used by the client to invoke a tool provided by the server. + * + * Tools allow servers to expose functionality that clients (and LLMs) can call. + * Examples include file operations, API calls, database queries, or any other + * server-side operations. + * + * @property params The parameters specifying which tool to call and what arguments to pass. + */ +@Serializable +public data class CallToolRequest(override val params: CallToolRequestParams) : ClientRequest { + @EncodeDefault + override val method: Method = Method.Defined.ToolsCall +} + +/** + * Parameters for a tools/call request. + * + * @property name The name of the tool to invoke. + * @property arguments Arguments to pass to the tool. Keys are argument names, values are the argument values. + * The structure must match the tool's input schema. + * @property meta Optional metadata for this request. May include a progressToken for + * out-of-band progress notifications. + */ +@Serializable +public data class CallToolRequestParams( + val name: String, + val arguments: JsonObject? = null, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : RequestParams + +/** + * The server's response to a [CallToolRequest]. + * + * Contains the result of the tool execution, which can be successful or an error. + * + * **Important error handling:** + * - Errors that originate from the **tool itself** SHOULD be reported inside the result object + * with [isError] set to true, NOT as an MCP protocol-level error response. This allows the LLM + * to see that an error occurred and potentially self-correct. + * - Errors in **finding the tool**, unsupported operations, or other exceptional conditions + * SHOULD be reported as MCP protocol-level error responses. + * + * @property content A list of content blocks that represent the unstructured result of the tool call. + * This is what the LLM will see as the tool's output. + * @property isError Whether the tool call ended in an error. + * If not set, this is assumed to be false (the call was successful). + * When true, the [content] should describe the error that occurred. + * @property structuredContent An optional JSON object that represents the structured result of the tool call. + * Provides machine-readable output in addition to the human-readable [content]. + * @property meta Optional metadata for this response. + */ +@Serializable +public data class CallToolResult( + val content: List, + val isError: Boolean? = null, + val structuredContent: JsonObject? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ServerResult + +// ============================================================================ +// tools/list +// ============================================================================ + +/** + * Sent from the client to request a list of tools the server has. + * + * This request supports pagination through the cursor parameter. If the server has many + * tools, it may return a subset along with a cursor to fetch the next page. + * + * @property params Optional pagination parameters to control which page of results to return. + */ +@Serializable +public data class ListToolsRequest(override val params: PaginatedRequestParams? = null) : + ClientRequest, + PaginatedRequest { + @EncodeDefault + override val method: Method = Method.Defined.ToolsList +} + +/** + * The server's response to a [ListToolsRequest] from the client. + * + * Returns the available tools along with pagination information if there are more results. + * + * @property tools The list of available tools. Each tool includes its name, description, + * and input schema that defines what arguments it accepts. + * @property nextCursor An opaque token representing the pagination position after the last returned result. + * If present, there may be more results available. The client can pass this token + * in a subsequent request to fetch the next page. + * @property meta Optional metadata for this response. + */ +@Serializable +public data class ListToolsResult( + val tools: List, + override val nextCursor: String? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ServerResult, + PaginatedResult diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/AudioContentSerializationTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/AudioContentSerializationTest.kt deleted file mode 100644 index 247388f7..00000000 --- a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/AudioContentSerializationTest.kt +++ /dev/null @@ -1,33 +0,0 @@ -package io.modelcontextprotocol.kotlin.sdk - -import io.kotest.assertions.json.shouldEqualJson -import io.modelcontextprotocol.kotlin.sdk.shared.McpJson -import kotlin.test.Test -import kotlin.test.assertEquals - -class AudioContentSerializationTest { - - private val audioContentJson = """ - { - "data": "base64-encoded-audio-data", - "mimeType": "audio/wav", - "type": "audio" - } - """.trimIndent() - - private val audioContent = AudioContent( - data = "base64-encoded-audio-data", - mimeType = "audio/wav", - ) - - @Test - fun `should serialize audio content`() { - McpJson.encodeToString(audioContent) shouldEqualJson audioContentJson - } - - @Test - fun `should deserialize audio content`() { - val content = McpJson.decodeFromString(audioContentJson) - assertEquals(expected = audioContent, actual = content) - } -} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/CallToolResultUtilsTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/CallToolResultUtilsTest.kt deleted file mode 100644 index d331b01e..00000000 --- a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/CallToolResultUtilsTest.kt +++ /dev/null @@ -1,63 +0,0 @@ -package io.modelcontextprotocol.kotlin.sdk - -import kotlinx.serialization.json.JsonPrimitive -import kotlinx.serialization.json.buildJsonObject -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertFalse -import kotlin.test.assertTrue - -class CallToolResultUtilsTest { - - @Test - fun testOkWithOnlyText() { - val content = "TextMessage" - val result = CallToolResult.Companion.ok(content) - - assertEquals(1, result.content.size) - assertEquals(content, (result.content[0] as TextContent).text) - assertFalse(result.isError == true) - assertEquals(EmptyJsonObject, result._meta) - } - - @Test - fun testOkWithMeta() { - val content = "TextMessageWithMeta" - val meta = buildJsonObject { - put("key1", JsonPrimitive("value1")) - put("key2", JsonPrimitive(42)) - } - val result = CallToolResult.Companion.ok(content, meta) - - assertEquals(1, result.content.size) - assertEquals(content, (result.content[0] as TextContent).text) - assertFalse(result.isError == true) - assertEquals(meta, result._meta) - } - - @Test - fun testErrorWithOnlyText() { - val content = "ErrorMessage" - val result = CallToolResult.Companion.error(content) - - assertEquals(1, result.content.size) - assertEquals(content, (result.content[0] as TextContent).text) - assertTrue(result.isError == true) - assertEquals(EmptyJsonObject, result._meta) - } - - @Test - fun testErrorWithMeta() { - val content = "ErrorMessageWithMeta" - val meta = buildJsonObject { - put("errorCode", JsonPrimitive(404)) - put("errorDetail", JsonPrimitive("资源未找到")) - } - val result = CallToolResult.Companion.error(content, meta) - - assertEquals(1, result.content.size) - assertEquals(content, (result.content[0] as TextContent).text) - assertTrue(result.isError == true) - assertEquals(meta, result._meta) - } -} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/RequestSerializerTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/RequestSerializerTest.kt deleted file mode 100644 index 96a74dc0..00000000 --- a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/RequestSerializerTest.kt +++ /dev/null @@ -1,325 +0,0 @@ -package io.modelcontextprotocol.kotlin.sdk - -import io.modelcontextprotocol.kotlin.sdk.shared.McpJson -import kotlinx.serialization.json.buildJsonObject -import kotlinx.serialization.json.put -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertIs - -class RequestSerializerTest { - - // Client Result Tests - @Test - fun `should deserialize CreateMessageResult polymorphically`() { - val json = """{ - "model": "test-model", - "role": "assistant", - "content": { - "type": "text", - "text": "Hello" - }, - "stopReason": "endTurn" - }""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("test-model", decoded.model) - assertEquals(Role.assistant, decoded.role) - assertEquals(StopReason.EndTurn, decoded.stopReason) - } - - @Test - fun `should deserialize ListRootsResult polymorphically`() { - val json = """{ - "roots": [ - { - "uri": "file:///test", - "name": "Test Root" - } - ] - }""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals(1, decoded.roots.size) - assertEquals("file:///test", decoded.roots[0].uri) - assertEquals("Test Root", decoded.roots[0].name) - } - - @Test - fun `should deserialize CreateElicitationResult polymorphically`() { - val json = """{ - "action": "accept", - "content": { - "timezone": "Europe/Amsterdam" - } - }""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals(CreateElicitationResult.Action.accept, decoded.action) - } - - // Server Result Tests - @Test - fun `should deserialize ListToolsResult polymorphically`() { - val json = """{ - "tools": [ - { - "name": "test-tool", - "description": "A test tool", - "inputSchema": { - "type": "object", - "properties": {} - }, - "_meta": {} - } - ] - }""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals(1, decoded.tools.size) - assertEquals("test-tool", decoded.tools[0].name) - assertEquals("A test tool", decoded.tools[0].description) - } - - @Test - fun `should deserialize ListResourcesResult polymorphically`() { - val json = """{ - "resources": [ - { - "uri": "file:///test.txt", - "name": "test.txt", - "mimeType": "text/plain" - } - ] - }""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals(1, decoded.resources.size) - assertEquals("file:///test.txt", decoded.resources[0].uri) - assertEquals("test.txt", decoded.resources[0].name) - assertEquals("text/plain", decoded.resources[0].mimeType) - } - - @Test - fun `should deserialize ListResourceTemplatesResult polymorphically`() { - val json = """{ - "resourceTemplates": [ - { - "uriTemplate": "file:///templates/{name}", - "name": "template", - "mimeType": "text/plain" - } - ] - }""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals(1, decoded.resourceTemplates.size) - assertEquals("file:///templates/{name}", decoded.resourceTemplates[0].uriTemplate) - assertEquals("template", decoded.resourceTemplates[0].name) - assertEquals("text/plain", decoded.resourceTemplates[0].mimeType) - } - - @Test - fun `should deserialize ListPromptsResult polymorphically`() { - val json = """{ - "prompts": [ - { - "name": "test-prompt", - "description": "A test prompt" - } - ] - }""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals(1, decoded.prompts.size) - assertEquals("test-prompt", decoded.prompts[0].name) - assertEquals("A test prompt", decoded.prompts[0].description) - } - - @Test - fun `should deserialize InitializeResult polymorphically`() { - val json = """{ - "capabilities": { - "logging": {}, - "prompts": { - "listChanged": true - }, - "resources": { - "subscribe": true, - "listChanged": true - }, - "tools": { - "listChanged": true - } - }, - "protocolVersion": "2024-11-05", - "serverInfo": { - "name": "Test Server", - "version": "1.0.0" - } - }""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("2024-11-05", decoded.protocolVersion) - assertEquals("Test Server", decoded.serverInfo.name) - assertEquals("1.0.0", decoded.serverInfo.version) - } - - @Test - fun `should deserialize GetPromptResult polymorphically`() { - val json = """{ - "description": "A test prompt", - "messages": [ - { - "role": "user", - "content": { - "type": "text", - "text": "Hello" - } - } - ] - }""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("A test prompt", decoded.description) - assertEquals(1, decoded.messages.size) - assertEquals(Role.user, decoded.messages[0].role) - } - - @Test - fun `should deserialize CompleteResult polymorphically`() { - val json = """{ - "completion": { - "values": ["option1", "option2"], - "total": 2, - "hasMore": false - } - }""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals(2, decoded.completion.values.size) - assertEquals("option1", decoded.completion.values[0]) - assertEquals("option2", decoded.completion.values[1]) - assertEquals(2, decoded.completion.total) - assertEquals(false, decoded.completion.hasMore) - } - - @Test - fun `should deserialize ReadResourceResult polymorphically`() { - val json = """{ - "contents": [ - { - "uri": "file:///test.txt", - "mimeType": "text/plain", - "text": "Hello World" - } - ] - }""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals(1, decoded.contents.size) - assertIs(decoded.contents[0]) - val textContent = decoded.contents[0] as TextResourceContents - assertEquals("file:///test.txt", textContent.uri) - assertEquals("text/plain", textContent.mimeType) - assertEquals("Hello World", textContent.text) - } - - @Test - fun `should deserialize CallToolResult polymorphically`() { - val json = """{ - "content": [ - { - "type": "text", - "text": "Tool result" - } - ], - "isError": false - }""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals(1, decoded.content.size) - assertIs(decoded.content[0]) - assertEquals("Tool result", (decoded.content[0] as TextContent).text) - assertEquals(false, decoded.isError) - } - - @Test - fun `should deserialize CompatibilityCallToolResult polymorphically`() { - val json = """{ - "toolResult": {"result": "Legacy tool result"}, - "content": [], - "isError": false - }""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals(buildJsonObject { put("result", "Legacy tool result") }, decoded.toolResult) - } - - // Fallback Test - @Test - fun `should deserialize EmptyRequestResult for unknown result type`() { - val json = """{"unknownField": "value"}""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals(EmptyJsonObject, decoded._meta) - } - - @Test - fun `should handle empty JSON object`() { - val json = """{}""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - } - - // Priority Test - Client results should take precedence over server results - @Test - fun `should prioritize client results over server results when both match`() { - // This JSON could potentially match both CreateMessageResult (client) and CallToolResult (server) - // but CreateMessageResult should be selected first due to the order - val json = """{ - "model": "test-model", - "role": "assistant", - "content": { - "type": "text", - "text": "Test message" - }, - "stopReason": "endTurn" - }""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("test-model", decoded.model) - } -} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/ToolSerializationTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/ToolSerializationTest.kt deleted file mode 100644 index 969a1f3c..00000000 --- a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/ToolSerializationTest.kt +++ /dev/null @@ -1,506 +0,0 @@ -package io.modelcontextprotocol.kotlin.sdk - -import io.kotest.assertions.json.shouldEqualJson -import io.modelcontextprotocol.kotlin.sdk.shared.McpJson -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.json.JsonPrimitive -import kotlinx.serialization.json.buildJsonObject -import kotlin.test.Test -import kotlin.test.assertEquals - -class ToolSerializationTest { - - // see https://docs.anthropic.com/en/docs/build-with-claude/tool-use - /* language=json */ - private val getWeatherToolJson = """ - { - "name": "get_weather", - "title": "Get weather", - "description": "Get the current weather in a given location", - "inputSchema": { - "type": "object", - "properties": { - "location": { - "type": "string", - "description": "The city and state, e.g. San Francisco, CA" - } - }, - "required": ["location"] - }, - "outputSchema": { - "type": "object", - "properties": { - "temperature": { - "type": "number", - "description": "Temperature in celsius" - }, - "conditions": { - "type": "string", - "description": "Weather conditions description" - }, - "humidity": { - "type": "number", - "description": "Humidity percentage" - } - }, - "required": ["temperature", "conditions", "humidity"] - }, - "_meta": { - "_for_test_only": true - } - } - """.trimIndent() - - val getWeatherTool = Tool( - name = "get_weather", - title = "Get weather", - description = "Get the current weather in a given location", - annotations = null, - inputSchema = Tool.Input( - properties = buildJsonObject { - put( - "location", - buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("The city and state, e.g. San Francisco, CA")) - }, - ) - }, - required = listOf("location"), - ), - outputSchema = Tool.Output( - properties = buildJsonObject { - put( - "temperature", - buildJsonObject { - put("type", JsonPrimitive("number")) - put("description", JsonPrimitive("Temperature in celsius")) - }, - ) - put( - "conditions", - buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("Weather conditions description")) - }, - ) - put( - "humidity", - buildJsonObject { - put("type", JsonPrimitive("number")) - put("description", JsonPrimitive("Humidity percentage")) - }, - ) - }, - required = listOf("temperature", "conditions", "humidity"), - ), - _meta = buildJsonObject { - put("_for_test_only", JsonPrimitive(true)) - }, - ) - - //region Serialize - - @Test - fun `should serialize get_weather tool`() { - McpJson.encodeToString(getWeatherTool) shouldEqualJson getWeatherToolJson - } - - @Test - fun `should always serialize default value`() { - val json = Json(from = McpJson) { - encodeDefaults = false - } - json.encodeToString(getWeatherTool) shouldEqualJson getWeatherToolJson - } - - @Test - fun `should serialize get_weather tool without optional properties`() { - val weatherTool = createWeatherTool(name = "get_weather") - val expectedJson = createWeatherToolJson(name = "get_weather") - val actualJson = McpJson.encodeToString(weatherTool) - - actualJson shouldEqualJson expectedJson - } - - @Test - fun `should serialize get_weather tool with title optional property specified`() { - val weatherTool = createWeatherTool(name = "get_weather", title = "Get weather") - val expectedJson = createWeatherToolJson(name = "get_weather", title = "Get weather") - val actualJson = McpJson.encodeToString(weatherTool) - - actualJson shouldEqualJson expectedJson - } - - @Test - fun `should serialize get_weather tool with outputSchema optional property specified`() { - val weatherTool = createWeatherTool( - name = "get_weather", - outputSchema = Tool.Output( - properties = buildJsonObject { - put( - "temperature", - buildJsonObject { - put("type", JsonPrimitive("number")) - put("description", JsonPrimitive("Temperature in celsius")) - }, - ) - put( - "conditions", - buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("Weather conditions description")) - }, - ) - put( - "humidity", - buildJsonObject { - put("type", JsonPrimitive("number")) - put("description", JsonPrimitive("Humidity percentage")) - }, - ) - }, - required = listOf("temperature", "conditions", "humidity"), - ), - ) - val expectedJson = - createWeatherToolJson( - name = "get_weather", - outputSchema = """ - { - "type": "object", - "properties": { - "temperature": { - "type": "number", - "description": "Temperature in celsius" - }, - "conditions": { - "type": "string", - "description": "Weather conditions description" - }, - "humidity": { - "type": "number", - "description": "Humidity percentage" - } - }, - "required": ["temperature", "conditions", "humidity"] - } - """.trimIndent(), - ) - - val actualJson = McpJson.encodeToString(weatherTool) - - actualJson shouldEqualJson expectedJson - } - - @Test - fun `should serialize get_weather tool with all properties specified`() { - val weatherTool = createWeatherTool( - name = "get_weather", - title = "Get weather", - outputSchema = Tool.Output( - properties = buildJsonObject { - put( - "temperature", - buildJsonObject { - put("type", JsonPrimitive("number")) - put("description", JsonPrimitive("Temperature in celsius")) - }, - ) - put( - "conditions", - buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("Weather conditions description")) - }, - ) - put( - "humidity", - buildJsonObject { - put("type", JsonPrimitive("number")) - put("description", JsonPrimitive("Humidity percentage")) - }, - ) - }, - required = listOf("temperature", "conditions", "humidity"), - ), - ) - val expectedJson = createWeatherToolJson( - name = "get_weather", - title = "Get weather", - outputSchema = """ - { - "type": "object", - "properties": { - "temperature": { - "type": "number", - "description": "Temperature in celsius" - }, - "conditions": { - "type": "string", - "description": "Weather conditions description" - }, - "humidity": { - "type": "number", - "description": "Humidity percentage" - } - }, - "required": ["temperature", "conditions", "humidity"] - } - """.trimIndent(), - ) - - val actualJson = McpJson.encodeToString(weatherTool) - - actualJson shouldEqualJson expectedJson - } - - //endregion Serialize - - //region Deserialize - - @Test - fun `should deserialize get_weather tool`() { - val actualTool = McpJson.decodeFromString(getWeatherToolJson) - assertEquals(expected = getWeatherTool, actual = actualTool) - } - - @Test - fun `should deserialize get_weather tool without optional properties`() { - val toolJson = createWeatherToolJson(name = "get_weather") - val expectedTool = createWeatherTool(name = "get_weather") - val actualTool = McpJson.decodeFromString(toolJson) - - assertEquals(expected = expectedTool, actual = actualTool) - } - - @Test - fun `should deserialize get_weather tool with title properties specified`() { - val toolJson = createWeatherToolJson(name = "get_weather", title = "Get weather") - val expectedTool = createWeatherTool(name = "get_weather", title = "Get weather") - - val actualTool = McpJson.decodeFromString(toolJson) - - assertEquals(expected = expectedTool, actual = actualTool) - } - - @Test - fun `should deserialize get_weather tool with outputSchema optional property specified`() { - val toolJson = - createWeatherToolJson( - name = "get_weather", - outputSchema = """ - { - "type": "object", - "properties": { - "temperature": { - "type": "number", - "description": "Temperature in celsius" - }, - "conditions": { - "type": "string", - "description": "Weather conditions description" - }, - "humidity": { - "type": "number", - "description": "Humidity percentage" - } - }, - "required": ["temperature", "conditions", "humidity"] - } - """.trimIndent(), - ) - - val expectedTool = createWeatherTool( - name = "get_weather", - outputSchema = Tool.Output( - properties = buildJsonObject { - put( - "temperature", - buildJsonObject { - put("type", JsonPrimitive("number")) - put("description", JsonPrimitive("Temperature in celsius")) - }, - ) - put( - "conditions", - buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("Weather conditions description")) - }, - ) - put( - "humidity", - buildJsonObject { - put("type", JsonPrimitive("number")) - put("description", JsonPrimitive("Humidity percentage")) - }, - ) - }, - required = listOf("temperature", "conditions", "humidity"), - ), - ) - - val actualTool = McpJson.decodeFromString(toolJson) - - assertEquals(expected = expectedTool, actual = actualTool) - } - - @Test - fun `should deserialize get_weather tool with all properties specified`() { - val toolJson = createWeatherToolJson( - name = "get_weather", - title = "Get weather", - outputSchema = """ - { - "type": "object", - "properties": { - "temperature": { - "type": "number", - "description": "Temperature in celsius" - }, - "conditions": { - "type": "string", - "description": "Weather conditions description" - }, - "humidity": { - "type": "number", - "description": "Humidity percentage" - } - }, - "required": ["temperature", "conditions", "humidity"] - } - """.trimIndent(), - ) - - val expectedTool = createWeatherTool( - name = "get_weather", - title = "Get weather", - outputSchema = Tool.Output( - properties = buildJsonObject { - put( - "temperature", - buildJsonObject { - put("type", JsonPrimitive("number")) - put("description", JsonPrimitive("Temperature in celsius")) - }, - ) - put( - "conditions", - buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("Weather conditions description")) - }, - ) - put( - "humidity", - buildJsonObject { - put("type", JsonPrimitive("number")) - put("description", JsonPrimitive("Humidity percentage")) - }, - ) - }, - required = listOf("temperature", "conditions", "humidity"), - ), - ) - - val actualTool = McpJson.decodeFromString(toolJson) - - assertEquals(expected = expectedTool, actual = actualTool) - } - - //endregion Deserialize - - //region Private Methods - - private fun createWeatherToolJson( - name: String = "get_weather", - title: String? = null, - outputSchema: String? = null, - @Suppress("LocalVariableName") _meta: String? = null, - ): String { - val stringBuilder = StringBuilder() - - stringBuilder - .appendLine("{") - .append(" \"name\": \"$name\"") - - if (title != null) { - stringBuilder - .appendLine(",") - .append(" \"title\": \"$title\"") - } - - stringBuilder - .appendLine(",") - .append(" \"description\": \"Get the current weather in a given location\"") - .appendLine(",") - .append( - """ - "inputSchema": { - "type": "object", - "properties": { - "location": { - "type": "string", - "description": "The city and state, e.g. San Francisco, CA" - } - }, - "required": ["location"] - } - """.trimIndent(), - ) - - if (outputSchema != null) { - stringBuilder - .appendLine(",") - .append( - """ - "outputSchema": $outputSchema - """.trimIndent(), - ) - } - - stringBuilder - .appendLine(",") - .append( - """ - "_meta": ${_meta ?: "{}"} - """.trimIndent(), - ) - - stringBuilder - .appendLine() - .appendLine("}") - - return stringBuilder.toString().trimIndent() - } - - private fun createWeatherTool( - name: String = "get_weather", - title: String? = null, - outputSchema: Tool.Output? = null, - @Suppress("LocalVariableName") _meta: JsonObject? = null, - ): Tool = Tool( - name = name, - title = title, - description = "Get the current weather in a given location", - annotations = null, - inputSchema = Tool.Input( - properties = buildJsonObject { - put( - "location", - buildJsonObject { - put("type", JsonPrimitive("string")) - put("description", JsonPrimitive("The city and state, e.g. San Francisco, CA")) - }, - ) - }, - required = listOf("location"), - ), - outputSchema = outputSchema, - _meta = _meta ?: EmptyJsonObject, - ) - - //endregion Private Methods -} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/TypesTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/TypesTest.kt deleted file mode 100644 index 7a4938a8..00000000 --- a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/TypesTest.kt +++ /dev/null @@ -1,456 +0,0 @@ -package io.modelcontextprotocol.kotlin.sdk - -import io.modelcontextprotocol.kotlin.sdk.shared.McpJson -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertIs -import kotlin.test.assertNotEquals -import kotlin.test.assertTrue -import kotlin.time.ExperimentalTime -import kotlin.time.Instant - -class TypesTest { - - @Test - fun `should have correct latest protocol version`() { - assertNotEquals("", LATEST_PROTOCOL_VERSION) - assertEquals("2025-03-26", LATEST_PROTOCOL_VERSION) - } - - @Test - fun `should have correct supported protocol versions`() { - assertIs>(SUPPORTED_PROTOCOL_VERSIONS) - assertTrue(SUPPORTED_PROTOCOL_VERSIONS.contains(LATEST_PROTOCOL_VERSION)) - assertTrue(SUPPORTED_PROTOCOL_VERSIONS.contains("2024-11-05")) - assertEquals(2, SUPPORTED_PROTOCOL_VERSIONS.size) - } - - @Test - fun `should validate JSONRPC version constant`() { - assertEquals("2.0", JSONRPC_VERSION) - } - - // Reference Tests - @Test - fun `should validate ResourceTemplateReference`() { - val resourceRef = ResourceTemplateReference(uri = "file:///path/to/file.txt") - - assertEquals("ref/resource", resourceRef.type) - assertEquals("file:///path/to/file.txt", resourceRef.uri) - } - - @Test - fun `should serialize and deserialize ResourceTemplateReference correctly`() { - val resourceRef = ResourceTemplateReference(uri = "https://example.com/resource") - - val json = McpJson.encodeToString(resourceRef) - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("ref/resource", decoded.type) - assertEquals("https://example.com/resource", decoded.uri) - } - - @Test - fun `should validate PromptReference`() { - val promptRef = PromptReference(name = "greeting") - - assertEquals("ref/prompt", promptRef.type) - assertEquals("greeting", promptRef.name) - } - - @Test - fun `should serialize and deserialize PromptReference correctly`() { - val promptRef = PromptReference(name = "test-prompt") - - val json = McpJson.encodeToString(promptRef) - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("ref/prompt", decoded.type) - assertEquals("test-prompt", decoded.name) - } - - @Test - fun `should handle UnknownReference for invalid type`() { - val invalidJson = """{"type": "invalid_type"}""" - - val decoded = McpJson.decodeFromString(invalidJson) - - assertIs(decoded) - assertEquals("invalid_type", decoded.type) - } - - // PromptMessageContent Tests - @Test - fun `should validate text content`() { - val textContent = TextContent(text = "Hello, world!") - - assertEquals("text", textContent.type) - assertEquals("Hello, world!", textContent.text) - } - - @Test - fun `should serialize and deserialize text content correctly`() { - val textContent = TextContent(text = "Test message") - - val json = McpJson.encodeToString(textContent) - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("text", decoded.type) - assertEquals("Test message", decoded.text) - } - - @Test - fun `should validate image content`() { - val imageContent = ImageContent( - data = "aGVsbG8=", // base64 encoded "hello" - mimeType = "image/png", - ) - - assertEquals("image", imageContent.type) - assertEquals("aGVsbG8=", imageContent.data) - assertEquals("image/png", imageContent.mimeType) - } - - @Test - fun `should serialize and deserialize image content correctly`() { - val imageContent = ImageContent( - data = "dGVzdA==", // base64 encoded "test" - mimeType = "image/jpeg", - ) - - val json = McpJson.encodeToString(imageContent) - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("image", decoded.type) - assertEquals("dGVzdA==", decoded.data) - assertEquals("image/jpeg", decoded.mimeType) - } - - @Test - fun `should validate audio content`() { - val audioContent = AudioContent( - data = "aGVsbG8=", // base64 encoded "hello" - mimeType = "audio/mp3", - ) - - assertEquals("audio", audioContent.type) - assertEquals("aGVsbG8=", audioContent.data) - assertEquals("audio/mp3", audioContent.mimeType) - } - - @Test - fun `should serialize and deserialize audio content correctly`() { - val audioContent = AudioContent( - data = "YXVkaW8=", // base64 encoded "audio" - mimeType = "audio/wav", - ) - - val json = McpJson.encodeToString(audioContent) - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("audio", decoded.type) - assertEquals("YXVkaW8=", decoded.data) - assertEquals("audio/wav", decoded.mimeType) - } - - @Test - fun `should validate embedded resource content`() { - val resource = TextResourceContents( - text = "File contents", - uri = "file:///path/to/file.txt", - mimeType = "text/plain", - ) - val embeddedResource = EmbeddedResource(resource = resource) - - assertEquals("resource", embeddedResource.type) - assertEquals(resource, embeddedResource.resource) - } - - @Test - fun `should serialize and deserialize embedded resource content correctly`() { - val resource = BlobResourceContents( - blob = "YmluYXJ5ZGF0YQ==", - uri = "file:///path/to/binary.dat", - mimeType = "application/octet-stream", - ) - val embeddedResource = EmbeddedResource(resource = resource) - - val json = McpJson.encodeToString(embeddedResource) - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("resource", decoded.type) - assertIs(decoded.resource) - val decodedBlob = decoded.resource - assertEquals("YmluYXJ5ZGF0YQ==", decodedBlob.blob) - assertEquals("file:///path/to/binary.dat", decodedBlob.uri) - assertEquals("application/octet-stream", decodedBlob.mimeType) - } - - @Test - fun `should handle unknown content type`() { - val unknownJson = """{"type": "unknown_type"}""" - - val decoded = McpJson.decodeFromString(unknownJson) - - assertIs(decoded) - assertEquals("unknown_type", decoded.type) - } - - // PromptMessage Tests - @Test - fun `should validate prompt message with text content`() { - val textContent = TextContent(text = "Hello, assistant!") - val promptMessage = PromptMessage( - role = Role.user, - content = textContent, - ) - - assertEquals(Role.user, promptMessage.role) - assertEquals(textContent, promptMessage.content) - assertEquals("text", promptMessage.content.type) - } - - @Test - fun `should validate prompt message with embedded resource`() { - val resource = TextResourceContents( - text = "Primary application entry point", - uri = "file:///project/src/main.rs", - mimeType = "text/x-rust", - ) - val embeddedResource = EmbeddedResource(resource = resource) - val promptMessage = PromptMessage( - role = Role.assistant, - content = embeddedResource, - ) - - assertEquals(Role.assistant, promptMessage.role) - assertEquals("resource", promptMessage.content.type) - val content = promptMessage.content as EmbeddedResource - val textResource = content.resource as TextResourceContents - assertEquals("Primary application entry point", textResource.text) - assertEquals("file:///project/src/main.rs", textResource.uri) - assertEquals("text/x-rust", textResource.mimeType) - } - - @OptIn(ExperimentalTime::class) - @Test - fun `should serialize and deserialize annotations correctly`() { - val annotations = Annotations( - audience = listOf(Role.assistant), - lastModified = Instant.parse("2025-06-18T00:00:00Z"), - priority = 0.5, - ) - - val json = McpJson.encodeToString(annotations) - val decoded = McpJson.decodeFromString(json) - - assertEquals(listOf(Role.assistant), decoded.audience) - assertEquals(Instant.parse("2025-06-18T00:00:00Z"), decoded.lastModified) - assertEquals(0.5, decoded.priority) - } - - @Test - fun `should serialize and deserialize prompt message correctly`() { - val imageContent = ImageContent( - data = "aW1hZ2VkYXRh", // base64 encoded "imagedata" - mimeType = "image/png", - ) - val promptMessage = PromptMessage( - role = Role.assistant, - content = imageContent, - ) - - val json = McpJson.encodeToString(promptMessage) - val decoded = McpJson.decodeFromString(json) - - assertEquals(Role.assistant, decoded.role) - assertIs(decoded.content) - val decodedContent = decoded.content - assertEquals("aW1hZ2VkYXRh", decodedContent.data) - assertEquals("image/png", decodedContent.mimeType) - } - - // CallToolResult Tests - @Test - fun `should validate tool result with multiple content types`() { - val toolResult = CallToolResult( - content = listOf( - TextContent(text = "Found the following files:"), - EmbeddedResource( - resource = TextResourceContents( - text = "fn main() {}", - uri = "file:///project/src/main.rs", - mimeType = "text/x-rust", - ), - ), - EmbeddedResource( - resource = TextResourceContents( - text = "pub mod lib;", - uri = "file:///project/src/lib.rs", - mimeType = "text/x-rust", - ), - ), - ), - ) - - assertEquals(3, toolResult.content.size) - assertEquals("text", toolResult.content[0].type) - assertEquals("resource", toolResult.content[1].type) - assertEquals("resource", toolResult.content[2].type) - assertEquals(false, toolResult.isError) - } - - @Test - fun `should validate empty content array with default`() { - val toolResult = CallToolResult(content = emptyList()) - - assertEquals(0, toolResult.content.size) - assertEquals(false, toolResult.isError) - } - - @Test - fun `should serialize and deserialize CallToolResult correctly`() { - val toolResult = CallToolResult( - content = listOf( - TextContent(text = "Operation completed"), - ImageContent(data = "aW1hZ2U=", mimeType = "image/png"), - ), - isError = false, - ) - - val json = McpJson.encodeToString(toolResult) - val decoded = McpJson.decodeFromString(json) - - assertEquals(2, decoded.content.size) - assertIs(decoded.content[0]) - assertIs(decoded.content[1]) - assertEquals(false, decoded.isError) - } - - // CompleteRequest Tests - @Test - fun `should validate CompleteRequest with prompt reference`() { - val request = CompleteRequest( - ref = PromptReference(name = "greeting"), - argument = CompleteRequest.Argument(name = "name", value = "A"), - ) - - assertEquals("completion/complete", request.method.value) - assertIs(request.ref) - val promptRef = request.ref - assertEquals("greeting", promptRef.name) - assertEquals("name", request.argument.name) - assertEquals("A", request.argument.value) - } - - @Test - fun `should validate CompleteRequest with resource reference`() { - val request = CompleteRequest( - ref = ResourceTemplateReference(uri = "github://repos/{owner}/{repo}"), - argument = CompleteRequest.Argument(name = "repo", value = "t"), - ) - - assertEquals("completion/complete", request.method.value) - assertIs(request.ref) - val resourceRef = request.ref - assertEquals("github://repos/{owner}/{repo}", resourceRef.uri) - assertEquals("repo", request.argument.name) - assertEquals("t", request.argument.value) - } - - @Test - fun `should serialize and deserialize CompleteRequest correctly`() { - val request = CompleteRequest( - ref = PromptReference(name = "test"), - argument = CompleteRequest.Argument(name = "arg", value = ""), - ) - - val json = McpJson.encodeToString(request) - val decoded = McpJson.decodeFromString(json) - - assertEquals("completion/complete", decoded.method.value) - assertIs(decoded.ref) - val promptRef = decoded.ref - assertEquals("test", promptRef.name) - assertEquals("arg", decoded.argument.name) - assertEquals("", decoded.argument.value) - } - - @Test - fun `should validate CompleteRequest with complex URIs`() { - val request = CompleteRequest( - ref = ResourceTemplateReference(uri = "api://v1/{tenant}/{resource}/{id}"), - argument = CompleteRequest.Argument(name = "id", value = "123"), - ) - - val resourceRef = request.ref as ResourceTemplateReference - assertEquals("api://v1/{tenant}/{resource}/{id}", resourceRef.uri) - assertEquals("id", request.argument.name) - assertEquals("123", request.argument.value) - } - - // InitializeResult Tests - @Test - fun `should create InitializeResult with default instructions`() { - val serverInfo = Implementation(name = "test-server", version = "1.0.0") - val result = InitializeResult( - serverInfo = serverInfo, - ) - - assertEquals(LATEST_PROTOCOL_VERSION, result.protocolVersion) - assertEquals(serverInfo, result.serverInfo) - assertEquals(null, result.instructions) - } - - @Test - fun `should create InitializeResult with custom instructions`() { - val serverInfo = Implementation(name = "test-server", version = "1.0.0") - val instructions = "Use this server to perform calculations. Call the 'add' tool to add numbers." - val result = InitializeResult( - serverInfo = serverInfo, - instructions = instructions, - ) - - assertEquals(LATEST_PROTOCOL_VERSION, result.protocolVersion) - assertEquals(serverInfo, result.serverInfo) - assertEquals(instructions, result.instructions) - } - - @Test - fun `should serialize and deserialize InitializeResult with instructions`() { - val serverInfo = Implementation(name = "test-server", version = "1.0.0") - val instructions = "This server provides file system access. Use the 'read' tool to read files." - val result = InitializeResult( - serverInfo = serverInfo, - instructions = instructions, - ) - - val json = McpJson.encodeToString(result) - val decoded = McpJson.decodeFromString(json) - - assertEquals(LATEST_PROTOCOL_VERSION, decoded.protocolVersion) - assertEquals(serverInfo, decoded.serverInfo) - assertEquals(instructions, decoded.instructions) - } - - @Test - fun `should serialize and deserialize InitializeResult without instructions`() { - val serverInfo = Implementation(name = "test-server", version = "1.0.0") - val result = InitializeResult( - serverInfo = serverInfo, - ) - - val json = McpJson.encodeToString(result) - val decoded = McpJson.decodeFromString(json) - - assertEquals(LATEST_PROTOCOL_VERSION, decoded.protocolVersion) - assertEquals(serverInfo, decoded.serverInfo) - assertEquals(null, decoded.instructions) - } -} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/TypesUtilTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/TypesUtilTest.kt deleted file mode 100644 index 5207af35..00000000 --- a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/TypesUtilTest.kt +++ /dev/null @@ -1,252 +0,0 @@ -package io.modelcontextprotocol.kotlin.sdk - -import io.modelcontextprotocol.kotlin.sdk.shared.McpJson -import kotlinx.serialization.json.buildJsonObject -import kotlinx.serialization.json.put -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertIs - -class TypesUtilTest { - - // ErrorCode Serializer Tests - @Test - fun `should serialize and deserialize ErrorCode Defined correctly`() { - val errorCode: ErrorCode = ErrorCode.Defined.InvalidRequest - - val json = McpJson.encodeToString(errorCode) - val decoded = McpJson.decodeFromString(json) - - assertEquals(ErrorCode.Defined.InvalidRequest, decoded) - assertEquals(-32600, decoded.code) - } - - @Test - fun `should serialize and deserialize ErrorCode Unknown correctly`() { - val errorCode: ErrorCode = ErrorCode.Unknown(1001) - - val json = McpJson.encodeToString(errorCode) - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals(1001, decoded.code) - } - - // Method Serializer Tests - @Test - fun `should serialize and deserialize Method Defined correctly`() { - val method: Method = Method.Defined.Initialize - - val json = McpJson.encodeToString(method) - val decoded = McpJson.decodeFromString(json) - - assertEquals(Method.Defined.Initialize, decoded) - assertEquals("initialize", decoded.value) - } - - @Test - fun `should serialize and deserialize Method Custom correctly`() { - val method: Method = Method.Custom("custom/method") - - val json = McpJson.encodeToString(method) - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("custom/method", decoded.value) - } - - // StopReason Serializer Tests - @Test - fun `should serialize and deserialize StopReason EndTurn correctly`() { - val stopReason: StopReason = StopReason.EndTurn - - val json = McpJson.encodeToString(stopReason) - val decoded = McpJson.decodeFromString(json) - - assertEquals(StopReason.EndTurn, decoded) - assertEquals("endTurn", decoded.value) - } - - @Test - fun `should serialize and deserialize StopReason Other correctly`() { - val stopReason: StopReason = StopReason.Other("custom_reason") - - val json = McpJson.encodeToString(stopReason) - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("custom_reason", decoded.value) - } - - // Reference Polymorphic Serializer Tests - @Test - fun `should deserialize ResourceTemplateReference polymorphically`() { - val json = """{"type": "ref/resource", "uri": "file:///test.txt"}""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("ref/resource", decoded.type) - assertEquals("file:///test.txt", decoded.uri) - } - - @Test - fun `should deserialize PromptReference polymorphically`() { - val json = """{"type": "ref/prompt", "name": "test-prompt"}""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("ref/prompt", decoded.type) - assertEquals("test-prompt", decoded.name) - } - - @Test - fun `should deserialize UnknownReference for invalid type`() { - val json = """{"type": "unknown_ref", "data": "test"}""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("unknown_ref", decoded.type) - } - - // PromptMessageContent Polymorphic Serializer Tests - @Test - fun `should deserialize TextContent polymorphically`() { - val json = """{"type": "text", "text": "Hello world"}""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("text", decoded.type) - assertEquals("Hello world", decoded.text) - } - - @Test - fun `should deserialize ImageContent polymorphically`() { - val json = """{"type": "image", "data": "aW1hZ2U=", "mimeType": "image/png"}""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("image", decoded.type) - assertEquals("aW1hZ2U=", decoded.data) - assertEquals("image/png", decoded.mimeType) - } - - @Test - fun `should deserialize AudioContent polymorphically`() { - val json = """{"type": "audio", "data": "YXVkaW8=", "mimeType": "audio/mp3"}""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("audio", decoded.type) - assertEquals("YXVkaW8=", decoded.data) - assertEquals("audio/mp3", decoded.mimeType) - } - - @Test - fun `should deserialize EmbeddedResource polymorphically`() { - val json = - """{"type": "resource", "resource": {"uri": "file:///test.txt", "mimeType": "text/plain", "text": "content"}}""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("resource", decoded.type) - assertIs(decoded.resource) - val textResource = decoded.resource - assertEquals("file:///test.txt", textResource.uri) - assertEquals("content", textResource.text) - } - - // ResourceContents Polymorphic Serializer Tests - @Test - fun `should deserialize TextResourceContents polymorphically`() { - val json = """{"uri": "file:///test.txt", "mimeType": "text/plain", "text": "file content"}""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("file:///test.txt", decoded.uri) - assertEquals("file content", decoded.text) - assertEquals("text/plain", decoded.mimeType) - } - - @Test - fun `should deserialize BlobResourceContents polymorphically`() { - val json = """{"uri": "file:///binary.dat", "mimeType": "application/octet-stream", "blob": "YmluYXJ5"}""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("file:///binary.dat", decoded.uri) - assertEquals("YmluYXJ5", decoded.blob) - assertEquals("application/octet-stream", decoded.mimeType) - } - - @Test - fun `should deserialize UnknownResourceContents for missing fields`() { - val json = """{"uri": "file:///unknown.dat", "mimeType": "unknown/type"}""" - - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("file:///unknown.dat", decoded.uri) - assertEquals("unknown/type", decoded.mimeType) - } - - // RequestId Serializer Tests - @Test - fun `should serialize and deserialize RequestId StringId correctly`() { - val requestId: RequestId = RequestId.StringId("test-id") - - val json = McpJson.encodeToString(requestId) - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals("test-id", decoded.value) - } - - @Test - fun `should serialize and deserialize RequestId NumberId correctly`() { - val requestId: RequestId = RequestId.NumberId(42L) - - val json = McpJson.encodeToString(requestId) - val decoded = McpJson.decodeFromString(json) - - assertIs(decoded) - assertEquals(42L, decoded.value) - } - - // Utility Functions Tests - @Test - fun `should create CallToolResult ok correctly`() { - val result = CallToolResult.ok("Success message") - - assertEquals(listOf(TextContent("Success message")), result.content) - assertEquals(false, result.isError) - assertEquals(EmptyJsonObject, result._meta) - } - - @Test - fun `should create CallToolResult error correctly`() { - val result = CallToolResult.error("Error message") - - assertEquals(listOf(TextContent("Error message")), result.content) - assertEquals(true, result.isError) - assertEquals(EmptyJsonObject, result._meta) - } - - @Test - fun `should create CallToolResult with custom meta`() { - val meta = buildJsonObject { put("custom", "value") } - val result = CallToolResult.ok("Success", meta) - - assertEquals(listOf(TextContent("Success")), result.content) - assertEquals(false, result.isError) - assertEquals(meta, result._meta) - } -} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/models/ProgressNotificationsTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/models/ProgressNotificationsTest.kt index 33927ec5..9b52ef9a 100644 --- a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/models/ProgressNotificationsTest.kt +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/models/ProgressNotificationsTest.kt @@ -1,9 +1,10 @@ package io.modelcontextprotocol.kotlin.sdk.models import io.kotest.matchers.shouldBe -import io.modelcontextprotocol.kotlin.sdk.ProgressNotification -import io.modelcontextprotocol.kotlin.sdk.RequestId -import io.modelcontextprotocol.kotlin.sdk.shared.McpJson +import io.modelcontextprotocol.kotlin.sdk.types.McpJson +import io.modelcontextprotocol.kotlin.sdk.types.ProgressNotification +import io.modelcontextprotocol.kotlin.sdk.types.ProgressNotificationParams +import io.modelcontextprotocol.kotlin.sdk.types.RequestId import kotlin.test.Test class ProgressNotificationsTest { @@ -30,7 +31,7 @@ class ProgressNotificationsTest { val result = McpJson.decodeFromString(json) result shouldBe ProgressNotification( - params = ProgressNotification.Params( + params = ProgressNotificationParams( progressToken = RequestId.StringId("abc123"), progress = 50.0, message = "Reticulating splines...", @@ -60,7 +61,7 @@ class ProgressNotificationsTest { val result = McpJson.decodeFromString(json) result shouldBe ProgressNotification( - params = ProgressNotification.Params( + params = ProgressNotificationParams( progressToken = RequestId.NumberId(100500), progress = 50.0, message = "Reticulating splines...", diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/ReadBufferTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/ReadBufferTest.kt index 8e6f4f65..a49ff3df 100644 --- a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/ReadBufferTest.kt +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/ReadBufferTest.kt @@ -2,8 +2,8 @@ package io.modelcontextprotocol.kotlin.sdk.shared import io.ktor.utils.io.charsets.Charsets import io.ktor.utils.io.core.toByteArray -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage -import io.modelcontextprotocol.kotlin.sdk.JSONRPCNotification +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCNotification import kotlinx.serialization.json.Json import kotlin.test.Test import kotlin.test.assertEquals diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/CapabilitiesTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/CapabilitiesTest.kt new file mode 100644 index 00000000..c288ccaf --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/CapabilitiesTest.kt @@ -0,0 +1,636 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull + +class CapabilitiesTest { + + @Test + fun `should serialize Implementation with minimal fields`() { + val implementation = Implementation( + name = "test-server", + version = "1.0.0", + ) + val json = McpJson.encodeToString(implementation) + + json shouldEqualJson """ + { + "name": "test-server", + "version": "1.0.0" + } + """.trimIndent() + } + + @Test + fun `should serialize Implementation with all fields`() { + val implementation = Implementation( + name = "test-server", + version = "1.0.0", + title = "Test Server", + websiteUrl = "https://example.com", + icons = listOf( + Icon(src = "https://example.com/icon.png"), + ), + ) + val json = McpJson.encodeToString(implementation) + + json shouldEqualJson """ + { + "name": "test-server", + "version": "1.0.0", + "title": "Test Server", + "websiteUrl": "https://example.com", + "icons": [ + {"src": "https://example.com/icon.png"} + ] + } + """.trimIndent() + } + + @Test + fun `should deserialize Implementation from JSON`() { + val json = """ + { + "name": "test-server", + "version": "2.1.3-beta", + "title": "Test Server", + "websiteUrl": "https://example.com" + } + """.trimIndent() + + val implementation = McpJson.decodeFromString(json) + + assertEquals("test-server", implementation.name) + assertEquals("2.1.3-beta", implementation.version) + assertEquals("Test Server", implementation.title) + assertEquals("https://example.com", implementation.websiteUrl) + } + + @Test + fun `should deserialize Implementation with minimal fields from JSON`() { + val json = """ + { + "name": "minimal-server", + "version": "0.1.0" + } + """.trimIndent() + + val implementation = McpJson.decodeFromString(json) + + assertEquals("minimal-server", implementation.name) + assertEquals("0.1.0", implementation.version) + assertNull(implementation.title) + assertNull(implementation.websiteUrl) + assertNull(implementation.icons) + } + + @Test + fun `should serialize and deserialize Implementation round trip`() { + val original = Implementation( + name = "round-trip-test", + version = "1.2.3", + title = "Round Trip Test", + websiteUrl = "https://test.com", + ) + + val json = McpJson.encodeToString(original) + val decoded = McpJson.decodeFromString(json) + + assertEquals(original.name, decoded.name) + assertEquals(original.version, decoded.version) + assertEquals(original.title, decoded.title) + assertEquals(original.websiteUrl, decoded.websiteUrl) + } + + // ClientCapabilities tests + @Test + fun `should serialize empty ClientCapabilities`() { + val capabilities = ClientCapabilities() + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson "{}" + } + + @Test + fun `should serialize ClientCapabilities with sampling`() { + val capabilities = ClientCapabilities( + sampling = ClientCapabilities.sampling, + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "sampling": {} + } + """.trimIndent() + } + + @Test + fun `should serialize ClientCapabilities with roots without listChanged`() { + val capabilities = ClientCapabilities( + roots = ClientCapabilities.Roots(), + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "roots": {} + } + """.trimIndent() + } + + @Test + fun `should serialize ClientCapabilities with roots with listChanged`() { + val capabilities = ClientCapabilities( + roots = ClientCapabilities.Roots(listChanged = true), + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "roots": { + "listChanged": true + } + } + """.trimIndent() + } + + @Test + fun `should serialize ClientCapabilities with elicitation`() { + val capabilities = ClientCapabilities( + elicitation = ClientCapabilities.elicitation, + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "elicitation": {} + } + """.trimIndent() + } + + @Test + fun `should serialize ClientCapabilities with experimental`() { + val experimental = buildJsonObject { + put( + "customFeature", + buildJsonObject { + put("enabled", true) + }, + ) + } + val capabilities = ClientCapabilities( + experimental = experimental, + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "experimental": { + "customFeature": { + "enabled": true + } + } + } + """.trimIndent() + } + + @Test + fun `should serialize ClientCapabilities with all fields`() { + val experimental = buildJsonObject { + put("feature1", buildJsonObject { put("enabled", true) }) + } + val capabilities = ClientCapabilities( + sampling = ClientCapabilities.sampling, + roots = ClientCapabilities.Roots(listChanged = true), + elicitation = ClientCapabilities.elicitation, + experimental = experimental, + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "sampling": {}, + "roots": { + "listChanged": true + }, + "elicitation": {}, + "experimental": { + "feature1": { + "enabled": true + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize ClientCapabilities from JSON`() { + val json = """ + { + "sampling": {}, + "roots": { + "listChanged": true + }, + "elicitation": {} + } + """.trimIndent() + + val capabilities = McpJson.decodeFromString(json) + + assertEquals(EmptyJsonObject, capabilities.sampling) + assertEquals(true, capabilities.roots?.listChanged) + assertEquals(EmptyJsonObject, capabilities.elicitation) + } + + @Test + fun `should deserialize empty ClientCapabilities from JSON`() { + val json = "{}" + + val capabilities = McpJson.decodeFromString(json) + + assertNull(capabilities.sampling) + assertNull(capabilities.roots) + assertNull(capabilities.elicitation) + assertNull(capabilities.experimental) + } + + @Test + fun `should serialize and deserialize ClientCapabilities round trip`() { + val original = ClientCapabilities( + sampling = ClientCapabilities.sampling, + roots = ClientCapabilities.Roots(listChanged = false), + elicitation = ClientCapabilities.elicitation, + ) + + val json = McpJson.encodeToString(original) + val decoded = McpJson.decodeFromString(json) + + assertEquals(original.sampling, decoded.sampling) + assertEquals(original.roots?.listChanged, decoded.roots?.listChanged) + assertEquals(original.elicitation, decoded.elicitation) + } + + // ServerCapabilities tests + @Test + fun `should serialize empty ServerCapabilities`() { + val capabilities = ServerCapabilities() + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson "{}" + } + + @Test + fun `should serialize ServerCapabilities with tools without listChanged`() { + val capabilities = ServerCapabilities( + tools = ServerCapabilities.Tools(), + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "tools": {} + } + """.trimIndent() + } + + @Test + fun `should serialize ServerCapabilities with tools with listChanged`() { + val capabilities = ServerCapabilities( + tools = ServerCapabilities.Tools(listChanged = true), + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "tools": { + "listChanged": true + } + } + """.trimIndent() + } + + @Test + fun `should serialize ServerCapabilities with resources without options`() { + val capabilities = ServerCapabilities( + resources = ServerCapabilities.Resources(), + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "resources": {} + } + """.trimIndent() + } + + @Test + fun `should serialize ServerCapabilities with resources with listChanged`() { + val capabilities = ServerCapabilities( + resources = ServerCapabilities.Resources(listChanged = true), + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "resources": { + "listChanged": true + } + } + """.trimIndent() + } + + @Test + fun `should serialize ServerCapabilities with resources with subscribe`() { + val capabilities = ServerCapabilities( + resources = ServerCapabilities.Resources(subscribe = true), + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "resources": { + "subscribe": true + } + } + """.trimIndent() + } + + @Test + fun `should serialize ServerCapabilities with resources with both options`() { + val capabilities = ServerCapabilities( + resources = ServerCapabilities.Resources( + listChanged = true, + subscribe = false, + ), + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "resources": { + "listChanged": true, + "subscribe": false + } + } + """.trimIndent() + } + + @Test + fun `should serialize ServerCapabilities with prompts without listChanged`() { + val capabilities = ServerCapabilities( + prompts = ServerCapabilities.Prompts(), + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "prompts": {} + } + """.trimIndent() + } + + @Test + fun `should serialize ServerCapabilities with prompts with listChanged`() { + val capabilities = ServerCapabilities( + prompts = ServerCapabilities.Prompts(listChanged = false), + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "prompts": { + "listChanged": false + } + } + """.trimIndent() + } + + @Test + fun `should serialize ServerCapabilities with logging`() { + val capabilities = ServerCapabilities( + logging = ServerCapabilities.Logging, + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "logging": {} + } + """.trimIndent() + } + + @Test + fun `should serialize ServerCapabilities with completions`() { + val capabilities = ServerCapabilities( + completions = ServerCapabilities.Completions, + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "completions": {} + } + """.trimIndent() + } + + @Test + fun `should serialize ServerCapabilities with experimental`() { + val experimental = buildJsonObject { + put( + "customCapability", + buildJsonObject { + put("version", "1.0") + }, + ) + } + val capabilities = ServerCapabilities( + experimental = experimental, + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "experimental": { + "customCapability": { + "version": "1.0" + } + } + } + """.trimIndent() + } + + @Test + fun `should serialize ServerCapabilities with all fields`() { + val experimental = buildJsonObject { + put("feature1", buildJsonObject { put("enabled", true) }) + } + val capabilities = ServerCapabilities( + tools = ServerCapabilities.Tools(listChanged = true), + resources = ServerCapabilities.Resources( + listChanged = true, + subscribe = true, + ), + prompts = ServerCapabilities.Prompts(listChanged = false), + logging = ServerCapabilities.Logging, + completions = ServerCapabilities.Completions, + experimental = experimental, + ) + val json = McpJson.encodeToString(capabilities) + + json shouldEqualJson """ + { + "tools": { + "listChanged": true + }, + "resources": { + "listChanged": true, + "subscribe": true + }, + "prompts": { + "listChanged": false + }, + "logging": {}, + "completions": {}, + "experimental": { + "feature1": { + "enabled": true + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize ServerCapabilities from JSON`() { + val json = """ + { + "tools": { + "listChanged": true + }, + "resources": { + "listChanged": false, + "subscribe": true + }, + "prompts": { + "listChanged": true + }, + "logging": {}, + "completions": {} + } + """.trimIndent() + + val capabilities = McpJson.decodeFromString(json) + + assertEquals(true, capabilities.tools?.listChanged) + assertEquals(false, capabilities.resources?.listChanged) + assertEquals(true, capabilities.resources?.subscribe) + assertEquals(true, capabilities.prompts?.listChanged) + assertEquals(EmptyJsonObject, capabilities.logging) + assertEquals(EmptyJsonObject, capabilities.completions) + } + + @Test + fun `should deserialize empty ServerCapabilities from JSON`() { + val json = "{}" + + val capabilities = McpJson.decodeFromString(json) + + assertNull(capabilities.tools) + assertNull(capabilities.resources) + assertNull(capabilities.prompts) + assertNull(capabilities.logging) + assertNull(capabilities.completions) + assertNull(capabilities.experimental) + } + + @Test + fun `should serialize and deserialize ServerCapabilities round trip`() { + val original = ServerCapabilities( + tools = ServerCapabilities.Tools(listChanged = true), + resources = ServerCapabilities.Resources( + listChanged = false, + subscribe = true, + ), + prompts = ServerCapabilities.Prompts(listChanged = true), + logging = ServerCapabilities.Logging, + ) + + val json = McpJson.encodeToString(original) + val decoded = McpJson.decodeFromString(json) + + assertEquals(original.tools?.listChanged, decoded.tools?.listChanged) + assertEquals(original.resources?.listChanged, decoded.resources?.listChanged) + assertEquals(original.resources?.subscribe, decoded.resources?.subscribe) + assertEquals(original.prompts?.listChanged, decoded.prompts?.listChanged) + assertEquals(original.logging, decoded.logging) + } + + // Additional nested type tests + @Test + fun `should deserialize ClientCapabilities Roots with null listChanged`() { + val json = """ + { + "roots": {} + } + """.trimIndent() + + val capabilities = McpJson.decodeFromString(json) + + assertNull(capabilities.roots?.listChanged) + } + + @Test + fun `should deserialize ServerCapabilities nested types with null values`() { + val json = """ + { + "tools": {}, + "resources": {}, + "prompts": {} + } + """.trimIndent() + + val capabilities = McpJson.decodeFromString(json) + + assertNull(capabilities.tools?.listChanged) + assertNull(capabilities.resources?.listChanged) + assertNull(capabilities.resources?.subscribe) + assertNull(capabilities.prompts?.listChanged) + } + + @Test + fun `should handle ClientCapabilities with additionalProperties in sampling`() { + val json = """ + { + "sampling": { + "customProperty": "customValue" + } + } + """.trimIndent() + + val capabilities = McpJson.decodeFromString(json) + + // Should not fail - additionalProperties are allowed + assertEquals("customValue", capabilities.sampling?.get("customProperty")?.toString()?.trim('"')) + } + + @Test + fun `should handle ServerCapabilities with additionalProperties in logging`() { + val json = """ + { + "logging": { + "level": "debug" + } + } + """.trimIndent() + + val capabilities = McpJson.decodeFromString(json) + + // Should not fail - additionalProperties are allowed + assertEquals("debug", capabilities.logging?.get("level")?.toString()?.trim('"')) + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/CommonTypeTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/CommonTypeTest.kt new file mode 100644 index 00000000..5ff84eec --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/CommonTypeTest.kt @@ -0,0 +1,184 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs +import kotlin.test.assertNotEquals +import kotlin.test.assertNull +import kotlin.test.assertTrue + +class CommonTypeTest { + + @Test + fun `should have correct latest protocol version`() { + assertNotEquals("", LATEST_PROTOCOL_VERSION) + assertEquals("2025-03-26", LATEST_PROTOCOL_VERSION) + } + + @Test + fun `should have correct supported protocol versions`() { + assertIs>(SUPPORTED_PROTOCOL_VERSIONS) + assertTrue(SUPPORTED_PROTOCOL_VERSIONS.contains(LATEST_PROTOCOL_VERSION)) + assertTrue(SUPPORTED_PROTOCOL_VERSIONS.contains("2024-11-05")) + assertEquals(2, SUPPORTED_PROTOCOL_VERSIONS.size) + } + + @Test + fun `should serialize Icon with minimal fields`() { + val icon = Icon(src = "https://example.com/icon.png") + val json = McpJson.encodeToString(icon) + + json shouldEqualJson """ + { + "src": "https://example.com/icon.png" + } + """.trimIndent() + } + + @Test + fun `should serialize Icon with all fields`() { + val icon = Icon( + src = "https://example.com/icon.png", + mimeType = "image/png", + sizes = listOf("48x48", "96x96"), + theme = Icon.Theme.Light, + ) + val json = McpJson.encodeToString(icon) + + json shouldEqualJson """ + { + "src": "https://example.com/icon.png", + "mimeType": "image/png", + "sizes": ["48x48", "96x96"], + "theme": "light" + } + """.trimIndent() + } + + @Test + fun `should deserialize Icon from JSON`() { + val json = """ + { + "src": "https://example.com/icon.png", + "mimeType": "image/png", + "sizes": ["48x48"], + "theme": "dark" + } + """.trimIndent() + + val icon = McpJson.decodeFromString(json) + + assertEquals("https://example.com/icon.png", icon.src) + assertEquals("image/png", icon.mimeType) + assertEquals(listOf("48x48"), icon.sizes) + assertEquals(Icon.Theme.Dark, icon.theme) + } + + @Test + fun `should deserialize Icon with minimal fields from JSON`() { + val json = """{"src": "https://example.com/icon.png"}""" + + val icon = McpJson.decodeFromString(json) + + assertEquals("https://example.com/icon.png", icon.src) + assertNull(icon.mimeType) + assertNull(icon.sizes) + assertNull(icon.theme) + } + + @Test + fun `should serialize theme as lowercase strings`() { + val lightIcon = Icon(src = "test.png", theme = Icon.Theme.Light) + val darkIcon = Icon(src = "test.png", theme = Icon.Theme.Dark) + + val lightJson = McpJson.encodeToString(lightIcon) + val darkJson = McpJson.encodeToString(darkIcon) + + assertTrue(lightJson.contains("\"theme\":\"light\"")) + assertTrue(darkJson.contains("\"theme\":\"dark\"")) + } + + @Test + fun `should serialize Role as lowercase strings`() { + val userJson = McpJson.encodeToString(Role.User) + val assistantJson = McpJson.encodeToString(Role.Assistant) + + assertEquals("\"user\"", userJson) + assertEquals("\"assistant\"", assistantJson) + } + + @Test + fun `should deserialize Role from lowercase strings`() { + val user = McpJson.decodeFromString("\"user\"") + val assistant = McpJson.decodeFromString("\"assistant\"") + + assertEquals(Role.User, user) + assertEquals(Role.Assistant, assistant) + } + + @Test + fun `should serialize Annotations with all fields`() { + val annotations = Annotations( + audience = listOf(Role.User, Role.Assistant), + priority = 0.8, + lastModified = "2025-01-12T15:00:58Z", + ) + + val json = McpJson.encodeToString(annotations) + + json shouldEqualJson """ + { + "audience": ["user", "assistant"], + "priority": 0.8, + "lastModified": "2025-01-12T15:00:58Z" + } + """.trimIndent() + } + + @Test + fun `should serialize Annotations with minimal fields`() { + val annotations = Annotations(priority = 0.5) + + val json = McpJson.encodeToString(annotations) + + json shouldEqualJson """ + { + "priority": 0.5 + } + """.trimIndent() + } + + @Test + fun `should deserialize Annotations from JSON`() { + val json = """ + { + "audience": ["user"], + "priority": 0.9, + "lastModified": "2025-01-12T15:00:58Z" + } + """.trimIndent() + + val annotations = McpJson.decodeFromString(json) + + assertEquals(listOf(Role.User), annotations.audience) + assertEquals(0.9, annotations.priority) + assertEquals("2025-01-12T15:00:58Z", annotations.lastModified) + } + + @Test + fun `should serialize and deserialize Annotations round trip`() { + val original = Annotations( + audience = listOf(Role.User, Role.Assistant), + priority = 0.42, + lastModified = "2025-01-12T15:00:58Z", + ) + + val json = McpJson.encodeToString(original) + val decoded = McpJson.decodeFromString(json) + + assertEquals(original.audience, decoded.audience) + assertEquals(original.priority, decoded.priority) + assertEquals(original.lastModified, decoded.lastModified) + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/CompletionTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/CompletionTest.kt new file mode 100644 index 00000000..9a27ac50 --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/CompletionTest.kt @@ -0,0 +1,227 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith +import kotlin.test.assertIs +import kotlin.test.assertNotNull +import kotlin.test.assertNull + +class CompletionTest { + + @Test + fun `should serialize CompleteRequest with minimal fields`() { + val request = CompleteRequest( + CompleteRequestParams( + argument = CompleteRequestParams.Argument( + name = "name", + value = "A", + ), + ref = PromptReference(name = "greeting"), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "completion/complete", + "params": { + "argument": { + "name": "name", + "value": "A" + }, + "ref": { + "type": "ref/prompt", + "name": "greeting" + } + } + } + """.trimIndent() + } + + @Test + fun `should serialize CompleteRequest with context and meta`() { + val request = CompleteRequest( + CompleteRequestParams( + argument = CompleteRequestParams.Argument( + name = "repo", + value = "mcp", + ), + ref = ResourceTemplateReference(uri = "github://repos/{owner}/{repo}"), + context = CompleteRequestParams.Context( + arguments = mapOf( + "owner" to "modelcontextprotocol", + "language" to "kotlin", + ), + ), + meta = RequestMeta( + buildJsonObject { + put("progressToken", "token-123") + }, + ), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "completion/complete", + "params": { + "argument": { + "name": "repo", + "value": "mcp" + }, + "ref": { + "type": "ref/resource", + "uri": "github://repos/{owner}/{repo}" + }, + "context": { + "arguments": { + "owner": "modelcontextprotocol", + "language": "kotlin" + } + }, + "_meta": { + "progressToken": "token-123" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize CompleteRequest from JSON`() { + val json = """ + { + "method": "completion/complete", + "params": { + "argument": { + "name": "file", + "value": "mai" + }, + "ref": { + "type": "ref/resource", + "uri": "file:///{path}" + }, + "context": { + "arguments": { + "path": "src/main" + } + }, + "_meta": { + "progressToken": 42 + } + } + } + """.trimIndent() + + val request = McpJson.decodeFromString(json) + assertEquals(Method.Defined.CompletionComplete, request.method) + + val params = request.params + assertEquals("file", params.argument.name) + assertEquals("mai", params.argument.value) + val ref = params.ref + assertIs(ref) + assertEquals("file:///{path}", ref.uri) + assertNotNull(params.context) + assertEquals(mapOf("path" to "src/main"), params.context.arguments) + assertEquals(ProgressToken(42), params.meta?.progressToken) + } + + @Test + fun `should serialize CompleteResult with all fields`() { + val result = CompleteResult( + completion = CompleteResult.Completion( + values = listOf("src/main/kotlin/App.kt", "src/main/kotlin/Main.kt"), + total = 25, + hasMore = true, + ), + meta = buildJsonObject { + put("source", "cache") + }, + ) + + val json = McpJson.encodeToString(result) + + json shouldEqualJson """ + { + "completion": { + "values": [ + "src/main/kotlin/App.kt", + "src/main/kotlin/Main.kt" + ], + "total": 25, + "hasMore": true + }, + "_meta": { + "source": "cache" + } + } + """.trimIndent() + } + + @Test + fun `should deserialize CompleteResult from JSON`() { + val json = """ + { + "completion": { + "values": ["README.md", "CONTRIBUTING.md"], + "total": 2, + "hasMore": false + }, + "_meta": { + "fetchedAt": "2025-01-12T15:00:58Z" + } + } + """.trimIndent() + + val result = McpJson.decodeFromString(json) + assertEquals(listOf("README.md", "CONTRIBUTING.md"), result.completion.values) + assertEquals(2, result.completion.total) + assertEquals(false, result.completion.hasMore) + assertNotNull(result.meta) + assertEquals( + "2025-01-12T15:00:58Z", + result.meta["fetchedAt"]?.jsonPrimitive?.content, + ) + } + + @Test + fun `should allow omitting optional Total and HasMore`() { + val result = CompleteResult( + completion = CompleteResult.Completion(values = listOf("foo")), + meta = null, + ) + + val json = McpJson.encodeToString(result) + json shouldEqualJson """ + { + "completion": { + "values": ["foo"] + } + } + """.trimIndent() + + val decoded = McpJson.decodeFromString(json) + assertEquals(listOf("foo"), decoded.completion.values) + assertNull(decoded.completion.total) + assertNull(decoded.completion.hasMore) + assertNull(decoded.meta) + } + + @Test + fun `should enforce maximum of 100 completion values`() { + val values = (1..101).map { "entry-$it" } + + assertFailsWith { + CompleteResult.Completion(values = values) + } + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ContentTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ContentTest.kt new file mode 100644 index 00000000..2290dce7 --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ContentTest.kt @@ -0,0 +1,301 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs +import kotlin.test.assertNull + +class ContentTest { + + @Test + fun `should serialize TextContent with minimal fields`() { + val content = TextContent(text = "Hello, MCP!") + + val json = McpJson.encodeToString(content) + + json shouldEqualJson """ + { + "type": "text", + "text": "Hello, MCP!" + } + """.trimIndent() + } + + @Test + fun `should serialize and deserialize TextContent with annotations`() { + val content = TextContent( + text = "Need help?", + annotations = Annotations(audience = listOf(Role.User)), + meta = buildJsonObject { put("origin", "assistant") }, + ) + + val json = McpJson.encodeToString(content) + + json shouldEqualJson """ + { + "type": "text", + "text": "Need help?", + "annotations": { + "audience": ["user"] + }, + "_meta": { + "origin": "assistant" + } + } + """.trimIndent() + + val decoded = McpJson.decodeFromString(json) as TextContent + assertEquals("Need help?", decoded.text) + assertEquals(listOf(Role.User), decoded.annotations?.audience) + assertEquals("assistant", decoded.meta?.get("origin")?.jsonPrimitive?.content) + } + + @Test + fun `should serialize ImageContent`() { + val content = ImageContent( + data = "aW1hZ2VEYXRh", + mimeType = "image/png", + ) + + val json = McpJson.encodeToString(content) + + json shouldEqualJson """ + { + "type": "image", + "data": "aW1hZ2VEYXRh", + "mimeType": "image/png" + } + """.trimIndent() + } + + @Test + fun `should deserialize ImageContent from JSON`() { + val json = """ + { + "type": "image", + "data": "Zm9vYmFy", + "mimeType": "image/jpeg", + "annotations": {"priority": 0.6} + } + """.trimIndent() + + val content = McpJson.decodeFromString(json) as ImageContent + assertEquals("Zm9vYmFy", content.data) + assertEquals("image/jpeg", content.mimeType) + assertEquals(0.6, content.annotations?.priority) + assertNull(content.meta) + } + + @Test + fun `should serialize AudioContent`() { + val content = AudioContent( + data = "YXVkaW9kYXRh", + mimeType = "audio/wav", + meta = buildJsonObject { put("durationMs", 1200) }, + ) + + val json = McpJson.encodeToString(content) + + json shouldEqualJson """ + { + "type": "audio", + "data": "YXVkaW9kYXRh", + "mimeType": "audio/wav", + "_meta": { + "durationMs": 1200 + } + } + """.trimIndent() + } + + @Test + fun `should deserialize AudioContent from JSON`() { + val json = """ + { + "type": "audio", + "data": "YmF6", + "mimeType": "audio/mpeg", + "_meta": {"speaker": "user"} + } + """.trimIndent() + + val content = McpJson.decodeFromString(json) as AudioContent + assertEquals("audio/mpeg", content.mimeType) + assertEquals("YmF6", content.data) + assertEquals("user", content.meta?.get("speaker")?.jsonPrimitive?.content) + } + + @Test + fun `should serialize ResourceLink with minimal fields`() { + val resource = ResourceLink( + name = "README", + uri = "file:///workspace/README.md", + ) + + val json = McpJson.encodeToString(resource) + + json shouldEqualJson """ + { + "type": "resource_link", + "name": "README", + "uri": "file:///workspace/README.md" + } + """.trimIndent() + } + + @Test + fun `should serialize ResourceLink with all fields`() { + val resource = ResourceLink( + name = "README", + uri = "file:///workspace/README.md", + title = "Workspace README", + size = 2048, + mimeType = "text/markdown", + description = "Primary documentation", + icons = listOf(Icon(src = "https://example.com/icon.png")), + annotations = Annotations(priority = 0.75), + meta = buildJsonObject { put("etag", "1234") }, + ) + + val json = McpJson.encodeToString(resource) + + json shouldEqualJson """ + { + "type": "resource_link", + "name": "README", + "uri": "file:///workspace/README.md", + "title": "Workspace README", + "size": 2048, + "mimeType": "text/markdown", + "description": "Primary documentation", + "icons": [ + { + "src": "https://example.com/icon.png" + } + ], + "annotations": { + "priority": 0.75 + }, + "_meta": { + "etag": "1234" + } + } + """.trimIndent() + } + + @Test + fun `should deserialize ResourceLink from JSON`() { + val json = """ + { + "type": "resource_link", + "name": "config", + "uri": "file:///config.yaml", + "size": 512, + "annotations": { "lastModified": "2025-01-12T15:00:58Z" } + } + """.trimIndent() + + val resource = McpJson.decodeFromString(json) as ResourceLink + assertEquals("config", resource.name) + assertEquals("file:///config.yaml", resource.uri) + assertEquals(512, resource.size) + assertEquals("2025-01-12T15:00:58Z", resource.annotations?.lastModified) + assertNull(resource.meta) + } + + @Test + fun `should serialize EmbeddedResource with text contents`() { + val embedded = EmbeddedResource( + resource = TextResourceContents( + text = "fun main() = println(\"Hello\")", + uri = "file:///workspace/Main.kt", + mimeType = "text/x-kotlin", + meta = buildJsonObject { put("languageId", "kotlin") }, + ), + annotations = Annotations(audience = listOf(Role.Assistant)), + meta = buildJsonObject { put("source", "analysis") }, + ) + + val json = McpJson.encodeToString(embedded) + + json shouldEqualJson """ + { + "type": "resource", + "resource": { + "text": "fun main() = println(\"Hello\")", + "uri": "file:///workspace/Main.kt", + "mimeType": "text/x-kotlin", + "_meta": { + "languageId": "kotlin" + } + }, + "annotations": { + "audience": ["assistant"] + }, + "_meta": { + "source": "analysis" + } + } + """.trimIndent() + } + + @Test + fun `should deserialize EmbeddedResource with blob contents`() { + val json = """ + { + "type": "resource", + "resource": { + "blob": "YmFzZTY0", + "uri": "file:///workspace/archive.bin", + "mimeType": "application/octet-stream" + }, + "_meta": {"encoding": "base64"} + } + """.trimIndent() + + val embedded = McpJson.decodeFromString(json) as EmbeddedResource + assertEquals(ContentTypes.EMBEDDED_RESOURCE, embedded.type) + assertNull(embedded.annotations) + assertEquals("base64", embedded.meta?.get("encoding")?.jsonPrimitive?.content) + + val resource = embedded.resource + assertIs(resource) + assertEquals("YmFzZTY0", resource.blob) + assertEquals("file:///workspace/archive.bin", resource.uri) + assertEquals("application/octet-stream", resource.mimeType) + } + + @Test + fun `should decode heterogeneous content blocks`() { + val json = """ + [ + { + "type": "text", + "text": "Hello" + }, + { + "type": "resource_link", + "name": "log", + "uri": "file:///tmp/log.txt" + }, + { + "type": "resource", + "resource": { + "text": "line1", + "uri": "file:///tmp/log.txt" + } + } + ] + """.trimIndent() + + val content = McpJson.decodeFromString>(json) + assertEquals(3, content.size) + assertIs(content[0]) + assertIs(content[1]) + assertIs(content[2]) + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ElicitationTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ElicitationTest.kt new file mode 100644 index 00000000..c59c23fc --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ElicitationTest.kt @@ -0,0 +1,206 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.boolean +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.int +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith +import kotlin.test.assertNotNull +import kotlin.test.assertNull + +class ElicitationTest { + + @Test + fun `should serialize ElicitRequest with requested schema`() { + val request = ElicitRequest( + ElicitRequestParams( + message = "Provide repository details", + requestedSchema = ElicitRequestParams.RequestedSchema( + properties = buildJsonObject { + put( + "owner", + buildJsonObject { + put("type", "string") + put("description", "GitHub organization") + }, + ) + put( + "repository", + buildJsonObject { + put("type", "string") + put("title", "Repository name") + }, + ) + put( + "private", + buildJsonObject { + put("type", "boolean") + put("description", "Is the repository private?") + }, + ) + }, + required = listOf("owner", "repository"), + ), + meta = RequestMeta( + buildJsonObject { + put("progressToken", "token-42") + }, + ), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "elicitation/create", + "params": { + "message": "Provide repository details", + "requestedSchema": { + "properties": { + "owner": { + "type": "string", + "description": "GitHub organization" + }, + "repository": { + "type": "string", + "title": "Repository name" + }, + "private": { + "type": "boolean", + "description": "Is the repository private?" + } + }, + "required": ["owner", "repository"], + "type": "object" + }, + "_meta": { + "progressToken": "token-42" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize ElicitRequest from JSON`() { + val json = """ + { + "method": "elicitation/create", + "params": { + "message": "Tell us about the repository", + "requestedSchema": { + "properties": { + "name": { + "type": "string", + "title": "Repository name" + }, + "stars": { + "type": "number", + "description": "GitHub stars" + } + }, + "type": "object" + } + } + } + """.trimIndent() + + val request = McpJson.decodeFromString(json) + assertEquals(Method.Defined.ElicitationCreate, request.method) + + val params = request.params + assertEquals("Tell us about the repository", params.message) + assertNull(params.meta) + + val schema = params.requestedSchema + assertEquals("object", schema.type) + assertNull(schema.required) + + val nameDefinition = schema.properties["name"]?.jsonObject + assertNotNull(nameDefinition) + assertEquals("string", nameDefinition["type"]?.jsonPrimitive?.content) + assertEquals("Repository name", nameDefinition["title"]?.jsonPrimitive?.content) + + val starsDefinition = schema.properties["stars"]?.jsonObject + assertNotNull(starsDefinition) + assertEquals("number", starsDefinition["type"]?.jsonPrimitive?.content) + assertEquals("GitHub stars", starsDefinition["description"]?.jsonPrimitive?.content) + } + + @Test + fun `should serialize and deserialize accept result with content`() { + val result = ElicitResult( + action = ElicitResult.Action.Accept, + content = buildJsonObject { + put("repository", "kotlin-sdk") + put("stars", 128) + put("private", false) + }, + meta = buildJsonObject { + put("submittedAt", "2025-01-12T15:00:58Z") + }, + ) + + val json = McpJson.encodeToString(result) + + json shouldEqualJson """ + { + "action": "accept", + "content": { + "repository": "kotlin-sdk", + "stars": 128, + "private": false + }, + "_meta": { + "submittedAt": "2025-01-12T15:00:58Z" + } + } + """.trimIndent() + + val decoded = McpJson.decodeFromString(json) + assertEquals(ElicitResult.Action.Accept, decoded.action) + + val content = decoded.content + assertNotNull(content) + assertEquals("kotlin-sdk", content["repository"]?.jsonPrimitive?.content) + assertEquals(128, content["stars"]?.jsonPrimitive?.int) + assertEquals(false, content["private"]?.jsonPrimitive?.boolean) + + val meta = decoded.meta + assertNotNull(meta) + assertEquals("2025-01-12T15:00:58Z", meta["submittedAt"]?.jsonPrimitive?.content) + } + + @Test + fun `should deserialize decline result without content`() { + val json = """ + { + "action": "decline", + "_meta": { + "reason": "User skipped" + } + } + """.trimIndent() + + val result = McpJson.decodeFromString(json) + assertEquals(ElicitResult.Action.Decline, result.action) + assertNull(result.content) + assertEquals("User skipped", result.meta?.get("reason")?.jsonPrimitive?.content) + } + + @Test + fun `should require content only for accept action`() { + assertFailsWith { + ElicitResult( + action = ElicitResult.Action.Cancel, + content = buildJsonObject { put("value", "ignored") }, + ) + } + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/InitializeTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/InitializeTest.kt new file mode 100644 index 00000000..6af7c4e9 --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/InitializeTest.kt @@ -0,0 +1,219 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.boolean +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotNull +import kotlin.test.assertNull + +class InitializeTest { + + @Test + fun `should serialize InitializeRequest with capabilities and meta`() { + val request = InitializeRequest( + InitializeRequestParams( + protocolVersion = "2024-11-05", + capabilities = ClientCapabilities( + sampling = ClientCapabilities.sampling, + roots = ClientCapabilities.Roots(listChanged = true), + elicitation = ClientCapabilities.elicitation, + experimental = buildJsonObject { + put( + "workspace-sync", + buildJsonObject { put("enabled", true) }, + ) + }, + ), + clientInfo = Implementation( + name = "dev-client", + version = "1.2.3", + title = "Dev Client", + icons = listOf(Icon(src = "https://example.com/icon.png")), + ), + meta = RequestMeta( + buildJsonObject { put("progressToken", "init-42") }, + ), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": { + "sampling": {}, + "roots": { + "listChanged": true + }, + "elicitation": {}, + "experimental": { + "workspace-sync": { + "enabled": true + } + } + }, + "clientInfo": { + "name": "dev-client", + "version": "1.2.3", + "title": "Dev Client", + "icons": [ + {"src": "https://example.com/icon.png"} + ] + }, + "_meta": { + "progressToken": "init-42" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize InitializeRequest from JSON`() { + val json = """ + { + "method": "initialize", + "params": { + "protocolVersion": "2025-03-26", + "capabilities": { + "sampling": {}, + "roots": { + "listChanged": false + }, + "experimental": { + "custom-cap": { + "enabled": true + } + } + }, + "clientInfo": { + "name": "sdk-client", + "version": "2.1.0", + "title": "SDK Client" + }, + "_meta": { + "progressToken": 99 + } + } + } + """.trimIndent() + + val request = McpJson.decodeFromString(json) + assertEquals(Method.Defined.Initialize, request.method) + + val params = request.params + assertEquals("2025-03-26", params.protocolVersion) + assertEquals("sdk-client", params.clientInfo.name) + assertEquals("2.1.0", params.clientInfo.version) + assertEquals("SDK Client", params.clientInfo.title) + assertEquals(ProgressToken(99), params.meta?.progressToken) + + val capabilities = params.capabilities + assertNotNull(capabilities.sampling) + assertEquals(false, capabilities.roots?.listChanged) + val experimental = capabilities.experimental + assertNotNull(experimental) + val custom = experimental["custom-cap"]?.jsonObject + assertNotNull(custom) + assertEquals(true, custom["enabled"]?.jsonPrimitive?.boolean) + } + + @Test + fun `should serialize InitializeResult with instructions`() { + val result = InitializeResult( + protocolVersion = "2024-11-05", + capabilities = ServerCapabilities( + tools = ServerCapabilities.Tools(listChanged = true), + resources = ServerCapabilities.Resources( + listChanged = true, + subscribe = true, + ), + prompts = ServerCapabilities.Prompts(listChanged = false), + logging = ServerCapabilities.Logging, + completions = buildJsonObject { put("defaultCount", 5) }, + ), + serverInfo = Implementation( + name = "demo-server", + version = "5.0.0", + websiteUrl = "https://example.com/server", + ), + instructions = "Call the `read` tool to fetch files.", + meta = buildJsonObject { put("issuedAt", "2025-01-12T15:00:58Z") }, + ) + + val json = McpJson.encodeToString(result) + + json shouldEqualJson """ + { + "protocolVersion": "2024-11-05", + "capabilities": { + "tools": { + "listChanged": true + }, + "resources": { + "listChanged": true, + "subscribe": true + }, + "prompts": { + "listChanged": false + }, + "logging": {}, + "completions": { + "defaultCount": 5 + } + }, + "serverInfo": { + "name": "demo-server", + "version": "5.0.0", + "websiteUrl": "https://example.com/server" + }, + "instructions": "Call the `read` tool to fetch files.", + "_meta": { + "issuedAt": "2025-01-12T15:00:58Z" + } + } + """.trimIndent() + } + + @Test + fun `should deserialize InitializeResult from JSON`() { + val json = """ + { + "protocolVersion": "2025-03-26", + "capabilities": { + "tools": {}, + "resources": { + "listChanged": true + } + }, + "serverInfo": { + "name": "result-server", + "version": "4.0.0" + } + } + """.trimIndent() + + val result = McpJson.decodeFromString(json) + + assertEquals("2025-03-26", result.protocolVersion) + assertEquals("result-server", result.serverInfo.name) + assertEquals("4.0.0", result.serverInfo.version) + assertNull(result.instructions) + assertNull(result.meta) + + val capabilities = result.capabilities + assertNotNull(capabilities.tools) + assertEquals(true, capabilities.resources?.listChanged) + assertNull(capabilities.resources?.subscribe) + assertNull(capabilities.prompts) + assertNull(capabilities.logging) + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/JsonRpcTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/JsonRpcTest.kt new file mode 100644 index 00000000..9b970322 --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/JsonRpcTest.kt @@ -0,0 +1,401 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.boolean +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.int +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs +import kotlin.test.assertNotNull + +class JsonRpcTest { + + @Test + fun `should convert Request to JSONRPCRequest`() { + val request = ListToolsRequest( + PaginatedRequestParams( + cursor = "page-2", + meta = RequestMeta( + buildJsonObject { + put("progressToken", "token-123") + }, + ), + ), + ) + + val jsonRpc = request.toJSON() + + assertEquals(Method.Defined.ToolsList.value, jsonRpc.method) + val params = jsonRpc.params?.jsonObject + assertNotNull(params) + assertEquals("page-2", params["cursor"]?.jsonPrimitive?.content) + val meta = params["_meta"]?.jsonObject + assertNotNull(meta) + assertEquals("token-123", meta["progressToken"]?.jsonPrimitive?.content) + } + + @Test + fun `should convert JSONRPCRequest to Request`() { + val jsonRpc = McpJson.decodeFromString( + """ + { + "id": 17, + "method": "tools/list", + "params": { + "cursor": "page-5", + "_meta": { + "progressToken": 42 + } + }, + "jsonrpc": "2.0" + } + """.trimIndent(), + ) + + val request = jsonRpc.fromJSON() + val listToolsRequest = assertIs(request) + val decodedParams = assertNotNull(listToolsRequest.params) + assertEquals("page-5", decodedParams.cursor) + val meta = decodedParams.meta?.json + assertNotNull(meta) + assertEquals(42, meta["progressToken"]?.jsonPrimitive?.int) + } + + @Test + fun `should convert Notification to JSONRPCNotification`() { + val notification = LoggingMessageNotification( + LoggingMessageNotificationParams( + level = LoggingLevel.Warning, + data = buildJsonObject { put("message", "Disk space low") }, + logger = "disk-monitor", + meta = buildJsonObject { put("requestId", "req-99") }, + ), + ) + + val json = McpJson.encodeToString(notification.toJSON()) + + json shouldEqualJson """ + { + "method": "notifications/message", + "params": { + "level": "warning", + "data": { + "message": "Disk space low" + }, + "logger": "disk-monitor", + "_meta": { + "requestId": "req-99" + } + }, + "jsonrpc": "2.0" + } + """.trimIndent() + } + + @Test + fun `should convert JSONRPCNotification to Notification`() { + val jsonRpc = McpJson.decodeFromString( + """ + { + "method": "notifications/message", + "params": { + "level": "error", + "data": { + "lines": { + "count": 3 + } + }, + "logger": "pipeline", + "_meta": { + "traceIds": ["abc"] + } + }, + "jsonrpc": "2.0" + } + """.trimIndent(), + ) + + val notification = jsonRpc.fromJSON() + val messageNotification = assertIs(notification) + val decodedParams = messageNotification.params + assertEquals(LoggingLevel.Error, decodedParams.level) + val data = decodedParams.data.jsonObject + assertEquals(3, data["lines"]?.jsonObject?.get("count")?.jsonPrimitive?.int) + assertEquals("pipeline", decodedParams.logger) + val meta = decodedParams.meta + assertNotNull(meta) + val traceIds = meta["traceIds"]?.jsonArray + assertNotNull(traceIds) + assertEquals("abc", traceIds.first().jsonPrimitive.content) + } + + @Test + fun `should serialize JSONRPCRequest with params`() { + val request = JSONRPCRequest( + id = RequestId("req-1"), + method = "tools/list", + params = buildJsonObject { + put("cursor", "abc") + put("includeInactive", true) + }, + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "id": "req-1", + "method": "tools/list", + "params": { + "cursor": "abc", + "includeInactive": true + }, + "jsonrpc": "2.0" + } + """.trimIndent() + } + + @Test + fun `should deserialize JSONRPCRequest with numeric id`() { + val json = """ + { + "id": 42, + "method": "resources/read", + "params": { + "uri": "file:///tmp/readme.md" + }, + "jsonrpc": "2.0" + } + """.trimIndent() + + val request = McpJson.decodeFromString(json) + + val id = request.id + assertIs(id) + assertEquals(42L, id.value) + assertEquals("resources/read", request.method) + val params = request.params?.jsonObject + assertNotNull(params) + assertEquals("file:///tmp/readme.md", params["uri"]?.jsonPrimitive?.content) + } + + @Test + fun `should serialize JSONRPCNotification with params`() { + val notification = JSONRPCNotification( + method = "notifications/log", + params = buildJsonObject { + put("level", "info") + put("message", "Completed operation") + }, + ) + + val json = McpJson.encodeToString(notification) + + json shouldEqualJson """ + { + "method": "notifications/log", + "params": { + "level": "info", + "message": "Completed operation" + }, + "jsonrpc": "2.0" + } + """.trimIndent() + } + + @Test + fun `should deserialize JSONRPCNotification`() { + val json = """ + { + "method": "notifications/progress", + "params": { + "progress": 50, + "total": 100 + }, + "jsonrpc": "2.0" + } + """.trimIndent() + + val notification = McpJson.decodeFromString(json) + assertEquals("notifications/progress", notification.method) + val params = notification.params?.jsonObject + assertNotNull(params) + assertEquals(50, params["progress"]?.jsonPrimitive?.int) + assertEquals(100, params["total"]?.jsonPrimitive?.int) + } + + @Test + fun `should serialize JSONRPCResponse with result`() { + val response = JSONRPCResponse( + id = RequestId("call-1"), + result = EmptyResult( + meta = buildJsonObject { put("durationMs", 15) }, + ), + ) + + val json = McpJson.encodeToString(response) + + json shouldEqualJson """ + { + "id": "call-1", + "result": { + "_meta": { + "durationMs": 15 + } + }, + "jsonrpc": "2.0" + } + """.trimIndent() + } + + @Test + fun `should deserialize JSONRPCResponse with EmptyResult`() { + val json = """ + { + "id": 7, + "jsonrpc": "2.0", + "result": { + "_meta": { + "cached": true + } + } + } + """.trimIndent() + + val response = McpJson.decodeFromString(json) + val result = response.result + assertIs(result) + assertEquals(RequestId.NumberId(7L), response.id) + val meta = result.meta + assertNotNull(meta) + assertEquals(true, meta["cached"]?.jsonPrimitive?.boolean) + } + + @Test + fun `should serialize JSONRPCError`() { + val error = JSONRPCError( + id = RequestId(99), + error = RPCError( + code = RPCError.ErrorCode.METHOD_NOT_FOUND, + message = "Method not found", + data = buildJsonObject { put("method", "tools/unknown") }, + ), + ) + + val json = McpJson.encodeToString(error) + + json shouldEqualJson """ + { + "id": 99, + "error": { + "code": -32601, + "message": "Method not found", + "data": { + "method": "tools/unknown" + } + }, + "jsonrpc": "2.0" + } + """.trimIndent() + } + + @Test + fun `should deserialize JSONRPCError`() { + val json = """ + { + "id": "req-404", + "jsonrpc": "2.0", + "error": { + "code": -32602, + "message": "Invalid params", + "data": { + "field": "limit", + "reason": "must be positive" + } + } + } + """.trimIndent() + + val error = McpJson.decodeFromString(json) + assertEquals(RequestId("req-404"), error.id) + assertEquals(RPCError.ErrorCode.INVALID_PARAMS, error.error.code) + assertEquals("Invalid params", error.error.message) + + val data = error.error.data?.jsonObject + assertNotNull(data) + assertEquals("limit", data["field"]?.jsonPrimitive?.content) + assertEquals("must be positive", data["reason"]?.jsonPrimitive?.content) + } + + @Test + fun `should decode JSONRPCMessage as request`() { + val json = """ + { + "id": "msg-1", + "method": "sampling/create", + "params": { + "model": "gpt", + "prompt": "Hello" + }, + "jsonrpc": "2.0" + } + """.trimIndent() + + val message = McpJson.decodeFromString(json) + val request = assertIs(message) + assertEquals("sampling/create", request.method) + val params = request.params?.jsonObject + assertNotNull(params) + assertEquals("gpt", params["model"]?.jsonPrimitive?.content) + assertEquals("Hello", params["prompt"]?.jsonPrimitive?.content) + } + + @Test + fun `should decode JSONRPCMessage as error response`() { + val json = """ + { + "id": 123, + "jsonrpc": "2.0", + "error": { + "code": -32001, + "message": "Request timeout", + "data": { + "timeoutMs": 1000 + } + } + } + """.trimIndent() + + val message = McpJson.decodeFromString(json) + val error = assertIs(message) + assertEquals(RPCError.ErrorCode.REQUEST_TIMEOUT, error.error.code) + val data = error.error.data?.jsonObject + assertNotNull(data) + assertEquals(1000, data["timeoutMs"]?.jsonPrimitive?.int) + } + + @Test + fun `should encode JSONRPCMessage polymorphically`() { + val message: JSONRPCMessage = JSONRPCNotification( + method = "notifications/log", + params = buildJsonObject { put("message", "Polymorphic") }, + ) + + val json = McpJson.encodeToString(message) + + json shouldEqualJson """ + { + "method": "notifications/log", + "params": { + "message": "Polymorphic" + }, + "jsonrpc": "2.0" + } + """.trimIndent() + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/LoggingTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/LoggingTest.kt new file mode 100644 index 00000000..2b8c61a5 --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/LoggingTest.kt @@ -0,0 +1,166 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.boolean +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull + +class LoggingTest { + + @Test + fun `should serialize LoggingLevel to expected schema values`() { + assertEquals("\"debug\"", McpJson.encodeToString(LoggingLevel.Debug)) + assertEquals("\"info\"", McpJson.encodeToString(LoggingLevel.Info)) + assertEquals("\"notice\"", McpJson.encodeToString(LoggingLevel.Notice)) + assertEquals("\"warning\"", McpJson.encodeToString(LoggingLevel.Warning)) + assertEquals("\"error\"", McpJson.encodeToString(LoggingLevel.Error)) + assertEquals("\"critical\"", McpJson.encodeToString(LoggingLevel.Critical)) + assertEquals("\"alert\"", McpJson.encodeToString(LoggingLevel.Alert)) + assertEquals("\"emergency\"", McpJson.encodeToString(LoggingLevel.Emergency)) + } + + @Test + fun `should deserialize LoggingLevel from schema values`() { + assertEquals(LoggingLevel.Debug, McpJson.decodeFromString("\"debug\"")) + assertEquals(LoggingLevel.Info, McpJson.decodeFromString("\"info\"")) + assertEquals(LoggingLevel.Notice, McpJson.decodeFromString("\"notice\"")) + assertEquals(LoggingLevel.Warning, McpJson.decodeFromString("\"warning\"")) + assertEquals(LoggingLevel.Error, McpJson.decodeFromString("\"error\"")) + assertEquals(LoggingLevel.Critical, McpJson.decodeFromString("\"critical\"")) + assertEquals(LoggingLevel.Alert, McpJson.decodeFromString("\"alert\"")) + assertEquals(LoggingLevel.Emergency, McpJson.decodeFromString("\"emergency\"")) + } + + @Test + fun `should serialize SetLevelRequest with meta`() { + val request = SetLevelRequest( + SetLevelRequestParams( + level = LoggingLevel.Warning, + meta = RequestMeta( + buildJsonObject { put("progressToken", "log-42") }, + ), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "logging/setLevel", + "params": { + "level": "warning", + "_meta": { + "progressToken": "log-42" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize SetLevelRequest with numeric progress token`() { + val json = """ + { + "method": "logging/setLevel", + "params": { + "level": "alert", + "_meta": { + "progressToken": 1001 + } + } + } + """.trimIndent() + + val request = McpJson.decodeFromString(json) + assertEquals(Method.Defined.LoggingSetLevel, request.method) + assertEquals(LoggingLevel.Alert, request.params.level) + assertEquals(ProgressToken(1001), request.params.meta?.progressToken) + } + + @Test + fun `should serialize LoggingMessageNotification with logger`() { + val notification = LoggingMessageNotification( + LoggingMessageNotificationParams( + level = LoggingLevel.Error, + data = buildJsonObject { put("message", "Disk space critically low") }, + logger = "infra.monitor", + meta = buildJsonObject { put("source", "node-1") }, + ), + ) + + val json = McpJson.encodeToString(notification) + + json shouldEqualJson """ + { + "method": "notifications/message", + "params": { + "level": "error", + "data": { + "message": "Disk space critically low" + }, + "logger": "infra.monitor", + "_meta": { + "source": "node-1" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize LoggingMessageNotification with text data`() { + val json = """ + { + "method": "notifications/message", + "params": { + "level": "info", + "data": "Service started successfully" + } + } + """.trimIndent() + + val notification = McpJson.decodeFromString(json) + assertEquals(Method.Defined.NotificationsMessage, notification.method) + + val params = notification.params + assertEquals(LoggingLevel.Info, params.level) + assertEquals("Service started successfully", params.data.jsonPrimitive.content) + assertNull(params.logger) + assertNull(params.meta) + } + + @Test + fun `should deserialize LoggingMessageNotification with structured data`() { + val json = """ + { + "method": "notifications/message", + "params": { + "level": "critical", + "data": { + "code": "DB_CONN_FAIL", + "retry": false + }, + "logger": "database.monitor", + "_meta": { + "requestId": "req-77" + } + } + } + """.trimIndent() + + val notification = McpJson.decodeFromString(json) + val params = notification.params + assertEquals(LoggingLevel.Critical, params.level) + val data = params.data.jsonObject + assertEquals("DB_CONN_FAIL", data["code"]?.jsonPrimitive?.content) + assertEquals(false, data["retry"]?.jsonPrimitive?.boolean) + assertEquals("database.monitor", params.logger) + val meta = params.meta + assertEquals("req-77", meta?.get("requestId")?.jsonPrimitive?.content) + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/NotificationTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/NotificationTest.kt new file mode 100644 index 00000000..bbd209df --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/NotificationTest.kt @@ -0,0 +1,296 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull + +class NotificationTest { + + @Test + fun `should serialize CancelledNotification with reason and meta`() { + val notification = CancelledNotification( + CancelledNotificationParams( + requestId = RequestId("req-1"), + reason = "User requested cancellation", + meta = buildJsonObject { put("source", "client") }, + ), + ) + + val json = McpJson.encodeToString(notification) + + json shouldEqualJson """ + { + "method": "notifications/cancelled", + "params": { + "requestId": "req-1", + "reason": "User requested cancellation", + "_meta": { + "source": "client" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize CancelledNotification with numeric request id`() { + val json = """ + { + "method": "notifications/cancelled", + "params": { + "requestId": 42, + "reason": "Timeout reached" + } + } + """.trimIndent() + + val notification = McpJson.decodeFromString(json) + val params = notification.params + + assertEquals(Method.Defined.NotificationsCancelled, notification.method) + assertEquals(RequestId(42), params.requestId) + assertEquals("Timeout reached", params.reason) + assertNull(params.meta) + } + + @Test + fun `should serialize InitializedNotification with meta`() { + val notification = InitializedNotification( + BaseNotificationParams( + meta = buildJsonObject { put("readyAt", "2025-01-12T15:00:58Z") }, + ), + ) + + val json = McpJson.encodeToString(notification) + + json shouldEqualJson """ + { + "method": "notifications/initialized", + "params": { + "_meta": { + "readyAt": "2025-01-12T15:00:58Z" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize InitializedNotification without params`() { + val json = """ + { + "method": "notifications/initialized" + } + """.trimIndent() + + val notification = McpJson.decodeFromString(json) + + assertEquals(Method.Defined.NotificationsInitialized, notification.method) + assertNull(notification.params) + } + + @Test + fun `should serialize ProgressNotification with all fields`() { + val notification = ProgressNotification( + ProgressNotificationParams( + progressToken = ProgressToken("task-42"), + progress = 0.6, + total = 1.0, + message = "Syncing repository", + meta = buildJsonObject { put("stage", "download") }, + ), + ) + + val json = McpJson.encodeToString(notification) + + json shouldEqualJson """ + { + "method": "notifications/progress", + "params": { + "progressToken": "task-42", + "progress": 0.6, + "total": 1.0, + "message": "Syncing repository", + "_meta": { + "stage": "download" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize ProgressNotification with numeric token`() { + val json = """ + { + "method": "notifications/progress", + "params": { + "progressToken": 7, + "progress": 0.25 + } + } + """.trimIndent() + + val notification = McpJson.decodeFromString(json) + val params = notification.params + + assertEquals(Method.Defined.NotificationsProgress, notification.method) + assertEquals(ProgressToken(7), params.progressToken) + assertEquals(0.25, params.progress) + assertNull(params.total) + assertNull(params.message) + assertNull(params.meta) + } + + @Test + fun `should serialize ResourceUpdatedNotification with meta`() { + val notification = ResourceUpdatedNotification( + ResourceUpdatedNotificationParams( + uri = "file:///workspace/README.md", + meta = buildJsonObject { put("checksum", "abcd1234") }, + ), + ) + + val json = McpJson.encodeToString(notification) + + json shouldEqualJson """ + { + "method": "notifications/resources/updated", + "params": { + "uri": "file:///workspace/README.md", + "_meta": { + "checksum": "abcd1234" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize ResourceUpdatedNotification`() { + val json = """ + { + "method": "notifications/resources/updated", + "params": { + "uri": "file:///docs/guide.md", + "_meta": { + "etag": "W/\"42\"" + } + } + } + """.trimIndent() + + val notification = McpJson.decodeFromString(json) + val params = notification.params + + assertEquals(Method.Defined.NotificationsResourcesUpdated, notification.method) + assertEquals("file:///docs/guide.md", params.uri) + assertEquals("W/\"42\"", params.meta?.get("etag")?.jsonPrimitive?.content) + } + + @Test + fun `should serialize PromptListChangedNotification with meta`() { + val notification = PromptListChangedNotification( + BaseNotificationParams( + meta = buildJsonObject { put("reason", "catalog-updated") }, + ), + ) + + val json = McpJson.encodeToString(notification) + + json shouldEqualJson """ + { + "method": "notifications/prompts/list_changed", + "params": { + "_meta": { + "reason": "catalog-updated" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize PromptListChangedNotification without params`() { + val json = """ + { + "method": "notifications/prompts/list_changed" + } + """.trimIndent() + + val notification = McpJson.decodeFromString(json) + + assertEquals(Method.Defined.NotificationsPromptsListChanged, notification.method) + assertNull(notification.params) + } + + @Test + fun `should serialize ResourceListChangedNotification with meta`() { + val notification = ResourceListChangedNotification( + BaseNotificationParams( + meta = buildJsonObject { put("reason", "subscription-updated") }, + ), + ) + + val json = McpJson.encodeToString(notification) + + json shouldEqualJson """ + { + "method": "notifications/resources/list_changed", + "params": { + "_meta": { + "reason": "subscription-updated" + } + } + } + """.trimIndent() + } + + @Test + fun `should serialize RootsListChangedNotification with meta`() { + val notification = RootsListChangedNotification( + BaseNotificationParams( + meta = buildJsonObject { put("reason", "workspace-moved") }, + ), + ) + + val json = McpJson.encodeToString(notification) + + json shouldEqualJson """ + { + "method": "notifications/roots/list_changed", + "params": { + "_meta": { + "reason": "workspace-moved" + } + } + } + """.trimIndent() + } + + @Test + fun `should serialize ToolListChangedNotification with meta`() { + val notification = ToolListChangedNotification( + BaseNotificationParams( + meta = buildJsonObject { put("reason", "tool-added") }, + ), + ) + + val json = McpJson.encodeToString(notification) + + json shouldEqualJson """ + { + "method": "notifications/tools/list_changed", + "params": { + "_meta": { + "reason": "tool-added" + } + } + } + """.trimIndent() + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/PingRequestTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/PingRequestTest.kt new file mode 100644 index 00000000..070d58e7 --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/PingRequestTest.kt @@ -0,0 +1,95 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.int +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs +import kotlin.test.assertNotNull + +class PingRequestTest { + + @Test + fun `should serialize PingRequest without params`() { + val request = PingRequest() + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "ping" + } + """.trimIndent() + } + + @Test + fun `should serialize PingRequest with meta`() { + val request = PingRequest( + BaseRequestParams( + meta = RequestMeta( + buildJsonObject { put("progressToken", "ping-42") }, + ), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "ping", + "params": { + "_meta": { + "progressToken": "ping-42" + } + } + } + """.trimIndent() + } + + @Test + fun `should convert PingRequest to JSONRPCRequest`() { + val request = PingRequest( + BaseRequestParams( + meta = RequestMeta( + buildJsonObject { put("progressToken", 99) }, + ), + ), + ) + + val jsonRpc = request.toJSON() + + assertEquals("ping", jsonRpc.method) + val params = assertNotNull(jsonRpc.params).jsonObject + val meta = params["_meta"]?.jsonObject + assertNotNull(meta) + assertEquals(99, meta["progressToken"]?.jsonPrimitive?.int) + } + + @Test + fun `should deserialize JSONRPCRequest to PingRequest`() { + val json = """ + { + "id": "ping-1", + "method": "ping", + "jsonrpc": "2.0", + "params": { + "_meta": { + "progressToken": "pong-1" + } + } + } + """.trimIndent() + + val jsonRpc = McpJson.decodeFromString(json) + val request = jsonRpc.fromJSON() + + val pingRequest = assertIs(request) + val meta = pingRequest.params?.meta?.json + assertNotNull(meta) + assertEquals("pong-1", meta["progressToken"]?.jsonPrimitive?.content) + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/PromptsTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/PromptsTest.kt new file mode 100644 index 00000000..01eb01c0 --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/PromptsTest.kt @@ -0,0 +1,453 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.double +import kotlinx.serialization.json.int +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs +import kotlin.test.assertNotNull +import kotlin.test.assertNull + +class PromptsTest { + + @Test + fun `should serialize PromptArgument with minimal fields`() { + val argument = PromptArgument(name = "repository") + + val json = McpJson.encodeToString(argument) + + json shouldEqualJson """ + { + "name": "repository" + } + """.trimIndent() + } + + @Test + fun `should serialize PromptArgument with all fields`() { + val argument = PromptArgument( + name = "language", + description = "Programming language to use", + required = true, + title = "Language", + ) + + val json = McpJson.encodeToString(argument) + + json shouldEqualJson """ + { + "name": "language", + "description": "Programming language to use", + "required": true, + "title": "Language" + } + """.trimIndent() + } + + @Test + fun `should serialize Prompt with arguments and meta`() { + val prompt = Prompt( + name = "summarize_update", + title = "Summarize Update", + description = "Summarize the latest repository changes.", + arguments = listOf( + PromptArgument( + name = "summaryLength", + description = "Approximate length of the summary", + required = false, + title = "Summary length", + ), + ), + icons = listOf( + Icon(src = "https://example.com/icon.png"), + Icon(src = "https://example.com/icon-dark.svg", theme = Icon.Theme.Dark), + ), + meta = buildJsonObject { put("category", "status-report") }, + ) + + val json = McpJson.encodeToString(prompt) + + json shouldEqualJson """ + { + "name": "summarize_update", + "description": "Summarize the latest repository changes.", + "arguments": [ + { + "name": "summaryLength", + "description": "Approximate length of the summary", + "required": false, + "title": "Summary length" + } + ], + "title": "Summarize Update", + "icons": [ + { + "src": "https://example.com/icon.png" + }, + { + "src": "https://example.com/icon-dark.svg", + "theme": "dark" + } + ], + "_meta": { + "category": "status-report" + } + } + """.trimIndent() + } + + @Test + fun `should deserialize Prompt from JSON`() { + val json = """ + { + "name": "code_review", + "description": "Generate a succinct code review.", + "title": "Code Review", + "arguments": [ + { + "name": "filePath", + "description": "Path to the file to review", + "required": true + }, + { + "name": "severity", + "title": "Issue severity" + } + ], + "icons": [ + {"src": "https://example.com/review.png"} + ], + "_meta": { + "category": "quality" + } + } + """.trimIndent() + + val prompt = McpJson.decodeFromString(json) + + assertEquals("code_review", prompt.name) + assertEquals("Generate a succinct code review.", prompt.description) + assertEquals("Code Review", prompt.title) + val arguments = prompt.arguments + assertNotNull(arguments) + assertEquals(2, arguments.size) + assertEquals("filePath", arguments[0].name) + assertEquals(true, arguments[0].required) + assertEquals("severity", arguments[1].name) + assertEquals("Issue severity", arguments[1].title) + val meta = prompt.meta + assertNotNull(meta) + assertEquals("quality", meta["category"]?.jsonPrimitive?.content) + } + + @Test + fun `should serialize PromptMessage with text content`() { + val message = PromptMessage( + role = Role.Assistant, + content = TextContent(text = "Provide a concise summary of the changes."), + ) + + val json = McpJson.encodeToString(message) + + json shouldEqualJson """ + { + "role": "assistant", + "content": { + "type": "text", + "text": "Provide a concise summary of the changes." + } + } + """.trimIndent() + } + + @Test + fun `should deserialize PromptMessage with resource content`() { + val json = """ + { + "role": "user", + "content": { + "type": "resource", + "resource": { + "uri": "file:///workspace/README.md", + "mimeType": "text/markdown", + "text": "# Project Overview" + } + } + } + """.trimIndent() + + val message = McpJson.decodeFromString(json) + + assertEquals(Role.User, message.role) + val content = message.content + assertIs(content) + val resource = assertIs(content.resource) + assertEquals("file:///workspace/README.md", resource.uri) + assertEquals("# Project Overview", resource.text) + } + + @Test + fun `should serialize and deserialize PromptReference`() { + val reference = PromptReference(name = "daily-summary", title = "Daily Summary") + + val json = McpJson.encodeToString(reference) + json shouldEqualJson """ + { + "type": "ref/prompt", + "name": "daily-summary", + "title": "Daily Summary" + } + """.trimIndent() + + val decoded = McpJson.decodeFromString(json) + val promptReference = assertIs(decoded) + assertEquals("daily-summary", promptReference.name) + assertEquals("Daily Summary", promptReference.title) + assertEquals(ReferenceType.Prompt, promptReference.type) + } + + @Test + fun `should serialize GetPromptRequest with arguments and meta`() { + val request = GetPromptRequest( + GetPromptRequestParams( + name = "generate_release_notes", + arguments = mapOf("version" to "1.2.3"), + meta = RequestMeta( + buildJsonObject { put("progressToken", "get-prompt-1") }, + ), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "prompts/get", + "params": { + "name": "generate_release_notes", + "arguments": { + "version": "1.2.3" + }, + "_meta": { + "progressToken": "get-prompt-1" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize GetPromptRequest from JSON`() { + val json = """ + { + "method": "prompts/get", + "params": { + "name": "draft-response", + "arguments": { + "tone": "confident", + "audience": "executive" + }, + "_meta": { + "progressToken": 88 + } + } + } + """.trimIndent() + + val request = McpJson.decodeFromString(json) + + assertEquals(Method.Defined.PromptsGet, request.method) + val params = request.params + assertEquals("draft-response", params.name) + val args = params.arguments + assertNotNull(args) + assertEquals("confident", args["tone"]) + assertEquals("executive", args["audience"]) + assertEquals(ProgressToken(88), params.meta?.progressToken) + } + + @Test + fun `should serialize GetPromptResult with messages and meta`() { + val result = GetPromptResult( + messages = listOf( + PromptMessage( + role = Role.User, + content = TextContent(text = "Use concise language suitable for executives."), + ), + PromptMessage( + role = Role.Assistant, + content = TextContent(text = "Here is the summary you requested."), + ), + ), + description = "Executive summary response template.", + meta = buildJsonObject { put("generatedAt", "2025-01-12T15:00:58Z") }, + ) + + val json = McpJson.encodeToString(result) + + json shouldEqualJson """ + { + "messages": [ + { + "role": "user", + "content": { + "type": "text", + "text": "Use concise language suitable for executives." + } + }, + { + "role": "assistant", + "content": { + "type": "text", + "text": "Here is the summary you requested." + } + } + ], + "description": "Executive summary response template.", + "_meta": { + "generatedAt": "2025-01-12T15:00:58Z" + } + } + """.trimIndent() + } + + @Test + fun `should deserialize GetPromptResult from JSON`() { + val json = """ + { + "messages": [ + { + "role": "user", + "content": { + "type": "text", + "text": "Summarize today's standup." + } + } + ], + "description": "Collect information from the team." + } + """.trimIndent() + + val result = McpJson.decodeFromString(json) + + val messages = result.messages + assertEquals(1, messages.size) + assertEquals(Role.User, messages.first().role) + val textContent = assertIs(messages.first().content) + assertEquals("Summarize today's standup.", textContent.text) + assertEquals("Collect information from the team.", result.description) + assertNull(result.meta) + } + + @Test + fun `should serialize ListPromptsRequest with pagination params`() { + val request = ListPromptsRequest( + PaginatedRequestParams( + cursor = "cursor-123", + meta = RequestMeta( + buildJsonObject { put("progressToken", "list-prompts-1") }, + ), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "prompts/list", + "params": { + "cursor": "cursor-123", + "_meta": { + "progressToken": "list-prompts-1" + } + } + } + """.trimIndent() + } + + @Test + fun `should serialize ListPromptsRequest without params`() { + val request = ListPromptsRequest() + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "prompts/list" + } + """.trimIndent() + } + + @Test + fun `should serialize ListPromptsResult with next cursor and meta`() { + val result = ListPromptsResult( + prompts = listOf( + Prompt(name = "morning-briefing"), + Prompt(name = "incident-response"), + ), + nextCursor = "cursor-2", + meta = buildJsonObject { put("page", 1) }, + ) + + val json = McpJson.encodeToString(result) + + json shouldEqualJson """ + { + "prompts": [ + {"name": "morning-briefing"}, + {"name": "incident-response"} + ], + "nextCursor": "cursor-2", + "_meta": { + "page": 1 + } + } + """.trimIndent() + } + + @Test + fun `should deserialize ListPromptsResult from JSON`() { + val json = """ + { + "prompts": [ + { + "name": "weekly-update", + "description": "Summarize weekly activities.", + "arguments": [ + { + "name": "team", + "title": "Team name" + } + ] + } + ], + "nextCursor": "cursor-next", + "_meta": { + "page": 2, + "latencyMs": 12.5 + } + } + """.trimIndent() + + val result = McpJson.decodeFromString(json) + + val prompts = result.prompts + assertEquals(1, prompts.size) + val prompt = prompts.first() + assertEquals("weekly-update", prompt.name) + assertEquals("Summarize weekly activities.", prompt.description) + val args = prompt.arguments + assertNotNull(args) + assertEquals("team", args.first().name) + assertEquals("Team name", args.first().title) + assertEquals("cursor-next", result.nextCursor) + val meta = result.meta + assertNotNull(meta) + assertEquals(2, meta["page"]?.jsonPrimitive?.int) + assertEquals(12.5, meta["latencyMs"]?.jsonPrimitive?.double) + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/RequestTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/RequestTest.kt new file mode 100644 index 00000000..93412651 --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/RequestTest.kt @@ -0,0 +1,182 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.double +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs +import kotlin.test.assertNotNull +import kotlin.test.assertNull + +class RequestTest { + + @Test + fun `should expose progress token from RequestMeta`() { + val stringTokenMeta = RequestMeta(buildJsonObject { put("progressToken", "sync-1") }) + val numberTokenMeta = RequestMeta(buildJsonObject { put("progressToken", 7) }) + val customMeta = RequestMeta( + buildJsonObject { + put("progressToken", "ignored") + put("source", "client") + }, + ) + + assertEquals(ProgressToken("sync-1"), stringTokenMeta.progressToken) + assertEquals(ProgressToken(7), numberTokenMeta.progressToken) + assertEquals("client", customMeta["source"]?.jsonPrimitive?.content) + } + + @Test + fun `should serialize BaseRequestParams with meta`() { + val params = BaseRequestParams( + meta = RequestMeta( + buildJsonObject { + put("progressToken", "base-42") + put("origin", "test-suite") + }, + ), + ) + + val json = McpJson.encodeToString(params) + + json shouldEqualJson """ + { + "_meta": { + "progressToken": "base-42", + "origin": "test-suite" + } + } + """.trimIndent() + } + + @Test + fun `should deserialize BaseRequestParams with numeric progress token`() { + val json = """ + { + "_meta": { + "progressToken": 501, + "latencyMs": 12.5 + } + } + """.trimIndent() + + val params = McpJson.decodeFromString(json) + + val meta = params.meta + assertNotNull(meta) + assertEquals(ProgressToken(501), meta.progressToken) + assertEquals(12.5, meta["latencyMs"]?.jsonPrimitive?.double) + } + + @Test + fun `should serialize PaginatedRequestParams with cursor and meta`() { + val params = PaginatedRequestParams( + cursor = "cursor-1", + meta = RequestMeta(buildJsonObject { put("progressToken", "page-req") }), + ) + + val json = McpJson.encodeToString(params) + + json shouldEqualJson """ + { + "cursor": "cursor-1", + "_meta": { + "progressToken": "page-req" + } + } + """.trimIndent() + } + + @Test + fun `should deserialize PaginatedRequestParams`() { + val json = """ + { + "cursor": "cursor-2", + "_meta": { + "progressToken": 99 + } + } + """.trimIndent() + + val params = McpJson.decodeFromString(json) + + assertEquals("cursor-2", params.cursor) + assertEquals(ProgressToken(99), params.meta?.progressToken) + } + + @Test + fun `should serialize CustomRequest with params`() { + val request = CustomRequest( + method = Method.Custom("workspace/sync"), + params = BaseRequestParams( + meta = RequestMeta(buildJsonObject { put("progressToken", "sync-req") }), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "workspace/sync", + "params": { + "_meta": { + "progressToken": "sync-req" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize unknown method into CustomRequest`() { + val json = """ + { + "method": "extensions/customAction", + "params": { + "_meta": { + "progressToken": "custom-1" + } + } + } + """.trimIndent() + + val request = McpJson.decodeFromString(json) + + val custom = assertIs(request) + val method = custom.method + val customMethod = assertIs(method) + assertEquals("extensions/customAction", customMethod.value) + assertEquals("custom-1", custom.params?.meta?.json?.get("progressToken")?.jsonPrimitive?.content) + } + + @Test + fun `should serialize EmptyResult with meta`() { + val result = EmptyResult( + meta = buildJsonObject { + put("processedBy", "worker-1") + }, + ) + + val json = McpJson.encodeToString(result) + + json shouldEqualJson """ + { + "_meta": { + "processedBy": "worker-1" + } + } + """.trimIndent() + } + + @Test + fun `should deserialize EmptyResult without meta`() { + val json = "{}" + + val result = McpJson.decodeFromString(json) + + assertNull(result.meta) + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ResourcesTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ResourcesTest.kt new file mode 100644 index 00000000..0313b758 --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ResourcesTest.kt @@ -0,0 +1,539 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.int +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs +import kotlin.test.assertNotNull +import kotlin.test.assertNull + +class ResourcesTest { + + @Test + fun `should serialize Resource with minimal fields`() { + val resource = Resource( + uri = "file:///workspace/README.md", + name = "README", + ) + + val json = McpJson.encodeToString(resource) + + json shouldEqualJson """ + { + "uri": "file:///workspace/README.md", + "name": "README" + } + """.trimIndent() + } + + @Test + fun `should serialize Resource with all fields`() { + val resource = Resource( + uri = "file:///workspace/CHANGELOG.md", + name = "CHANGELOG", + description = "Changelog for recent releases", + mimeType = "text/markdown", + size = 4096, + title = "Project Changelog", + annotations = Annotations(priority = 0.8, audience = listOf(Role.Assistant)), + icons = listOf( + Icon(src = "https://example.com/changelog.png"), + ), + meta = buildJsonObject { put("etag", "abc123") }, + ) + + val json = McpJson.encodeToString(resource) + + json shouldEqualJson """ + { + "uri": "file:///workspace/CHANGELOG.md", + "name": "CHANGELOG", + "description": "Changelog for recent releases", + "mimeType": "text/markdown", + "size": 4096, + "title": "Project Changelog", + "annotations": { + "priority": 0.8, + "audience": ["assistant"] + }, + "icons": [ + {"src": "https://example.com/changelog.png"} + ], + "_meta": { + "etag": "abc123" + } + } + """.trimIndent() + } + + @Test + fun `should deserialize Resource from JSON`() { + val json = """ + { + "uri": "file:///config/settings.json", + "name": "config-settings", + "description": "Configuration file", + "mimeType": "application/json", + "size": 1024, + "title": "Settings", + "annotations": { + "priority": 0.5 + }, + "icons": [ + {"src": "https://example.com/settings.png"} + ], + "_meta": { + "etag": "\"98765\"" + } + } + """.trimIndent() + + val resource = McpJson.decodeFromString(json) + + assertEquals("file:///config/settings.json", resource.uri) + assertEquals("config-settings", resource.name) + assertEquals("Configuration file", resource.description) + assertEquals("application/json", resource.mimeType) + assertEquals(1024, resource.size) + assertEquals("Settings", resource.title) + assertEquals(0.5, resource.annotations?.priority) + val meta = resource.meta + assertNotNull(meta) + assertEquals("\"98765\"", meta["etag"]?.jsonPrimitive?.content) + } + + @Test + fun `should serialize ResourceTemplate with meta`() { + val template = ResourceTemplate( + uriTemplate = "file:///workspace/{path}", + name = "workspace-file", + description = "Workspace file template", + mimeType = "text/plain", + title = "Workspace File", + annotations = Annotations( + priority = 0.6, + audience = listOf(Role.User, Role.Assistant), + ), + icons = listOf(Icon(src = "https://example.com/file.svg", theme = Icon.Theme.Light)), + meta = buildJsonObject { put("requiresAuth", true) }, + ) + + val json = McpJson.encodeToString(template) + + json shouldEqualJson """ + { + "uriTemplate": "file:///workspace/{path}", + "name": "workspace-file", + "description": "Workspace file template", + "mimeType": "text/plain", + "title": "Workspace File", + "annotations": { + "priority": 0.6, + "audience": ["user", "assistant"] + }, + "icons": [ + { + "src": "https://example.com/file.svg", + "theme": "light" + } + ], + "_meta": { + "requiresAuth": true + } + } + """.trimIndent() + } + + @Test + fun `should deserialize ResourceTemplate from JSON`() { + val json = """ + { + "uriTemplate": "db://users/{id}", + "name": "user-record", + "description": "Database record template", + "annotations": { + "priority": 1.0 + } + } + """.trimIndent() + + val template = McpJson.decodeFromString(json) + + assertEquals("db://users/{id}", template.uriTemplate) + assertEquals("user-record", template.name) + assertEquals("Database record template", template.description) + assertEquals(1.0, template.annotations?.priority) + assertNull(template.meta) + } + + @Test + fun `should serialize and deserialize ResourceTemplateReference`() { + val reference = ResourceTemplateReference(uri = "file:///workspace/{path}") + + val json = McpJson.encodeToString(reference) + + json shouldEqualJson """ + { + "type": "ref/resource", + "uri": "file:///workspace/{path}" + } + """.trimIndent() + + val decoded = McpJson.decodeFromString(json) + val templateReference = assertIs(decoded) + assertEquals("file:///workspace/{path}", templateReference.uri) + assertEquals(ReferenceType.ResourceTemplate, templateReference.type) + } + + @Test + fun `should serialize TextResourceContents`() { + val contents = TextResourceContents( + text = "Hello, MCP!", + uri = "file:///workspace/hello.txt", + mimeType = "text/plain", + meta = buildJsonObject { put("encoding", "utf-8") }, + ) + + val json = McpJson.encodeToString(contents) + + json shouldEqualJson """ + { + "text": "Hello, MCP!", + "uri": "file:///workspace/hello.txt", + "mimeType": "text/plain", + "_meta": { + "encoding": "utf-8" + } + } + """.trimIndent() + } + + @Test + fun `should deserialize BlobResourceContents`() { + val json = """ + { + "blob": "YmluYXJ5ZGF0YQ==", + "uri": "file:///workspace/logo.png", + "mimeType": "image/png", + "_meta": { + "size": 128 + } + } + """.trimIndent() + + val contents = McpJson.decodeFromString(json) + val blobContents = assertIs(contents) + assertEquals("YmluYXJ5ZGF0YQ==", blobContents.blob) + assertEquals("file:///workspace/logo.png", blobContents.uri) + assertEquals("image/png", blobContents.mimeType) + assertEquals(128, blobContents.meta?.get("size")?.jsonPrimitive?.int) + } + + @Test + fun `should serialize UnknownResourceContents`() { + val contents = UnknownResourceContents( + uri = "custom://resource/42", + mimeType = "application/octet-stream", + ) + + val json = McpJson.encodeToString(contents) + + json shouldEqualJson """ + { + "uri": "custom://resource/42", + "mimeType": "application/octet-stream" + } + """.trimIndent() + } + + @Test + fun `should serialize ListResourcesRequest with cursor`() { + val request = ListResourcesRequest( + PaginatedRequestParams( + cursor = "cursor-1", + meta = RequestMeta(buildJsonObject { put("progressToken", "list-resources-1") }), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "resources/list", + "params": { + "cursor": "cursor-1", + "_meta": { + "progressToken": "list-resources-1" + } + } + } + """.trimIndent() + } + + @Test + fun `should serialize ListResourcesRequest without params`() { + val request = ListResourcesRequest() + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "resources/list" + } + """.trimIndent() + } + + @Test + fun `should serialize ListResourcesResult`() { + val result = ListResourcesResult( + resources = listOf( + Resource(uri = "file:///workspace/README.md", name = "README"), + Resource(uri = "file:///workspace/CONTRIBUTING.md", name = "CONTRIBUTING"), + ), + nextCursor = "cursor-2", + meta = buildJsonObject { put("page", 1) }, + ) + + val json = McpJson.encodeToString(result) + + json shouldEqualJson """ + { + "resources": [ + {"uri": "file:///workspace/README.md", "name": "README"}, + {"uri": "file:///workspace/CONTRIBUTING.md", "name": "CONTRIBUTING"} + ], + "nextCursor": "cursor-2", + "_meta": { + "page": 1 + } + } + """.trimIndent() + } + + @Test + fun `should deserialize ListResourcesResult`() { + val json = """ + { + "resources": [ + { + "uri": "file:///workspace/docs/guide.md", + "name": "guide", + "description": "User guide" + } + ], + "nextCursor": "cursor-next", + "_meta": { + "page": 2 + } + } + """.trimIndent() + + val result = McpJson.decodeFromString(json) + + assertEquals("cursor-next", result.nextCursor) + val resources = result.resources + assertEquals(1, resources.size) + val resource = resources.first() + assertEquals("file:///workspace/docs/guide.md", resource.uri) + assertEquals("guide", resource.name) + assertEquals("User guide", resource.description) + assertEquals(2, result.meta?.get("page")?.jsonPrimitive?.int) + } + + @Test + fun `should serialize ReadResourceRequest`() { + val request = ReadResourceRequest( + ReadResourceRequestParams( + uri = "file:///workspace/notes.txt", + meta = RequestMeta(buildJsonObject { put("progressToken", "read-1") }), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "resources/read", + "params": { + "uri": "file:///workspace/notes.txt", + "_meta": { + "progressToken": "read-1" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize ReadResourceResult with mixed contents`() { + val json = """ + { + "contents": [ + { + "text": "Section 1", + "uri": "file:///workspace/report.txt", + "mimeType": "text/plain" + }, + { + "blob": "aW1hZ2VEYXRh", + "uri": "file:///workspace/diagram.png", + "mimeType": "image/png" + } + ], + "_meta": { + "generatedAt": "2025-01-12T15:00:58Z" + } + } + """.trimIndent() + + val result = McpJson.decodeFromString(json) + + val contents = result.contents + assertEquals(2, contents.size) + assertIs(contents[0]) + assertIs(contents[1]) + val meta = result.meta + assertNotNull(meta) + assertEquals("2025-01-12T15:00:58Z", meta["generatedAt"]?.jsonPrimitive?.content) + } + + @Test + fun `should serialize SubscribeRequest`() { + val request = SubscribeRequest( + SubscribeRequestParams( + uri = "file:///workspace/todo.md", + meta = RequestMeta(buildJsonObject { put("progressToken", 42) }), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "resources/subscribe", + "params": { + "uri": "file:///workspace/todo.md", + "_meta": { + "progressToken": 42 + } + } + } + """.trimIndent() + } + + @Test + fun `should serialize UnsubscribeRequest`() { + val request = UnsubscribeRequest( + UnsubscribeRequestParams( + uri = "file:///workspace/todo.md", + meta = RequestMeta(buildJsonObject { put("progressToken", "unsubscribe-1") }), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "resources/unsubscribe", + "params": { + "uri": "file:///workspace/todo.md", + "_meta": { + "progressToken": "unsubscribe-1" + } + } + } + """.trimIndent() + } + + @Test + fun `should serialize ListResourceTemplatesRequest`() { + val request = ListResourceTemplatesRequest( + PaginatedRequestParams( + cursor = "template-1", + meta = RequestMeta(buildJsonObject { put("progressToken", "templates-1") }), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "resources/templates/list", + "params": { + "cursor": "template-1", + "_meta": { + "progressToken": "templates-1" + } + } + } + """.trimIndent() + } + + @Test + fun `should serialize ListResourceTemplatesResult`() { + val result = ListResourceTemplatesResult( + resourceTemplates = listOf( + ResourceTemplate(uriTemplate = "file:///workspace/{path}", name = "workspace-file"), + ), + nextCursor = "cursor-templates-2", + meta = buildJsonObject { put("page", 3) }, + ) + + val json = McpJson.encodeToString(result) + + json shouldEqualJson """ + { + "resourceTemplates": [ + { + "uriTemplate": "file:///workspace/{path}", + "name": "workspace-file" + } + ], + "nextCursor": "cursor-templates-2", + "_meta": { + "page": 3 + } + } + """.trimIndent() + } + + @Test + fun `should deserialize ListResourceTemplatesResult`() { + val json = """ + { + "resourceTemplates": [ + { + "uriTemplate": "db://records/{id}", + "name": "record", + "description": "Database record", + "icons": [ + {"src": "https://example.com/db.png"} + ] + } + ], + "nextCursor": "cursor-next", + "_meta": { + "page": 1 + } + } + """.trimIndent() + + val result = McpJson.decodeFromString(json) + + assertEquals("cursor-next", result.nextCursor) + val templates = result.resourceTemplates + assertEquals(1, templates.size) + val template = templates.first() + assertEquals("db://records/{id}", template.uriTemplate) + assertEquals("record", template.name) + assertEquals("Database record", template.description) + val icons = template.icons + assertNotNull(icons) + assertEquals("https://example.com/db.png", icons.first().src) + assertEquals(1, result.meta?.get("page")?.jsonPrimitive?.int) + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/RootsTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/RootsTest.kt new file mode 100644 index 00000000..3f1b8d66 --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/RootsTest.kt @@ -0,0 +1,169 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.boolean +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotNull + +class RootsTest { + + @Test + fun `should serialize Root with minimal fields`() { + val root = Root(uri = "file:///workspace/project") + + val json = McpJson.encodeToString(root) + + json shouldEqualJson """ + { + "uri": "file:///workspace/project" + } + """.trimIndent() + } + + @Test + fun `should serialize Root with name and meta`() { + val root = Root( + uri = "file:///workspace/docs", + name = "Docs", + meta = buildJsonObject { put("writable", true) }, + ) + + val json = McpJson.encodeToString(root) + + json shouldEqualJson """ + { + "uri": "file:///workspace/docs", + "name": "Docs", + "_meta": { + "writable": true + } + } + """.trimIndent() + } + + @Test + fun `should deserialize Root with validation`() { + val json = """ + { + "uri": "file:///workspace/code", + "name": "Code", + "_meta": { + "default": true + } + } + """.trimIndent() + + val root = McpJson.decodeFromString(json) + + assertEquals("file:///workspace/code", root.uri) + assertEquals("Code", root.name) + assertEquals(true, root.meta?.get("default")?.jsonPrimitive?.boolean) + } + + @Test + fun `should serialize ListRootsRequest with meta`() { + val request = ListRootsRequest( + BaseRequestParams( + meta = RequestMeta( + buildJsonObject { put("progressToken", "roots-list-1") }, + ), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "roots/list", + "params": { + "_meta": { + "progressToken": "roots-list-1" + } + } + } + """.trimIndent() + } + + @Test + fun `should serialize ListRootsRequest without params`() { + val request = ListRootsRequest() + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "roots/list" + } + """.trimIndent() + } + + @Test + fun `should serialize ListRootsResult`() { + val result = ListRootsResult( + roots = listOf( + Root(uri = "file:///workspace/project", name = "Project"), + Root(uri = "file:///workspace/docs", name = "Docs"), + ), + meta = buildJsonObject { put("issuedAt", "2025-01-12T15:00:58Z") }, + ) + + val json = McpJson.encodeToString(result) + + json shouldEqualJson """ + { + "roots": [ + {"uri": "file:///workspace/project", "name": "Project"}, + {"uri": "file:///workspace/docs", "name": "Docs"} + ], + "_meta": { + "issuedAt": "2025-01-12T15:00:58Z" + } + } + """.trimIndent() + } + + @Test + fun `should deserialize ListRootsResult`() { + val json = """ + { + "roots": [ + { + "uri": "file:///workspace/code", + "name": "Code" + } + ], + "_meta": { + "updatedBy": "client-1" + } + } + """.trimIndent() + + val result = McpJson.decodeFromString(json) + + val roots = result.roots + assertEquals(1, roots.size) + val root = roots.first() + assertEquals("file:///workspace/code", root.uri) + assertEquals("Code", root.name) + val meta = result.meta + assertNotNull(meta) + assertEquals("client-1", meta["updatedBy"]?.jsonPrimitive?.content) + } + + @Test + fun `should reject non file URI roots`() { + val json = """ + { + "uri": "https://example.com/root" + } + """.trimIndent() + + val exception = runCatching { McpJson.decodeFromString(json) }.exceptionOrNull() + assertNotNull(exception) + assertEquals(true, exception.message?.contains("Root URI must start with 'file://'")) + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/SamplingTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/SamplingTest.kt new file mode 100644 index 00000000..7dc3fe6d --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/SamplingTest.kt @@ -0,0 +1,258 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.double +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith +import kotlin.test.assertIs +import kotlin.test.assertNotNull + +class SamplingTest { + + @Test + fun `should serialize ModelHint`() { + val hint = ModelHint(name = "claude-3-5-sonnet") + + val json = McpJson.encodeToString(hint) + + json shouldEqualJson """ + { + "name": "claude-3-5-sonnet" + } + """.trimIndent() + } + + @Test + fun `should serialize ModelPreferences with priorities`() { + val preferences = ModelPreferences( + hints = listOf(ModelHint(name = "haiku"), ModelHint(name = "openaichat")), + costPriority = 0.25, + speedPriority = 0.75, + intelligencePriority = 1.0, + ) + + val json = McpJson.encodeToString(preferences) + + json shouldEqualJson """ + { + "hints": [ + {"name": "haiku"}, + {"name": "openaichat"} + ], + "costPriority": 0.25, + "speedPriority": 0.75, + "intelligencePriority": 1.0 + } + """.trimIndent() + } + + @Test + fun `should reject ModelPreferences with invalid priority`() { + assertFailsWith { + ModelPreferences(costPriority = 1.5) + } + } + + @Test + fun `should serialize SamplingMessage`() { + val message = SamplingMessage( + role = Role.User, + content = TextContent(text = "Summarize the latest release."), + ) + + val json = McpJson.encodeToString(message) + + json shouldEqualJson """ + { + "role": "user", + "content": { + "type": "text", + "text": "Summarize the latest release." + } + } + """.trimIndent() + } + + @Test + fun `should serialize CreateMessageRequest with all fields`() { + val request = CreateMessageRequest( + CreateMessageRequestParams( + maxTokens = 512, + messages = listOf( + SamplingMessage( + role = Role.User, + content = TextContent(text = "You are a helpful assistant."), + ), + SamplingMessage( + role = Role.User, + content = TextContent(text = "Provide a short summary."), + ), + ), + modelPreferences = ModelPreferences( + hints = listOf(ModelHint(name = "claude")), + speedPriority = 0.6, + ), + systemPrompt = "Respond with concise bullet points.", + includeContext = IncludeContext.AllServers, + temperature = 0.8, + stopSequences = listOf("END"), + metadata = buildJsonObject { put("provider", "anthropic") }, + meta = RequestMeta(buildJsonObject { put("progressToken", "sample-1") }), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "sampling/createMessage", + "params": { + "maxTokens": 512, + "messages": [ + { + "role": "user", + "content": { + "type": "text", + "text": "You are a helpful assistant." + } + }, + { + "role": "user", + "content": { + "type": "text", + "text": "Provide a short summary." + } + } + ], + "modelPreferences": { + "hints": [ + {"name": "claude"} + ], + "speedPriority": 0.6 + }, + "systemPrompt": "Respond with concise bullet points.", + "includeContext": "allServers", + "temperature": 0.8, + "stopSequences": ["END"], + "metadata": { + "provider": "anthropic" + }, + "_meta": { + "progressToken": "sample-1" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize CreateMessageRequest`() { + val json = """ + { + "method": "sampling/createMessage", + "params": { + "maxTokens": 256, + "messages": [ + { + "role": "user", + "content": { + "type": "text", + "text": "Draft a project update." + } + } + ], + "modelPreferences": { + "costPriority": 0.4 + }, + "includeContext": "thisServer", + "temperature": 1.1, + "stopSequences": ["\n\n"], + "metadata": { + "provider": "openai" + }, + "_meta": { + "progressToken": 42 + } + } + } + """.trimIndent() + + val request = McpJson.decodeFromString(json) + + assertEquals(Method.Defined.SamplingCreateMessage, request.method) + val params = request.params + assertEquals(256, params.maxTokens) + assertEquals(IncludeContext.ThisServer, params.includeContext) + assertEquals(ProgressToken(42), params.meta?.progressToken) + assertEquals("openai", params.metadata?.get("provider")?.jsonPrimitive?.content) + + val message = params.messages.first() + assertEquals(Role.User, message.role) + val content = assertIs(message.content) + assertEquals("Draft a project update.", content.text) + + val preferences = assertNotNull(params.modelPreferences) + assertEquals(0.4, preferences.costPriority) + } + + @Test + fun `should serialize CreateMessageResult with stop reason`() { + val result = CreateMessageResult( + role = Role.Assistant, + content = TextContent(text = "Here is the requested update."), + model = "claude-3-5-sonnet", + stopReason = StopReason.MaxTokens, + meta = buildJsonObject { put("latencyMs", 850) }, + ) + + val json = McpJson.encodeToString(result) + + json shouldEqualJson """ + { + "role": "assistant", + "content": { + "type": "text", + "text": "Here is the requested update." + }, + "model": "claude-3-5-sonnet", + "stopReason": "maxTokens", + "_meta": { + "latencyMs": 850 + } + } + """.trimIndent() + } + + @Test + fun `should deserialize CreateMessageResult`() { + val json = """ + { + "role": "assistant", + "content": { + "type": "text", + "text": "Summary complete." + }, + "model": "gpt-4o", + "stopReason": "stopSequence", + "_meta": { + "latencyMs": 1200.5 + } + } + """.trimIndent() + + val result = McpJson.decodeFromString(json) + + assertEquals(Role.Assistant, result.role) + val text = assertIs(result.content) + assertEquals("Summary complete.", text.text) + assertEquals("gpt-4o", result.model) + assertEquals(StopReason.StopSequence, result.stopReason) + val meta = result.meta + assertNotNull(meta) + assertEquals(1200.5, meta["latencyMs"]?.jsonPrimitive?.double) + } +} diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ToolsTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ToolsTest.kt new file mode 100644 index 00000000..a662e441 --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/ToolsTest.kt @@ -0,0 +1,523 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.assertions.json.shouldEqualJson +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.int +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs +import kotlin.test.assertNotNull + +class ToolsTest { + + @Test + fun `should serialize Tool with minimal fields`() { + val tool = Tool( + name = "search", + inputSchema = ToolSchema(), + ) + + val json = McpJson.encodeToString(tool) + + json shouldEqualJson """ + { + "name": "search", + "inputSchema": { + "type": "object" + } + } + """.trimIndent() + } + + @Test + fun `should serialize Tool with annotations and schemas`() { + val inputSchema = ToolSchema( + properties = buildJsonObject { + put( + "query", + buildJsonObject { + put("type", "string") + put("description", "Search query") + }, + ) + }, + required = listOf("query"), + ) + val outputSchema = ToolSchema( + properties = buildJsonObject { + put( + "results", + buildJsonObject { + put("type", "array") + }, + ) + }, + ) + val tool = Tool( + name = "web-search", + inputSchema = inputSchema, + description = "Search the web for information", + outputSchema = outputSchema, + title = "Web Search", + annotations = ToolAnnotations( + title = "Web Search (Preferred)", + readOnlyHint = true, + destructiveHint = false, + idempotentHint = true, + openWorldHint = true, + ), + icons = listOf(Icon(src = "https://example.com/search.png")), + meta = buildJsonObject { put("category", "search") }, + ) + + val json = McpJson.encodeToString(tool) + + json shouldEqualJson """ + { + "name": "web-search", + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "Search query" + } + }, + "required": ["query"] + }, + "description": "Search the web for information", + "outputSchema": { + "type": "object", + "properties": { + "results": { + "type": "array" + } + } + }, + "title": "Web Search", + "annotations": { + "title": "Web Search (Preferred)", + "readOnlyHint": true, + "destructiveHint": false, + "idempotentHint": true, + "openWorldHint": true + }, + "icons": [ + {"src": "https://example.com/search.png"} + ], + "_meta": { + "category": "search" + } + } + """.trimIndent() + } + + @Test + fun `should deserialize Tool from JSON`() { + val json = """ + { + "name": "translate", + "inputSchema": { + "type": "object", + "properties": { + "text": {"type": "string"}, + "targetLanguage": {"type": "string"} + }, + "required": ["text", "targetLanguage"] + }, + "annotations": { + "title": "Translate Text", + "readOnlyHint": true + }, + "_meta": { + "category": "language" + } + } + """.trimIndent() + + val tool = McpJson.decodeFromString(json) + + assertEquals("translate", tool.name) + assertEquals("Translate Text", tool.annotations?.title) + assertEquals(true, tool.annotations?.readOnlyHint) + val schema = tool.inputSchema + val properties = schema.properties + assertNotNull(properties) + assertNotNull(properties["text"]) + assertEquals(listOf("text", "targetLanguage"), schema.required) + assertEquals("language", tool.meta?.get("category")?.jsonPrimitive?.content) + } + + @Test + fun `should serialize CallToolRequest with arguments`() { + val request = CallToolRequest( + CallToolRequestParams( + name = "web-search", + arguments = buildJsonObject { put("query", "MCP protocol") }, + meta = RequestMeta( + buildJsonObject { put("progressToken", "call-1") }, + ), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "tools/call", + "params": { + "name": "web-search", + "arguments": { + "query": "MCP protocol" + }, + "_meta": { + "progressToken": "call-1" + } + } + } + """.trimIndent() + } + + @Test + fun `should deserialize CallToolRequest`() { + val json = """ + { + "method": "tools/call", + "params": { + "name": "analyze-code", + "arguments": { + "path": "src/main.kt" + }, + "_meta": { + "progressToken": 77 + } + } + } + """.trimIndent() + + val request = McpJson.decodeFromString(json) + + assertEquals(Method.Defined.ToolsCall, request.method) + val params = request.params + assertEquals("analyze-code", params.name) + assertEquals("src/main.kt", params.arguments?.get("path")?.jsonPrimitive?.content) + assertEquals(ProgressToken(77), params.meta?.progressToken) + } + + @Test + fun `should serialize CallToolResult with structured content`() { + val result = CallToolResult( + content = listOf( + TextContent(text = "Found 3 relevant documents."), + ), + isError = false, + structuredContent = buildJsonObject { + put("count", 3) + put("items", buildJsonObject { put("first", "doc.md") }) + }, + meta = buildJsonObject { put("elapsedMs", 1200) }, + ) + + val json = McpJson.encodeToString(result) + + json shouldEqualJson """ + { + "content": [ + { + "type": "text", + "text": "Found 3 relevant documents." + } + ], + "isError": false, + "structuredContent": { + "count": 3, + "items": { + "first": "doc.md" + } + }, + "_meta": { + "elapsedMs": 1200 + } + } + """.trimIndent() + } + + @Test + fun `should deserialize CallToolResult`() { + val json = """ + { + "content": [ + { + "type": "text", + "text": "Unable to reach server." + } + ], + "isError": true, + "structuredContent": { + "errorCode": "NETWORK", + "retryable": true + }, + "_meta": { + "requestId": "req-9" + } + } + """.trimIndent() + + val result = McpJson.decodeFromString(json) + + assertEquals(true, result.isError) + val text = assertIs(result.content.first()) + assertEquals("Unable to reach server.", text.text) + val structured = result.structuredContent + assertNotNull(structured) + assertEquals("NETWORK", structured["errorCode"]?.jsonPrimitive?.content) + assertEquals("req-9", result.meta?.get("requestId")?.jsonPrimitive?.content) + } + + @Test + fun `should serialize ListToolsRequest with cursor`() { + val request = ListToolsRequest( + PaginatedRequestParams( + cursor = "cursor-1", + meta = RequestMeta(buildJsonObject { put("progressToken", "tools-list-1") }), + ), + ) + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "tools/list", + "params": { + "cursor": "cursor-1", + "_meta": { + "progressToken": "tools-list-1" + } + } + } + """.trimIndent() + } + + @Test + fun `should serialize ListToolsRequest without params`() { + val request = ListToolsRequest() + + val json = McpJson.encodeToString(request) + + json shouldEqualJson """ + { + "method": "tools/list" + } + """.trimIndent() + } + + @Test + fun `should serialize ListToolsResult`() { + val result = ListToolsResult( + tools = listOf( + Tool(name = "search", inputSchema = ToolSchema()), + Tool(name = "summarize", inputSchema = ToolSchema()), + ), + nextCursor = "cursor-2", + meta = buildJsonObject { put("page", 1) }, + ) + + val json = McpJson.encodeToString(result) + + json shouldEqualJson """ + { + "tools": [ + { + "name": "search", + "inputSchema": { + "type": "object" + } + }, + { + "name": "summarize", + "inputSchema": { + "type": "object" + } + } + ], + "nextCursor": "cursor-2", + "_meta": { + "page": 1 + } + } + """.trimIndent() + } + + @Test + fun `should deserialize ListToolsResult`() { + val json = """ + { + "tools": [ + { + "name": "search", + "inputSchema": { + "type": "object" + }, + "description": "Search the workspace" + } + ], + "nextCursor": "cursor-next", + "_meta": { + "page": 3 + } + } + """.trimIndent() + + val result = McpJson.decodeFromString(json) + + assertEquals("cursor-next", result.nextCursor) + val tools = result.tools + assertEquals(1, tools.size) + val tool = tools.first() + assertEquals("search", tool.name) + assertEquals("Search the workspace", tool.description) + assertEquals("object", tool.inputSchema.type) + assertEquals(3, result.meta?.get("page")?.jsonPrimitive?.int) + } + + @Test + fun `should build success CallToolResult with text content`() { + val meta = buildJsonObject { put("source", "toolkit") } + + val result = CallToolResult.success("Operation complete", meta) + + assertEquals(false, result.isError) + val text = assertIs(result.content.single()) + assertEquals("Operation complete", text.text) + assertEquals("toolkit", result.meta?.get("source")?.jsonPrimitive?.content) + assertEquals(null, result.structuredContent) + } + + @Test + fun `should build error CallToolResult with text content`() { + val meta = buildJsonObject { put("code", "ERR42") } + + val result = CallToolResult.error("Failed to connect", meta) + + assertEquals(true, result.isError) + val text = assertIs(result.content.single()) + assertEquals("Failed to connect", text.text) + assertEquals("ERR42", result.meta?.get("code")?.jsonPrimitive?.content) + assertEquals(null, result.structuredContent) + } + + @Test + fun `should serialize tool schema type even when defaults disabled`() { + val tool = weatherTool() + + val customJson = Json(from = McpJson) { + encodeDefaults = false + } + val encoded = customJson.encodeToString(Tool.serializer(), tool) + val element = Json.parseToJsonElement(encoded).jsonObject + + val inputSchema = element["inputSchema"]?.jsonObject + val outputSchema = element["outputSchema"]?.jsonObject + + assertNotNull(inputSchema) + assertEquals("object", inputSchema["type"]?.jsonPrimitive?.content) + assertNotNull(outputSchema) + assertEquals("object", outputSchema["type"]?.jsonPrimitive?.content) + } + + @Test + fun `should deserialize complex tool definition`() { + val expected = weatherTool() + val actual = McpJson.decodeFromString(weatherToolJson()) + + assertEquals(expected, actual) + } + + private fun weatherTool(): Tool = Tool( + name = "get_weather", + title = "Get weather", + description = "Get the current weather in a given location", + inputSchema = ToolSchema( + properties = buildJsonObject { + put( + "location", + buildJsonObject { + put("type", "string") + put("description", "The city and state, e.g. San Francisco, CA") + }, + ) + }, + required = listOf("location"), + ), + outputSchema = ToolSchema( + properties = buildJsonObject { + put( + "temperature", + buildJsonObject { + put("type", "number") + put("description", "Temperature in celsius") + }, + ) + put( + "conditions", + buildJsonObject { + put("type", "string") + put("description", "Weather conditions description") + }, + ) + put( + "humidity", + buildJsonObject { + put("type", "number") + put("description", "Humidity percentage") + }, + ) + }, + required = listOf("temperature", "conditions", "humidity"), + ), + meta = buildJsonObject { put("_for_test_only", true) }, + ) + + private fun weatherToolJson(): String = """ + { + "name": "get_weather", + "title": "Get weather", + "description": "Get the current weather in a given location", + "inputSchema": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA" + } + }, + "required": ["location"] + }, + "outputSchema": { + "type": "object", + "properties": { + "temperature": { + "type": "number", + "description": "Temperature in celsius" + }, + "conditions": { + "type": "string", + "description": "Weather conditions description" + }, + "humidity": { + "type": "number", + "description": "Humidity percentage" + } + }, + "required": ["temperature", "conditions", "humidity"] + }, + "_meta": { + "_for_test_only": true + } + } + """.trimIndent() +} diff --git a/kotlin-sdk-server/api/kotlin-sdk-server.api b/kotlin-sdk-server/api/kotlin-sdk-server.api index f8594469..48e2ca7e 100644 --- a/kotlin-sdk-server/api/kotlin-sdk-server.api +++ b/kotlin-sdk-server/api/kotlin-sdk-server.api @@ -6,62 +6,62 @@ public final class io/modelcontextprotocol/kotlin/sdk/server/KtorServerKt { } public final class io/modelcontextprotocol/kotlin/sdk/server/RegisteredPrompt : io/modelcontextprotocol/kotlin/sdk/server/Feature { - public fun (Lio/modelcontextprotocol/kotlin/sdk/Prompt;Lkotlin/jvm/functions/Function2;)V - public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/Prompt; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/Prompt;Lkotlin/jvm/functions/Function2;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/Prompt; public final fun component2 ()Lkotlin/jvm/functions/Function2; - public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/Prompt;Lkotlin/jvm/functions/Function2;)Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredPrompt; - public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredPrompt;Lio/modelcontextprotocol/kotlin/sdk/Prompt;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredPrompt; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/Prompt;Lkotlin/jvm/functions/Function2;)Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredPrompt; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredPrompt;Lio/modelcontextprotocol/kotlin/sdk/types/Prompt;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredPrompt; public fun equals (Ljava/lang/Object;)Z public fun getKey ()Ljava/lang/String; public final fun getMessageProvider ()Lkotlin/jvm/functions/Function2; - public final fun getPrompt ()Lio/modelcontextprotocol/kotlin/sdk/Prompt; + public final fun getPrompt ()Lio/modelcontextprotocol/kotlin/sdk/types/Prompt; public fun hashCode ()I public fun toString ()Ljava/lang/String; } public final class io/modelcontextprotocol/kotlin/sdk/server/RegisteredResource : io/modelcontextprotocol/kotlin/sdk/server/Feature { - public fun (Lio/modelcontextprotocol/kotlin/sdk/Resource;Lkotlin/jvm/functions/Function2;)V - public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/Resource; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/Resource;Lkotlin/jvm/functions/Function2;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/Resource; public final fun component2 ()Lkotlin/jvm/functions/Function2; - public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/Resource;Lkotlin/jvm/functions/Function2;)Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredResource; - public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredResource;Lio/modelcontextprotocol/kotlin/sdk/Resource;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredResource; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/Resource;Lkotlin/jvm/functions/Function2;)Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredResource; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredResource;Lio/modelcontextprotocol/kotlin/sdk/types/Resource;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredResource; public fun equals (Ljava/lang/Object;)Z public fun getKey ()Ljava/lang/String; public final fun getReadHandler ()Lkotlin/jvm/functions/Function2; - public final fun getResource ()Lio/modelcontextprotocol/kotlin/sdk/Resource; + public final fun getResource ()Lio/modelcontextprotocol/kotlin/sdk/types/Resource; public fun hashCode ()I public fun toString ()Ljava/lang/String; } public final class io/modelcontextprotocol/kotlin/sdk/server/RegisteredTool : io/modelcontextprotocol/kotlin/sdk/server/Feature { - public fun (Lio/modelcontextprotocol/kotlin/sdk/Tool;Lkotlin/jvm/functions/Function2;)V - public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/Tool; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/Tool;Lkotlin/jvm/functions/Function2;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/Tool; public final fun component2 ()Lkotlin/jvm/functions/Function2; - public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/Tool;Lkotlin/jvm/functions/Function2;)Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredTool; - public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredTool;Lio/modelcontextprotocol/kotlin/sdk/Tool;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredTool; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/Tool;Lkotlin/jvm/functions/Function2;)Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredTool; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredTool;Lio/modelcontextprotocol/kotlin/sdk/types/Tool;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/server/RegisteredTool; public fun equals (Ljava/lang/Object;)Z public final fun getHandler ()Lkotlin/jvm/functions/Function2; public fun getKey ()Ljava/lang/String; - public final fun getTool ()Lio/modelcontextprotocol/kotlin/sdk/Tool; + public final fun getTool ()Lio/modelcontextprotocol/kotlin/sdk/types/Tool; public fun hashCode ()I public fun toString ()Ljava/lang/String; } public class io/modelcontextprotocol/kotlin/sdk/server/Server { - public fun (Lio/modelcontextprotocol/kotlin/sdk/Implementation;Lio/modelcontextprotocol/kotlin/sdk/server/ServerOptions;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V - public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/Implementation;Lio/modelcontextprotocol/kotlin/sdk/server/ServerOptions;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun (Lio/modelcontextprotocol/kotlin/sdk/Implementation;Lio/modelcontextprotocol/kotlin/sdk/server/ServerOptions;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V - public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/Implementation;Lio/modelcontextprotocol/kotlin/sdk/server/ServerOptions;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun addPrompt (Lio/modelcontextprotocol/kotlin/sdk/Prompt;Lkotlin/jvm/functions/Function2;)V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Lio/modelcontextprotocol/kotlin/sdk/server/ServerOptions;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Lio/modelcontextprotocol/kotlin/sdk/server/ServerOptions;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Lio/modelcontextprotocol/kotlin/sdk/server/ServerOptions;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Lio/modelcontextprotocol/kotlin/sdk/server/ServerOptions;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun addPrompt (Lio/modelcontextprotocol/kotlin/sdk/types/Prompt;Lkotlin/jvm/functions/Function2;)V public final fun addPrompt (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lkotlin/jvm/functions/Function2;)V public static synthetic fun addPrompt$default (Lio/modelcontextprotocol/kotlin/sdk/server/Server;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V public final fun addPrompts (Ljava/util/List;)V public final fun addResource (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V public static synthetic fun addResource$default (Lio/modelcontextprotocol/kotlin/sdk/server/Server;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V public final fun addResources (Ljava/util/List;)V - public final fun addTool (Lio/modelcontextprotocol/kotlin/sdk/Tool;Lkotlin/jvm/functions/Function2;)V - public final fun addTool (Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/Tool$Input;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/Tool$Output;Lio/modelcontextprotocol/kotlin/sdk/ToolAnnotations;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/functions/Function2;)V - public static synthetic fun addTool$default (Lio/modelcontextprotocol/kotlin/sdk/server/Server;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/Tool$Input;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/Tool$Output;Lio/modelcontextprotocol/kotlin/sdk/ToolAnnotations;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V + public final fun addTool (Lio/modelcontextprotocol/kotlin/sdk/types/Tool;Lkotlin/jvm/functions/Function2;)V + public final fun addTool (Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/functions/Function2;)V + public static synthetic fun addTool$default (Lio/modelcontextprotocol/kotlin/sdk/server/Server;Ljava/lang/String;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ToolSchema;Lio/modelcontextprotocol/kotlin/sdk/types/ToolAnnotations;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V public final fun addTools (Ljava/util/List;)V public final fun close (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun connect (Lio/modelcontextprotocol/kotlin/sdk/shared/Transport;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -70,7 +70,7 @@ public class io/modelcontextprotocol/kotlin/sdk/server/Server { protected final fun getOptions ()Lio/modelcontextprotocol/kotlin/sdk/server/ServerOptions; public final fun getPrompts ()Ljava/util/Map; public final fun getResources ()Ljava/util/Map; - protected final fun getServerInfo ()Lio/modelcontextprotocol/kotlin/sdk/Implementation; + protected final fun getServerInfo ()Lio/modelcontextprotocol/kotlin/sdk/types/Implementation; public final fun getTools ()Ljava/util/Map; public final fun onClose (Lkotlin/jvm/functions/Function0;)V public final fun onConnect (Lkotlin/jvm/functions/Function0;)V @@ -84,34 +84,34 @@ public class io/modelcontextprotocol/kotlin/sdk/server/Server { } public final class io/modelcontextprotocol/kotlin/sdk/server/ServerOptions : io/modelcontextprotocol/kotlin/sdk/shared/ProtocolOptions { - public fun (Lio/modelcontextprotocol/kotlin/sdk/ServerCapabilities;Z)V - public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/ServerCapabilities;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getCapabilities ()Lio/modelcontextprotocol/kotlin/sdk/ServerCapabilities; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities;Z)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getCapabilities ()Lio/modelcontextprotocol/kotlin/sdk/types/ServerCapabilities; } public class io/modelcontextprotocol/kotlin/sdk/server/ServerSession : io/modelcontextprotocol/kotlin/sdk/shared/Protocol { - public fun (Lio/modelcontextprotocol/kotlin/sdk/Implementation;Lio/modelcontextprotocol/kotlin/sdk/server/ServerOptions;Ljava/lang/String;)V - protected fun assertCapabilityForMethod (Lio/modelcontextprotocol/kotlin/sdk/Method;)V - protected fun assertNotificationCapability (Lio/modelcontextprotocol/kotlin/sdk/Method;)V - public fun assertRequestHandlerCapability (Lio/modelcontextprotocol/kotlin/sdk/Method;)V - public final fun createElicitation (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun createElicitation$default (Lio/modelcontextprotocol/kotlin/sdk/server/ServerSession;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/CreateElicitationRequest$RequestedSchema;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public final fun createMessage (Lio/modelcontextprotocol/kotlin/sdk/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun createMessage$default (Lio/modelcontextprotocol/kotlin/sdk/server/ServerSession;Lio/modelcontextprotocol/kotlin/sdk/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public final fun getClientCapabilities ()Lio/modelcontextprotocol/kotlin/sdk/ClientCapabilities; - public final fun getClientVersion ()Lio/modelcontextprotocol/kotlin/sdk/Implementation; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/Implementation;Lio/modelcontextprotocol/kotlin/sdk/server/ServerOptions;Ljava/lang/String;)V + protected fun assertCapabilityForMethod (Lio/modelcontextprotocol/kotlin/sdk/types/Method;)V + protected fun assertNotificationCapability (Lio/modelcontextprotocol/kotlin/sdk/types/Method;)V + public fun assertRequestHandlerCapability (Lio/modelcontextprotocol/kotlin/sdk/types/Method;)V + public final fun createElicitation (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun createElicitation$default (Lio/modelcontextprotocol/kotlin/sdk/server/ServerSession;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/ElicitRequestParams$RequestedSchema;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun createMessage (Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun createMessage$default (Lio/modelcontextprotocol/kotlin/sdk/server/ServerSession;Lio/modelcontextprotocol/kotlin/sdk/types/CreateMessageRequest;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun getClientCapabilities ()Lio/modelcontextprotocol/kotlin/sdk/types/ClientCapabilities; + public final fun getClientVersion ()Lio/modelcontextprotocol/kotlin/sdk/types/Implementation; protected final fun getInstructions ()Ljava/lang/String; - protected final fun getServerInfo ()Lio/modelcontextprotocol/kotlin/sdk/Implementation; + protected final fun getServerInfo ()Lio/modelcontextprotocol/kotlin/sdk/types/Implementation; public final fun listRoots (Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static synthetic fun listRoots$default (Lio/modelcontextprotocol/kotlin/sdk/server/ServerSession;Lkotlinx/serialization/json/JsonObject;Lio/modelcontextprotocol/kotlin/sdk/shared/RequestOptions;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public fun onClose ()V public final fun onClose (Lkotlin/jvm/functions/Function0;)V public final fun onInitialized (Lkotlin/jvm/functions/Function0;)V public final fun ping (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun sendLoggingMessage (Lio/modelcontextprotocol/kotlin/sdk/LoggingMessageNotification;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun sendLoggingMessage (Lio/modelcontextprotocol/kotlin/sdk/types/LoggingMessageNotification;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun sendPromptListChanged (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun sendResourceListChanged (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun sendResourceUpdated (Lio/modelcontextprotocol/kotlin/sdk/ResourceUpdatedNotification;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun sendResourceUpdated (Lio/modelcontextprotocol/kotlin/sdk/types/ResourceUpdatedNotification;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun sendToolListChanged (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } @@ -121,14 +121,14 @@ public final class io/modelcontextprotocol/kotlin/sdk/server/SseServerTransport public final fun getSessionId ()Ljava/lang/String; public final fun handleMessage (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun handlePostMessage (Lio/ktor/server/application/ApplicationCall;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun send (Lio/modelcontextprotocol/kotlin/sdk/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun send (Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public fun start (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } public final class io/modelcontextprotocol/kotlin/sdk/server/StdioServerTransport : io/modelcontextprotocol/kotlin/sdk/shared/AbstractTransport { public fun (Lkotlinx/io/Source;Lkotlinx/io/Sink;)V public fun close (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun send (Lio/modelcontextprotocol/kotlin/sdk/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun send (Lio/modelcontextprotocol/kotlin/sdk/types/JSONRPCMessage;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public fun start (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } diff --git a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Features.kt b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Features.kt index a956f1b7..78bed9cd 100644 --- a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Features.kt +++ b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Features.kt @@ -1,14 +1,14 @@ package io.modelcontextprotocol.kotlin.sdk.server -import io.modelcontextprotocol.kotlin.sdk.CallToolRequest -import io.modelcontextprotocol.kotlin.sdk.CallToolResult -import io.modelcontextprotocol.kotlin.sdk.GetPromptRequest -import io.modelcontextprotocol.kotlin.sdk.GetPromptResult -import io.modelcontextprotocol.kotlin.sdk.Prompt -import io.modelcontextprotocol.kotlin.sdk.ReadResourceRequest -import io.modelcontextprotocol.kotlin.sdk.ReadResourceResult -import io.modelcontextprotocol.kotlin.sdk.Resource -import io.modelcontextprotocol.kotlin.sdk.Tool +import io.modelcontextprotocol.kotlin.sdk.types.CallToolRequest +import io.modelcontextprotocol.kotlin.sdk.types.CallToolResult +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptRequest +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptResult +import io.modelcontextprotocol.kotlin.sdk.types.Prompt +import io.modelcontextprotocol.kotlin.sdk.types.ReadResourceRequest +import io.modelcontextprotocol.kotlin.sdk.types.ReadResourceResult +import io.modelcontextprotocol.kotlin.sdk.types.Resource +import io.modelcontextprotocol.kotlin.sdk.types.Tool internal typealias FeatureKey = String diff --git a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/SSEServerTransport.kt b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/SSEServerTransport.kt index 64e32fed..b8c15563 100644 --- a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/SSEServerTransport.kt +++ b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/SSEServerTransport.kt @@ -8,9 +8,9 @@ import io.ktor.server.request.contentType import io.ktor.server.request.receiveText import io.ktor.server.response.respondText import io.ktor.server.sse.ServerSSESession -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage import io.modelcontextprotocol.kotlin.sdk.shared.AbstractTransport -import io.modelcontextprotocol.kotlin.sdk.shared.McpJson +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.McpJson import kotlinx.coroutines.InternalCoroutinesApi import kotlinx.coroutines.job import kotlin.concurrent.atomics.AtomicBoolean diff --git a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt index 99f7aa84..3ce426f1 100644 --- a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt +++ b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt @@ -1,32 +1,32 @@ package io.modelcontextprotocol.kotlin.sdk.server import io.github.oshai.kotlinlogging.KotlinLogging -import io.modelcontextprotocol.kotlin.sdk.CallToolRequest -import io.modelcontextprotocol.kotlin.sdk.CallToolResult -import io.modelcontextprotocol.kotlin.sdk.EmptyJsonObject -import io.modelcontextprotocol.kotlin.sdk.GetPromptRequest -import io.modelcontextprotocol.kotlin.sdk.GetPromptResult -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.ListPromptsRequest -import io.modelcontextprotocol.kotlin.sdk.ListPromptsResult -import io.modelcontextprotocol.kotlin.sdk.ListResourceTemplatesRequest -import io.modelcontextprotocol.kotlin.sdk.ListResourceTemplatesResult -import io.modelcontextprotocol.kotlin.sdk.ListResourcesRequest -import io.modelcontextprotocol.kotlin.sdk.ListResourcesResult -import io.modelcontextprotocol.kotlin.sdk.ListToolsRequest -import io.modelcontextprotocol.kotlin.sdk.ListToolsResult -import io.modelcontextprotocol.kotlin.sdk.Method -import io.modelcontextprotocol.kotlin.sdk.Prompt -import io.modelcontextprotocol.kotlin.sdk.PromptArgument -import io.modelcontextprotocol.kotlin.sdk.ReadResourceRequest -import io.modelcontextprotocol.kotlin.sdk.ReadResourceResult -import io.modelcontextprotocol.kotlin.sdk.Resource -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities -import io.modelcontextprotocol.kotlin.sdk.TextContent -import io.modelcontextprotocol.kotlin.sdk.Tool -import io.modelcontextprotocol.kotlin.sdk.ToolAnnotations import io.modelcontextprotocol.kotlin.sdk.shared.ProtocolOptions import io.modelcontextprotocol.kotlin.sdk.shared.Transport +import io.modelcontextprotocol.kotlin.sdk.types.CallToolRequest +import io.modelcontextprotocol.kotlin.sdk.types.CallToolResult +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptRequest +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptResult +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.ListPromptsRequest +import io.modelcontextprotocol.kotlin.sdk.types.ListPromptsResult +import io.modelcontextprotocol.kotlin.sdk.types.ListResourceTemplatesRequest +import io.modelcontextprotocol.kotlin.sdk.types.ListResourceTemplatesResult +import io.modelcontextprotocol.kotlin.sdk.types.ListResourcesRequest +import io.modelcontextprotocol.kotlin.sdk.types.ListResourcesResult +import io.modelcontextprotocol.kotlin.sdk.types.ListToolsRequest +import io.modelcontextprotocol.kotlin.sdk.types.ListToolsResult +import io.modelcontextprotocol.kotlin.sdk.types.Method +import io.modelcontextprotocol.kotlin.sdk.types.Prompt +import io.modelcontextprotocol.kotlin.sdk.types.PromptArgument +import io.modelcontextprotocol.kotlin.sdk.types.ReadResourceRequest +import io.modelcontextprotocol.kotlin.sdk.types.ReadResourceResult +import io.modelcontextprotocol.kotlin.sdk.types.Resource +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.TextContent +import io.modelcontextprotocol.kotlin.sdk.types.Tool +import io.modelcontextprotocol.kotlin.sdk.types.ToolAnnotations +import io.modelcontextprotocol.kotlin.sdk.types.ToolSchema import kotlinx.atomicfu.atomic import kotlinx.atomicfu.update import kotlinx.collections.immutable.persistentListOf @@ -245,7 +245,7 @@ public open class Server( * @param inputSchema The expected input schema for the tool. * @param outputSchema The optional expected output schema for the tool. * @param toolAnnotations Optional additional tool information. - * @param _meta Optional metadata as a [JsonObject]. + * @param meta Optional metadata as a [JsonObject]. * @param handler A suspend function that handles executing the tool when called by the client. * @throws IllegalStateException If the server does not support tools. */ @@ -253,21 +253,21 @@ public open class Server( public fun addTool( name: String, description: String, - inputSchema: Tool.Input = Tool.Input(), + inputSchema: ToolSchema = ToolSchema(), title: String? = null, - outputSchema: Tool.Output? = null, + outputSchema: ToolSchema? = null, toolAnnotations: ToolAnnotations? = null, - @Suppress("LocalVariableName") _meta: JsonObject? = null, + meta: JsonObject? = null, handler: suspend (CallToolRequest) -> CallToolResult, ) { val tool = Tool( name = name, - title = title, - description = description, inputSchema = inputSchema, outputSchema = outputSchema, + description = description, + title = title, annotations = toolAnnotations, - _meta = _meta ?: EmptyJsonObject, + meta = meta, ) addTool(tool, handler) } @@ -474,13 +474,14 @@ public open class Server( } private suspend fun handleCallTool(request: CallToolRequest): CallToolResult { - logger.debug { "Handling tool call request for tool: ${request.name}" } + val requestParams = request.params + logger.debug { "Handling tool call request for tool: ${requestParams.name}" } // Check if the tool exists - val tool = toolRegistry.get(request.name) ?: run { - logger.error { "Tool not found: ${request.name}" } + val tool = toolRegistry.get(requestParams.name) ?: run { + logger.error { "Tool not found: ${requestParams.name}" } return CallToolResult( - content = listOf(TextContent(text = "Tool ${request.name} not found")), + content = listOf(TextContent(text = "Tool ${requestParams.name} not found")), isError = true, ) } @@ -488,14 +489,14 @@ public open class Server( @Suppress("TooGenericExceptionCaught") // Execute the tool handler and catch any errors return try { - logger.trace { "Executing tool ${request.name} with input: ${request.arguments}" } + logger.trace { "Executing tool ${requestParams.name} with input: ${requestParams.arguments}" } tool.handler(request) } catch (e: CancellationException) { throw e } catch (e: Exception) { - logger.error(e) { "Error executing tool ${request.name}" } + logger.error(e) { "Error executing tool ${requestParams.name}" } CallToolResult( - content = listOf(TextContent(text = "Error executing tool ${request.name}: ${e.message}")), + content = listOf(TextContent(text = "Error executing tool ${requestParams.name}: ${e.message}")), isError = true, ) } @@ -507,11 +508,12 @@ public open class Server( } private suspend fun handleGetPrompt(request: GetPromptRequest): GetPromptResult { - logger.debug { "Handling get prompt request for: ${request.name}" } - val prompt = promptRegistry.get(request.name) + val requestParams = request.params + logger.debug { "Handling get prompt request for: ${requestParams.name}" } + val prompt = promptRegistry.get(requestParams.name) ?: run { - logger.error { "Prompt not found: ${request.name}" } - throw IllegalArgumentException("Prompt not found: ${request.name}") + logger.error { "Prompt not found: ${requestParams.name}" } + throw IllegalArgumentException("Prompt not found: ${requestParams.name}") } return prompt.messageProvider(request) } @@ -522,11 +524,12 @@ public open class Server( } private suspend fun handleReadResource(request: ReadResourceRequest): ReadResourceResult { - logger.debug { "Handling read resource request for: ${request.uri}" } - val resource = resourceRegistry.get(request.uri) + val requestParams = request.params + logger.debug { "Handling read resource request for: ${requestParams.uri}" } + val resource = resourceRegistry.get(requestParams.uri) ?: run { - logger.error { "Resource not found: ${request.uri}" } - throw IllegalArgumentException("Resource not found: ${request.uri}") + logger.error { "Resource not found: ${requestParams.uri}" } + throw IllegalArgumentException("Resource not found: ${requestParams.uri}") } return resource.readHandler(request) } diff --git a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerSession.kt b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerSession.kt index 887b57bd..53d47b68 100644 --- a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerSession.kt +++ b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerSession.kt @@ -1,33 +1,36 @@ package io.modelcontextprotocol.kotlin.sdk.server import io.github.oshai.kotlinlogging.KotlinLogging -import io.modelcontextprotocol.kotlin.sdk.ClientCapabilities -import io.modelcontextprotocol.kotlin.sdk.CreateElicitationRequest -import io.modelcontextprotocol.kotlin.sdk.CreateElicitationRequest.RequestedSchema -import io.modelcontextprotocol.kotlin.sdk.CreateElicitationResult -import io.modelcontextprotocol.kotlin.sdk.CreateMessageRequest -import io.modelcontextprotocol.kotlin.sdk.CreateMessageResult -import io.modelcontextprotocol.kotlin.sdk.EmptyJsonObject -import io.modelcontextprotocol.kotlin.sdk.EmptyRequestResult -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.InitializeRequest -import io.modelcontextprotocol.kotlin.sdk.InitializeResult -import io.modelcontextprotocol.kotlin.sdk.InitializedNotification -import io.modelcontextprotocol.kotlin.sdk.LATEST_PROTOCOL_VERSION -import io.modelcontextprotocol.kotlin.sdk.ListRootsRequest -import io.modelcontextprotocol.kotlin.sdk.ListRootsResult -import io.modelcontextprotocol.kotlin.sdk.LoggingLevel -import io.modelcontextprotocol.kotlin.sdk.LoggingMessageNotification -import io.modelcontextprotocol.kotlin.sdk.Method -import io.modelcontextprotocol.kotlin.sdk.Method.Defined -import io.modelcontextprotocol.kotlin.sdk.PingRequest -import io.modelcontextprotocol.kotlin.sdk.PromptListChangedNotification -import io.modelcontextprotocol.kotlin.sdk.ResourceListChangedNotification -import io.modelcontextprotocol.kotlin.sdk.ResourceUpdatedNotification -import io.modelcontextprotocol.kotlin.sdk.SUPPORTED_PROTOCOL_VERSIONS -import io.modelcontextprotocol.kotlin.sdk.ToolListChangedNotification import io.modelcontextprotocol.kotlin.sdk.shared.Protocol import io.modelcontextprotocol.kotlin.sdk.shared.RequestOptions +import io.modelcontextprotocol.kotlin.sdk.types.BaseRequestParams +import io.modelcontextprotocol.kotlin.sdk.types.ClientCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.CreateMessageRequest +import io.modelcontextprotocol.kotlin.sdk.types.CreateMessageResult +import io.modelcontextprotocol.kotlin.sdk.types.ElicitRequest +import io.modelcontextprotocol.kotlin.sdk.types.ElicitRequestParams +import io.modelcontextprotocol.kotlin.sdk.types.ElicitResult +import io.modelcontextprotocol.kotlin.sdk.types.EmptyJsonObject +import io.modelcontextprotocol.kotlin.sdk.types.EmptyResult +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.InitializeRequest +import io.modelcontextprotocol.kotlin.sdk.types.InitializeResult +import io.modelcontextprotocol.kotlin.sdk.types.InitializedNotification +import io.modelcontextprotocol.kotlin.sdk.types.LATEST_PROTOCOL_VERSION +import io.modelcontextprotocol.kotlin.sdk.types.ListRootsRequest +import io.modelcontextprotocol.kotlin.sdk.types.ListRootsResult +import io.modelcontextprotocol.kotlin.sdk.types.LoggingLevel +import io.modelcontextprotocol.kotlin.sdk.types.LoggingMessageNotification +import io.modelcontextprotocol.kotlin.sdk.types.Method +import io.modelcontextprotocol.kotlin.sdk.types.Method.Defined +import io.modelcontextprotocol.kotlin.sdk.types.PingRequest +import io.modelcontextprotocol.kotlin.sdk.types.PromptListChangedNotification +import io.modelcontextprotocol.kotlin.sdk.types.RequestMeta +import io.modelcontextprotocol.kotlin.sdk.types.ResourceListChangedNotification +import io.modelcontextprotocol.kotlin.sdk.types.ResourceUpdatedNotification +import io.modelcontextprotocol.kotlin.sdk.types.SUPPORTED_PROTOCOL_VERSIONS +import io.modelcontextprotocol.kotlin.sdk.types.SetLevelRequest +import io.modelcontextprotocol.kotlin.sdk.types.ToolListChangedNotification import kotlinx.atomicfu.AtomicRef import kotlinx.atomicfu.atomic import kotlinx.coroutines.CompletableDeferred @@ -81,10 +84,10 @@ public open class ServerSession( // Logging level handler if (options.capabilities.logging != null) { - setRequestHandler(Defined.LoggingSetLevel) { request, _ -> - currentLoggingLevel.value = request.level - logger.debug { "Logging level set to: ${request.level}" } - EmptyRequestResult() + setRequestHandler(Defined.LoggingSetLevel) { request, _ -> + currentLoggingLevel.value = request.params.level + logger.debug { "Logging level set to: ${request.params.level}" } + EmptyResult() } } } @@ -125,7 +128,7 @@ public open class ServerSession( * @return The result of the ping request. * @throws IllegalStateException If for some reason the method is not supported or the connection is closed. */ - public suspend fun ping(): EmptyRequestResult = request(PingRequest()) + public suspend fun ping(): EmptyResult = request(PingRequest()) /** * Creates a message using the server's sampling capability. @@ -140,8 +143,7 @@ public open class ServerSession( options: RequestOptions? = null, ): CreateMessageResult { logger.debug { - "Creating message with ${params.messages.size} messages, maxTokens=${params.maxTokens}, " + - "temperature=${params.temperature}, systemPrompt=${if (params.systemPrompt != null) "present" else "absent"}" + "Creating message with ${params.params.messages.size} messages, maxTokens=${params.params.maxTokens}, temperature=${params.params.temperature}, systemPrompt=${if (params.params.systemPrompt != null) "present" else "absent"}" } logger.trace { "Full createMessage params: $params" } return request(params, options) @@ -160,20 +162,20 @@ public open class ServerSession( options: RequestOptions? = null, ): ListRootsResult { logger.debug { "Listing roots with params: $params" } - return request(ListRootsRequest(params), options) + return request(ListRootsRequest(BaseRequestParams(RequestMeta(params))), options) } public suspend fun createElicitation( message: String, - requestedSchema: RequestedSchema, + requestedSchema: ElicitRequestParams.RequestedSchema, options: RequestOptions? = null, - ): CreateElicitationResult { + ): ElicitResult { logger.debug { "Creating elicitation with message length=${message.length}, " + "schema properties count=${requestedSchema.properties.size}" } logger.trace { "Full elicitation message: $message, requestedSchema: $requestedSchema" } - return request(CreateElicitationRequest(message, requestedSchema), options) + return request(ElicitRequest(ElicitRequestParams(message, requestedSchema)), options) } /** @@ -336,7 +338,7 @@ public open class ServerSession( logger.trace { "Asserting request handler capability for method: ${method.value}" } when (method) { Defined.SamplingCreateMessage -> { - if (serverCapabilities.sampling == null) { + if (serverCapabilities.experimental?.get("sampling") == null) { logger.error { "Server capability assertion failed: sampling not supported" } throw IllegalStateException("Server does not support sampling (required for $method)") } @@ -388,10 +390,10 @@ public open class ServerSession( private suspend fun handleInitialize(request: InitializeRequest): InitializeResult { logger.debug { "Handling initialization request from client" } - clientCapabilities = request.capabilities - clientVersion = request.clientInfo + clientCapabilities = request.params.capabilities + clientVersion = request.params.clientInfo - val requestedVersion = request.protocolVersion + val requestedVersion = request.params.protocolVersion val protocolVersion = if (SUPPORTED_PROTOCOL_VERSIONS.contains(requestedVersion)) { requestedVersion } else { @@ -418,7 +420,7 @@ public open class ServerSession( private fun isMessageIgnored(level: LoggingLevel): Boolean { val current = currentLoggingLevel.value ?: return false // If no level is set, don't filter - return level.ordinal < current.ordinal + return level < current } /** diff --git a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/StdioServerTransport.kt b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/StdioServerTransport.kt index 0fa18b8f..b65aecd0 100644 --- a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/StdioServerTransport.kt +++ b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/StdioServerTransport.kt @@ -1,11 +1,11 @@ package io.modelcontextprotocol.kotlin.sdk.server import io.github.oshai.kotlinlogging.KotlinLogging -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage import io.modelcontextprotocol.kotlin.sdk.internal.IODispatcher import io.modelcontextprotocol.kotlin.sdk.shared.AbstractTransport import io.modelcontextprotocol.kotlin.sdk.shared.ReadBuffer import io.modelcontextprotocol.kotlin.sdk.shared.serializeMessage +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.NonCancellable diff --git a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/WebSocketMcpKtorServerExtensions.kt b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/WebSocketMcpKtorServerExtensions.kt index a5a24927..b4d88498 100644 --- a/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/WebSocketMcpKtorServerExtensions.kt +++ b/kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/WebSocketMcpKtorServerExtensions.kt @@ -11,10 +11,10 @@ import io.ktor.server.websocket.WebSockets import io.ktor.server.websocket.webSocket import io.ktor.utils.io.CancellationException import io.ktor.utils.io.KtorDsl -import io.modelcontextprotocol.kotlin.sdk.Implementation import io.modelcontextprotocol.kotlin.sdk.LIB_VERSION -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities import io.modelcontextprotocol.kotlin.sdk.shared.IMPLEMENTATION_NAME +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities import kotlinx.coroutines.awaitCancellation private val logger = KotlinLogging.logger {} @@ -71,7 +71,7 @@ internal suspend fun WebSocketServerSession.mcpWebSocketEndpoint(block: () -> Se try { session = server.createSession(transport) awaitCancellation() - } catch (e: CancellationException) { + } catch (_: CancellationException) { session?.close() } } diff --git a/kotlin-sdk-server/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/StdioServerTransportTest.kt b/kotlin-sdk-server/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/StdioServerTransportTest.kt index be1e64e8..ff46263d 100644 --- a/kotlin-sdk-server/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/StdioServerTransportTest.kt +++ b/kotlin-sdk-server/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/StdioServerTransportTest.kt @@ -1,11 +1,11 @@ package io.modelcontextprotocol.kotlin.sdk.server -import io.modelcontextprotocol.kotlin.sdk.InitializedNotification -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage -import io.modelcontextprotocol.kotlin.sdk.PingRequest import io.modelcontextprotocol.kotlin.sdk.shared.ReadBuffer import io.modelcontextprotocol.kotlin.sdk.shared.serializeMessage -import io.modelcontextprotocol.kotlin.sdk.toJSON +import io.modelcontextprotocol.kotlin.sdk.types.InitializedNotification +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.PingRequest +import io.modelcontextprotocol.kotlin.sdk.types.toJSON import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest diff --git a/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/ClientTest.kt b/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/ClientTest.kt index ad2a9586..d863e008 100644 --- a/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/ClientTest.kt +++ b/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/ClientTest.kt @@ -1,38 +1,40 @@ package io.modelcontextprotocol.kotlin.sdk.client -import io.modelcontextprotocol.kotlin.sdk.ClientCapabilities -import io.modelcontextprotocol.kotlin.sdk.CreateElicitationRequest -import io.modelcontextprotocol.kotlin.sdk.CreateElicitationResult -import io.modelcontextprotocol.kotlin.sdk.CreateMessageRequest -import io.modelcontextprotocol.kotlin.sdk.CreateMessageResult -import io.modelcontextprotocol.kotlin.sdk.EmptyJsonObject -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.InitializeRequest -import io.modelcontextprotocol.kotlin.sdk.InitializeResult -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage -import io.modelcontextprotocol.kotlin.sdk.JSONRPCRequest -import io.modelcontextprotocol.kotlin.sdk.JSONRPCResponse -import io.modelcontextprotocol.kotlin.sdk.LATEST_PROTOCOL_VERSION -import io.modelcontextprotocol.kotlin.sdk.ListResourcesRequest -import io.modelcontextprotocol.kotlin.sdk.ListResourcesResult -import io.modelcontextprotocol.kotlin.sdk.ListRootsRequest -import io.modelcontextprotocol.kotlin.sdk.ListToolsRequest -import io.modelcontextprotocol.kotlin.sdk.ListToolsResult -import io.modelcontextprotocol.kotlin.sdk.LoggingLevel -import io.modelcontextprotocol.kotlin.sdk.LoggingMessageNotification -import io.modelcontextprotocol.kotlin.sdk.Method -import io.modelcontextprotocol.kotlin.sdk.Role -import io.modelcontextprotocol.kotlin.sdk.Root -import io.modelcontextprotocol.kotlin.sdk.RootsListChangedNotification -import io.modelcontextprotocol.kotlin.sdk.SUPPORTED_PROTOCOL_VERSIONS -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities -import io.modelcontextprotocol.kotlin.sdk.TextContent -import io.modelcontextprotocol.kotlin.sdk.Tool import io.modelcontextprotocol.kotlin.sdk.server.Server import io.modelcontextprotocol.kotlin.sdk.server.ServerOptions import io.modelcontextprotocol.kotlin.sdk.server.ServerSession import io.modelcontextprotocol.kotlin.sdk.shared.AbstractTransport import io.modelcontextprotocol.kotlin.sdk.shared.InMemoryTransport +import io.modelcontextprotocol.kotlin.sdk.types.ClientCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.CreateMessageRequest +import io.modelcontextprotocol.kotlin.sdk.types.CreateMessageResult +import io.modelcontextprotocol.kotlin.sdk.types.ElicitRequestParams +import io.modelcontextprotocol.kotlin.sdk.types.ElicitResult +import io.modelcontextprotocol.kotlin.sdk.types.EmptyJsonObject +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.InitializeRequest +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.ListResourcesRequest +import io.modelcontextprotocol.kotlin.sdk.types.ListResourcesResult +import io.modelcontextprotocol.kotlin.sdk.types.ListRootsRequest +import io.modelcontextprotocol.kotlin.sdk.types.ListToolsRequest +import io.modelcontextprotocol.kotlin.sdk.types.ListToolsResult +import io.modelcontextprotocol.kotlin.sdk.types.LoggingLevel +import io.modelcontextprotocol.kotlin.sdk.types.LoggingMessageNotification +import io.modelcontextprotocol.kotlin.sdk.types.LoggingMessageNotificationParams +import io.modelcontextprotocol.kotlin.sdk.types.Method +import io.modelcontextprotocol.kotlin.sdk.types.Role +import io.modelcontextprotocol.kotlin.sdk.types.Root +import io.modelcontextprotocol.kotlin.sdk.types.RootsListChangedNotification +import io.modelcontextprotocol.kotlin.sdk.types.SUPPORTED_PROTOCOL_VERSIONS +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.TextContent +import io.modelcontextprotocol.kotlin.sdk.types.Tool +import io.modelcontextprotocol.kotlin.sdk.types.ToolSchema import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.cancel @@ -49,6 +51,7 @@ import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertFailsWith import kotlin.test.assertIs +import kotlin.test.assertNull import kotlin.test.assertTrue import kotlin.test.fail @@ -393,8 +396,8 @@ class ClientTest { } serverSession.sendLoggingMessage( LoggingMessageNotification( - params = LoggingMessageNotification.Params( - level = LoggingLevel.info, + params = LoggingMessageNotificationParams( + level = LoggingLevel.Info, data = jsonObject, ), ), @@ -548,7 +551,7 @@ class ClientTest { client.setRequestHandler(Method.Defined.SamplingCreateMessage) { _, _ -> CreateMessageResult( model = "test-model", - role = Role.assistant, + role = Role.Assistant, content = TextContent( text = "Test response", ), @@ -619,7 +622,7 @@ class ClientTest { title = "testTool title", description = "testTool description", annotations = null, - inputSchema = Tool.Input(), + inputSchema = ToolSchema(), outputSchema = null, ), ), @@ -643,7 +646,6 @@ class ClientTest { assertEquals(request.id, receivedAsResponse.id) assertEquals(request.jsonrpc, receivedAsResponse.jsonrpc) assertEquals(serverListToolsResult, receivedAsResponse.result) - assertEquals(null, receivedAsResponse.error) } @Test @@ -870,7 +872,7 @@ class ClientTest { val exception = assertFailsWith { serverSession.createElicitation( message = "Please provide your GitHub username", - requestedSchema = CreateElicitationRequest.RequestedSchema( + requestedSchema = ElicitRequestParams.RequestedSchema( properties = buildJsonObject { putJsonObject("name") { put("type", "string") @@ -928,22 +930,22 @@ class ClientTest { val serverSession = serverSessionResult.await() // Set logging level to warning - val minLevel = LoggingLevel.warning + val minLevel = LoggingLevel.Warning val result = client.setLoggingLevel(minLevel) - assertEquals(EmptyJsonObject, result._meta) + assertNull(result.meta) // Send messages of different levels val testMessages = listOf( - LoggingLevel.debug to "Debug - should be filtered", - LoggingLevel.info to "Info - should be filtered", - LoggingLevel.warning to "Warning - should pass", - LoggingLevel.error to "Error - should pass", + LoggingLevel.Debug to "Debug - should be filtered", + LoggingLevel.Info to "Info - should be filtered", + LoggingLevel.Warning to "Warning - should pass", + LoggingLevel.Error to "Error - should pass", ) testMessages.forEach { (level, message) -> serverSession.sendLoggingMessage( LoggingMessageNotification( - params = LoggingMessageNotification.Params( + params = LoggingMessageNotificationParams( level = level, data = buildJsonObject { put("message", message) }, ), @@ -978,7 +980,7 @@ class ClientTest { ) val elicitationMessage = "Please provide your GitHub username" - val requestedSchema = CreateElicitationRequest.RequestedSchema( + val requestedSchema = ElicitRequestParams.RequestedSchema( properties = buildJsonObject { putJsonObject("name") { put("type", "string") @@ -987,16 +989,16 @@ class ClientTest { required = listOf("name"), ) - val elicitationResultAction = CreateElicitationResult.Action.accept + val elicitationResultAction = ElicitResult.Action.Accept val elicitationResultContent = buildJsonObject { put("name", "octocat") } client.setElicitationHandler { request -> - assertEquals(elicitationMessage, request.message) - assertEquals(requestedSchema, request.requestedSchema) + assertEquals(elicitationMessage, request.params.message) + assertEquals(requestedSchema, request.params.requestedSchema) - CreateElicitationResult( + ElicitResult( action = elicitationResultAction, content = elicitationResultContent, ) diff --git a/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/SseTransportTest.kt b/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/SseTransportTest.kt index e81332e6..d82ff47a 100644 --- a/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/SseTransportTest.kt +++ b/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/client/SseTransportTest.kt @@ -6,12 +6,12 @@ import io.ktor.server.cio.CIO import io.ktor.server.engine.EmbeddedServer import io.ktor.server.engine.embeddedServer import io.ktor.server.routing.routing -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities import io.modelcontextprotocol.kotlin.sdk.server.Server import io.modelcontextprotocol.kotlin.sdk.server.ServerOptions import io.modelcontextprotocol.kotlin.sdk.server.mcp import io.modelcontextprotocol.kotlin.sdk.shared.BaseTransportTest +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities import kotlinx.coroutines.test.runTest import kotlin.test.BeforeTest import kotlin.test.Ignore diff --git a/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/InMemoryTransportTest.kt b/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/InMemoryTransportTest.kt index 3e7cdb2a..d13f5848 100644 --- a/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/InMemoryTransportTest.kt +++ b/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/InMemoryTransportTest.kt @@ -1,9 +1,9 @@ package io.modelcontextprotocol.kotlin.sdk.integration -import io.modelcontextprotocol.kotlin.sdk.InitializedNotification -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage import io.modelcontextprotocol.kotlin.sdk.shared.InMemoryTransport -import io.modelcontextprotocol.kotlin.sdk.toJSON +import io.modelcontextprotocol.kotlin.sdk.types.InitializedNotification +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.toJSON import kotlinx.coroutines.test.runTest import kotlin.test.BeforeTest import kotlin.test.Test diff --git a/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/BaseTransportTest.kt b/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/BaseTransportTest.kt index 26404b62..1929facf 100644 --- a/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/BaseTransportTest.kt +++ b/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/BaseTransportTest.kt @@ -1,9 +1,9 @@ package io.modelcontextprotocol.kotlin.sdk.shared -import io.modelcontextprotocol.kotlin.sdk.InitializedNotification -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage -import io.modelcontextprotocol.kotlin.sdk.PingRequest -import io.modelcontextprotocol.kotlin.sdk.toJSON +import io.modelcontextprotocol.kotlin.sdk.types.InitializedNotification +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.PingRequest +import io.modelcontextprotocol.kotlin.sdk.types.toJSON import kotlinx.coroutines.CompletableDeferred import kotlin.test.assertEquals import kotlin.test.assertFalse diff --git a/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/InMemoryTransport.kt b/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/InMemoryTransport.kt index fd567c75..5c5fdd7c 100644 --- a/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/InMemoryTransport.kt +++ b/kotlin-sdk-test/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/InMemoryTransport.kt @@ -1,6 +1,6 @@ package io.modelcontextprotocol.kotlin.sdk.shared -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage /** * In-memory transport for creating clients and servers that talk to each other within the same process. diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/AbstractPromptIntegrationTest.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/AbstractPromptIntegrationTest.kt index d5644bbc..b66ac7bd 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/AbstractPromptIntegrationTest.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/AbstractPromptIntegrationTest.kt @@ -1,12 +1,15 @@ package io.modelcontextprotocol.kotlin.sdk.integration.kotlin -import io.modelcontextprotocol.kotlin.sdk.GetPromptRequest -import io.modelcontextprotocol.kotlin.sdk.GetPromptResult -import io.modelcontextprotocol.kotlin.sdk.PromptArgument -import io.modelcontextprotocol.kotlin.sdk.PromptMessage -import io.modelcontextprotocol.kotlin.sdk.Role -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities -import io.modelcontextprotocol.kotlin.sdk.TextContent +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptRequest +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptRequestParams +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptResult +import io.modelcontextprotocol.kotlin.sdk.types.McpException +import io.modelcontextprotocol.kotlin.sdk.types.PromptArgument +import io.modelcontextprotocol.kotlin.sdk.types.PromptMessage +import io.modelcontextprotocol.kotlin.sdk.types.RPCError +import io.modelcontextprotocol.kotlin.sdk.types.Role +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.TextContent import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking @@ -56,17 +59,17 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { ), ), ) { request -> - val name = request.arguments?.get("name") ?: "World" + val name = request.params.arguments?.get("name") ?: "World" GetPromptResult( description = basicPromptDescription, messages = listOf( PromptMessage( - role = Role.user, + role = Role.User, content = TextContent(text = "Hello, $name!"), ), PromptMessage( - role = Role.assistant, + role = Role.Assistant, content = TextContent(text = "Greetings, $name! How can I assist you today?"), ), ), @@ -85,17 +88,17 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { ), ), ) { request -> - val special = request.arguments?.get("special") ?: specialCharsContent + val special = request.params.arguments?.get("special") ?: specialCharsContent GetPromptResult( description = specialCharsPromptDescription, messages = listOf( PromptMessage( - role = Role.user, + role = Role.User, content = TextContent(text = "Special characters: $special"), ), PromptMessage( - role = Role.assistant, + role = Role.Assistant, content = TextContent(text = "Received special characters: $special"), ), ), @@ -114,18 +117,18 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { ), ), ) { request -> - val size = request.arguments?.get("size")?.toIntOrNull() ?: 1 + val size = request.params.arguments?.get("size")?.toIntOrNull() ?: 1 val content = largePromptContent.repeat(size) GetPromptResult( description = largePromptDescription, messages = listOf( PromptMessage( - role = Role.user, + role = Role.User, content = TextContent(text = "Generate a large response"), ), PromptMessage( - role = Role.assistant, + role = Role.Assistant, content = TextContent(text = content), ), ), @@ -152,7 +155,7 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { // validate required arguments val requiredArgs = listOf("arg1", "arg2", "arg3") for (argName in requiredArgs) { - if (request.arguments?.get(argName) == null) { + if (request.params.arguments?.get(argName) == null) { throw IllegalArgumentException("Missing required argument: $argName") } } @@ -160,7 +163,7 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { val args = mutableMapOf() for (i in 1..10) { val argName = "arg$i" - val argValue = request.arguments?.get(argName) + val argValue = request.params.arguments?.get(argName) if (argValue != null) { args[argName] = argValue } @@ -170,7 +173,7 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { description = complexPromptDescription, messages = listOf( PromptMessage( - role = Role.user, + role = Role.User, content = TextContent( text = "Arguments: ${ args.entries.joinToString { @@ -180,7 +183,7 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { ), ), PromptMessage( - role = Role.assistant, + role = Role.Assistant, content = TextContent(text = "Received ${args.size} arguments"), ), ), @@ -199,38 +202,38 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { ), ), ) { request -> - val topic = request.arguments?.get("topic") ?: "weather" + val topic = request.params.arguments?.get("topic") ?: "weather" GetPromptResult( description = conversationPromptDescription, messages = listOf( PromptMessage( - role = Role.user, + role = Role.User, content = TextContent(text = "Let's talk about the $topic."), ), PromptMessage( - role = Role.assistant, + role = Role.Assistant, content = TextContent( text = "Sure, I'd love to discuss the $topic. What would you like to know?", ), ), PromptMessage( - role = Role.user, + role = Role.User, content = TextContent(text = "What's your opinion on the $topic?"), ), PromptMessage( - role = Role.assistant, + role = Role.Assistant, content = TextContent( text = "As an AI, I don't have personal opinions," + " but I can provide information about $topic.", ), ), PromptMessage( - role = Role.user, + role = Role.User, content = TextContent(text = "That's helpful, thank you!"), ), PromptMessage( - role = Role.assistant, + role = Role.Assistant, content = TextContent( text = "You're welcome! Let me know if you have more questions about $topic.", ), @@ -261,7 +264,7 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { ), ), ) { request -> - val args = request.arguments ?: emptyMap() + val args = request.params.arguments ?: emptyMap() val arg1 = args["requiredArg1"] ?: throw IllegalArgumentException( "Missing required argument: requiredArg1", ) @@ -274,11 +277,11 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { description = strictPromptDescription, messages = listOf( PromptMessage( - role = Role.user, + role = Role.User, content = TextContent(text = "Required arguments: $arg1, $arg2. Optional: $optArg"), ), PromptMessage( - role = Role.assistant, + role = Role.Assistant, content = TextContent(text = "I received your arguments: $arg1, $arg2, and $optArg"), ), ), @@ -319,8 +322,10 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { val testName = "Alice" val result = client.getPrompt( GetPromptRequest( - name = basicPromptName, - arguments = mapOf("name" to testName), + GetPromptRequestParams( + name = basicPromptName, + arguments = mapOf("name" to testName), + ), ), ) @@ -334,7 +339,7 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { assertTrue(result.messages.isNotEmpty(), "Prompt messages should not be empty") assertEquals(2, result.messages.size, "Prompt should have 2 messages") - val userMessage = result.messages.find { it.role == Role.user } + val userMessage = result.messages.find { it.role == Role.User } assertNotNull(userMessage, "User message should be in the list") val userContent = userMessage.content as? TextContent assertNotNull(userContent, "User message content should be TextContent") @@ -345,7 +350,7 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { "User message content should match", ) - val assistantMessage = result.messages.find { it.role == Role.assistant } + val assistantMessage = result.messages.find { it.role == Role.Assistant } assertNotNull(assistantMessage, "Assistant message should be in the list") val assistantContent = assistantMessage.content as? TextContent assertNotNull(assistantContent, "Assistant message content should be TextContent") @@ -373,48 +378,46 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { ) // test missing required arg - val exception = assertThrows { + val exception = assertThrows { runBlocking { client.getPrompt( GetPromptRequest( - name = strictPromptName, - arguments = mapOf("requiredArg1" to "value1"), + GetPromptRequestParams( + name = strictPromptName, + arguments = mapOf("requiredArg1" to "value1"), + ), ), ) } } - assertEquals( - true, - exception.message?.contains("requiredArg2"), - "Exception should mention the missing argument", - ) + assertTrue(exception.message.contains("requiredArg2"), "Exception should mention the missing argument") // test with no args - val exception2 = assertThrows { + val exception2 = assertThrows { runBlocking { client.getPrompt( GetPromptRequest( - name = strictPromptName, - arguments = emptyMap(), + GetPromptRequestParams( + name = strictPromptName, + arguments = emptyMap(), + ), ), ) } } - assertEquals( - exception2.message?.contains("requiredArg"), - true, - "Exception should mention a missing required argument", - ) + assertTrue(exception2.message.contains("requiredArg"), "Exception should mention a missing required argument") // test with all required args val result = client.getPrompt( GetPromptRequest( - name = strictPromptName, - arguments = mapOf( - "requiredArg1" to "value1", - "requiredArg2" to "value2", + GetPromptRequestParams( + name = strictPromptName, + arguments = mapOf( + "requiredArg1" to "value1", + "requiredArg2" to "value2", + ), ), ), ) @@ -422,7 +425,7 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { assertNotNull(result, "Get prompt result should not be null") assertEquals(2, result.messages.size, "Prompt should have 2 messages") - val userMessage = result.messages.find { it.role == Role.user } + val userMessage = result.messages.find { it.role == Role.User } assertNotNull(userMessage, "User message should be in the list") val userContent = userMessage.content as? TextContent assertNotNull(userContent, "User message content should be TextContent") @@ -436,8 +439,10 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { val topic = "climate change" val result = client.getPrompt( GetPromptRequest( - name = conversationPromptName, - arguments = mapOf("topic" to topic), + GetPromptRequestParams( + name = conversationPromptName, + arguments = mapOf("topic" to topic), + ), ), ) @@ -451,14 +456,14 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { assertTrue(result.messages.isNotEmpty(), "Prompt messages should not be empty") assertEquals(6, result.messages.size, "Prompt should have 6 messages") - val userMessages = result.messages.filter { it.role == Role.user } - val assistantMessages = result.messages.filter { it.role == Role.assistant } + val userMessages = result.messages.filter { it.role == Role.User } + val assistantMessages = result.messages.filter { it.role == Role.Assistant } assertEquals(3, userMessages.size, "Should have 3 user messages") assertEquals(3, assistantMessages.size, "Should have 3 assistant messages") for (i in 0 until result.messages.size) { - val expectedRole = if (i % 2 == 0) Role.user else Role.assistant + val expectedRole = if (i % 2 == 0) Role.User else Role.Assistant assertEquals( expectedRole, result.messages[i].role, @@ -487,8 +492,10 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { val testName = "Alice" val result = client.getPrompt( GetPromptRequest( - name = basicPromptName, - arguments = mapOf("name" to testName), + GetPromptRequestParams( + name = basicPromptName, + arguments = mapOf("name" to testName), + ), ), ) @@ -497,13 +504,13 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { assertEquals(2, result.messages.size, "Prompt should have 2 messages") - val userMessage = result.messages.find { it.role == Role.user } + val userMessage = result.messages.find { it.role == Role.User } assertNotNull(userMessage, "User message should be in the list") val userContent = userMessage.content as? TextContent assertNotNull(userContent, "User message content should be TextContent") assertEquals("Hello, $testName!", userContent.text, "User message content should match") - val assistantMessage = result.messages.find { it.role == Role.assistant } + val assistantMessage = result.messages.find { it.role == Role.Assistant } assertNotNull(assistantMessage, "Assistant message should be in the list") val assistantContent = assistantMessage.content as? TextContent assertNotNull(assistantContent, "Assistant message content should be TextContent") @@ -520,8 +527,10 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { val result = client.getPrompt( GetPromptRequest( - name = complexPromptName, - arguments = arguments, + GetPromptRequestParams( + name = complexPromptName, + arguments = arguments, + ), ), ) @@ -530,18 +539,18 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { assertEquals(2, result.messages.size, "Prompt should have 2 messages") - val userMessage = result.messages.find { it.role == Role.user } + val userMessage = result.messages.find { it.role == Role.User } assertNotNull(userMessage, "User message should be in the list") val userContent = userMessage.content as? TextContent assertNotNull(userContent, "User message content should be TextContent") // verify all arguments - val text = userContent.text ?: "" + val text = userContent.text for (i in 1..10) { assertTrue(text.contains("arg$i=value$i"), "Message should contain arg$i=value$i") } - val assistantMessage = result.messages.find { it.role == Role.assistant } + val assistantMessage = result.messages.find { it.role == Role.Assistant } assertNotNull(assistantMessage, "Assistant message should be in the list") val assistantContent = assistantMessage.content as? TextContent assertNotNull(assistantContent, "Assistant message content should be TextContent") @@ -556,8 +565,10 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { fun testLargePrompt() = runBlocking(Dispatchers.IO) { val result = client.getPrompt( GetPromptRequest( - name = largePromptName, - arguments = mapOf("size" to "1"), + GetPromptRequestParams( + name = largePromptName, + arguments = mapOf("size" to "1"), + ), ), ) @@ -566,11 +577,11 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { assertEquals(2, result.messages.size, "Prompt should have 2 messages") - val assistantMessage = result.messages.find { it.role == Role.assistant } + val assistantMessage = result.messages.find { it.role == Role.Assistant } assertNotNull(assistantMessage, "Assistant message should be in the list") val assistantContent = assistantMessage.content as? TextContent assertNotNull(assistantContent, "Assistant message content should be TextContent") - val text = assistantContent.text ?: "" + val text = assistantContent.text assertEquals(100_000, text.length, "Assistant message should be 100KB in size") } @@ -578,8 +589,10 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { fun testSpecialCharacters() = runBlocking(Dispatchers.IO) { val result = client.getPrompt( GetPromptRequest( - name = specialCharsPromptName, - arguments = mapOf("special" to specialCharsContent), + GetPromptRequestParams( + name = specialCharsPromptName, + arguments = mapOf("special" to specialCharsContent), + ), ), ) @@ -588,18 +601,18 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { assertEquals(2, result.messages.size, "Prompt should have 2 messages") - val userMessage = result.messages.find { it.role == Role.user } + val userMessage = result.messages.find { it.role == Role.User } assertNotNull(userMessage, "User message should be in the list") val userContent = userMessage.content as? TextContent assertNotNull(userContent, "User message content should be TextContent") - val userText = userContent.text ?: "" + val userText = userContent.text assertTrue(userText.contains(specialCharsContent), "User message should contain special characters") - val assistantMessage = result.messages.find { it.role == Role.assistant } + val assistantMessage = result.messages.find { it.role == Role.Assistant } assertNotNull(assistantMessage, "Assistant message should be in the list") val assistantContent = assistantMessage.content as? TextContent assertNotNull(assistantContent, "Assistant message content should be TextContent") - val assistantText = assistantContent.text ?: "" + val assistantText = assistantContent.text assertTrue( assistantText.contains(specialCharsContent), "Assistant message should contain special characters", @@ -630,8 +643,10 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { val result = client.getPrompt( GetPromptRequest( - name = promptName, - arguments = arguments, + GetPromptRequestParams( + name = promptName, + arguments = arguments, + ), ), ) @@ -654,20 +669,26 @@ abstract class AbstractPromptIntegrationTest : KotlinTestBase() { fun testNonExistentPrompt() = runTest { val nonExistentPromptName = "non-existent-prompt" - val exception = assertThrows { + val exception = assertThrows { runBlocking { client.getPrompt( GetPromptRequest( - name = nonExistentPromptName, - arguments = mapOf("name" to "Test"), + GetPromptRequestParams( + name = nonExistentPromptName, + arguments = mapOf("name" to "Test"), + ), ), ) } } - val msg = exception.message ?: "" - val expectedMessage = "JSONRPCError(code=InternalError, message=Prompt not found: non-existent-prompt, data={})" + val expectedMessage = "MCP error -32603: Prompt not found: non-existent-prompt" - assertEquals(expectedMessage, msg, "Unexpected error message for non-existent prompt") + assertEquals( + RPCError.ErrorCode.INTERNAL_ERROR, + exception.code, + "Exception code should be INTERNAL_ERROR: ${RPCError.ErrorCode.INTERNAL_ERROR}", + ) + assertEquals(expectedMessage, exception.message, "Unexpected error message for non-existent prompt") } } diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/AbstractResourceIntegrationTest.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/AbstractResourceIntegrationTest.kt index ad80567a..fc088103 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/AbstractResourceIntegrationTest.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/AbstractResourceIntegrationTest.kt @@ -1,12 +1,17 @@ package io.modelcontextprotocol.kotlin.sdk.integration.kotlin -import io.modelcontextprotocol.kotlin.sdk.BlobResourceContents -import io.modelcontextprotocol.kotlin.sdk.ReadResourceRequest -import io.modelcontextprotocol.kotlin.sdk.ReadResourceResult -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities -import io.modelcontextprotocol.kotlin.sdk.SubscribeRequest -import io.modelcontextprotocol.kotlin.sdk.TextResourceContents -import io.modelcontextprotocol.kotlin.sdk.UnsubscribeRequest +import io.modelcontextprotocol.kotlin.sdk.types.BlobResourceContents +import io.modelcontextprotocol.kotlin.sdk.types.McpException +import io.modelcontextprotocol.kotlin.sdk.types.RPCError +import io.modelcontextprotocol.kotlin.sdk.types.ReadResourceRequest +import io.modelcontextprotocol.kotlin.sdk.types.ReadResourceRequestParams +import io.modelcontextprotocol.kotlin.sdk.types.ReadResourceResult +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.SubscribeRequest +import io.modelcontextprotocol.kotlin.sdk.types.SubscribeRequestParams +import io.modelcontextprotocol.kotlin.sdk.types.TextResourceContents +import io.modelcontextprotocol.kotlin.sdk.types.UnsubscribeRequest +import io.modelcontextprotocol.kotlin.sdk.types.UnsubscribeRequestParams import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking @@ -59,7 +64,7 @@ abstract class AbstractResourceIntegrationTest : KotlinTestBase() { contents = listOf( TextResourceContents( text = testResourceContent, - uri = request.uri, + uri = request.params.uri, mimeType = "text/plain", ), ), @@ -76,7 +81,7 @@ abstract class AbstractResourceIntegrationTest : KotlinTestBase() { contents = listOf( TextResourceContents( text = testResourceContent, - uri = request.uri, + uri = request.params.uri, mimeType = "text/plain", ), ), @@ -93,7 +98,7 @@ abstract class AbstractResourceIntegrationTest : KotlinTestBase() { contents = listOf( BlobResourceContents( blob = binaryResourceContent, - uri = request.uri, + uri = request.params.uri, mimeType = "image/png", ), ), @@ -110,7 +115,7 @@ abstract class AbstractResourceIntegrationTest : KotlinTestBase() { contents = listOf( TextResourceContents( text = largeResourceContent, - uri = request.uri, + uri = request.params.uri, mimeType = "text/plain", ), ), @@ -127,7 +132,7 @@ abstract class AbstractResourceIntegrationTest : KotlinTestBase() { contents = listOf( TextResourceContents( text = if (dynamicResourceContent.get()) "Updated content" else "Original content", - uri = request.uri, + uri = request.params.uri, mimeType = "text/plain", ), ), @@ -150,7 +155,7 @@ abstract class AbstractResourceIntegrationTest : KotlinTestBase() { @Test fun testReadResource() = runBlocking(Dispatchers.IO) { - val result = client.readResource(ReadResourceRequest(uri = testResourceUri)) + val result = client.readResource(ReadResourceRequest(ReadResourceRequestParams(uri = testResourceUri))) assertNotNull(result, "Read resource result should not be null") assertTrue(result.contents.isNotEmpty(), "Resource contents should not be empty") @@ -164,17 +169,19 @@ abstract class AbstractResourceIntegrationTest : KotlinTestBase() { @Test fun testSubscribeAndUnsubscribe() { runBlocking(Dispatchers.IO) { - val subscribeResult = client.subscribeResource(SubscribeRequest(uri = testResourceUri)) + val subscribeResult = + client.subscribeResource(SubscribeRequest(SubscribeRequestParams(uri = testResourceUri))) assertNotNull(subscribeResult, "Subscribe result should not be null") - val unsubscribeResult = client.unsubscribeResource(UnsubscribeRequest(uri = testResourceUri)) + val unsubscribeResult = + client.unsubscribeResource(UnsubscribeRequest(UnsubscribeRequestParams(uri = testResourceUri))) assertNotNull(unsubscribeResult, "Unsubscribe result should not be null") } } @Test fun testBinaryResource() = runBlocking(Dispatchers.IO) { - val result = client.readResource(ReadResourceRequest(uri = binaryResourceUri)) + val result = client.readResource(ReadResourceRequest(ReadResourceRequestParams(uri = binaryResourceUri))) assertNotNull(result, "Read resource result should not be null") assertTrue(result.contents.isNotEmpty(), "Resource contents should not be empty") @@ -187,7 +194,7 @@ abstract class AbstractResourceIntegrationTest : KotlinTestBase() { @Test fun testLargeResource() = runBlocking(Dispatchers.IO) { - val result = client.readResource(ReadResourceRequest(uri = largeResourceUri)) + val result = client.readResource(ReadResourceRequest(ReadResourceRequestParams(uri = largeResourceUri))) assertNotNull(result, "Read resource result should not be null") assertTrue(result.contents.isNotEmpty(), "Resource contents should not be empty") @@ -202,22 +209,26 @@ abstract class AbstractResourceIntegrationTest : KotlinTestBase() { fun testInvalidResourceUri() = runTest { val invalidUri = "test://nonexistent.txt" - val exception = assertThrows { + val exception = assertThrows { runBlocking { - client.readResource(ReadResourceRequest(uri = invalidUri)) + client.readResource(ReadResourceRequest(ReadResourceRequestParams(uri = invalidUri))) } } - val msg = exception.message ?: "" - val expectedMessage = - "JSONRPCError(code=InternalError, message=Resource not found: test://nonexistent.txt, data={})" + val expectedMessage = "MCP error -32603: Resource not found: test://nonexistent.txt" - assertEquals(expectedMessage, msg, "Unexpected error message for invalid resource URI") + assertEquals( + RPCError.ErrorCode.INTERNAL_ERROR, + exception.code, + "Exception code should be INTERNAL_ERROR: ${RPCError.ErrorCode.INTERNAL_ERROR}", + ) + assertEquals(expectedMessage, exception.message, "Unexpected error message for invalid resource URI") } @Test fun testDynamicResource() = runBlocking(Dispatchers.IO) { - val initialResult = client.readResource(ReadResourceRequest(uri = dynamicResourceUri)) + val initialResult = + client.readResource(ReadResourceRequest(ReadResourceRequestParams(uri = dynamicResourceUri))) assertNotNull(initialResult, "Initial read result should not be null") val initialContent = (initialResult.contents.firstOrNull() as? TextResourceContents)?.text assertEquals("Original content", initialContent, "Initial content should match") @@ -225,7 +236,8 @@ abstract class AbstractResourceIntegrationTest : KotlinTestBase() { // update resource dynamicResourceContent.set(true) - val updatedResult = client.readResource(ReadResourceRequest(uri = dynamicResourceUri)) + val updatedResult = + client.readResource(ReadResourceRequest(ReadResourceRequestParams(uri = dynamicResourceUri))) assertNotNull(updatedResult, "Updated read result should not be null") val updatedContent = (updatedResult.contents.firstOrNull() as? TextResourceContents)?.text assertEquals("Updated content", updatedContent, "Updated content should match") @@ -248,7 +260,7 @@ abstract class AbstractResourceIntegrationTest : KotlinTestBase() { contents = listOf( TextResourceContents( text = "New resource content", - uri = request.uri, + uri = request.params.uri, mimeType = "text/plain", ), ), @@ -288,7 +300,7 @@ abstract class AbstractResourceIntegrationTest : KotlinTestBase() { else -> largeResourceUri } - val result = client.readResource(ReadResourceRequest(uri = uri)) + val result = client.readResource(ReadResourceRequest(ReadResourceRequestParams(uri = uri))) synchronized(results) { results.add(result) } diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/AbstractToolIntegrationTest.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/AbstractToolIntegrationTest.kt index ca88723f..7da82cc3 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/AbstractToolIntegrationTest.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/AbstractToolIntegrationTest.kt @@ -1,14 +1,14 @@ package io.modelcontextprotocol.kotlin.sdk.integration.kotlin import io.kotest.assertions.json.shouldEqualJson -import io.modelcontextprotocol.kotlin.sdk.CallToolRequest -import io.modelcontextprotocol.kotlin.sdk.CallToolResult -import io.modelcontextprotocol.kotlin.sdk.CallToolResultBase -import io.modelcontextprotocol.kotlin.sdk.ImageContent -import io.modelcontextprotocol.kotlin.sdk.PromptMessageContent -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities -import io.modelcontextprotocol.kotlin.sdk.TextContent -import io.modelcontextprotocol.kotlin.sdk.Tool +import io.modelcontextprotocol.kotlin.sdk.types.CallToolRequest +import io.modelcontextprotocol.kotlin.sdk.types.CallToolRequestParams +import io.modelcontextprotocol.kotlin.sdk.types.CallToolResult +import io.modelcontextprotocol.kotlin.sdk.types.ContentBlock +import io.modelcontextprotocol.kotlin.sdk.types.ImageContent +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.TextContent +import io.modelcontextprotocol.kotlin.sdk.types.ToolSchema import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -69,7 +69,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { server.addTool( name = testToolName, description = testToolDescription, - inputSchema = Tool.Input( + inputSchema = ToolSchema( properties = buildJsonObject { put( "text", @@ -82,7 +82,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { required = listOf("text"), ), ) { request -> - val text = (request.arguments["text"] as? JsonPrimitive)?.content ?: "No text provided" + val text = (request.params.arguments?.get("text") as? JsonPrimitive)?.content ?: "No text provided" CallToolResult( content = listOf(TextContent(text = "Echo: $text")), @@ -97,7 +97,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { server.addTool( name = basicToolName, description = basicToolDescription, - inputSchema = Tool.Input( + inputSchema = ToolSchema( properties = buildJsonObject { put( "text", @@ -110,7 +110,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { required = listOf("text"), ), ) { request -> - val text = (request.arguments["text"] as? JsonPrimitive)?.content ?: "No text provided" + val text = (request.params.arguments?.get("text") as? JsonPrimitive)?.content ?: "No text provided" CallToolResult( content = listOf(TextContent(text = "Echo: $text")), @@ -123,7 +123,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { server.addTool( name = specialCharsToolName, description = specialCharsToolDescription, - inputSchema = Tool.Input( + inputSchema = ToolSchema( properties = buildJsonObject { put( "special", @@ -135,7 +135,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { }, ), ) { request -> - val special = (request.arguments["special"] as? JsonPrimitive)?.content ?: specialCharsContent + val special = (request.params.arguments?.get("special") as? JsonPrimitive)?.content ?: specialCharsContent CallToolResult( content = listOf(TextContent(text = "Received special characters: $special")), @@ -149,7 +149,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { server.addTool( name = slowToolName, description = slowToolDescription, - inputSchema = Tool.Input( + inputSchema = ToolSchema( properties = buildJsonObject { put( "delay", @@ -161,7 +161,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { }, ), ) { request -> - val delay = (request.arguments["delay"] as? JsonPrimitive)?.content?.toIntOrNull() ?: 1000 + val delay = (request.params.arguments?.get("delay") as? JsonPrimitive)?.content?.toIntOrNull() ?: 1000 // simulate slow operation runBlocking { @@ -179,7 +179,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { server.addTool( name = largeToolName, description = largeToolDescription, - inputSchema = Tool.Input( + inputSchema = ToolSchema( properties = buildJsonObject { put( "size", @@ -191,7 +191,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { }, ), ) { request -> - val size = (request.arguments["size"] as? JsonPrimitive)?.content?.toIntOrNull() ?: 1 + val size = (request.params.arguments?.get("size") as? JsonPrimitive)?.content?.toIntOrNull() ?: 1 val content = largeToolContent.take(largeToolContent.length.coerceAtMost(size * 1000)) CallToolResult( @@ -205,7 +205,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { server.addTool( name = complexToolName, description = complexToolDescription, - inputSchema = Tool.Input( + inputSchema = ToolSchema( properties = buildJsonObject { put( "operation", @@ -270,12 +270,13 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { required = listOf("operation", "a", "b"), ), ) { request -> - val operation = (request.arguments["operation"] as? JsonPrimitive)?.content ?: "add" - val a = (request.arguments["a"] as? JsonPrimitive)?.content?.toDoubleOrNull() ?: 0.0 - val b = (request.arguments["b"] as? JsonPrimitive)?.content?.toDoubleOrNull() ?: 0.0 - val precision = (request.arguments["precision"] as? JsonPrimitive)?.content?.toIntOrNull() ?: 2 - val showSteps = (request.arguments["showSteps"] as? JsonPrimitive)?.content?.toBoolean() ?: false - val tags = (request.arguments["tags"] as? JsonArray)?.mapNotNull { + val operation = (request.params.arguments?.get("operation") as? JsonPrimitive)?.content ?: "add" + val a = (request.params.arguments?.get("a") as? JsonPrimitive)?.content?.toDoubleOrNull() ?: 0.0 + val b = (request.params.arguments?.get("b") as? JsonPrimitive)?.content?.toDoubleOrNull() ?: 0.0 + val precision = (request.params.arguments?.get("precision") as? JsonPrimitive)?.content?.toIntOrNull() ?: 2 + val showSteps = + (request.params.arguments?.get("showSteps") as? JsonPrimitive)?.content?.toBoolean() ?: false + val tags = (request.params.arguments?.get("tags") as? JsonArray)?.mapNotNull { (it as? JsonPrimitive)?.content } ?: emptyList() @@ -319,7 +320,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { server.addTool( name = errorToolName, description = errorToolDescription, - inputSchema = Tool.Input( + inputSchema = ToolSchema( properties = buildJsonObject { put( "errorType", @@ -348,8 +349,8 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { required = listOf("errorType"), ), ) { request -> - val errorType = (request.arguments["errorType"] as? JsonPrimitive)?.content ?: "none" - val message = (request.arguments["message"] as? JsonPrimitive)?.content ?: "An error occurred" + val errorType = (request.params.arguments?.get("errorType") as? JsonPrimitive)?.content ?: "none" + val message = (request.params.arguments?.get("message") as? JsonPrimitive)?.content ?: "An error occurred" when (errorType) { "exception" -> throw IllegalArgumentException(message) @@ -377,7 +378,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { server.addTool( name = multiContentToolName, description = multiContentToolDescription, - inputSchema = Tool.Input( + inputSchema = ToolSchema( properties = buildJsonObject { put( "text", @@ -398,10 +399,11 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { required = listOf("text"), ), ) { request -> - val text = (request.arguments["text"] as? JsonPrimitive)?.content ?: "Default text" - val includeImage = (request.arguments["includeImage"] as? JsonPrimitive)?.content?.toBoolean() ?: true + val text = (request.params.arguments?.get("text") as? JsonPrimitive)?.content ?: "Default text" + val includeImage = + (request.params.arguments?.get("includeImage") as? JsonPrimitive)?.content?.toBoolean() ?: true - val content = mutableListOf( + val content = mutableListOf( TextContent(text = "Text content: $text"), ) @@ -446,7 +448,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { val testText = "Hello, world!" val arguments = mapOf("text" to testText) - val result = client.callTool(testToolName, arguments) as CallToolResultBase + val result = client.callTool(testToolName, arguments) val actualContent = result.structuredContent.toString() val expectedContent = """ @@ -472,7 +474,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { "tags" to listOf("test", "calculator", "integration"), ) - val result = client.callTool(complexToolName, arguments) as CallToolResultBase + val result = client.callTool(complexToolName, arguments) val actualContent = result.structuredContent.toString() val expectedContent = """ @@ -495,7 +497,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { val successArgs = mapOf("errorType" to "none") val successResult = client.callTool(errorToolName, successArgs) - val actualContent = successResult?.structuredContent.toString() + val actualContent = successResult.structuredContent.toString() val expectedContent = """ { "error" : false, @@ -509,7 +511,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { "errorType" to "error", "message" to "Custom error message", ) - val errorResult = client.callTool(errorToolName, errorArgs) as CallToolResultBase + val errorResult = client.callTool(errorToolName, errorArgs) val actualError = errorResult.structuredContent.toString() val expectedError = """ @@ -526,14 +528,14 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { "message" to "My exception message", ) - val exceptionResult = client.callTool(errorToolName, exceptionArgs) as CallToolResultBase + val exceptionResult = client.callTool(errorToolName, exceptionArgs) assertTrue(exceptionResult.isError ?: false, "isError should be true for exception") val exceptionContent = exceptionResult.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(exceptionContent, "Error content should be present in the result") - val exceptionText = exceptionContent.text ?: "" + val exceptionText = exceptionContent.text assertTrue( exceptionText.contains("Error executing tool") && exceptionText.contains("My exception message"), "Error message should contain the exception details", @@ -548,7 +550,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { "includeImage" to true, ) - val result = client.callTool(multiContentToolName, arguments) as CallToolResultBase + val result = client.callTool(multiContentToolName, arguments) assertEquals( 2, @@ -585,7 +587,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { "includeImage" to false, ) - val textOnlyResult = client.callTool(multiContentToolName, textOnlyArgs) as CallToolResultBase + val textOnlyResult = client.callTool(multiContentToolName, textOnlyArgs) assertEquals( 1, @@ -622,10 +624,12 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { val result = client.callTool( CallToolRequest( - name = complexToolName, - arguments = arguments, + CallToolRequestParams( + name = complexToolName, + arguments = arguments, + ), ), - ) as CallToolResultBase + ) val actualContent = result.structuredContent.toString() val expectedContent = """ @@ -648,7 +652,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { val size = 10 val arguments = mapOf("size" to size) - val result = client.callTool(largeToolName, arguments) as CallToolResultBase + val result = client.callTool(largeToolName, arguments) val content = result.content.firstOrNull() as TextContent assertNotNull(content, "Tool result content should be TextContent") @@ -669,7 +673,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { val arguments = mapOf("delay" to delay) val startTime = System.currentTimeMillis() - val result = client.callTool(slowToolName, arguments) as CallToolResultBase + val result = client.callTool(slowToolName, arguments) val endTime = System.currentTimeMillis() val content = result.content.firstOrNull() as? TextContent @@ -692,11 +696,11 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { runBlocking(Dispatchers.IO) { val arguments = mapOf("special" to specialCharsContent) - val result = client.callTool(specialCharsToolName, arguments) as CallToolResultBase + val result = client.callTool(specialCharsToolName, arguments) val content = result.content.firstOrNull() as? TextContent assertNotNull(content, "Tool result content should be TextContent") - val text = content.text ?: "" + val text = content.text assertTrue(text.contains(specialCharsContent), "Result should contain the special characters") @@ -715,7 +719,7 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { @Test fun testConcurrentToolCalls() = runTest { val concurrentCount = 10 - val results = mutableListOf() + val results = mutableListOf() runBlocking { repeat(concurrentCount) { index -> @@ -776,13 +780,12 @@ abstract class AbstractToolIntegrationTest : KotlinTestBase() { } assertNotNull(result, "Tool call result should not be null") - val callResult = result as CallToolResult - assertTrue(callResult.isError ?: false, "isError should be true for non-existent tool") + assertTrue(result.isError ?: false, "isError should be true for non-existent tool") - val textContent = callResult.content.firstOrNull { it is TextContent } as? TextContent + val textContent = result.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(textContent, "Error content should be present in the result") - val errorText = textContent.text ?: "" + val errorText = textContent.text assertTrue( errorText.contains("non-existent-tool") && errorText.contains("not found"), "Error message should indicate the tool was not found", diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/KotlinTestBase.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/KotlinTestBase.kt index 66b166cc..e409ec6a 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/KotlinTestBase.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/KotlinTestBase.kt @@ -7,8 +7,6 @@ import io.ktor.server.application.install import io.ktor.server.engine.EmbeddedServer import io.ktor.server.engine.embeddedServer import io.ktor.server.routing.routing -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities import io.modelcontextprotocol.kotlin.sdk.client.Client import io.modelcontextprotocol.kotlin.sdk.client.SseClientTransport import io.modelcontextprotocol.kotlin.sdk.client.StdioClientTransport @@ -17,6 +15,8 @@ import io.modelcontextprotocol.kotlin.sdk.server.Server import io.modelcontextprotocol.kotlin.sdk.server.ServerOptions import io.modelcontextprotocol.kotlin.sdk.server.StdioServerTransport import io.modelcontextprotocol.kotlin.sdk.server.mcp +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withTimeout import kotlinx.io.Sink diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/websocket/WebSocketIntegrationTest.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/websocket/WebSocketIntegrationTest.kt index 6200e083..ab0d8480 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/websocket/WebSocketIntegrationTest.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/kotlin/websocket/WebSocketIntegrationTest.kt @@ -6,19 +6,20 @@ import io.ktor.server.cio.CIOApplicationEngine import io.ktor.server.engine.EmbeddedServer import io.ktor.server.engine.embeddedServer import io.ktor.server.routing.routing -import io.modelcontextprotocol.kotlin.sdk.GetPromptRequest -import io.modelcontextprotocol.kotlin.sdk.GetPromptResult -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.PromptArgument -import io.modelcontextprotocol.kotlin.sdk.PromptMessage -import io.modelcontextprotocol.kotlin.sdk.Role -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities -import io.modelcontextprotocol.kotlin.sdk.TextContent import io.modelcontextprotocol.kotlin.sdk.client.Client import io.modelcontextprotocol.kotlin.sdk.client.mcpWebSocketTransport import io.modelcontextprotocol.kotlin.sdk.server.Server import io.modelcontextprotocol.kotlin.sdk.server.ServerOptions import io.modelcontextprotocol.kotlin.sdk.server.mcpWebSocket +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptRequest +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptRequestParams +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptResult +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.PromptArgument +import io.modelcontextprotocol.kotlin.sdk.types.PromptMessage +import io.modelcontextprotocol.kotlin.sdk.types.Role +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.TextContent import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.test.runTest import kotlinx.coroutines.withContext @@ -154,13 +155,13 @@ class WebSocketIntegrationTest { ), ) { request -> GetPromptResult( - "Prompt for ${request.name}", messages = listOf( PromptMessage( - role = Role.user, - content = TextContent("Prompt for client ${request.arguments?.get("client")}"), + role = Role.User, + content = TextContent("Prompt for client ${request.params.arguments?.get("client")}"), ), ), + description = "Prompt for ${request.params.name}", ) } @@ -180,8 +181,10 @@ class WebSocketIntegrationTest { private suspend fun getPrompt(client: Client, clientName: String): String { val response = client.getPrompt( GetPromptRequest( - "prompt", - arguments = mapOf("client" to clientName), + GetPromptRequestParams( + name = "prompt", + arguments = mapOf("client" to clientName), + ), ), ) diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/sse/AbstractSseIntegrationTest.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/sse/AbstractSseIntegrationTest.kt index 26289250..8f6aed63 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/sse/AbstractSseIntegrationTest.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/sse/AbstractSseIntegrationTest.kt @@ -7,18 +7,18 @@ import io.ktor.server.cio.CIOApplicationEngine import io.ktor.server.engine.EmbeddedServer import io.ktor.server.engine.embeddedServer import io.ktor.server.routing.routing -import io.modelcontextprotocol.kotlin.sdk.GetPromptResult -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.PromptArgument -import io.modelcontextprotocol.kotlin.sdk.PromptMessage -import io.modelcontextprotocol.kotlin.sdk.Role -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities -import io.modelcontextprotocol.kotlin.sdk.TextContent import io.modelcontextprotocol.kotlin.sdk.client.Client import io.modelcontextprotocol.kotlin.sdk.client.mcpSseTransport import io.modelcontextprotocol.kotlin.sdk.server.Server import io.modelcontextprotocol.kotlin.sdk.server.ServerOptions import io.modelcontextprotocol.kotlin.sdk.server.mcp +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptResult +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.PromptArgument +import io.modelcontextprotocol.kotlin.sdk.types.PromptMessage +import io.modelcontextprotocol.kotlin.sdk.types.Role +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.TextContent import io.ktor.client.engine.cio.CIO as ClientCIO import io.ktor.server.cio.CIO as ServerCIO import io.ktor.server.sse.SSE as ServerSSE @@ -70,13 +70,13 @@ open class AbstractSseIntegrationTest { ), ) { request -> GetPromptResult( - "Prompt for ${request.name}", messages = listOf( PromptMessage( - role = Role.user, - content = TextContent("Prompt for client ${request.arguments?.get("client")}"), + role = Role.User, + content = TextContent("Prompt for client ${request.params.arguments?.get("client")}"), ), ), + description = "Prompt for ${request.params.name}", ) } } diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/sse/SseIntegrationTest.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/sse/SseIntegrationTest.kt index 55e833b3..0826eb21 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/sse/SseIntegrationTest.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/sse/SseIntegrationTest.kt @@ -2,9 +2,10 @@ package io.modelcontextprotocol.kotlin.sdk.integration.sse import io.ktor.server.cio.CIOApplicationEngine import io.ktor.server.engine.EmbeddedServer -import io.modelcontextprotocol.kotlin.sdk.GetPromptRequest -import io.modelcontextprotocol.kotlin.sdk.TextContent import io.modelcontextprotocol.kotlin.sdk.client.Client +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptRequest +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptRequestParams +import io.modelcontextprotocol.kotlin.sdk.types.TextContent import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.test.runTest import kotlinx.coroutines.withContext @@ -100,8 +101,10 @@ class SseIntegrationTest : AbstractSseIntegrationTest() { private suspend fun getPrompt(client: Client, clientName: String): String { val response = client.getPrompt( GetPromptRequest( - "prompt", - arguments = mapOf("client" to clientName), + GetPromptRequestParams( + name = "prompt", + arguments = mapOf("client" to clientName), + ), ), ) diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/AbstractKotlinClientTsServerTest.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/AbstractKotlinClientTsServerTest.kt index 51179982..5d045127 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/AbstractKotlinClientTsServerTest.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/AbstractKotlinClientTsServerTest.kt @@ -1,8 +1,7 @@ package io.modelcontextprotocol.kotlin.sdk.integration.typescript -import io.modelcontextprotocol.kotlin.sdk.CallToolResult -import io.modelcontextprotocol.kotlin.sdk.TextContent import io.modelcontextprotocol.kotlin.sdk.client.Client +import io.modelcontextprotocol.kotlin.sdk.types.TextContent import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import org.junit.jupiter.api.Test @@ -50,7 +49,7 @@ abstract class AbstractKotlinClientTsServerTest : TsTestBase() { val arguments = mapOf("name" to testName) val result = client.callTool("greet", arguments) assertNotNull(result, "Tool call result should not be null") - val callResult = result as CallToolResult + val callResult = result val textContent = callResult.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(textContent, "Text content should be present in the result") assertEquals("Hello, $testName!", textContent.text) diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/TsTestBase.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/TsTestBase.kt index 21593fe2..22af65a0 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/TsTestBase.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/TsTestBase.kt @@ -3,7 +3,6 @@ package io.modelcontextprotocol.kotlin.sdk.integration.typescript import io.ktor.client.HttpClient import io.ktor.client.engine.cio.CIO import io.ktor.client.plugins.sse.SSE -import io.modelcontextprotocol.kotlin.sdk.Implementation import io.modelcontextprotocol.kotlin.sdk.client.Client import io.modelcontextprotocol.kotlin.sdk.client.StdioClientTransport import io.modelcontextprotocol.kotlin.sdk.client.mcpStreamableHttp @@ -11,6 +10,7 @@ import io.modelcontextprotocol.kotlin.sdk.integration.typescript.sse.KotlinServe import io.modelcontextprotocol.kotlin.sdk.integration.utils.Retry import io.modelcontextprotocol.kotlin.sdk.server.Server import io.modelcontextprotocol.kotlin.sdk.server.StdioServerTransport +import io.modelcontextprotocol.kotlin.sdk.types.Implementation import kotlinx.coroutines.withTimeout import kotlinx.io.Sink import kotlinx.io.Source diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/sse/KotlinClientTsServerEdgeCasesTestSse.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/sse/KotlinClientTsServerEdgeCasesTestSse.kt index de275666..54c6e0f2 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/sse/KotlinClientTsServerEdgeCasesTestSse.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/sse/KotlinClientTsServerEdgeCasesTestSse.kt @@ -1,10 +1,9 @@ package io.modelcontextprotocol.kotlin.sdk.integration.typescript.sse -import io.modelcontextprotocol.kotlin.sdk.CallToolResult -import io.modelcontextprotocol.kotlin.sdk.TextContent import io.modelcontextprotocol.kotlin.sdk.client.Client import io.modelcontextprotocol.kotlin.sdk.integration.typescript.TransportKind import io.modelcontextprotocol.kotlin.sdk.integration.typescript.TsTestBase +import io.modelcontextprotocol.kotlin.sdk.types.TextContent import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -76,13 +75,12 @@ class KotlinClientTsServerEdgeCasesTestSse : TsTestBase() { val result = client.callTool(nonExistentToolName, arguments) assertNotNull(result, "Tool call result should not be null") - val callResult = result as CallToolResult - assertTrue(callResult.isError ?: false, "isError should be true for non-existent tool") + assertTrue(result.isError ?: false, "isError should be true for non-existent tool") - val textContent = callResult.content.firstOrNull { it is TextContent } as? TextContent + val textContent = result.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(textContent, "Error content should be present in the result") - val errorText = textContent.text ?: "" + val errorText = textContent.text assertTrue( errorText.contains("non-existent-tool") && errorText.contains("not found"), "Error message should indicate the tool was not found", @@ -100,11 +98,10 @@ class KotlinClientTsServerEdgeCasesTestSse : TsTestBase() { val result = client.callTool("greet", arguments) assertNotNull(result, "Tool call result should not be null") - val callResult = result as CallToolResult - val textContent = callResult.content.firstOrNull { it is TextContent } as? TextContent + val textContent = result.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(textContent, "Text content should be present in the result") - val text = textContent.text ?: "" + val text = textContent.text assertTrue( text.contains(specialChars), "Tool response should contain the special characters", @@ -122,11 +119,10 @@ class KotlinClientTsServerEdgeCasesTestSse : TsTestBase() { val result = client.callTool("greet", arguments) assertNotNull(result, "Tool call result should not be null") - val callResult = result as CallToolResult - val textContent = callResult.content.firstOrNull { it is TextContent } as? TextContent + val textContent = result.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(textContent, "Text content should be present in the result") - val text = textContent.text ?: "" + val text = textContent.text assertTrue( text.contains("Hello,") && text.contains("A"), "Tool response should contain the greeting with the large name", @@ -148,11 +144,10 @@ class KotlinClientTsServerEdgeCasesTestSse : TsTestBase() { val result = client.callTool("greet", arguments) assertNotNull(result, "Tool call result should not be null for client $i") - val callResult = result as CallToolResult - val textContent = callResult.content.firstOrNull { it is TextContent } as? TextContent + val textContent = result.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(textContent, "Text content should be present for client $i") - textContent.text ?: "" + textContent.text } } results.awaitAll() @@ -181,13 +176,12 @@ class KotlinClientTsServerEdgeCasesTestSse : TsTestBase() { val result = client.callTool("greet", invalidArguments) assertNotNull(result, "Tool call result should not be null") - val callResult = result as CallToolResult - assertTrue(callResult.isError ?: false, "isError should be true for invalid arguments") + assertTrue(result.isError ?: false, "isError should be true for invalid arguments") - val textContent = callResult.content.firstOrNull { it is TextContent } as? TextContent + val textContent = result.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(textContent, "Error content should be present in the result") - val errorText = textContent.text ?: "" + val errorText = textContent.text assertTrue( errorText.contains("Invalid arguments") && errorText.contains("greet"), "Error message should indicate invalid arguments for tool greet", @@ -206,7 +200,7 @@ class KotlinClientTsServerEdgeCasesTestSse : TsTestBase() { val result = client.callTool("greet", arguments) assertNotNull(result, "Tool call result should not be null for call $i") - val callResult = result as CallToolResult + val callResult = result val textContent = callResult.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(textContent, "Text content should be present for call $i") diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/sse/KotlinServerForTsClientSse.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/sse/KotlinServerForTsClientSse.kt index c51454df..3aa36bc7 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/sse/KotlinServerForTsClientSse.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/sse/KotlinServerForTsClientSse.kt @@ -17,28 +17,28 @@ import io.ktor.server.routing.delete import io.ktor.server.routing.get import io.ktor.server.routing.post import io.ktor.server.routing.routing -import io.modelcontextprotocol.kotlin.sdk.CallToolResult -import io.modelcontextprotocol.kotlin.sdk.ErrorCode -import io.modelcontextprotocol.kotlin.sdk.GetPromptResult -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.JSONRPCError -import io.modelcontextprotocol.kotlin.sdk.JSONRPCMessage -import io.modelcontextprotocol.kotlin.sdk.JSONRPCNotification -import io.modelcontextprotocol.kotlin.sdk.JSONRPCRequest -import io.modelcontextprotocol.kotlin.sdk.JSONRPCResponse -import io.modelcontextprotocol.kotlin.sdk.PromptArgument -import io.modelcontextprotocol.kotlin.sdk.PromptMessage -import io.modelcontextprotocol.kotlin.sdk.ReadResourceResult -import io.modelcontextprotocol.kotlin.sdk.RequestId -import io.modelcontextprotocol.kotlin.sdk.Role -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities -import io.modelcontextprotocol.kotlin.sdk.TextContent -import io.modelcontextprotocol.kotlin.sdk.TextResourceContents -import io.modelcontextprotocol.kotlin.sdk.Tool import io.modelcontextprotocol.kotlin.sdk.server.Server import io.modelcontextprotocol.kotlin.sdk.server.ServerOptions import io.modelcontextprotocol.kotlin.sdk.shared.AbstractTransport -import io.modelcontextprotocol.kotlin.sdk.shared.McpJson +import io.modelcontextprotocol.kotlin.sdk.types.CallToolResult +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptResult +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCError +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCMessage +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCNotification +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCRequest +import io.modelcontextprotocol.kotlin.sdk.types.JSONRPCResponse +import io.modelcontextprotocol.kotlin.sdk.types.McpJson +import io.modelcontextprotocol.kotlin.sdk.types.PromptArgument +import io.modelcontextprotocol.kotlin.sdk.types.PromptMessage +import io.modelcontextprotocol.kotlin.sdk.types.RPCError +import io.modelcontextprotocol.kotlin.sdk.types.ReadResourceResult +import io.modelcontextprotocol.kotlin.sdk.types.RequestId +import io.modelcontextprotocol.kotlin.sdk.types.Role +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.TextContent +import io.modelcontextprotocol.kotlin.sdk.types.TextResourceContents +import io.modelcontextprotocol.kotlin.sdk.types.ToolSchema import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.channels.Channel @@ -211,7 +211,7 @@ class KotlinServerForTsClient { server.addTool( name = "greet", description = "A simple greeting tool", - inputSchema = Tool.Input( + inputSchema = ToolSchema( properties = buildJsonObject { put( "name", @@ -224,7 +224,7 @@ class KotlinServerForTsClient { required = listOf("name"), ), ) { request -> - val name = (request.arguments["name"] as? JsonPrimitive)?.content ?: "World" + val name = (request.params.arguments?.get("name") as? JsonPrimitive)?.content ?: "World" CallToolResult( content = listOf(TextContent("Hello, $name!")), structuredContent = buildJsonObject { @@ -236,7 +236,7 @@ class KotlinServerForTsClient { server.addTool( name = "multi-greet", description = "A greeting tool that sends multiple notifications", - inputSchema = Tool.Input( + inputSchema = ToolSchema( properties = buildJsonObject { put( "name", @@ -249,7 +249,7 @@ class KotlinServerForTsClient { required = listOf("name"), ), ) { request -> - val name = (request.arguments["name"] as? JsonPrimitive)?.content ?: "World" + val name = (request.params.arguments?.get("name") as? JsonPrimitive)?.content ?: "World" CallToolResult( content = listOf(TextContent("Multiple greetings sent to $name!")), @@ -272,15 +272,15 @@ class KotlinServerForTsClient { ), ) { request -> GetPromptResult( - "Greeting for ${request.name}", messages = listOf( PromptMessage( - role = Role.user, + role = Role.User, content = TextContent( - "Please greet ${request.arguments?.get("name") ?: "someone"} in a friendly manner.", + "Please greet ${request.params.arguments?.get("name") ?: "someone"} in a friendly manner.", ), ), ), + description = "Greeting for ${request.params.name}", ) } @@ -292,7 +292,7 @@ class KotlinServerForTsClient { ) { request -> ReadResourceResult( contents = listOf( - TextResourceContents("Hello, world!", request.uri, "text/plain"), + TextResourceContents("Hello, world!", request.params.uri, "text/plain"), ), ) } @@ -366,10 +366,10 @@ class HttpServerTransport(private val sessionId: String) : AbstractTransport() { logger.warn { "Timeout waiting for response to request ID: $id" } call.respondText( McpJson.encodeToString( - JSONRPCResponse( + JSONRPCError( id = message.id, - error = JSONRPCError( - code = ErrorCode.Defined.RequestTimeout, + error = RPCError( + code = RPCError.ErrorCode.REQUEST_TIMEOUT, message = "Request timed out", ), ), @@ -383,10 +383,10 @@ class HttpServerTransport(private val sessionId: String) : AbstractTransport() { if (!call.response.isCommitted) { call.respondText( McpJson.encodeToString( - JSONRPCResponse( + JSONRPCError( id = message.id, - error = JSONRPCError( - code = ErrorCode.Defined.ConnectionClosed, + error = RPCError( + code = RPCError.ErrorCode.CONNECTION_CLOSED, message = "Request cancelled", ), ), @@ -403,10 +403,10 @@ class HttpServerTransport(private val sessionId: String) : AbstractTransport() { logger.error(e) { "Error handling request" } if (!call.response.isCommitted) { try { - val errorResponse = JSONRPCResponse( - id = RequestId.NumberId(0), - error = JSONRPCError( - code = ErrorCode.Defined.InternalError, + val errorResponse = JSONRPCError( + id = RequestId(0), + error = RPCError( + code = RPCError.ErrorCode.INTERNAL_ERROR, message = "Internal server error: ${e.message}", ), ) diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/stdio/KotlinClientTsServerEdgeCasesTestStdio.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/stdio/KotlinClientTsServerEdgeCasesTestStdio.kt index b6e385f9..fcab03c3 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/stdio/KotlinClientTsServerEdgeCasesTestStdio.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/integration/typescript/stdio/KotlinClientTsServerEdgeCasesTestStdio.kt @@ -1,10 +1,9 @@ package io.modelcontextprotocol.kotlin.sdk.integration.typescript.stdio -import io.modelcontextprotocol.kotlin.sdk.CallToolResult -import io.modelcontextprotocol.kotlin.sdk.TextContent import io.modelcontextprotocol.kotlin.sdk.client.Client import io.modelcontextprotocol.kotlin.sdk.integration.typescript.TransportKind import io.modelcontextprotocol.kotlin.sdk.integration.typescript.TsTestBase +import io.modelcontextprotocol.kotlin.sdk.types.TextContent import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -33,13 +32,12 @@ class KotlinClientTsServerEdgeCasesTestStdio : TsTestBase() { val result = client.callTool(nonExistentToolName, arguments) assertNotNull(result, "Tool call result should not be null") - val callResult = result as CallToolResult - assertTrue(callResult.isError ?: false, "isError should be true for non-existent tool") + assertTrue(result.isError ?: false, "isError should be true for non-existent tool") - val textContent = callResult.content.firstOrNull { it is TextContent } as? TextContent + val textContent = result.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(textContent, "Error content should be present in the result") - val errorText = textContent.text ?: "" + val errorText = textContent.text assertTrue( errorText.contains("non-existent-tool") && errorText.contains("not found"), "Error message should indicate the tool was not found", @@ -57,11 +55,10 @@ class KotlinClientTsServerEdgeCasesTestStdio : TsTestBase() { val result = client.callTool("greet", arguments) assertNotNull(result, "Tool call result should not be null") - val callResult = result as CallToolResult - val textContent = callResult.content.firstOrNull { it is TextContent } as? TextContent + val textContent = result.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(textContent, "Text content should be present in the result") - val text = textContent.text ?: "" + val text = textContent.text assertTrue( text.contains(specialChars), "Tool response should contain the special characters", @@ -79,11 +76,11 @@ class KotlinClientTsServerEdgeCasesTestStdio : TsTestBase() { val result = client.callTool("greet", arguments) assertNotNull(result, "Tool call result should not be null") - val callResult = result as CallToolResult + val callResult = result val textContent = callResult.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(textContent, "Text content should be present in the result") - val text = textContent.text ?: "" + val text = textContent.text assertTrue( text.contains("Hello,") && text.contains("A"), "Tool response should contain the greeting with the large name", @@ -105,11 +102,11 @@ class KotlinClientTsServerEdgeCasesTestStdio : TsTestBase() { val result = client.callTool("greet", arguments) assertNotNull(result, "Tool call result should not be null for client $i") - val callResult = result as CallToolResult + val callResult = result val textContent = callResult.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(textContent, "Text content should be present for client $i") - textContent.text ?: "" + textContent.text } } results.awaitAll() @@ -138,13 +135,13 @@ class KotlinClientTsServerEdgeCasesTestStdio : TsTestBase() { val result = client.callTool("greet", invalidArguments) assertNotNull(result, "Tool call result should not be null") - val callResult = result as CallToolResult + val callResult = result assertTrue(callResult.isError ?: false, "isError should be true for invalid arguments") val textContent = callResult.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(textContent, "Error content should be present in the result") - val errorText = textContent.text ?: "" + val errorText = textContent.text assertTrue( errorText.contains("Invalid arguments") && errorText.contains("greet"), "Error message should indicate invalid arguments for tool greet", @@ -163,8 +160,7 @@ class KotlinClientTsServerEdgeCasesTestStdio : TsTestBase() { val result = client.callTool("greet", arguments) assertNotNull(result, "Tool call result should not be null for call $i") - val callResult = result as CallToolResult - val textContent = callResult.content.firstOrNull { it is TextContent } as? TextContent + val textContent = result.content.firstOrNull { it is TextContent } as? TextContent assertNotNull(textContent, "Text content should be present for call $i") assertEquals( diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/AbstractServerFeaturesTest.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/AbstractServerFeaturesTest.kt index 3feea029..21b46d2b 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/AbstractServerFeaturesTest.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/AbstractServerFeaturesTest.kt @@ -1,9 +1,9 @@ package io.modelcontextprotocol.kotlin.sdk.server -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities import io.modelcontextprotocol.kotlin.sdk.client.Client import io.modelcontextprotocol.kotlin.sdk.shared.InMemoryTransport +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import org.junit.jupiter.api.BeforeEach diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerInstructionsTest.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerInstructionsTest.kt index 89eeaef2..a3c60374 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerInstructionsTest.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerInstructionsTest.kt @@ -1,9 +1,9 @@ package io.modelcontextprotocol.kotlin.sdk.server -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities import io.modelcontextprotocol.kotlin.sdk.client.Client import io.modelcontextprotocol.kotlin.sdk.shared.InMemoryTransport +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertNull diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerPromptsTest.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerPromptsTest.kt index ffaff6b4..60de0cab 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerPromptsTest.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerPromptsTest.kt @@ -1,11 +1,11 @@ package io.modelcontextprotocol.kotlin.sdk.server -import io.modelcontextprotocol.kotlin.sdk.GetPromptResult -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.Method -import io.modelcontextprotocol.kotlin.sdk.Prompt -import io.modelcontextprotocol.kotlin.sdk.PromptListChangedNotification -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.GetPromptResult +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.Method +import io.modelcontextprotocol.kotlin.sdk.types.Prompt +import io.modelcontextprotocol.kotlin.sdk.types.PromptListChangedNotification +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.Test diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerResourcesTest.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerResourcesTest.kt index ac9e979e..ad73c834 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerResourcesTest.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerResourcesTest.kt @@ -1,11 +1,11 @@ package io.modelcontextprotocol.kotlin.sdk.server -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.Method -import io.modelcontextprotocol.kotlin.sdk.ReadResourceResult -import io.modelcontextprotocol.kotlin.sdk.ResourceListChangedNotification -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities -import io.modelcontextprotocol.kotlin.sdk.TextResourceContents +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.Method +import io.modelcontextprotocol.kotlin.sdk.types.ReadResourceResult +import io.modelcontextprotocol.kotlin.sdk.types.ResourceListChangedNotification +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.TextResourceContents import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.Test diff --git a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerToolsTest.kt b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerToolsTest.kt index 2ccb4607..eae2eb23 100644 --- a/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerToolsTest.kt +++ b/kotlin-sdk-test/src/jvmTest/kotlin/io/modelcontextprotocol/kotlin/sdk/server/ServerToolsTest.kt @@ -1,12 +1,12 @@ package io.modelcontextprotocol.kotlin.sdk.server -import io.modelcontextprotocol.kotlin.sdk.CallToolResult -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.Method -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities -import io.modelcontextprotocol.kotlin.sdk.TextContent -import io.modelcontextprotocol.kotlin.sdk.Tool -import io.modelcontextprotocol.kotlin.sdk.ToolListChangedNotification +import io.modelcontextprotocol.kotlin.sdk.types.CallToolResult +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.Method +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.TextContent +import io.modelcontextprotocol.kotlin.sdk.types.ToolListChangedNotification +import io.modelcontextprotocol.kotlin.sdk.types.ToolSchema import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.Test @@ -24,7 +24,7 @@ class ServerToolsTest : AbstractServerFeaturesTest() { @Test fun `removeTool should remove a tool`() = runTest { // Add a tool - server.addTool("test-tool", "Test Tool", Tool.Input()) { + server.addTool("test-tool", "Test Tool", ToolSchema()) { CallToolResult(listOf(TextContent("Test result"))) }