FrontMCP can emit a MCP Bundle (Documentation Index
Fetch the complete documentation index at: https://docs.agentfront.dev/llms.txt
Use this file to discover all available pages before exploring further.
.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:
| FrontMCP schema | MCPB type |
|---|---|
z.string() | string |
z.number() / z.number().int() | number |
z.boolean() | boolean |
z.array(z.string()) | string + multiple |
userConfig.key.type: 'directory' override | directory |
userConfig.key.type: 'file' override | file |
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
| Flag | Description |
|---|---|
--target mcpb | Selects the MCPB target |
-o, --out-dir <dir> | Output root — the archive lands at {out-dir}/mcpb/{name}-{version}.mcpb |
-e, --entry <path> | Manually specify the server entry file |
--sea | Also build an SEA binary for the host platform |
--merge-from <dir> | Merge pre-built cross-platform binaries from {dir}/{platform}/{name} |
--icon <path> | Override the icon path |
--no-deterministic | Disable deterministic archive output (use for diagnostics only) |
--stage-only | Leave the staging directory intact and skip zipping |
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
| Symptom | Cause / Fix |
|---|---|
@frontmcp/sdk is required for schema extraction | Make sure @frontmcp/sdk is installed and not excluded from the bundle. |
| Archive > 100 MB | Set build.esbuild.external for native/optional deps, or drop --sea to ship node-only. |
Unknown substitution variable | Only the allow-listed variables above and declared user_config keys are valid. |
entry_point is not present in the archive | A custom entry or bundler config moved the server file; re-run without overrides or set --entry correctly. |
platform_overrides.darwin-arm64.command missing | --merge-from layout must be {dir}/{platform}/{name}[.exe] — check the folder names against MCPB platform keys. |
| Two builds produce different SHA-256s | --no-deterministic or deterministic: false was set, or an input file had a changing timestamp embedded in content. |
Reference
- MCPB specification — upstream
frontmcp.config— deployment target reference- Production builds — for Node-hosted deployments