Describe the bug
In Claude Desktop, ${HOME} is not substituted when it appears inside a user_config default value. When ${user_config.server_path} is resolved, the raw default string (e.g. ${HOME}/AppData/...) is passed through without further variable substitution.
Tried with multiple type values, with required: true, and using \\ instead of / - none resolve the issue.
To Reproduce
- Create a manifest using
${HOME} inside a user_config default:
{
"server": {
"type": "binary",
"entry_point": "${user_config.server_path}",
"mcp_config": {
"command": "${user_config.server_path}"
}
},
"user_config": {
"server_path": {
"type": "file",
"title": "WinGet MCP Server Executable",
"description": "Path to WindowsPackageManagerMCPServer.exe. Override only if using a custom build.",
"default": "${HOME}/AppData/Local/Microsoft/WindowsApps/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe/WindowsPackageManagerMCPServer.exe"
}
}
}
- Install the plugin without overriding the default value.
- Observe that the server fails to start -
${HOME} is not expanded in the resolved path.
Expected behavior
${HOME} in a user_config default should be substituted, producing the same resolved path as if used directly:
{
"server": {
"type": "binary",
"entry_point": "${HOME}/AppData/Local/Microsoft/WindowsApps/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe/WindowsPackageManagerMCPServer.exe",
"mcp_config": {
"command": "${HOME}/AppData/Local/Microsoft/WindowsApps/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe/WindowsPackageManagerMCPServer.exe"
}
}
}
(The above works correctly.)
Additional context
Workaround is to hardcode ${HOME} directly in entry_point/mcp_config, but this prevents users from overriding the path (e.g. for debug builds).
Describe the bug
In Claude Desktop,
${HOME}is not substituted when it appears inside auser_configdefault value. When${user_config.server_path}is resolved, the raw default string (e.g.${HOME}/AppData/...) is passed through without further variable substitution.Tried with multiple
typevalues, withrequired: true, and using\\instead of/- none resolve the issue.To Reproduce
${HOME}inside auser_configdefault:{ "server": { "type": "binary", "entry_point": "${user_config.server_path}", "mcp_config": { "command": "${user_config.server_path}" } }, "user_config": { "server_path": { "type": "file", "title": "WinGet MCP Server Executable", "description": "Path to WindowsPackageManagerMCPServer.exe. Override only if using a custom build.", "default": "${HOME}/AppData/Local/Microsoft/WindowsApps/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe/WindowsPackageManagerMCPServer.exe" } } }${HOME}is not expanded in the resolved path.Expected behavior
${HOME}in auser_configdefault should be substituted, producing the same resolved path as if used directly:{ "server": { "type": "binary", "entry_point": "${HOME}/AppData/Local/Microsoft/WindowsApps/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe/WindowsPackageManagerMCPServer.exe", "mcp_config": { "command": "${HOME}/AppData/Local/Microsoft/WindowsApps/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe/WindowsPackageManagerMCPServer.exe" } } }(The above works correctly.)
Additional context
Workaround is to hardcode
${HOME}directly inentry_point/mcp_config, but this prevents users from overriding the path (e.g. for debug builds).