2.6 MB of memory.
That's the whole runtime.
zeromcp vs rmcp — side by side.
This is a hello world
Proc-macro imports, a server builder, tool attribute macros, and transport setup. 12 lines before your tool does anything.
use rmcp::{Server, Tool, tool};
#[tool(description = "Say hello")]
async fn hello(name: String) -> String {
format!("Hello, {name}!")
}
#[tokio::main]
async fn main() {
Server::new("test", "1.0.0")
.tool(hello)
.serve_stdio()
.await;
} This is the whole server
No proc macros. No server builder. No attribute ceremony.
Register a closure and serve.
let mut server = Server::new();
server.add_tool("hello", "Say hello",
Input::new().required("name", "string"),
|args: Value, _ctx: Ctx| Box::pin(async move {
let name = args["name"].as_str().unwrap_or("world");
Ok(Value::String(format!("Hello, {name}!")))
})
);
server.serve().await; HTTP Performance — Head to Head
Same hello tool. Same methodology. 5-minute sustained load in Docker. Actix for ZeroMCP, stdio proxy for the official SDK.
The official Rust SDK leaks memory — 2,420 MB over 5 minutes. ZeroMCP Actix holds steady at 4 MB.
ZeroMCP HTTP Frameworks
ZeroMCP embedded natively in Rust frameworks. No proxy. No subprocess. 300-second sustained load.
What's different
- SandboxEnforced. Not advisory.
- CredentialsPer-directory. Not
std::env. - 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 runtime registration. If you prefer derive macros for tool definitions, the official SDK (rmcp) supports them.
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).