Skip to content

Commit db3977f

Browse files
committed
Update samples to use new schema
Refactor samples to use `kotlin-sdk.types`, update integration tests to assert `meta` is null, and adjust coroutine logic.
1 parent 4645ebf commit db3977f

File tree

3 files changed

+33
-29
lines changed

3 files changed

+33
-29
lines changed

samples/kotlin-mcp-client/src/main/kotlin/io/modelcontextprotocol/sample/client/MCPClient.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@ import com.anthropic.models.messages.Tool
99
import com.anthropic.models.messages.ToolUnion
1010
import com.fasterxml.jackson.core.type.TypeReference
1111
import com.fasterxml.jackson.databind.ObjectMapper
12-
import io.modelcontextprotocol.kotlin.sdk.EmptyJsonObject
13-
import io.modelcontextprotocol.kotlin.sdk.Implementation
14-
import io.modelcontextprotocol.kotlin.sdk.TextContent
1512
import io.modelcontextprotocol.kotlin.sdk.client.Client
1613
import io.modelcontextprotocol.kotlin.sdk.client.StdioClientTransport
14+
import io.modelcontextprotocol.kotlin.sdk.types.EmptyJsonObject
15+
import io.modelcontextprotocol.kotlin.sdk.types.Implementation
16+
import io.modelcontextprotocol.kotlin.sdk.types.TextContent
1717
import kotlinx.coroutines.runBlocking
18+
import kotlinx.coroutines.yield
1819
import kotlinx.io.asSink
1920
import kotlinx.io.asSource
2021
import kotlinx.io.buffered
@@ -137,8 +138,8 @@ class MCPClient : AutoCloseable {
137138
"type": "tool_result",
138139
"tool_name": $toolName,
139140
"result": ${
140-
result?.content?.joinToString("\n") {
141-
(it as TextContent).text ?: ""
141+
result.content.joinToString("\n") {
142+
(it as TextContent).text
142143
}
143144
}
144145
""".trimIndent(),
@@ -173,6 +174,7 @@ class MCPClient : AutoCloseable {
173174
if (message.lowercase() == "quit") break
174175
val response = processQuery(message)
175176
println("\n$response")
177+
yield()
176178
}
177179
}
178180

samples/kotlin-mcp-server/src/main/kotlin/io/modelcontextprotocol/sample/server/server.kt

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,22 @@ import io.ktor.server.routing.routing
1414
import io.ktor.server.sse.SSE
1515
import io.ktor.server.sse.sse
1616
import io.ktor.util.collections.ConcurrentMap
17-
import io.modelcontextprotocol.kotlin.sdk.CallToolResult
18-
import io.modelcontextprotocol.kotlin.sdk.GetPromptResult
19-
import io.modelcontextprotocol.kotlin.sdk.Implementation
20-
import io.modelcontextprotocol.kotlin.sdk.PromptArgument
21-
import io.modelcontextprotocol.kotlin.sdk.PromptMessage
22-
import io.modelcontextprotocol.kotlin.sdk.ReadResourceResult
23-
import io.modelcontextprotocol.kotlin.sdk.Role
24-
import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities
25-
import io.modelcontextprotocol.kotlin.sdk.TextContent
26-
import io.modelcontextprotocol.kotlin.sdk.TextResourceContents
27-
import io.modelcontextprotocol.kotlin.sdk.Tool
2817
import io.modelcontextprotocol.kotlin.sdk.server.Server
2918
import io.modelcontextprotocol.kotlin.sdk.server.ServerOptions
3019
import io.modelcontextprotocol.kotlin.sdk.server.ServerSession
3120
import io.modelcontextprotocol.kotlin.sdk.server.SseServerTransport
3221
import io.modelcontextprotocol.kotlin.sdk.server.StdioServerTransport
3322
import io.modelcontextprotocol.kotlin.sdk.server.mcp
23+
import io.modelcontextprotocol.kotlin.sdk.types.CallToolResult
24+
import io.modelcontextprotocol.kotlin.sdk.types.GetPromptResult
25+
import io.modelcontextprotocol.kotlin.sdk.types.Implementation
26+
import io.modelcontextprotocol.kotlin.sdk.types.PromptArgument
27+
import io.modelcontextprotocol.kotlin.sdk.types.PromptMessage
28+
import io.modelcontextprotocol.kotlin.sdk.types.ReadResourceResult
29+
import io.modelcontextprotocol.kotlin.sdk.types.Role
30+
import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities
31+
import io.modelcontextprotocol.kotlin.sdk.types.TextContent
32+
import io.modelcontextprotocol.kotlin.sdk.types.TextResourceContents
3433
import kotlinx.coroutines.Job
3534
import kotlinx.coroutines.runBlocking
3635
import kotlinx.io.asSink
@@ -66,7 +65,7 @@ fun configureServer(): Server {
6665
GetPromptResult(
6766
messages = listOf(
6867
PromptMessage(
69-
role = Role.user,
68+
role = Role.User,
7069
content = TextContent(
7170
"Develop a kotlin project named <name>${request.arguments?.get("Project Name")}</name>",
7271
),
@@ -80,7 +79,6 @@ fun configureServer(): Server {
8079
server.addTool(
8180
name = "kotlin-sdk-tool",
8281
description = "A test tool",
83-
inputSchema = Tool.Input(),
8482
) { _ ->
8583
CallToolResult(
8684
content = listOf(TextContent("Hello, world!")),

samples/kotlin-mcp-server/src/test/kotlin/SseServerIntegrationTest.kt

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
import io.modelcontextprotocol.kotlin.sdk.EmptyJsonObject
2-
import io.modelcontextprotocol.kotlin.sdk.ReadResourceRequest
3-
import io.modelcontextprotocol.kotlin.sdk.TextContent
4-
import io.modelcontextprotocol.kotlin.sdk.TextResourceContents
51
import io.modelcontextprotocol.kotlin.sdk.client.Client
2+
import io.modelcontextprotocol.kotlin.sdk.types.ReadResourceRequest
3+
import io.modelcontextprotocol.kotlin.sdk.types.ReadResourceRequestParams
4+
import io.modelcontextprotocol.kotlin.sdk.types.TextContent
5+
import io.modelcontextprotocol.kotlin.sdk.types.TextResourceContents
66
import kotlinx.coroutines.runBlocking
77
import kotlin.test.Test
88
import kotlin.test.assertEquals
99
import kotlin.test.assertIs
1010
import kotlin.test.assertNotNull
11+
import kotlin.test.assertNull
1112
import kotlin.test.assertTrue
1213

1314
class SseServerIntegrationTest {
@@ -20,7 +21,7 @@ class SseServerIntegrationTest {
2021
val listToolsResult = client.listTools()
2122

2223
// then
23-
assertEquals(expected = EmptyJsonObject, actual = listToolsResult._meta)
24+
assertNull(listToolsResult.meta)
2425

2526
val tools = listToolsResult.tools
2627
assertEquals(actual = tools.size, expected = 1)
@@ -33,7 +34,7 @@ class SseServerIntegrationTest {
3334
val listPromptsResult = client.listPrompts()
3435

3536
// then
36-
assertEquals(expected = EmptyJsonObject, actual = listPromptsResult._meta)
37+
assertNull(listPromptsResult.meta)
3738

3839
val prompts = listPromptsResult.prompts
3940

@@ -45,7 +46,7 @@ class SseServerIntegrationTest {
4546
val listResourcesResult = client.listResources()
4647

4748
// then
48-
assertEquals(expected = EmptyJsonObject, actual = listResourcesResult._meta)
49+
assertNull(listResourcesResult.meta)
4950
val resources = listResourcesResult.resources
5051

5152
assertEquals(expected = listOf("Web Search"), actual = resources.map { it.name })
@@ -55,11 +56,11 @@ class SseServerIntegrationTest {
5556
fun `should get resource`(): Unit = runBlocking {
5657
val testResourceUri = "https://search.com/"
5758
val getResourcesResult = client.readResource(
58-
ReadResourceRequest(uri = testResourceUri),
59+
ReadResourceRequest(ReadResourceRequestParams(uri = testResourceUri)),
5960
)
6061

6162
// then
62-
assertEquals(expected = EmptyJsonObject, actual = getResourcesResult._meta)
63+
assertEquals(expected = null, actual = getResourcesResult.meta)
6364
val contents = getResourcesResult.contents
6465
assertEquals(expected = 1, actual = contents.size)
6566
assertTrue {
@@ -72,11 +73,14 @@ class SseServerIntegrationTest {
7273
@Test
7374
fun `should call tool`(): Unit = runBlocking {
7475
// when
75-
val toolResult = client.callTool("kotlin-sdk-tool", EmptyJsonObject)
76+
val toolResult = client.callTool(
77+
name = "kotlin-sdk-tool",
78+
arguments = emptyMap(),
79+
)
7680

7781
// then
7882
assertNotNull(toolResult)
79-
assertEquals(expected = EmptyJsonObject, actual = toolResult._meta)
83+
assertNull(toolResult.meta)
8084
val content = toolResult.content.single()
8185
assertIs<TextContent>(content, "Tool result should be a text content")
8286

0 commit comments

Comments
 (0)