CherryHQ/cherry-studio · error · Error
Invalid manifest: missing manifest_version
Error message
Invalid manifest: missing manifest_version
What it means
Thrown during manifest validation when the package format is 'mcpb' and the parsed manifest has no manifest_version field. The mcpb format requires a top-level manifest_version string (analogous to dxt_version for the .dxt format). The check runs after JSON.parse succeeds, so this is specifically about a missing field, not a malformed JSON.
Source
Thrown at src/main/ai/mcp/McpPackageService.ts:540
await zip.extract(null, tempExtractDir)
} finally {
await zip.close()
}
// Read and validate the manifest.json
const manifestPath = path.join(tempExtractDir, 'manifest.json')
if (!fs.existsSync(manifestPath)) {
throw new Error(`manifest.json not found in ${packageLabel} file`)
}
const manifestContent = fs.readFileSync(manifestPath, 'utf-8')
const parsedManifest: ParsedMcpPackageManifest = JSON.parse(manifestContent)
// Validate required fields in manifest
let manifest: McpPackageManifest
if (packageFormat === 'mcpb') {
if (!parsedManifest.manifest_version) {
throw new Error('Invalid manifest: missing manifest_version')
}
manifest = { ...parsedManifest, manifest_version: parsedManifest.manifest_version }
} else {
if (!parsedManifest.dxt_version) {
throw new Error('Invalid manifest: missing dxt_version')
}
manifest = { ...parsedManifest, dxt_version: parsedManifest.dxt_version }
}
if (!manifest.name) {
throw new Error('Invalid manifest: missing name')
}
if (!manifest.version) {
throw new Error('Invalid manifest: missing version')
}
if (!manifest.server) {
throw new Error('Invalid manifest: missing server configuration')
}
if (!manifest.server.mcp_config) {View on GitHub (pinned to 726446b54c)
Solutions
- Open the package's manifest.json and add a top-level "manifest_version" field with a valid version string (e.g. "1").
- Confirm the file uses the mcpb schema (manifest_version) and not the dxt schema (dxt_version); if it is a dxt manifest, upload it as a .dxt instead.
- Repackage and re-upload.
Example fix
// manifest.json - before (uploaded as .mcpb)
{ "dxt_version": "0.1", "name": "x", ... }
// after
{ "manifest_version": "1", "name": "x", ... } Defensive patterns
Strategy: validation
Validate before calling
function mcpbManifestHasVersion(manifest: any): boolean {
return manifest && typeof manifest.manifest_version === 'string' && manifest.manifest_version.length > 0
} Type guard
function isMcpbManifestShape(m: any): m is { manifest_version: string } {
return !!m && typeof m.manifest_version === 'string' && m.manifest_version.length > 0
} Prevention
- Use the correct schema for the format: mcpb → manifest_version, dxt → dxt_version. Do not mix.
- Add a manifest linter to the package build that asserts the version field matches the file extension.
- Start from an official mcpb manifest template so the version field is present by construction.
When it happens
Trigger: An mcpb archive's manifest.json parses correctly but omits the top-level "manifest_version" key, or sets it to a falsy value (empty string, null).
Common situations: The author wrote a manifest for the older dxt format (using dxt_version) and renamed the file extension to .mcpb without changing the schema; the manifest template used did not include the version field; a field was misspelled (e.g. "manifestVersion").
Related errors
- Invalid command: command must be a non-empty string
- Invalid command: command cannot be empty
- Invalid args: must be an array
- Invalid args: argument at index ${index} must be a string
- Invalid args: path traversal detected in argument at index $
AI-assisted analysis of CherryHQ/cherry-studio@726446b54c (2026-08-12).
Data as JSON: /api/errors/203972968338ceba.
Report an issue: GitHub.