{"record":{"id":"15e60a86f430856d","repo":"CherryHQ/cherry-studio","slug":"invalid-manifest-missing-name","errorCode":null,"errorMessage":"Invalid manifest: missing name","messagePattern":"Invalid manifest: missing name","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/main/ai/mcp/McpPackageService.ts","lineNumber":550,"sourceCode":"\n      const manifestContent = fs.readFileSync(manifestPath, 'utf-8')\n      const parsedManifest: ParsedMcpPackageManifest = JSON.parse(manifestContent)\n\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","sourceCodeStart":532,"sourceCodeEnd":568,"githubUrl":"https://github.com/CherryHQ/cherry-studio/blob/726446b54cd69ffe51a276638672f6d95ca0768c/src/main/ai/mcp/McpPackageService.ts#L532-L568","documentation":"Thrown during manifest validation when the required top-level name field is missing or falsy. After the format-specific version field is verified, the service checks the common required fields; name is first because it is also used to build the final install directory (server-${manifest.name}). A missing or empty name therefore also prevents a safe directory path.","triggerScenarios":"manifest.json parses and has the right version field but no \"name\", or \"name\": \"\" / null. The field is required by the BaseMcpPackageManifest type.","commonSituations":"The author set display_name but forgot the machine-readable name; the name was removed during a refactor; a manifest generator omitted it.","solutions":["Add a top-level \"name\" field with a stable machine-readable identifier (lowercase, no spaces is conventional, e.g. \"my-mcp-server\").","Do not confuse name with display_name (the latter is the human-readable label and is optional).","Repackage and re-upload."],"exampleFix":"// manifest.json - before\n{ \"dxt_version\": \"0.1\", \"display_name\": \"My Server\", ... }\n// after\n{ \"dxt_version\": \"0.1\", \"name\": \"my-server\", \"display_name\": \"My Server\", ... }","handlingStrategy":"validation","validationCode":"function manifestHasName(manifest: any): boolean {\n  return !!manifest && typeof manifest.name === 'string' && manifest.name.length > 0\n}","typeGuard":"function hasManifestName(m: any): m is { name: string } {\n  return !!m && typeof m.name === 'string' && m.name.length > 0\n}","tryCatchPattern":null,"preventionTips":["Always include a machine-readable top-level name (lowercase, hyphen-separated is conventional).","Do not confuse name (required) with display_name (optional, human-readable).","Add a manifest linter that rejects manifests without a non-empty name."],"tags":["mcp","manifest","validation"],"backgroundTag":null,"analyzedSha":"726446b54cd69ffe51a276638672f6d95ca0768c","analyzedAt":"2026-08-12T17:30:37.448Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}