From 0b26647d9436d42dd8efdb17ab94ef6728b55806 Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 9 Apr 2025 09:08:17 +0700 Subject: [PATCH] chore: mcp supports env --- src-tauri/src/core/mcp.rs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/core/mcp.rs b/src-tauri/src/core/mcp.rs index b73b91f3a..f2109618a 100644 --- a/src-tauri/src/core/mcp.rs +++ b/src-tauri/src/core/mcp.rs @@ -32,11 +32,16 @@ pub async fn run_mcp_commands( log::info!("MCP Servers: {server_map:#?}"); for (name, config) in server_map { - if let Some((command, args)) = extract_command_args(config) { + if let Some((command, args, envs)) = extract_command_args(config) { let mut cmd = Command::new(command); args.iter().filter_map(Value::as_str).for_each(|arg| { cmd.arg(arg); }); + envs.iter().for_each(|(k, v)| { + if let Some(v_str) = v.as_str() { + cmd.env(k, v_str); + } + }); let service = ().serve(TokioChildProcess::new(&mut cmd).map_err(|e| e.to_string())?) @@ -58,11 +63,18 @@ pub async fn run_mcp_commands( Ok(()) } -fn extract_command_args(config: &Value) -> Option<(&str, &Vec)> { +fn extract_command_args( + config: &Value, +) -> Option<(String, Vec, serde_json::Map)> { let obj = config.as_object()?; - let command = obj.get("command")?.as_str()?; - let args = obj.get("args")?.as_array()?; - Some((command, args)) + let command = obj.get("command")?.as_str()?.to_string(); + let args = obj.get("args")?.as_array()?.clone(); + let envs = obj + .get("env") + .unwrap_or(&Value::Object(serde_json::Map::new())) + .as_object()? + .clone(); + Some((command, args, envs)) } #[cfg(test)]