MCP Hub
Back to servers

create-my-mcp-server

Validation Failed

Create production-ready MCP servers in seconds. Powered by vurb.ts — The Express.js for MCP Servers.

npm101/wk
Stars
1
Updated
Mar 22, 2026
Validated
Mar 31, 2026

Validation Error:

Timeout after 45s

Quick Install

npx -y create-my-mcp-server
create-my-mcp-server

create-my-mcp-server

The fastest way to build production-ready MCP servers.
An interactive CLI that scaffolds type-safe, secure MCP servers in seconds.

npm version npm downloads Node.js MCP Standard License Powered by vurb.ts

Documentation · Quick Start · API Reference


One Command. Your MCP Server is Ready.

npx create-my-mcp-server

Also works with:

npm create my-mcp-server@latest
npm init my-mcp-server

No setup. No boilerplate. An interactive wizard guides you through every option and your server is scaffolded, configured, and ready to connect to Cursor, Claude Desktop, Windsurf, Cline, or GitHub Copilot in under a minute.


What You Get (in ~60 seconds)

┌  Create My MCP Server  ·  powered by vurb.ts
│
◇  Project name
│  my-mcp-server
│
◇  Choose a vector  (what kind of server?)
│  ● vanilla    File-based routing, zero external deps
│  ○ prisma     Prisma schema + CRUD with field-level security
│  ○ openapi    OpenAPI 3.x / Swagger → full tool generation
│  ○ n8n        Bridge n8n workflows as MCP tools
│  ○ oauth      RFC 8628 Device Flow authentication
│
◇  Deploy target
│  ● vinkius    Vinkius Edge  (vurb deploy)
│  ○ vercel     Vercel Functions  (vercel deploy)
│  ○ cloudflare Cloudflare Workers  (wrangler deploy)
│
◇  Transport
│  ● stdio      Standard I/O — ideal for local / Cursor / Claude Desktop
│
◇  Install dependencies now?
│  ● Yes
│
◆  Scaffolding project with vurb.ts ...
│  ✔ Project scaffolded
│  ✔ Dependencies installed
│
  ✦  Your MCP server is ready.

  Next steps:

    $ cd my-mcp-server
    $ npm run dev

  Deploy  $ vurb deploy
  Docs    → https://vurb.vinkius.com

The Problem with Raw MCP Servers

Every MCP tutorial teaches you this:

// 🔴 What every tutorial shows — DON'T DO THIS
server.setRequestHandler(CallToolRequestSchema, async (request) => {
    const invoice = await db.invoices.findUnique(args.id);
    return { content: [{ type: 'text', text: JSON.stringify(invoice) }] };
    //                                          ^^^^^^^^^^^^^^^^^^^^^^^^
    //    Sends password_hash, internal_margin, customer_ssn to the LLM provider.
    //    One field = one GDPR violation.
});

Three catastrophic consequences:

ProblemWhat happens
🔴 Data exfiltrationJSON.stringify(row) sends every column to the LLM — including password_hash, ssn, internal_margin
🔴 Token explosionUnbounded findMany() dumps thousands of rows into context. Your API bill explodes.
🔴 HallucinationNo guardrails = the LLM calls tools out of order, invents parameters, ignores business rules

This CLI scaffolds servers using vurb.ts — a framework that solves all three at the architectural level.


The Solution — 15 Lines. Production-Ready.

// 🟢 vurb.ts with MVA — type-safe, PII-free, anti-hallucination
const InvoicePresenter = createPresenter('Invoice')
    .schema({ id: t.string, amount: t.number, status: t.enum('paid', 'pending') })
    .redactPII(['*.customer_ssn'])      // [REDACTED] — LLM never sees it
    .rules(['amount is in cents — divide by 100 for display'])
    .suggest((inv) => inv.status === 'pending'
        ? [suggest('billing.pay', 'Invoice pending — process payment')]
        : []);

export default f.query('billing.get_invoice')
    .describe('Get an invoice by ID')
    .withString('id', 'Invoice ID')
    .returns(InvoicePresenter)          // ← schema is the egress firewall
    .handle(async (input, ctx) =>
        ctx.db.invoices.findUnique({ where: { id: input.id } }),
    );

What the framework gives you for free:

  • ✅ Only declared fields reach the LLM — new DB columns are invisible by default
  • .redactPII() guarantees zero-leak — PII is masked before the LLM sees it
  • .suggest() computes next actions from data state — no hardcoded hints
  • ✅ Validation errors come with self-healing prompts — the LLM corrects itself

CLI Options

