Without MVA vs With MVA
Prerequisites
Install Vurb.ts before following this guide: npm install @vurb/core @modelcontextprotocol/sdk zod — or scaffold a project with vurb create.
| Aspect | Raw MCP | Vurb MVA |
|---|---|---|
| Tool count | 50 individual tools. Token explosion. | Action consolidation — module.action discriminator |
| Response | JSON.stringify() — AI guesses | Structured perception — data + rules + UI + affordances |
| Domain context | amount_cents: 45000 — dollars? cents? | System rules: "amount_cents is in CENTS." |
| Next actions | AI hallucinates tool names | Agentic HATEOAS — .suggest() based on state |
| Large datasets | 10,000 rows dump — token DDoS | .limit(50) truncates and teaches filters |
| Security | Internal fields leak | Schema IS the boundary |
| Error recovery | throw new Error('not found') — gives up | toolError() with recovery hints |
| Middleware | Copy-paste auth checks | tRPC-style defineMiddleware() |
| Deployment | Stdio only | Vercel, Cloudflare, Lambda |
Invoice: Before & After
Users: Before & After
Error Recovery: Before & After
The Architecture Difference
❌
Without MVA
Handler →
JSON.stringify() → raw data blob → LLM guesses everything✅
With MVA
Handler → raw data → Presenter (Schema + Rules + UI + Limits + Suggestions) → Structured Perception Package → LLM acts with confidence
| Without MVA | With MVA | |
|---|---|---|
| Lines of code per tool | 20-50 (routing + validation + formatting) | 3-5 (handler only) |
| Security | Hope you didn't forget to strip fields | Schema IS the boundary |
| Token cost per call | High (raw dumps) | Low (guardrails, truncation) |
| Deployment | Stdio + manual HTTP bridge | Stdio, SSE, Vercel, Cloudflare |
| Maintenance | Every tool re-implements rendering | Presenter defined once |