fix(mcp): support Java system property placeholders in env expansion

Resolve ${user.home} and other JVM system properties in MCP server env, headers, and cwd — previously only OS env vars were expanded, causing the filesystem MCP server to fail on Windows where $HOME isn't set.
This commit is contained in:
DayByDay 2026-05-05 14:54:54 +08:00 committed by GitHub
parent 10fe511d48
commit a77f632c0a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -269,6 +269,7 @@ public class McpClientManager {
// Args // Args
if (server.getArgsJson() != null && !server.getArgsJson().isBlank()) { if (server.getArgsJson() != null && !server.getArgsJson().isBlank()) {
List<String> args = JSONUtil.toList(server.getArgsJson(), String.class); List<String> args = JSONUtil.toList(server.getArgsJson(), String.class);
args = args.stream().map(McpClientManager::expandEnvVars).toList();
builder.args(args); builder.args(args);
} }
@ -376,9 +377,10 @@ public class McpClientManager {
} }
/** /**
* 展开环境变量引用 ${ENV_VAR} $ENV_VAR * 展开系统属性和环境变量引用 ${user.home}${ENV_VAR} $ENV_VAR
* <p> * <p>
* 先处理 ${VAR}精确匹配再用正则处理 $VARword boundary * 先处理 ${VAR}精确匹配优先系统属性再回退环境变量
* 再用正则处理 $VARword boundary
* 避免 $PATH 误替换 $PATH_HOME 的问题 * 避免 $PATH 误替换 $PATH_HOME 的问题
*/ */
private static String expandEnvVars(String value) { private static String expandEnvVars(String value) {
@ -386,7 +388,12 @@ public class McpClientManager {
return value; return value;
} }
String result = value; String result = value;
// Phase 1: 精确匹配 ${VAR} 模式不会误替换 // Phase 1: 精确匹配 ${VAR} 模式不会误替换支持 Java 系统属性如 ${user.home}
//JVM 里的系统属性
for (String key : System.getProperties().stringPropertyNames()) {
result = result.replace("${" + key + "}", System.getProperty(key));
}
//操作系统环境变量
for (Map.Entry<String, String> env : System.getenv().entrySet()) { for (Map.Entry<String, String> env : System.getenv().entrySet()) {
result = result.replace("${" + env.getKey() + "}", env.getValue()); result = result.replace("${" + env.getKey() + "}", env.getValue());
} }