diff --git a/samples/weather-stdio-server/src/main/kotlin/io/modelcontextprotocol/sample/server/McpWeatherServer.kt b/samples/weather-stdio-server/src/main/kotlin/io/modelcontextprotocol/sample/server/McpWeatherServer.kt index 181431e1..f08c436d 100644 --- a/samples/weather-stdio-server/src/main/kotlin/io/modelcontextprotocol/sample/server/McpWeatherServer.kt +++ b/samples/weather-stdio-server/src/main/kotlin/io/modelcontextprotocol/sample/server/McpWeatherServer.kt @@ -8,14 +8,14 @@ import io.ktor.http.contentType import io.ktor.http.headers import io.ktor.serialization.kotlinx.json.json import io.ktor.utils.io.streams.asInput -import io.modelcontextprotocol.kotlin.sdk.CallToolResult -import io.modelcontextprotocol.kotlin.sdk.Implementation -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.StdioServerTransport +import io.modelcontextprotocol.kotlin.sdk.types.CallToolResult +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.ServerCapabilities +import io.modelcontextprotocol.kotlin.sdk.types.TextContent +import io.modelcontextprotocol.kotlin.sdk.types.ToolSchema import kotlinx.coroutines.Job import kotlinx.coroutines.runBlocking import kotlinx.io.asSink @@ -28,7 +28,8 @@ import kotlinx.serialization.json.put import kotlinx.serialization.json.putJsonObject /** - * Starts an MCP server that provides weather-related tools for fetching active weather alerts by state and weather forecasts by latitude/longitude. + * Starts an MCP server that provides weather-related tools for fetching active + * weather alerts by state and weather forecasts by latitude/longitude. */ fun runMcpServer() { // Base URL for the Weather API @@ -72,7 +73,7 @@ fun runMcpServer() { description = """ Get weather alerts for a US state. Input is Two-letter US state code (e.g. CA, NY) """.trimIndent(), - inputSchema = Tool.Input( + inputSchema = ToolSchema( properties = buildJsonObject { putJsonObject("state") { put("type", "string") @@ -97,7 +98,7 @@ fun runMcpServer() { description = """ Get weather forecast for a specific latitude/longitude """.trimIndent(), - inputSchema = Tool.Input( + inputSchema = ToolSchema( properties = buildJsonObject { putJsonObject("latitude") { put("type", "number") diff --git a/samples/weather-stdio-server/src/test/kotlin/io/modelcontextprotocol/sample/client/ClientStdio.kt b/samples/weather-stdio-server/src/test/kotlin/io/modelcontextprotocol/sample/client/ClientStdio.kt index 480bc1c5..5934ee26 100644 --- a/samples/weather-stdio-server/src/test/kotlin/io/modelcontextprotocol/sample/client/ClientStdio.kt +++ b/samples/weather-stdio-server/src/test/kotlin/io/modelcontextprotocol/sample/client/ClientStdio.kt @@ -1,16 +1,20 @@ package io.modelcontextprotocol.sample.client -import io.modelcontextprotocol.kotlin.sdk.Implementation -import io.modelcontextprotocol.kotlin.sdk.TextContent import io.modelcontextprotocol.kotlin.sdk.client.Client import io.modelcontextprotocol.kotlin.sdk.client.StdioClientTransport +import io.modelcontextprotocol.kotlin.sdk.types.Implementation +import io.modelcontextprotocol.kotlin.sdk.types.TextContent import kotlinx.coroutines.runBlocking import kotlinx.io.asSink import kotlinx.io.asSource import kotlinx.io.buffered fun main(): Unit = runBlocking { - val process = ProcessBuilder("java", "-jar", "./build/libs/weather-stdio-server-0.1.0-all.jar") + val process = ProcessBuilder( + "java", + "-jar", + "${System.getProperty("user.dir")}/build/libs/weather-stdio-server-0.1.0-all.jar", + ).redirectErrorStream(true) .start() val transport = StdioClientTransport( @@ -34,15 +38,15 @@ fun main(): Unit = runBlocking { "latitude" to 38.5816, "longitude" to -121.4944, ), - )?.content?.map { if (it is TextContent) it.text else it.toString() } + ).content.map { if (it is TextContent) it.text else it.toString() } - println("Weather Forcast: ${weatherForecastResult?.joinToString(separator = "\n", prefix = "\n", postfix = "\n")}") + println("Weather Forecast: ${weatherForecastResult.joinToString(separator = "\n", prefix = "\n", postfix = "\n")}") val alertResult = client.callTool( name = "get_alert", arguments = mapOf("state" to "TX"), - )?.content?.map { if (it is TextContent) it.text else it.toString() } + ).content.map { if (it is TextContent) it.text else it.toString() } println("Alert Response = $alertResult")