This page covers Server Mode (HTTP). For embedded SDK usage or serverless handlers, see Runtime Modes.
@FrontMcp({ ... }). This page shows the minimal config and then every top-level option you can use. Deep dives live in the pages listed under Servers.
Minimal server
info.name(string)info.version(string)apps(at least one app)
Full configuration (at a glance)
Composition mode
FrontMCP can host many apps. Choose how they’re exposed:-
Multi-App (default):
splitByApp: falseOne server scope. You may configure server-levelauthand all apps inherit it (apps can still override with app-level auth). -
Split-By-App:
splitByApp: trueEach app is isolated under its own scope/base path (for example/billing). Streamable HTTP, the/messageSSE endpoint, and OAuth issuers reuse that scope automatically. Server-levelauthis disallowed; configure auth per app. (See Authentication → Overview.)
HTTP transport
- Port: listening port for Streamable HTTP. Defaults to
process.env.PORTor3000when omitted. - entryPath: your MCP JSON-RPC entry (
''or'/mcp'). Must align with discovery. - hostFactory: advanced — provide/construct a custom host implementation.
- socketPath: listen on a Unix socket instead of a TCP port. The entire HTTP feature set (streamable HTTP, SSE, elicitation, sessions) works unchanged over Unix sockets.
- Split-by-app scopes: when
splitByAppis enabled, clients hit<entryPath>/<appId>(for example/mcp/billing) and subscribe via<entryPath>/<appId>/message; FrontMCP handles the prefixing.
CORS
CORS is configured via thehttp.cors option. It supports three modes:
FrontMCP automatically adds
Mcp-Session-Id (alongside WWW-Authenticate) to the Access-Control-Expose-Headers response header when CORS is enabled. This ensures Streamable HTTP clients can read the session ID from cross-origin responses without additional configuration.Transport
Transport configuration is a dedicated top-level
transport property, separate from auth. It controls session lifecycle, protocol presets, and persistence.transport config controls session lifecycle, protocol presets, and session persistence. Configure it at the server level or per-app when using splitByApp: true.
Session Lifecycle
Protocol Presets
Use protocol presets for simplified configuration, or provide a custom config object for fine-grained control:Protocol Options (for custom config)
Session Persistence
Session persistence is automatically enabled when you configure top-levelredis. Sessions are persisted to Redis/Vercel KV and transports can be recreated after server restart.
Session persistence uses the top-level
redis config. Configure redis once and it’s automatically shared by transport.persistence and auth.tokenStorage.splitByApp: true. Sensitive apps stay stream-only with strict session IDs, while demo or health-check apps can enable stateful/stateless HTTP for easier automation.
Redis
Redis configuration is a dedicated top-level
redis property, shared by both transport.persistence and auth.tokenStorage.Usage with Features
Theredis config is automatically used by:
- Session persistence (
transport.persistence) — stores session state for recovery - Token storage (
auth.tokenStorage: { redis: { ... } }) — stores refresh tokens securely
Logging
Use custom log transports for shipping logs to external systems; console remains on by default.
Global providers
'global' (default, shared across all requests) or 'context' (one instance per execution context).
Authentication (server level)
Server-levelauth sets the default auth for all apps (unless splitByApp: true, where auth must be per-app).
Remote OAuth (encapsulated external IdP)
Local OAuth (built-in AS)
Apps can also define their own
auth (and mark themselves standalone) to expose an isolated auth surface — useful
when mixing public and private apps under one server.Bootstrapping & discovery
- Version safety: on boot, FrontMCP checks that all
@frontmcp/*packages are aligned and throws a clear “version mismatch” error otherwise.
Common starting points
- Single app, default everything: minimal sample above.
- Multiple apps, shared auth: omit
splitByApp, set server-levelauth. - Isolated apps with per-app auth: set
splitByApp: true, configureauthin each app.
Best Practices
Do:- Start with minimal config and add options as needed
- Use
splitByApp: truefor multi-tenant deployments - Use top-level
transportconfig (notauth.transportorsession) - Use protocol presets (
'legacy','modern', etc.) instead of individual flags - Configure
redisat top-level for shared use across features (auto-enables persistence) - Use Redis for session persistence in production deployments
- Set log level to
Infoor higher in production
- Configure server-level
authwhen usingsplitByApp: true - Use deprecated
auth.transportorsession— migrate totransport - Disable
serveunless you’re managing bootstrap manually - Use
protocol: 'stateless-api'with short-lived upstream tokens - Use
protocol: 'stateless-api'in production without trust boundaries - Leave
enableConsole: truein containerized production (use transports)
Next up: learn how to structure Apps, Tools, Resources, and Prompts in the Core Components section.