Skip to main content
FrontMCP can emit a MCP Bundle (.mcpb) — a ZIP archive with a declarative manifest.json that describes the server’s metadata, tools, user-configurable inputs, and runtime command. Clients such as Claude Desktop double-click the bundle; the host extracts it and starts the server over stdio.
MCPB targets spec v0.3. Archives are portable across macOS, Linux, and Windows. FrontMCP emits the node server type by default, with optional SEA binaries for offline execution.

When to use MCPB

  • You ship an MCP server to end users who install via Claude Desktop, Cursor, or another MCPB-aware client — no CLI, no npx, no registry.
  • You want a single signed artifact with a stable hash you can attach to a GitHub release.
  • You need a user_config form so users can supply tokens/paths during install rather than editing JSON.

Quick start

Output layout

The archive is deterministic by default — two back-to-back builds produce byte-identical output (fixed mtime, lexicographic entry ordering). FrontMCP logs the sha256 of every archive it emits so you can attach it to release notes.

Configuration

MCPB metadata lives alongside your other deployment targets in frontmcp.config:
frontmcp.config.ts
Unset fields fall back to package.jsonname, version, description, author, license, homepage, repository, keywords, and an icon.png in the project root are all detected automatically.

Tools and prompts

FrontMCP boots your server in a schema-extraction mode at build time (FRONTMCP_SCHEMA_EXTRACT=1) to enumerate tools, resources, prompts, and skills without starting the HTTP transport. The manifest emits:
  • tools[] — every user-defined tool with its name and description (system tools like execute_job / register_workflow are filtered out)
  • tools_generated: false — consumers can trust the static list
  • prompts[] — prompt names + descriptions
  • prompts_generated: true — FrontMCP prompts resolve via execute(); MCPB’s static text field cannot represent JS logic, so consumers query prompts/get at runtime for the rendered template
Skills travel with the bundle. The build copies each skill’s SKILL.md and references/ / examples/ / scripts/ / assets/ directories into server/_skills/<skill>--<asset>/ and emits a runtime manifest so your code resolves them via __dirname after the host extracts the archive.

User configuration

If your exec config defines a setup.steps questionnaire, FrontMCP translates each step into MCPB user_config entries and wires them back into mcp_config.env via ${user_config.KEY} references:
manifest.json (excerpt)
Claude Desktop shows each entry in the install dialog and re-runs the server with the user’s answers as environment variables — matching FrontMCP’s existing .env convention so the same code path works in dev and in the bundled server. Type resolution: Defaults are stripped automatically when sensitive: true so secrets never leak into the manifest.
setup.steps with showWhen (conditional visibility) or next (branching) have no MCPB equivalent — MCPB forms are flat key/value. The generator logs a warning and renders those steps unconditionally.

SEA binaries and platform overrides

Pass --sea (or set sea.enabled in config) to ship a Node.js single-executable alongside the bundled JS. FrontMCP emits a platform_overrides block in mcp_config that routes each supported OS/arch to its binary:
Platforms without a binary fall through to the Node command — the bundled JS runs on any machine with Node installed.

Cross-platform archives

Node SEA can only build for the host OS/arch in a single pass. To ship a single .mcpb that runs binary-only on every platform, run builds in a CI matrix and assemble them with --merge-from:
.github/workflows/release.yml (excerpt)

CLI flags

Validate an archive

Use the mcpb validate subcommand before attaching an archive to a release:
The validator checks that the archive:
  • opens as a ZIP and contains a manifest.json
  • parses against the MCPB v0.3 schema
  • points server.entry_point to a file actually present in the archive
  • uses only allow-listed ${…} substitutions (__dirname, HOME, DESKTOP, DOCUMENTS, DOWNLOADS, pathSeparator, and declared user_config keys)
  • has an accessible icon if one is declared
  • has no zip-slip paths or absolute paths where ${__dirname}/… is expected
  • binaries referenced in platform_overrides exist under bin/
Warnings fire for archives over 50 MB, for declarations of node_modules/, and for absolute paths that should probably be ${__dirname}/….

Troubleshooting

Reference