npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

create-my-mcp-server

v1.0.0

Published

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

Readme

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:

| Problem | What happens | |---|---| | 🔴 Data exfiltration | JSON.stringify(row) sends every column to the LLM — including password_hash, ssn, internal_margin | | 🔴 Token explosion | Unbounded findMany() dumps thousands of rows into context. Your API bill explodes. | | 🔴 Hallucination | No 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]

| Option | Description | Default | |---|---|---| | --vector <type> | vanilla, prisma, n8n, openapi, oauth | vanilla | | --transport <type> | stdio, sse | stdio | | --target <platform> | vinkius, vercel, cloudflare | vinkius | | --skip-install | Skip npm install after scaffolding | — | | -y, --yes | Skip wizard, use flags / defaults | — | | -h, --help | Show 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

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


Deploy Targets

| Target | Where it runs | How to deploy | |---|---|---| | vinkius | Vinkius Edge | vurb deploy | | vercel | Vercel Functions | vercel deploy | | cloudflare | Cloudflare Workers | wrangler 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 SDK | vurb.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