Open
Description
@Test
fun `can connect to MCP SSE Server`() {
val httpClient =
HttpClient(CIO) {
install(SSE)
install(Logging)
}
runBlocking {
val mcp = httpClient.mcpSse("http://localhost:8081/mcp")
val response = mcp.ping()
assertEquals(EmptyRequestResult(), response)
}
}
The issue is that 2nd request goes to http://localhost:8081/mcp/mcp/messages
Full KTOR HTTP log:
McpSseClientTest > can connect to MCP SSE Server() STANDARD_OUT
2025-06-29 07:29:32,258 INFO [io.kto.cli.HttpClient] (DefaultDispatcher-worker-1 @ktor-cio-context#4) REQUEST: http://localhost:8081/mcp/sse
METHOD: HttpMethod(value=GET)
COMMON HEADERS
-> Accept: */*
-> Accept-Charset: UTF-8
CONTENT HEADERS
-> Content-Length: 0
-> Accept: text/event-stream
-> Cache-Control: no-store
2025-06-29 07:29:32,344 INFO [io.kto.cli.HttpClient] (DefaultDispatcher-worker-5 @ktor-cio-context#4) RESPONSE: 200 OK
METHOD: HttpMethod(value=GET)
FROM: http://localhost:8081/mcp/sse
COMMON HEADERS
-> content-type: text/event-stream
-> transfer-encoding: chunked
2025-06-29 07:29:32,374 INFO [io.kto.cli.HttpClient] (Test worker @coroutine#3) REQUEST: http://localhost:8081/mcp/mcp/messages/NTI0NmFmZTEtM2I4ZS00YmYwLTk4OTAtYzM0NWQ2ZjQxYmE0
METHOD: HttpMethod(value=POST)
COMMON HEADERS
-> Accept: */*
-> Accept-Charset: UTF-8
CONTENT HEADERS
-> Content-Length: 221
-> Content-Type: application/json
2025-06-29 07:29:32,384 INFO [io.kto.cli.HttpClient] (Test worker @coroutine#3) RESPONSE: 404 Not Found
METHOD: HttpMethod(value=POST)
FROM: http://localhost:8081/mcp/mcp/messages/NTI0NmFmZTEtM2I4ZS00YmYwLTk4OTAtYzM0NWQ2ZjQxYmE0
COMMON HEADERS
-> content-length: 53
-> content-type: text/html; charset=utf-8