From 2fa8c75e668b927e0ac1110f6148c4b687d50779 Mon Sep 17 00:00:00 2001 From: Matthew Wang Date: Fri, 10 Oct 2025 17:12:37 -0700 Subject: [PATCH] add ping, and handle disconnect / reconnect --- server/routes/mcp/servers.ts | 15 +++++++++------ shared/mcp-client-manager/index.ts | 18 ++++++++++++++++-- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/server/routes/mcp/servers.ts b/server/routes/mcp/servers.ts index 3020e2b27..eac93f3da 100644 --- a/server/routes/mcp/servers.ts +++ b/server/routes/mcp/servers.ts @@ -5,12 +5,11 @@ const servers = new Hono(); // List all connected servers with their status servers.get("/", async (c) => { + // TODO: Figure out how to incorporate MCPClientManager try { const mcpJamClientManager = c.mcpJamClientManager; - // Get all server configurations and statuses const connectedServers = mcpJamClientManager.getConnectedServers(); - const serverList = Object.entries(connectedServers).map( ([serverId, serverInfo]) => ({ id: serverId, @@ -41,7 +40,6 @@ servers.get("/status/:serverId", async (c) => { try { const serverId = c.req.param("serverId"); const mcpJamClientManager = c.mcpJamClientManager; - const status = mcpJamClientManager.getConnectionStatus(serverId); return c.json({ @@ -65,8 +63,9 @@ servers.get("/status/:serverId", async (c) => { servers.delete("/:serverId", async (c) => { try { const serverId = c.req.param("serverId"); - const mcpJamClientManager = c.mcpJamClientManager; - + const mcpJamClientManager = c.mcpJamClientManager; // TODO: Remove MCPJamClientManager + const mcpClientManager = c.mcpClientManager; + await mcpClientManager.disconnectServer(serverId); await mcpJamClientManager.disconnectFromServer(serverId); return c.json({ @@ -100,7 +99,11 @@ servers.post("/reconnect", async (c) => { ); } - const mcpJamClientManager = c.mcpJamClientManager; + const mcpJamClientManager = c.mcpJamClientManager; // TODO: Remove MCPJamClientManager + const mcpClientManager = c.mcpClientManager; + + await mcpClientManager.disconnectServer(serverId); + await mcpClientManager.connectToServer(serverId, serverConfig); // Disconnect first, then reconnect await mcpJamClientManager.disconnectFromServer(serverId); diff --git a/shared/mcp-client-manager/index.ts b/shared/mcp-client-manager/index.ts index 96192be4e..9995e6cca 100644 --- a/shared/mcp-client-manager/index.ts +++ b/shared/mcp-client-manager/index.ts @@ -138,8 +138,10 @@ export class MCPClientManager { config: MCPServerConfig, ): Promise { const normalizedServerName = this.normalizeName(serverName); - if(this.clientStates.has(normalizedServerName)) { - throw new Error(`MCP server "${normalizedServerName}" is already connected.`); + if (this.clientStates.has(normalizedServerName)) { + throw new Error( + `MCP server "${normalizedServerName}" is already connected.`, + ); } const timeout = this.getTimeout(config); const state = this.clientStates.get(normalizedServerName) ?? { @@ -476,6 +478,18 @@ export class MCPClientManager { } } + pingServer(serverName: string, options?: RequestOptions) { + const normalizedServerName = this.normalizeName(serverName); + const client = this.getClientByName(normalizedServerName); + try { + client.ping(options); + } catch (error) { + throw new Error( + `Failed to ping MCP server "${normalizedServerName}": ${error instanceof Error ? error.message : "Unknown error"}`, + ); + } + } + clearElicitationHandler(serverName: string): void { const normalizedServerName = this.normalizeName(serverName); this.elicitationHandlers.delete(normalizedServerName);