CherryHQ/cherry-studio · error · Error
Invalid manifest: missing dxt_version
Error message
Invalid manifest: missing dxt_version
What it means
Thrown during manifest validation when the package format is 'dxt' and the parsed manifest has no dxt_version field. The dxt format requires a top-level dxt_version string. The check is the dxt branch of the format-specific validation; the mcpb branch checks manifest_version instead. Runs after JSON.parse, so a missing field, not malformed JSON.
Source
Thrown at src/main/ai/mcp/McpPackageService.ts:545
// 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) {
throw new Error('Invalid manifest: missing server.mcp_config')
}
if (!manifest.server.mcp_config.command) {
throw new Error('Invalid manifest: missing server.mcp_config.command')
}View on GitHub (pinned to 726446b54c)
Solutions
- Add a top-level "dxt_version" field to manifest.json (e.g. "0.1").
- If the manifest actually uses manifest_version, either re-upload as .mcpb or convert the manifest to the dxt schema.
- Repackage and re-upload.
Example fix
// manifest.json - before (uploaded as .dxt)
{ "manifest_version": "1", "name": "x", ... }
// after
{ "dxt_version": "0.1", "name": "x", ... } Defensive patterns
Strategy: validation
Validate before calling
function dxtManifestHasVersion(manifest: any): boolean {
return manifest && typeof manifest.dxt_version === 'string' && manifest.dxt_version.length > 0
} Type guard
function isDxtManifestShape(m: any): m is { dxt_version: string } {
return !!m && typeof m.dxt_version === 'string' && m.dxt_version.length > 0
} Prevention
- Match the manifest schema to the file extension: .dxt → dxt_version, .mcpb → manifest_version.
- Pin a known-good dxt_version in your manifest template and copy from it for new packages.
- Lint the manifest in CI against the dxt schema before publishing.
When it happens
Trigger: A .dxt archive's manifest.json omits "dxt_version" or sets it to a falsy value. Often the author used the newer mcpb schema (manifest_version) but named the file .dxt.
Common situations: Schema drift: a manifest written for the mcpb format was uploaded as .dxt; the manifest template was incomplete; the field was renamed in a tool but the version key was not updated.
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/5e2c29ad125beaf5.
Report an issue: GitHub.