Skip to content

Introduction

First ReleaseDownloadsWeekly Downloadsnpm versionTypeScriptMCP SDKLicenseBuilt with 🚀 by Vinkius

THE EXPRESS.JS FOR MCP SERVERS
Stop writing raw, chaotic MCP servers.
Your AI agent already knows Vurb.
Routes, data shaping, and security in one framework. Zero new syntax — if you know Zod and TypeScript, you already know Vurb. Your AI agent implements it via SKILL.md.
TELL YOUR AI AGENT
"Create an MCP server for invoice management with Presenters, PII redaction on customer_ssn, tenant isolation middleware, and deploy to Vinkius Cloud."

THE REAL PROBLEM
Your LLM is reading your database.
What is it seeing?
WITHOUT VURB — RAW MCP
raw-handler.ts
typescript
server.setRequestHandler(async (req) => {
  const user = await db.user.findUnique({
    where: { id: req.params.id },
  });
  // ⚠️ password_hash, ssn, tenant_id
  //    ALL sent directly to the LLM
  return { content: [{ type: 'text',
    text: JSON.stringify(user) }] };
});
The LLM sees password_hash, ssn, tenant_id — everything. No validation. No redaction. One migration adds a column → instant data leak.
WITH VURB
tools/users/get.ts
typescript
export default f.query('users.get')
  .withString('id', 'User ID')
  .returns(UserPresenter)
  .redactPII(['ssn', 'password_hash'])
  .handle(async (input, ctx) => {
    return ctx.db.user.findUnique({
      where: { id: input.id },
    });
  });
The LLM sees [REDACTED]. Schema allowlists fields. New columns are invisible unless declared. GDPR/HIPAA/SOC2 — built in.

Architect's Check

Verify that .redactPII() is chained BEFORE .handle(). If your AI agent forgot the Presenter, undeclared fields still leak. The schema is your security boundary — always audit it.


What You Tell the AI

The code below is what your AI agent produces when you give it the prompt above. Vurb ships a SKILL.md — your AI reads it and produces idiomatic architecture on the first pass.

Step 1 — Context src/vurb.ts

typescript
import { initVurb } from '@vurb/core';

interface AppContext {
  db: PrismaClient;
  user: { id: string; role: string; tenantId: string };
}
const f = initVurb<AppContext>();

Step 2 — Presenter views/InvoicePresenter.ts

typescript
const InvoicePresenter = f.presenter({
  name: 'Invoice',
  schema: InvoiceModel,
  rules: (inv) => [
    inv.status === 'overdue' ? 'Invoice is overdue. Mention it.' : null,
  ],
  suggest: (inv) => [
    inv.status === 'draft'
      ? suggest('billing.send', 'Send invoice', { id: inv.id })
      : null,
  ].filter(Boolean),
});

Step 3 — Tool tools/billing/get.ts

typescript
export const getInvoice = f.query('billing.get')
  .describe('Retrieve an invoice by ID')
  .withString('id', 'The unique invoice identifier')
  .returns(InvoicePresenter)
  .use(async ({ ctx, next }) => {
     const user = await auth.verify(ctx.token);
     return next({ ...ctx, user });
  })
  .handle(async (input, ctx) => {
    return ctx.db.invoice.findUnique({
      where: { id: input.id, tenantId: ctx.user.tenantId },
    });
  });

Context → Presenter → Tool. Standard TypeScript. Zero proprietary syntax. Your AI already speaks Zod and TypeScript — the SKILL.md teaches it the architecture.

TELL YOUR AI AGENT
"Build a patient records MCP server with Prisma. Redact SSN and diagnosis from LLM output. Add an FSM that gates discharge tools until the attending physician signs off."

Installation

bash
npm install @vurb/core @modelcontextprotocol/sdk zod

Node.js 18+. MCP · Zod · TypeScript · WinterCG — zero new syntax to learn. Works with Vercel AI SDK, LangChain, and LlamaIndex via standard stdio or HTTP transports.


COMPLIANCE & ZERO RISK
Security by design.
Not by afterthought.
The biggest CTO/CISO panic in 2026: LLMs leaking password_hash, SSNs, and medical data. Vurb guarantees the LLM sees [REDACTED].
EGRESS
Egress Firewall
Zod schema strips undeclared fields at RAM level. password_hash never reaches the wire. New columns are invisible unless declared.
DLP
PII Redaction
V8-optimized via fast-redact. GDPR, LGPD, HIPAA — impossible to bypass. The developer cannot accidentally skip it.
FSM
State Gate
Removes tools from tools/list based on workflow state. Empty cart → cart.pay doesn't exist. Anti-hallucination.
SANDBOX
Zero-Trust V8 Isolate
LLM sends JavaScript to your data. Sealed isolate — zero access to process, fs, net.
SKILLS
Agent Skills
Progressive three-layer disclosure — domain expertise on demand. Zero context window waste.
DEPLOY
One Command Deploy
vurb deployVinkius Cloud with tamper-proof audit logs. Or self-host on Vercel / Cloudflare.

TIP

Vurb blocks PII locally by default. Need to prove it in a compliance audit (SOC2/GDPR/HIPAA)? Connect to Vinkius Cloud for tamper-proof Audit Logs →

Ecosystem Packages

PackagePurpose
@vurb/vercelDeploy to Vercel — App Router, Edge or Node.js
@vurb/cloudflareDeploy to Cloudflare Workers — D1, KV, R2
@vurb/oauthOAuth Device Flow (RFC 8628)
@vurb/prisma-genAuto-generate tools from Prisma schema
@vurb/openapi-genGenerate tools from OpenAPI/Swagger specs
@vurb/skillsProgressive instruction distribution
@vurb/testingTest harness — blast radius, snapshots
@vurb/inspectorReal-time TUI dashboard