From 0665a6be09bd7c9911e2820f7757982a3e738f4c Mon Sep 17 00:00:00 2001 From: matevip Date: Tue, 5 May 2026 15:21:20 +0800 Subject: [PATCH] fix(mcp): expand JVM system properties in stdio args/env/cwd --- .../mate/tool/mcp/runtime/McpClientManager.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/mateclaw-server/src/main/java/vip/mate/tool/mcp/runtime/McpClientManager.java b/mateclaw-server/src/main/java/vip/mate/tool/mcp/runtime/McpClientManager.java index 88dd7a71..542b1cd5 100644 --- a/mateclaw-server/src/main/java/vip/mate/tool/mcp/runtime/McpClientManager.java +++ b/mateclaw-server/src/main/java/vip/mate/tool/mcp/runtime/McpClientManager.java @@ -269,6 +269,7 @@ public class McpClientManager { // Args if (server.getArgsJson() != null && !server.getArgsJson().isBlank()) { List args = JSONUtil.toList(server.getArgsJson(), String.class); + args = args.stream().map(McpClientManager::expandEnvVars).toList(); builder.args(args); } @@ -376,17 +377,22 @@ public class McpClientManager { } /** - * 展开环境变量引用,如 ${ENV_VAR} 或 $ENV_VAR + * 展开系统属性和环境变量引用,如 ${user.home}、${ENV_VAR} 或 $ENV_VAR *

- * 先处理 ${VAR}(精确匹配),再用正则处理 $VAR(word boundary), - * 避免 $PATH 误替换 $PATH_HOME 的问题。 + * 先处理 ${VAR}(精确匹配,JVM 系统属性优先于环境变量, + * 这样 ${user.home} 等跨平台占位符在 Windows 上也能解析), + * 再用正则处理 $VAR(word boundary),避免 $PATH 误替换 $PATH_HOME 的问题。 */ private static String expandEnvVars(String value) { if (value == null || !value.contains("$")) { return value; } String result = value; - // Phase 1: 精确匹配 ${VAR} 模式(不会误替换) + // Phase 1a: ${VAR} 优先匹配 JVM system property(如 ${user.home}、${java.io.tmpdir}) + for (String key : System.getProperties().stringPropertyNames()) { + result = result.replace("${" + key + "}", System.getProperty(key)); + } + // Phase 1b: ${VAR} 回退匹配 OS 环境变量 for (Map.Entry env : System.getenv().entrySet()) { result = result.replace("${" + env.getKey() + "}", env.getValue()); }