diff --git a/agents/agents-mcp-server/build.gradle.kts b/agents/agents-mcp-server/build.gradle.kts index e22ce427ee..a11ef0e107 100644 --- a/agents/agents-mcp-server/build.gradle.kts +++ b/agents/agents-mcp-server/build.gradle.kts @@ -13,6 +13,9 @@ kotlin { commonMain { dependencies { api(libs.mcp.server) + implementation(libs.ktor.server.core) + implementation(libs.ktor.server.sse) + api(project(":agents:agents-tools")) } } diff --git a/agents/agents-mcp-server/src/jvmTest/kotlin/ai/koog/agents/mcp/server/KoogToolAsMcpToolTest.kt b/agents/agents-mcp-server/src/jvmTest/kotlin/ai/koog/agents/mcp/server/KoogToolAsMcpToolTest.kt index 94358d16c1..c94b32f296 100644 --- a/agents/agents-mcp-server/src/jvmTest/kotlin/ai/koog/agents/mcp/server/KoogToolAsMcpToolTest.kt +++ b/agents/agents-mcp-server/src/jvmTest/kotlin/ai/koog/agents/mcp/server/KoogToolAsMcpToolTest.kt @@ -20,7 +20,6 @@ import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.put import kotlin.test.Test import kotlin.test.assertEquals -import kotlin.test.assertFailsWith import kotlin.test.assertIsNot import kotlin.test.assertNotEquals import kotlin.test.assertNotNull @@ -68,19 +67,20 @@ class KoogToolAsMcpToolTest { @OptIn(InternalAgentToolsApi::class) @Test fun testKoogToolAsMcpToolWithInvalidArguments() = testMcpTool(RandomNumberTool()) { mcpTool, origin -> - assertFailsWith { - val args = buildJsonObject { put("seed", "forty-two") } + run { + val errorArgs = buildJsonObject { put("seed", "forty-two") } - withContext(Dispatchers.Default.limitedParallelism(1)) { + val errorResult = withContext(Dispatchers.Default.limitedParallelism(1)) { withTimeout(20.seconds) { - mcpTool.execute(args) + mcpTool.execute(errorArgs) } } + + assertTrue(errorResult?.isError ?: false) } + // check that the server is still working run { - // check that the server is still working - val args = buildJsonObject { put("seed", "42") } val result = withContext(Dispatchers.Default.limitedParallelism(1)) { @@ -102,17 +102,19 @@ class KoogToolAsMcpToolTest { val tool = ThrowingExceptionTool() testMcpTool(tool) { mcpTool, origin -> - tool.throwing = true + run { + tool.throwing = true - assertFailsWith { val args = EmptyJsonObject - withContext(Dispatchers.Default.limitedParallelism(1)) { + val errorResult = withContext(Dispatchers.Default.limitedParallelism(1)) { withTimeout(20.seconds) { mcpTool.execute(args) } } + assertTrue(errorResult?.isError ?: false) + val last = origin.last assertNotNull(last) assertTrue(last.isFailure) @@ -158,7 +160,7 @@ class KoogToolAsMcpToolTest { val toolRegistry = withContext(Dispatchers.Default.limitedParallelism(1)) { withTimeout(20.seconds) { McpToolRegistryProvider.fromTransport( - transport = McpToolRegistryProvider.defaultSseTransport("http://localhost:$port/sse") + transport = McpToolRegistryProvider.defaultSseTransport("http://localhost:$port") ) } } diff --git a/agents/agents-mcp/src/jvmTest/kotlin/ai/koog/agents/mcp/McpToolTest.kt b/agents/agents-mcp/src/jvmTest/kotlin/ai/koog/agents/mcp/McpToolTest.kt index 3483f7fe05..4ed38605d1 100644 --- a/agents/agents-mcp/src/jvmTest/kotlin/ai/koog/agents/mcp/McpToolTest.kt +++ b/agents/agents-mcp/src/jvmTest/kotlin/ai/koog/agents/mcp/McpToolTest.kt @@ -48,7 +48,7 @@ class McpToolTest { val toolRegistry = withContext(Dispatchers.Default.limitedParallelism(1)) { withTimeout(1.minutes) { McpToolRegistryProvider.fromTransport( - transport = McpToolRegistryProvider.defaultSseTransport("http://localhost:$testPort/sse"), + transport = McpToolRegistryProvider.defaultSseTransport("http://localhost:$testPort"), name = "test-client", version = "0.1.0" ) diff --git a/examples/simple-examples/src/main/kotlin/ai/koog/agents/example/mcp/PlaywrightMcpClient.kt b/examples/simple-examples/src/main/kotlin/ai/koog/agents/example/mcp/PlaywrightMcpClient.kt index b683f520a1..f7aecbb8d9 100644 --- a/examples/simple-examples/src/main/kotlin/ai/koog/agents/example/mcp/PlaywrightMcpClient.kt +++ b/examples/simple-examples/src/main/kotlin/ai/koog/agents/example/mcp/PlaywrightMcpClient.kt @@ -39,7 +39,7 @@ fun main() { // Create the ToolRegistry with tools from the MCP server println("Connecting to Playwright MCP server...") val toolRegistry = McpToolRegistryProvider.fromTransport( - transport = McpToolRegistryProvider.defaultSseTransport("http://localhost:8931") + transport = McpToolRegistryProvider.defaultSseTransport("http://localhost:8931/sse") ) println("Successfully connected to Playwright MCP server") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9ca8efbf0f..d05d099895 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,7 +23,7 @@ ktlint = "14.0.1" ktor3 = "3.2.2" lettuce = "6.5.5.RELEASE" logback = "1.5.13" -mcp = "0.7.2" +mcp = "0.7.7" mockito = "5.19.0" mockk = "1.13.8" mokksy = "0.5.1"