If you've built an MCP server before, you know the drill. You spend 20 minutes wiring up the registry, another 15 debugging why your tool isn't showing up in Claude, and then you realize you forgot to sanitize that one field that absolutely shouldn't go to the LLM.
I've been there. More times than I'd like to admit.
That's why when I started playing with MCP Fusion, the first thing that hit me wasn't the architecture (though MVA is genuinely clever) — it was how fast I could get something real running. Like, "I typed one command and now I'm shipping" fast.
The "Wait, That's It?" Moment
Here's the entire onboarding:
npx fusion create my-server
That's it. No npm install afterwards, no copying .env.example, no hunting for the right tsconfig settings. The CLI scaffolds a complete project:
my-server/
├── src/
│ ├── fusion.ts # initFusion<AppContext>() - typed once, inferred everywhere
│ ├── context.ts # Your AppContext factory
│ ├── server.ts # Bootstrap with autoDiscover (the magic part)
│ ├── tools/
│ │ └── system/
│ │ ├── health.ts # Working health check, already wired
│ │ └── echo.ts # Connectivity test, ready to go
│ ├── presenters/ # MVA's secret sauce
│ ├── middleware/ # Auth, logging, whatever you need
├── tests/ # Vitest pre-configured
├── .cursor/mcp.json # Pre-connected to Cursor
├── .env.example
└── package.json # All deps, all scripts
Run fusion dev, and you're live. Connect Cursor or Claude Desktop, and your tools just… appear. No manual registration. No restart cycles. It feels almost suspicious.
The Real Win: autoDiscover()
Most frameworks make you maintain a central index file. Add a new tool? Edit index.ts, import, register, commit, pray you didn't break the build.
MCP Fusion flips that. Drop a .ts file in src/tools/, and it's automatically registered:
src/tools/
├── billing/
│ ├── get_invoice.ts → billing.get_invoice
│ └── refund.ts → billing.refund
├── users/
│ ├── list.ts → users.list
│ └── update_role.ts → users.update_role
Under the hood, server.ts does this:
import { autoDiscover } from '@vinkius-core/mcp-fusion';
const registry = f.registry();
const discovered = await autoDiscover(registry, './src/tools');
console.error(`📦 Discovered ${discovered.length} tool(s)`);
It scans, imports, validates, and registers — skipping .test.ts and .d.ts automatically. Your git diffs stay clean because adding a feature never touches a shared file. Small thing? Maybe. But after maintaining a 50-tool server the old way, it feels like getting your weekends back.
But Wait — Where's the Safety?
Speed without guardrails is just technical debt in fast-forward. MCP Fusion bakes safety into the scaffolding via the MVA pattern (Model-View-Agent).
Remember that UserPresenter you saw in the scaffold? It's not just for show:
// src/presenters/UserPresenter.ts
const UserPresenter = createPresenter('User')
.schema(z.object({
id: z.string(),
name: z.string(),
email: z.string(),
// password_hash? internal_flags? tenant_id?
// → Not in the schema = physically absent from output.
}))
.rules((user, ctx) => [
ctx?.user?.role !== 'admin'
? 'RESTRICTED: Mask email domain for non-admins'
: null,
]);
This isn't filtering at the API layer. Zod's .strict() rejects undeclared fields at parse time — they never make it into memory for the LLM to see. That's an egress firewall by design, not by hope.
And because rules travel with the data via .rules(), you get context tree-shaking: invoice logic only loads when you're working with invoices. Token usage drops from ~2k/call to ~200. Your Anthropic bill will notice.
The "Oh Right, Testing" Part
So many quickstarts skip this. MCP Fusion doesn't. Your scaffolded project includes:
-
vitest.config.tspre-wired -
tests/setup.tswith context mocks - A passing
system.test.tsyou can actually learn from
Run npm test and it just works. No hunting for the right mock pattern. No "why is my context undefined?" at 2 AM.
When You Need More Power
The --vector flag is where things get spicy. Need to expose your Prisma schema safely?
npx fusion create my-api --vector prisma --transport sse --yes
This doesn't just generate CRUD tools. It builds Presenters that act as an egress firewall: sensitive columns like password_hash or ssn are stripped at the schema level, before serialization. No raw SQL, no injection risks, no "oops I leaked PII" postmortems.
Why This Matters
I'm not saying MCP Fusion is the answer for every use case. But if you're:
- Tired of maintaining massive
switchstatements for tool routing - Worried about token costs from dumping raw JSON to LLMs
- Shipping MCP servers to production and need guardrails that don't slow you down
…then the 30-second scaffold is just the entry point. The real value is in the architecture that comes pre-wired: MVA for deterministic agent perception, Zod for schema-as-boundary, and file-based routing that scales without ceremony.
Try It. Break It. Tell Me What You Think.
npx fusion create my-experiment
cd my-experiment
fusion dev
Connect your favorite MCP client. Add a tool in src/tools/. Watch it appear instantly.
Then go deeper: add a Presenter, inject a rule, render a server-side chart with .ui(). See how the framework guides you toward patterns that keep your agents reliable and your costs predictable.
I built MCP Fusion because I needed this for my own projects at Vinkius Labs. If it saves you even one afternoon of boilerplate debugging, it's done its job.
What's the first tool you'd build with this? Drop a comment — I read every one.
P.S. If you hit a snag, the docs at mcp-fusion.vinkius.com have the full reference. And yes, the quickstart really does take 30 seconds. I timed it.
Top comments (0)