Self-hosting
The control plane and generator are open. Bring your own Postgres, Redis, Docker host and Anthropic API key. Production uses Hetzner + Coolify + Traefik; the seams are the same.
Requirements
- Node.js 20+
- pnpm 9+
- Docker engine reachable from the generator process
- Postgres 16+ and Redis 7+ (docker-compose for dev)
- Anthropic API key (optional — mock fallback for offline dev)
Local dev
git clone <repo>
cd buildmymcpserver
pnpm install
cp .env.example .env
pnpm devpnpm dev loads .env, brings up Postgres and Redis via docker-compose, pushes the Drizzle schema, and starts web (:3001), api (:4000) and generator concurrently.
Environment variables
DATABASE_URL— Postgres connection stringREDIS_URL— Redis (BullMQ + pubsub + preview cache)ANTHROPIC_API_KEY— unset = mock generatorSECRETS_ENCRYPTION_KEY— 32-byte hex, AES-256-GCM keyCONTROL_PLANE_PUBLIC_URL— issuer for OAuth tokensOAUTH_KEY_DIR— where RS256 keypair lives (auto-generated on boot)RUNNER_PORT_RANGE_START/END— host port window for generated containers
Production deployment
The intended production setup is a Hetzner AX52 running Coolify, Traefik for wildcard SSL on *.mcp.yourdomain.com, and Cloudflare for DNS+DDoS. The runner-deploy adapter is the only environment-specific seam — swap the Docker-CLI implementation inapps/generator/src/lib/deploy.ts for the Coolify HTTP API.
Container sandboxing
Production flags (commented in deploy.ts):
--read-only--cap-drop=ALL--security-opt=no-new-privileges--cpus=0.5 --memory=512m
Dev relaxes these for Docker Desktop on Windows compat. Don't ship dev defaults to prod.