Skip to main content
Deploy your FrontMCP server to serverless platforms like Vercel, AWS Lambda, and Cloudflare Workers.

Supported Platforms

Quick Start

New project? Use frontmcp create with the --target flag to scaffold a serverless-ready project:
This generates the platform config files (vercel.json, ci/template.yaml, or wrangler.toml) automatically.

Vercel

Vercel is a popular platform for deploying serverless functions with excellent DX.
For persistent session storage on Vercel, see Vercel KV Setup for an edge-compatible alternative to Redis.

Setup

  1. Build your project:
  2. This generates:
  3. Deploy:

Generated vercel.json

The buildCommand runs the vercel target through your package manager, detected from the lockfile: frontmcp create --target vercel writes the same file (with a $schema line).
The vercel target deploys a Node.js handler using Vercel’s Build Output API, not Vercel Edge Runtime. You can customize this file after generation — the build command will not overwrite existing config files.
Do not point buildCommand at your build script (npm run build). That script runs frontmcp build, which builds the deployments in your frontmcp.config (typically node) and never writes .vercel/output, so Vercel has nothing to deploy. Config files generated before 1.8.6 used <pm> run build; change them to the command in the table above.

How It Works

The generated serverless-setup.js + index.js wrapper:
  1. serverless-setup.js sets FRONTMCP_SERVERLESS=1 (must be required first, before any decorators run)
  2. index.js requires your compiled main.js (which runs the @FrontMcp decorator) and re-exports an async handler that retrieves the Express app
  3. The Vercel adapter compiles to CommonJS and bundles everything into a single handler.cjs via rspack — that bundle is what Vercel actually runs

AWS Lambda

Deploy to AWS Lambda using the Serverless Express adapter.

Prerequisites

Install the required dependency:

Setup

Projects created with frontmcp create --target lambda include a SAM template at ci/template.yaml and a deploy script:
  1. Build your project:
  2. This generates:
  3. Deploy using your preferred AWS deployment tool.

Example SAM Template

Example serverless.yml

Module Format

Lambda, Vercel, and Cloudflare Workers builds emit CommonJS (dist/index.js), so the bundle works without "type": "module" in package.json. If your handler must be ESM, you can use the import() form to load the bundle from an .mjs wrapper.

Cold Start Optimization

Lambda cold starts can add latency to the first request. Consider:
  • Provisioned Concurrency: Keep instances warm
  • Smaller bundle size: Use tree-shaking and minimize dependencies
  • ARM64 architecture: Often faster cold starts than x86

Cloudflare Workers (Experimental)

Cloudflare Workers support is experimental. The Express-to-Workers adapter has limitations with streaming, certain middleware, and some response methods.For production Cloudflare deployments, consider using Hono or native Workers APIs.
Projects created with frontmcp create --target cloudflare include a wrangler.toml and a deploy script:

Limitations

  • Basic request/response handling only
  • No streaming support
  • Limited Express middleware compatibility
  • Missing some response methods (redirect(), type(), etc.)

Setup

  1. Build your project:
  2. This generates:
  3. Deploy:

Generated wrangler.toml

Storage Considerations

Serverless environments require distributed storage since each invocation may run on a different instance.

Storage Configuration

Vercel KV has no pub/sub, so background tasks and elicitation cannot use it. The server still starts: tasks are skipped with a [tasks] startup warning unless you set tasks: { enabled: true } (which keeps the error), and elicitation throws ElicitationNotSupportedError only when its store actually resolves to Vercel KV. Give either feature its own backend (tasks: { redis }, or a Redis-backed elicitation) to use it on Vercel.

Plugin Storage

Plugins like RememberPlugin and CachePlugin can use type: 'global-store' to automatically use the FrontMcp-level storage configuration:
In-memory storage does not work reliably in serverless environments. Each invocation may create a new instance with empty memory. Always use a distributed storage backend.

How Serverless Mode Works

Architecture

Environment Variable

The FRONTMCP_SERVERLESS=1 environment variable triggers serverless mode:

Bundle-time behavior of serverless builds

  • process.env.NODE_ENV stays a runtime lookup in the Vercel and Lambda bundles. It is not inlined as "production" at build time, so a deployment’s own NODE_ENV (and the production-only checks that read it) behave the same as on a Node server.
  • Optional packages the server may or may not use (@frontmcp/storage-sqlite, @frontmcp/observability, @vercel/kv, @opentelemetry/sdk-trace-base) are bundled when installed and left as a lazy require() when they are not, so a missing optional package no longer fails the build with “Module not found”. better-sqlite3 (a native addon) is always left external.

Troubleshooting

”Serverless handler not initialized”

Causes:
  • The @FrontMcp decorator wasn’t executed before the handler was called
  • FRONTMCP_SERVERLESS=1 is not set in the entry point
Solutions:
  • Ensure your main.ts/main.js has the @FrontMcp decorator on a class
  • Verify the generated index.js sets the environment variable before importing main.js

Server answers 500 server_misconfigured

A configuration fault (for example a missing MCP_SESSION_SECRET or JWT_SECRET) is answered on Node, Vercel and Lambda the same way as on Workers: 500 {"error":"server_misconfigured","code":"SESSION_SECRET_REQUIRED","message":"<remedy>"}. The code is one of SESSION_SECRET_REQUIRED, JWT_SECRET_REQUIRED, JWT_SECRET_INVALID, UNENFORCED_METADATA, AUTH_CONFIGURATION_ERROR or CONFIG_INVALID; set the named variable in the platform’s environment settings and redeploy.

”Module not found: @codegenie/serverless-express”

The Lambda adapter requires an additional dependency:

Cold Start Performance

First requests may be slow due to initialization. Strategies:

TypeScript Compilation Errors

If you see module-related errors:
  • The adapter sets the correct module format automatically
  • --module commonjs for all targets (Node.js, Vercel, Lambda, Cloudflare); the Vercel and Lambda adapters then bundle to handler.cjs with rspack
Ensure your tsconfig.json doesn’t conflict. The CLI arguments override tsconfig settings.

API Reference

CLI Commands

SDK Exports