Skip to content

Commit eb637b4

Browse files
committed
adds optional _meta field to Tool
1 parent ff3e4e0 commit eb637b4

File tree

3 files changed

+29
-2
lines changed
  • kotlin-sdk-core/src
  • kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server

3 files changed

+29
-2
lines changed

kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1242,7 +1242,12 @@ public data class Tool(
12421242
* Optional additional tool information.
12431243
*/
12441244
val annotations: ToolAnnotations?,
1245-
) {
1245+
1246+
/**
1247+
* Optional metadata for the tool.
1248+
*/
1249+
override val _meta: JsonObject = EmptyJsonObject,
1250+
) : WithMeta {
12461251
@Serializable
12471252
public data class Input(val properties: JsonObject = EmptyJsonObject, val required: List<String>? = null) {
12481253
@OptIn(ExperimentalSerializationApi::class)

kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/ToolSerializationTest.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.modelcontextprotocol.kotlin.sdk
33
import io.kotest.assertions.json.shouldEqualJson
44
import io.modelcontextprotocol.kotlin.sdk.shared.McpJson
55
import kotlinx.serialization.json.Json
6+
import kotlinx.serialization.json.JsonObject
67
import kotlinx.serialization.json.JsonPrimitive
78
import kotlinx.serialization.json.buildJsonObject
89
import kotlin.test.Test
@@ -44,6 +45,9 @@ class ToolSerializationTest {
4445
}
4546
},
4647
"required": ["temperature", "conditions", "humidity"]
48+
},
49+
"_meta": {
50+
"_for_test_only": true
4751
}
4852
}
4953
""".trimIndent()
@@ -91,6 +95,9 @@ class ToolSerializationTest {
9195
},
9296
required = listOf("temperature", "conditions", "humidity"),
9397
),
98+
_meta = buildJsonObject {
99+
put("_for_test_only", JsonPrimitive(true))
100+
}
94101
)
95102

96103
//region Serialize
@@ -411,6 +418,7 @@ class ToolSerializationTest {
411418
name: String = "get_weather",
412419
title: String? = null,
413420
outputSchema: String? = null,
421+
_meta: String? = null
414422
): String {
415423
val stringBuilder = StringBuilder()
416424

@@ -453,6 +461,14 @@ class ToolSerializationTest {
453461
)
454462
}
455463

464+
stringBuilder
465+
.appendLine(",")
466+
.append(
467+
"""
468+
"_meta": ${_meta ?: "{}"}
469+
""".trimIndent(),
470+
)
471+
456472
stringBuilder
457473
.appendLine()
458474
.appendLine("}")
@@ -464,6 +480,7 @@ class ToolSerializationTest {
464480
name: String = "get_weather",
465481
title: String? = null,
466482
outputSchema: Tool.Output? = null,
483+
@Suppress("LocalVariableName") _meta: JsonObject = EmptyJsonObject,
467484
): Tool = Tool(
468485
name = name,
469486
title = title,
@@ -482,6 +499,7 @@ class ToolSerializationTest {
482499
required = listOf("location"),
483500
),
484501
outputSchema = outputSchema,
502+
_meta = _meta
485503
)
486504

487505
//endregion Private Methods

kotlin-sdk-server/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/server/Server.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.modelcontextprotocol.kotlin.sdk.server
33
import io.github.oshai.kotlinlogging.KotlinLogging
44
import io.modelcontextprotocol.kotlin.sdk.CallToolRequest
55
import io.modelcontextprotocol.kotlin.sdk.CallToolResult
6+
import io.modelcontextprotocol.kotlin.sdk.EmptyJsonObject
67
import io.modelcontextprotocol.kotlin.sdk.GetPromptRequest
78
import io.modelcontextprotocol.kotlin.sdk.GetPromptResult
89
import io.modelcontextprotocol.kotlin.sdk.Implementation
@@ -32,6 +33,7 @@ import kotlinx.collections.immutable.minus
3233
import kotlinx.collections.immutable.persistentListOf
3334
import kotlinx.collections.immutable.persistentMapOf
3435
import kotlinx.collections.immutable.toPersistentSet
36+
import kotlinx.serialization.json.JsonObject
3537

3638
private val logger = KotlinLogging.logger {}
3739

@@ -217,6 +219,7 @@ public open class Server(
217219
* @param inputSchema The expected input schema for the tool.
218220
* @param outputSchema The optional expected output schema for the tool.
219221
* @param toolAnnotations Optional additional tool information.
222+
* @param _meta Optional metadata as a [JsonObject].
220223
* @param handler A suspend function that handles executing the tool when called by the client.
221224
* @throws IllegalStateException If the server does not support tools.
222225
*/
@@ -227,9 +230,10 @@ public open class Server(
227230
title: String? = null,
228231
outputSchema: Tool.Output? = null,
229232
toolAnnotations: ToolAnnotations? = null,
233+
@Suppress("LocalVariableName") _meta: JsonObject = EmptyJsonObject,
230234
handler: suspend (CallToolRequest) -> CallToolResult,
231235
) {
232-
val tool = Tool(name, title, description, inputSchema, outputSchema, toolAnnotations)
236+
val tool = Tool(name, title, description, inputSchema, outputSchema, toolAnnotations, _meta)
233237
addTool(tool, handler)
234238
}
235239

0 commit comments

Comments
 (0)