diff --git a/src-tauri/src/core/mcp.rs b/src-tauri/src/core/mcp.rs index f2109618a..06bbdcbb2 100644 --- a/src-tauri/src/core/mcp.rs +++ b/src-tauri/src/core/mcp.rs @@ -2,8 +2,11 @@ use std::{collections::HashMap, sync::Arc}; use rmcp::{service::RunningService, transport::TokioChildProcess, RoleClient, ServiceExt}; use serde_json::Value; +use tauri::{AppHandle, State}; use tokio::{process::Command, sync::Mutex}; +use super::{cmd::get_jan_data_folder_path, state::AppState}; + /// Runs MCP commands by reading configuration from a JSON file and initializing servers /// /// # Arguments @@ -77,6 +80,35 @@ fn extract_command_args( Some((command, args, envs)) } +#[tauri::command] +pub async fn restart_mcp_servers( + app: AppHandle, + state: State<'_, AppState>, +) -> Result<(), String> { + let app_path = get_jan_data_folder_path(app.clone()); + let app_path_str = app_path.to_str().unwrap().to_string(); + let servers = state.mcp_servers.clone(); + // Stop the servers + stop_mcp_servers(state.mcp_servers.clone()).await?; + + // Restart the servers + run_mcp_commands(app_path_str, servers).await +} + +pub async fn stop_mcp_servers( + servers_state: Arc>>>, +) -> Result<(), String> { + let mut servers_map = servers_state.lock().await; + let keys: Vec = servers_map.keys().cloned().collect(); + for key in keys { + if let Some(service) = servers_map.remove(&key) { + service.cancel().await.map_err(|e| e.to_string())?; + } + } + drop(servers_map); // Release the lock after stopping + Ok(()) +} + #[cfg(test)] mod tests { use super::*; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 7248e15cc..3b5b13a64 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -44,6 +44,7 @@ pub fn run() { // MCP commands core::cmd::get_tools, core::cmd::call_tool, + core::mcp::restart_mcp_servers, // Threads core::threads::list_threads, core::threads::create_thread, diff --git a/web/screens/Settings/MCP/configuration.tsx b/web/screens/Settings/MCP/configuration.tsx index b829066d2..c5593d528 100644 --- a/web/screens/Settings/MCP/configuration.tsx +++ b/web/screens/Settings/MCP/configuration.tsx @@ -46,6 +46,7 @@ const MCPConfiguration = () => { return } await window.core?.api?.saveMcpConfigs({ configs: configContent }) + await window.core?.api?.restartMcpServers() setSuccess('Config saved successfully') setIsSaving(false) diff --git a/web/screens/Settings/MCP/search.tsx b/web/screens/Settings/MCP/search.tsx index 4a4696515..f3ff5ce30 100644 --- a/web/screens/Settings/MCP/search.tsx +++ b/web/screens/Settings/MCP/search.tsx @@ -188,6 +188,7 @@ const MCPSearch = () => { await window.core?.api?.saveMcpConfigs({ configs: JSON.stringify(config, null, 2), }) + await window.core?.api?.restartMcpServers() toaster({ title: `Add ${serverName} success`, diff --git a/web/screens/Thread/ThreadCenterPanel/ChatInput/index.tsx b/web/screens/Thread/ThreadCenterPanel/ChatInput/index.tsx index 5404fd85e..4602014ff 100644 --- a/web/screens/Thread/ThreadCenterPanel/ChatInput/index.tsx +++ b/web/screens/Thread/ThreadCenterPanel/ChatInput/index.tsx @@ -154,8 +154,6 @@ const ChatInput = () => { } } - console.log(tools) - return (
{renderPreview(fileUpload)} diff --git a/web/services/tauriService.ts b/web/services/tauriService.ts index 666383bd1..a63cf2211 100644 --- a/web/services/tauriService.ts +++ b/web/services/tauriService.ts @@ -21,6 +21,7 @@ export const Routes = [ 'modifyThreadAssistant', 'saveMcpConfigs', 'getMcpConfigs', + 'restartMcpServers', ].map((r) => ({ path: `app`, route: r,