.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
- Use MCPB when
- Use `--target cli` when
- Use `--target node` / serverless when
- 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_configform so users can supply tokens/paths during install rather than editing JSON.
Quick start
Output layout
sha256 of every archive it emits so you can attach it to release
notes.
Configuration
MCPB metadata lives alongside your other deployment targets infrontmcp.config:
frontmcp.config.ts
package.json — name, 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 itsnameanddescription(system tools likeexecute_job/register_workfloware filtered out)tools_generated: false— consumers can trust the static listprompts[]— prompt names + descriptionsprompts_generated: true— FrontMCP prompts resolve viaexecute(); MCPB’s statictextfield cannot represent JS logic, so consumers queryprompts/getat 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 asetup.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)
.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.
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:
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 themcpb validate subcommand before attaching an archive to a release:
- opens as a ZIP and contains a
manifest.json - parses against the MCPB v0.3 schema
- points
server.entry_pointto a file actually present in the archive - uses only allow-listed
${…}substitutions (__dirname,HOME,DESKTOP,DOCUMENTS,DOWNLOADS,pathSeparator, and declareduser_configkeys) - has an accessible icon if one is declared
- has no zip-slip paths or absolute paths where
${__dirname}/…is expected - binaries referenced in
platform_overridesexist underbin/
node_modules/,
and for absolute paths that should probably be ${__dirname}/….
Troubleshooting
Reference
- MCPB specification — upstream
frontmcp.config— deployment target reference- Production builds — for Node-hosted deployments