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

  1. Add a top-level "dxt_version" field to manifest.json (e.g. "0.1").
  2. If the manifest actually uses manifest_version, either re-upload as .mcpb or convert the manifest to the dxt schema.
  3. 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

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


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