CherryHQ/cherry-studio · error · Error
Invalid manifest: missing name
Error message
Invalid manifest: missing name
What it means
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.
Source
Thrown at src/main/ai/mcp/McpPackageService.ts:550
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')
}
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 managementView on GitHub (pinned to 726446b54c)
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.
Example fix
// manifest.json - before
{ "dxt_version": "0.1", "display_name": "My Server", ... }
// after
{ "dxt_version": "0.1", "name": "my-server", "display_name": "My Server", ... } Defensive patterns
Strategy: validation
Validate before calling
function manifestHasName(manifest: any): boolean {
return !!manifest && typeof manifest.name === 'string' && manifest.name.length > 0
} Type guard
function hasManifestName(m: any): m is { name: string } {
return !!m && typeof m.name === 'string' && m.name.length > 0
} Prevention
- 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.
When it happens
Trigger: manifest.json parses and has the right version field but no "name", or "name": "" / null. The field is required by the BaseMcpPackageManifest type.
Common situations: The author set display_name but forgot the machine-readable name; the name was removed during a refactor; a manifest generator omitted it.
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/15e60a86f430856d.
Report an issue: GitHub.