From e7bb9874417ade10a4648705d15f4f63684bb0d7 Mon Sep 17 00:00:00 2001 From: Abhishek Agarwal Date: Wed, 10 Dec 2025 19:05:32 +0530 Subject: [PATCH] =?UTF-8?q?=E2=8F=B1=EF=B8=8F=20feat:=20Make=20User=20Conn?= =?UTF-8?q?ection=20Idle=20Timeout=20Configurable=20(#10866)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/api/src/mcp/UserConnectionManager.ts | 6 +++--- packages/api/src/mcp/mcpConfig.ts | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/api/src/mcp/UserConnectionManager.ts b/packages/api/src/mcp/UserConnectionManager.ts index 21c177dc7c..6315007d53 100644 --- a/packages/api/src/mcp/UserConnectionManager.ts +++ b/packages/api/src/mcp/UserConnectionManager.ts @@ -5,6 +5,7 @@ import { mcpServersRegistry as serversRegistry } from '~/mcp/registry/MCPServers import { MCPConnection } from './connection'; import type * as t from './types'; import { ConnectionsRepository } from '~/mcp/ConnectionsRepository'; +import { mcpConfig } from './mcpConfig'; /** * Abstract base class for managing user-specific MCP connections with lifecycle management. @@ -20,7 +21,6 @@ export abstract class UserConnectionManager { protected userConnections: Map> = new Map(); /** Last activity timestamp for users (not per server) */ protected userLastActivity: Map = new Map(); - protected readonly USER_CONNECTION_IDLE_TIMEOUT = 15 * 60 * 1000; // 15 minutes (TODO: make configurable) /** Updates the last activity timestamp for a user */ protected updateUserLastActivity(userId: string): void { @@ -67,7 +67,7 @@ export abstract class UserConnectionManager { // Check if user is idle const lastActivity = this.userLastActivity.get(userId); - if (lastActivity && now - lastActivity > this.USER_CONNECTION_IDLE_TIMEOUT) { + if (lastActivity && now - lastActivity > mcpConfig.USER_CONNECTION_IDLE_TIMEOUT) { logger.info(`[MCP][User: ${userId}] User idle for too long. Disconnecting all connections.`); // Disconnect all user connections try { @@ -217,7 +217,7 @@ export abstract class UserConnectionManager { if (currentUserId && currentUserId === userId) { continue; } - if (now - lastActivity > this.USER_CONNECTION_IDLE_TIMEOUT) { + if (now - lastActivity > mcpConfig.USER_CONNECTION_IDLE_TIMEOUT) { logger.info( `[MCP][User: ${userId}] User idle for too long. Disconnecting all connections...`, ); diff --git a/packages/api/src/mcp/mcpConfig.ts b/packages/api/src/mcp/mcpConfig.ts index 4d0f2b8ca7..5018d04603 100644 --- a/packages/api/src/mcp/mcpConfig.ts +++ b/packages/api/src/mcp/mcpConfig.ts @@ -8,4 +8,6 @@ export const mcpConfig = { OAUTH_ON_AUTH_ERROR: isEnabled(process.env.MCP_OAUTH_ON_AUTH_ERROR ?? true), OAUTH_DETECTION_TIMEOUT: math(process.env.MCP_OAUTH_DETECTION_TIMEOUT ?? 5000), CONNECTION_CHECK_TTL: math(process.env.MCP_CONNECTION_CHECK_TTL ?? 60000), + /** Idle timeout (ms) after which user connections are disconnected. Default: 15 minutes */ + USER_CONNECTION_IDLE_TIMEOUT: math(process.env.MCP_USER_CONNECTION_IDLE_TIMEOUT ?? 15 * 60 * 1000), };