Drop a .rb file.
517 lines. No gems.
zeromcp vs mcp gem — side by side.
This is a hello world
Require, server instantiation, class-based registration, schema definition, and transport setup. 12 lines before your tool does anything.
require 'mcp'
server = MCP::Server.new(
name: "test", version: "1.0.0")
server.register_tool("hello",
description: "Say hello",
input_schema: {
name: { type: "string" }
}) do |args|
"Hello, #{args['name']}!"
end
server.run_stdio This is the whole server
No require. No server class. No registration blocks.
Drop it in a folder and run zeromcp serve.
# tools/hello.rb
TOOL = {
description: "Say hello",
input: { name: "string" }
}
def execute(args, ctx)
"Hello, #{args['name']}!"
end HTTP Performance — Head to Head
Same hello tool. Same methodology. 5-minute sustained load in Docker. Rack+Puma for ZeroMCP, stdio proxy for the official SDK.
ZeroMCP HTTP Frameworks
ZeroMCP embedded natively in Ruby frameworks. No proxy. No subprocess. 30-second sustained load.
What's different
- SandboxEnforced. Not advisory.
- CredentialsPer-directory. Not
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 file-based tools. If you prefer the block DSL registration pattern, use the official gem.
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).