Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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")
Expand All @@ -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")
Expand Down
Original file line number Diff line number Diff line change
@@ -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(
Expand All @@ -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")

Expand Down
Loading