Coroutines without
the SDK ceremony.
zeromcp vs kotlin-sdk — side by side.
This is a hello world
Server options, map-based schemas, CallToolResult wrapping, and transport setup. 11 lines of Kotlin DSL that could be simpler.
val server = Server(ServerOptions(
name = "test", version = "1.0.0"))
server.addTool("hello", "Say hello",
inputSchema = mapOf(
"name" to mapOf("type" to "string")
)) { args ->
CallToolResult(content = listOf(
TextContent("Hello, ${args["name"]}!")
))
}
server.connectStdio() This is the whole server
No ServerOptions. No CallToolResult. No map-based schemas.
A DSL that reads like Kotlin should.
val server = Server()
server.tool("hello") {
description = "Say hello"
input { required("name", "string") }
execute { args, ctx ->
"Hello, ${args["name"]}!"
}
}
server.serveStdio() HTTP Performance — Head to Head
Same hello tool. Same methodology. 5-minute sustained load in Docker. Ktor for ZeroMCP, stdio proxy for the official SDK.
ZeroMCP HTTP Frameworks
ZeroMCP embedded natively in Kotlin frameworks. No proxy. No subprocess. 30-second sustained load.
What's different
- SandboxEnforced. Not advisory.
- CredentialsPer-directory. Not
System.getenv. - ProcessesOne. Not N.
- Hot reloadBuilt-in. Not restart.
- ComposabilityConnect remote MCP servers. Official SDK can't.
- TransportStreamable HTTP by default. Stdio too.
When to use the official SDK
ZeroMCP makes trade-offs. Here's what you give up.
ZeroMCP implements tools only. If you need MCP resources, prompts, or sampling, use the official SDK.
ZeroMCP uses a lightweight DSL. If you need the full Kotlin SDK DSL with typed parameters, use the official.
The official SDK tracks every spec change immediately. ZeroMCP prioritizes stability over spec completeness.
The official SDK is maintained by the MCP specification team at Anthropic. ZeroMCP is maintained by the antidrift team (Reloop Labs, LLC).