npx create-my-mcp-server [project-name] [options]
OptionDescriptionDefault
--vector <type>vanilla, prisma, n8n, openapi, oauthvanilla
--transport <type>stdio, ssestdio
--target <platform>vinkius, vercel, cloudflarevinkius
--skip-installSkip npm install after scaffolding
-y, --yesSkip wizard, use flags / defaults
-h, --helpShow help

Non-interactive (CI / scripts)

# Defaults — vanilla + stdio + vinkius
npx create-my-mcp-server my-server --yes

# Prisma + Vercel (SSE auto-configured)
npx create-my-mcp-server my-api --vector prisma --target vercel --yes

# OpenAPI proxy + Cloudflare Workers
npx create-my-mcp-server petstore --vector openapi --transport sse --target cloudflare --yes

Vectors — Choose Your Starting Point

VectorWhat gets scaffolded
vanillaFile-based routing with autoDiscover(). Drop a .ts file in src/tools/ — it's instantly a live MCP tool. Zero external deps.
prismaPrisma schema + autogenerated CRUD tools with Presenters, field-level security (@vurb.hide), PII redaction, and tenant isolation middleware.
openapiOpenAPI 3.x / Swagger 2.0 → working MCP tools in seconds. Generates typed Zod schemas, Presenters, and tool handlers from your spec.
n8nBridge your n8n workflows as MCP tools. Each webhook endpoint becomes a typed, discoverable tool automatically.
oauthRFC 8628 Device Flow authentication, pre-wired and ready to connect to any OAuth 2.0 / OIDC provider.

Deploy Targets

TargetWhere it runsHow to deploy
vinkiusVinkius Edgevurb deploy
vercelVercel Functionsvercel deploy
cloudflareCloudflare Workerswrangler deploy

Vercel and Cloudflare automatically use SSE transport (required for edge runtimes). The CLI handles this for you.


What Is vurb.ts?

vurb.ts is The Express.js for MCP Servers — a production-grade TypeScript framework that provides the security and architectural guardrails that the raw MCP SDK leaves entirely up to you.

Raw SDK vs. vurb.ts

Raw MCP SDKvurb.ts
Data leakage🔴 JSON.stringify() — every column🟢 Presenter schema — allowlist only
PII protection🔴 Manual, error-prone🟢 .redactPII() — zero-leak guarantee
Tool routing🔴 Giant if/else chains🟢 File-based autoDiscover()
Context bloat🔴 Unbounded findMany()🟢 .limit() + TOON encoding
Hallucination guard🔴 None🟢 8 anti-hallucination mechanisms
Temporal safety🔴 LLM calls anything anytime🟢 FSM State Gate — tools disappear
Governance🔴 None🟢 Lockfile + SHA-256 attestation
Multi-agent🔴 Manual HTTP wiring🟢 @vurb/swarm — zero-trust B2BUA
Lines per tool🔴 ~200🟢 ~15

Key Features

🛡️ Presenter Egress Firewall Only declared fields pass through. A database migration that adds customer_ssn doesn't affect the LLM view — the new column is invisible unless explicitly declared.

🔒 Built-in PII Redaction .redactPII() compiles a V8-optimized redaction function. Wildcard paths ('*.ssn', 'patients[*].diagnosis'). GDPR / LGPD / HIPAA compliance baked in.

🤖 FSM State Gate The LLM literally cannot call cart.pay with an empty cart — the tool doesn't appear in tools/list until the FSM reaches the payment state. Temporal hallucination made structurally impossible.

⚡ File-Based Routing

src/tools/
├── billing/
│   ├── get_invoice.ts  → billing.get_invoice
│   └── pay.ts          → billing.pay
└── users/
    └── list.ts         → users.list

Drop a file. It's a tool. No imports. No registration. No merge conflicts.

🚀 Deploy Anywhere Same Fluent API and same Presenters work on Vinkius Edge, Vercel Functions, and Cloudflare Workers — only the transport adapter changes.


Quick Start After Scaffolding

# 1. Navigate to your project
cd my-mcp-server

# 2. Start the dev server (with HMR)
npm run dev

# 3. Connect in Cursor / Claude Desktop
#    Add to your MCP config:
#    { "command": "node", "args": ["dist/server.js"] }

# 4. Add a tool — just create a file
touch src/tools/hello.ts

# 5. Deploy
vurb deploy

Requirements

  • Node.js ≥ 18.0.0
  • npm ≥ 7 (or npx)

More


License

Apache-2.0 © Vinkius Labs

Reviews

No reviews yet

Sign in to write a review