Drop a file.
It's an MCP tool.
No 91 packages. No plaintext secrets. 2.1–102x faster than every official SDK. Just a function in a folder.
npm install -g zeromcp Faster than every official SDK. Every language.
Same hello tool. HTTP transport. 5-minute sustained load. Docker containers. Run them yourself.
Built-in sandbox. Credential injection. 21 chaos attacks survived. See the security model.
MCP is a great protocol with a
terrible developer experience
Hand-edited JSON. Zombie processes. Plaintext secrets. Config drift across the team. These are real quotes from developers who've had enough.
"MCP configuration is a sh*tshow, especially when secrets like API keys and database passwords are involved."
— Hagen Hubel, Medium
"Every AI coding session spawns a tree of child processes. When the session ends, these processes are supposed to terminate. They don't."
— thestack_ai, DEV Community
"You drop plaintext secrets into your Claude config. Any server you define can read your environment variables, access your filesystem, and send data anywhere on the internet."
— Cyata.ai, Security Research
Everything you need. Nothing you don't.
HTTP benchmarks across all 10 languages. Same tool, same transport, 5-minute sustained load. ZeroMCP wins every language. See the data.
Node.js, Python, Ruby, PHP: drop a file in ./tools/ and it's live. Hot reload on change. No server restart.
Express, Fastify, Starlette, Chi, Actix, Javalin, Ktor, ASP.NET, Vapor, Rack, Slim — embed ZeroMCP as a handler function. Framework benchmarks.
Connect existing MCP servers into one process. Auto-namespaced. Layer local tools on top. One stdio connection. The official SDK can't do this.
Network allowlists, sandboxed fetch, credential injection per directory, permission enforcement at runtime. Not advisory — enforced.
Most languages need nothing beyond stdlib. The official Node SDK installs 91 packages. Ruby installs 90. ZeroMCP installs none.
Node.js, Python, Go, Rust, Java, Kotlin, Swift, C#, Ruby, PHP. Same architecture, idiomatic per language. Compare all.
File becomes tool in
three seconds
Drop a file
Write a JavaScript file with a description, inputs, and an execute function. Put it in ./tools/.
ZeroMCP scans it
Recursive directory scan. Auto-namespacing from folder structure. Credential injection. Permission enforcement.
Serve over MCP
One command. stdio for Claude Code and Cursor. Library export for Express, Lambda, Workers.
ZeroMCP vs the alternatives
| ZeroMCP | Official SDK @modelcontextprotocol/sdk | Separate Servers N individual MCP servers | |
|---|---|---|---|
| Configuration | Drop a file | Server class + Zod schemas | JSON per server |
| Dependencies | 0 | 17 | N x each server's deps |
| Code size | ~1K LOC | 4.3 MB | N x server packages |
| Processes | 1 | 1 (per server) | N separate processes |
| Composability | Built-in | Not supported | Not supported |
| Credential injection | ctx.credentials | DIY | Plaintext JSON |
| Sandboxed fetch | Domain allowlisting | No | No |
| Hot reload | Built-in | Manual restart | Manual restart |
| Library export | Express / Lambda / Workers | Custom integration | No |
Three commands. That's it.
Install
npm install -g zeromcp Drop a tool file
export default { description: "Say hello", input: { name: "string" }, execute: async ({ name }) => `Hello, ${name}!` }
Serve
zeromcp serve
That's it. Your MCP client can now call hello.
Security is the default,
not an afterthought
Tools can't phone home to undeclared domains. They can't access other tools' credentials. They can't touch the filesystem without declaring it.
Permission declarations
Tools declare what they need: network domains, filesystem paths, exec access. Enforced at runtime, not advisory.
permissions: { network: ["api.stripe.com"] } Sandboxed fetch
ctx.fetch only reaches declared domains. Undeclared network calls are blocked. All calls logged when logging is enabled.
ctx.fetch("https://api.stripe.com/v1/...") Credential injection
Tools use ctx.credentials. Keys are mapped from env vars or files in one config. Never hardcoded, never passed as arguments.
credentials: { stripe: { env: "STRIPE_KEY" } } Audit CLI
zeromcp audit runs static analysis on tool files. Catches undeclared network access, credential leaks, and permission violations. Gates the community registry.
$ zeromcp audit ./tools Replace your MCP config
in 60 seconds
Install ZeroMCP, drop a tool file, and connect it to Claude Code or Cursor.
npm install -g zeromcp