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

  1. Open the package's manifest.json and add a top-level "manifest_version" field with a valid version string (e.g. "1").
  2. 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.
  3. 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

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


AI-assisted analysis of CherryHQ/cherry-studio@726446b54c (2026-08-12). Data as JSON: /api/errors/203972968338ceba. Report an issue: GitHub.