From a77f632c0a7cc68db9cf3c159e1236a30268112f Mon Sep 17 00:00:00 2001 From: DayByDay <43409392+gx-ydd@users.noreply.github.com> Date: Tue, 5 May 2026 14:54:54 +0800 Subject: [PATCH] fix(mcp): support Java system property placeholders in env expansion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .../vip/mate/tool/mcp/runtime/McpClientManager.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 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..5801ca75 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,9 +377,10 @@ public class McpClientManager { } /** - * 展开环境变量引用,如 ${ENV_VAR} 或 $ENV_VAR + * 展开系统属性和环境变量引用,如 ${user.home}、${ENV_VAR} 或 $ENV_VAR *

- * 先处理 ${VAR}(精确匹配),再用正则处理 $VAR(word boundary), + * 先处理 ${VAR}(精确匹配),优先系统属性,再回退环境变量; + * 再用正则处理 $VAR(word boundary), * 避免 $PATH 误替换 $PATH_HOME 的问题。 */ private static String expandEnvVars(String value) { @@ -386,7 +388,12 @@ public class McpClientManager { return 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 env : System.getenv().entrySet()) { result = result.replace("${" + env.getKey() + "}", env.getValue()); }