{"record":{"id":"1dc7b3a5908e7609","repo":"CherryHQ/cherry-studio","slug":"invalid-manifest-missing-version","errorCode":null,"errorMessage":"Invalid manifest: missing version","messagePattern":"Invalid manifest: missing version","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/main/ai/mcp/McpPackageService.ts","lineNumber":553,"sourceCode":"\n      // Validate required fields in manifest\n      let manifest: McpPackageManifest\n      if (packageFormat === 'mcpb') {\n        if (!parsedManifest.manifest_version) {\n          throw new Error('Invalid manifest: missing manifest_version')\n        }\n        manifest = { ...parsedManifest, manifest_version: parsedManifest.manifest_version }\n      } else {\n        if (!parsedManifest.dxt_version) {\n          throw new Error('Invalid manifest: missing dxt_version')\n        }\n        manifest = { ...parsedManifest, dxt_version: parsedManifest.dxt_version }\n      }\n      if (!manifest.name) {\n        throw new Error('Invalid manifest: missing name')\n      }\n      if (!manifest.version) {\n        throw new Error('Invalid manifest: missing version')\n      }\n      if (!manifest.server) {\n        throw new Error('Invalid manifest: missing server configuration')\n      }\n      if (!manifest.server.mcp_config) {\n        throw new Error('Invalid manifest: missing server.mcp_config')\n      }\n      if (!manifest.server.mcp_config.command) {\n        throw new Error('Invalid manifest: missing server.mcp_config.command')\n      }\n      if (!Array.isArray(manifest.server.mcp_config.args)) {\n        throw new Error('Invalid manifest: server.mcp_config.args must be an array')\n      }\n\n      // Use server name as the final extract directory for automatic version management\n      const serverDirName = `server-${manifest.name}`\n      const finalExtractDir = ensurePathWithin(this.mcpDir, path.join(this.mcpDir, serverDirName))\n","sourceCodeStart":535,"sourceCodeEnd":571,"githubUrl":"https://github.com/CherryHQ/cherry-studio/blob/726446b54cd69ffe51a276638672f6d95ca0768c/src/main/ai/mcp/McpPackageService.ts#L535-L571","documentation":"Thrown during manifest validation when the required top-level version field is missing or falsy. After name, the service checks version because the package directory is managed per-version and an empty version would break version comparison and update logic.","triggerScenarios":"manifest.json has a name but no \"version\", or \"version\": \"\" / null. The field is required as a string per the BaseMcpPackageManifest type.","commonSituations":"The author set the version in package.json but forgot to mirror it into manifest.json; the version field was renamed (e.g. \"v\"); the manifest was hand-edited and the field was dropped.","solutions":["Add a top-level \"version\" field using a semver string (e.g. \"1.0.0\").","If the version lives in a build source (package.json), wire the build script to copy it into manifest.json at package time.","Repackage and re-upload."],"exampleFix":"// manifest.json - before\n{ \"name\": \"my-server\", ... }\n// after\n{ \"name\": \"my-server\", \"version\": \"1.0.0\", ... }","handlingStrategy":"validation","validationCode":"function manifestHasVersion(manifest: any): boolean {\n  return !!manifest && typeof manifest.version === 'string' && manifest.version.length > 0\n}","typeGuard":"function hasManifestVersion(m: any): m is { version: string } {\n  return !!m && typeof m.version === 'string' && m.version.length > 0\n}","tryCatchPattern":null,"preventionTips":["Set a semver-compliant top-level version (e.g. \"1.0.0\") in every manifest.","If version lives in package.json, copy it into manifest.json at build time so they never drift.","Lint the manifest for a non-empty version field in CI."],"tags":["mcp","manifest","validation"],"backgroundTag":null,"analyzedSha":"726446b54cd69ffe51a276638672f6d95ca0768c","analyzedAt":"2026-08-12T17:30:37.448Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}