CherryHQ/cherry-studio · error · Error
Invalid manifest: missing server configuration
Error message
Invalid manifest: missing server configuration
What it means
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.
Source
Thrown at src/main/ai/mcp/McpPackageService.ts:556
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')
}
if (!Array.isArray(manifest.server.mcp_config.args)) {
throw new Error('Invalid manifest: server.mcp_config.args must be an array')
}
// Use server name as the final extract directory for automatic version management
const serverDirName = `server-${manifest.name}`
const finalExtractDir = ensurePathWithin(this.mcpDir, path.join(this.mcpDir, serverDirName))
// Stage the new package first, then swap directories so a failed install
// does not destroy the last working version.
await this.replacePackageDirectory(tempExtractDir, finalExtractDir, serverDirName)View on GitHub (pinned to 726446b54c)
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.
Example fix
// manifest.json - before
{ "name": "x", "version": "1.0.0" }
// after
{ "name": "x", "version": "1.0.0",
"server": { "type": "node", "entry_point": "./server.js",
"mcp_config": { "command": "node", "args": ["${__dirname}/server.js"] } } } Defensive patterns
Strategy: validation
Validate before calling
function manifestHasServer(manifest: any): boolean {
return !!manifest && typeof manifest.server === 'object' && manifest.server !== null
} Type guard
function hasManifestServer(m: any): m is { server: object } {
return !!m && typeof m.server === 'object' && m.server !== null
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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).
Related errors
- Invalid command: command must be a non-empty string
- Invalid command: command cannot be empty
- Invalid args: must be an array
- Invalid args: argument at index ${index} must be a string
- Invalid args: path traversal detected in argument at index $
AI-assisted analysis of CherryHQ/cherry-studio@726446b54c (2026-08-12).
Data as JSON: /api/errors/4bab189b34a9b1be.
Report an issue: GitHub.