diff --git a/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/client/Client.kt b/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/client/Client.kt index 4eccbfa..2efc9eb 100644 --- a/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/client/Client.kt +++ b/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/client/Client.kt @@ -1,42 +1,7 @@ package io.modelcontextprotocol.kotlin.sdk.client -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.ClientNotification -import io.modelcontextprotocol.kotlin.sdk.ClientRequest -import io.modelcontextprotocol.kotlin.sdk.ClientResult -import io.modelcontextprotocol.kotlin.sdk.CompatibilityCallToolResult -import io.modelcontextprotocol.kotlin.sdk.CompleteRequest -import io.modelcontextprotocol.kotlin.sdk.CompleteResult -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.ListToolsRequest -import io.modelcontextprotocol.kotlin.sdk.ListToolsResult -import io.modelcontextprotocol.kotlin.sdk.LoggingLevel +import io.modelcontextprotocol.kotlin.sdk.* 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.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 @@ -45,6 +10,7 @@ import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonNull import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive + /** * Options for configuring the MCP client. * @@ -70,7 +36,7 @@ public class ClientOptions( public open class Client( private val clientInfo: Implementation, options: ClientOptions = ClientOptions(), -) : Protocol(options) { +) : Protocol(options) { private var serverCapabilities: ServerCapabilities? = null private var serverVersion: Implementation? = null diff --git a/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt b/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt index c3f6dcf..75c1578 100644 --- a/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt +++ b/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt @@ -1,13 +1,12 @@ package io.modelcontextprotocol.kotlin.sdk.server import io.github.oshai.kotlinlogging.KotlinLogging -import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities -import kotlinx.coroutines.CompletableDeferred -import kotlinx.serialization.json.JsonObject import io.modelcontextprotocol.kotlin.sdk.* import io.modelcontextprotocol.kotlin.sdk.shared.Protocol import io.modelcontextprotocol.kotlin.sdk.shared.ProtocolOptions import io.modelcontextprotocol.kotlin.sdk.shared.RequestOptions +import kotlinx.coroutines.CompletableDeferred +import kotlinx.serialization.json.JsonObject private val logger = KotlinLogging.logger {} @@ -37,7 +36,7 @@ public open class Server( private val serverInfo: Implementation, options: ServerOptions, public var onCloseCallback: (() -> Unit)? = null -) : Protocol(options) { +) : Protocol(options) { /** * The client's reported capabilities after initialization. diff --git a/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt b/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt index 291b253..1e04fa0 100644 --- a/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt +++ b/src/main/kotlin/io/modelcontextprotocol/kotlin/sdk/shared/Protocol.kt @@ -1,24 +1,7 @@ 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.* import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.TimeoutCancellationException @@ -107,14 +90,14 @@ internal val COMPLETED = CompletableDeferred(Unit).also { it.complete(Unit) } * Implements MCP protocol framing on top of a pluggable transport, including * features like request/response linking, notifications, and progress. */ -public abstract class Protocol( +public abstract class Protocol( @PublishedApi internal val options: ProtocolOptions?, ) { public var transport: Transport? = null private set @PublishedApi - internal val requestHandlers: MutableMap SendResultT?> = + internal val requestHandlers: MutableMap RequestResult?> = mutableMapOf() public val notificationHandlers: MutableMap Unit> = mutableMapOf() @@ -143,7 +126,7 @@ public abstract class Protocol SendResultT?)? = + public var fallbackRequestHandler: (suspend (request: JSONRPCRequest, extra: RequestHandlerExtra) -> RequestResult?)? = null /** @@ -158,8 +141,7 @@ public abstract class Protocol(Method.Defined.Ping) { request, _ -> - @Suppress("UNCHECKED_CAST") - EmptyRequestResult() as SendResultT + EmptyRequestResult() } } @@ -344,12 +326,12 @@ public abstract class Protocol request( - request: SendRequestT, + request: Request, options: RequestOptions? = null, ): T { LOGGER.trace { "Sending request: ${request.method}" } @@ -427,7 +409,7 @@ public abstract class Protocol setRequestHandler( method: Method, - noinline block: suspend (T, RequestHandlerExtra) -> SendResultT?, + noinline block: suspend (T, RequestHandlerExtra) -> RequestResult?, ) { setRequestHandler(typeOf(), method, block) } @@ -455,7 +437,7 @@ public abstract class Protocol setRequestHandler( requestType: KType, method: Method, - block: suspend (T, RequestHandlerExtra) -> SendResultT?, + block: suspend (T, RequestHandlerExtra) -> RequestResult?, ) { assertRequestHandlerCapability(method) @@ -470,8 +452,7 @@ public abstract class Protocol