{"record":{"id":"4bab189b34a9b1be","repo":"CherryHQ/cherry-studio","slug":"invalid-manifest-missing-server-configuration","errorCode":null,"errorMessage":"Invalid manifest: missing server configuration","messagePattern":"Invalid manifest: missing server configuration","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/main/ai/mcp/McpPackageService.ts","lineNumber":556,"sourceCode":"      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\n      // Stage the new package first, then swap directories so a failed install\n      // does not destroy the last working version.\n      await this.replacePackageDirectory(tempExtractDir, finalExtractDir, serverDirName)","sourceCodeStart":538,"sourceCodeEnd":574,"githubUrl":"https://github.com/CherryHQ/cherry-studio/blob/726446b54cd69ffe51a276638672f6d95ca0768c/src/main/ai/mcp/McpPackageService.ts#L538-L574","documentation":"Thrown during manifest validation when the required top-level server object is missing or falsy. The server field holds the package's server configuration (type, entry_point, and crucially mcp_config with command/args/env). Without it the service cannot determine how to launch the MCP server.","triggerScenarios":"manifest.json has name and version but no \"server\" object, or \"server\": null. Common when the author filled in metadata fields but omitted the server block, or nested it under another key.","commonSituations":"Manifest authoring tools that scaffold metadata but leave the server block for later; copy-paste from a config that used a different top-level shape (e.g. \"servers\" plural).","solutions":["Add a top-level \"server\" object with at least type, entry_point, and mcp_config (command, args). See the BaseMcpPackageManifest type for the full shape.","If the server config was placed under a different key, move it to \"server\".","Repackage and re-upload."],"exampleFix":"// manifest.json - before\n{ \"name\": \"x\", \"version\": \"1.0.0\" }\n// after\n{ \"name\": \"x\", \"version\": \"1.0.0\",\n  \"server\": { \"type\": \"node\", \"entry_point\": \"./server.js\",\n    \"mcp_config\": { \"command\": \"node\", \"args\": [\"${__dirname}/server.js\"] } } }","handlingStrategy":"validation","validationCode":"function manifestHasServer(manifest: any): boolean {\n  return !!manifest && typeof manifest.server === 'object' && manifest.server !== null\n}","typeGuard":"function hasManifestServer(m: any): m is { server: object } {\n  return !!m && typeof m.server === 'object' && m.server !== null\n}","tryCatchPattern":null,"preventionTips":["Always include a top-level server object with type, entry_point, and mcp_config.","Use a manifest schema validator (JSON Schema) in CI to catch a missing server block before publishing.","Start from the official manifest template rather than hand-authoring the structure."],"tags":["mcp","manifest","validation"],"backgroundTag":null,"analyzedSha":"726446b54cd69ffe51a276638672f6d95ca0768c","analyzedAt":"2026-08-12T17:30:37.448Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}