@@ -19,17 +19,18 @@ export interface McpToolDefinition {
1919}
2020
2121export class McpManager {
22+ static #instance: McpManager | undefined
2223 private mcpServers : Record < string , MCPServerConfig > = { }
2324 private clients : Map < string , Client > = new Map ( ) // key: serverName, val: MCP client
2425 private mcpTools : McpToolDefinition [ ] = [ ]
2526
2627 private constructor ( private readonly configPath : string ) { }
2728
28- public static async create ( configPath : string ) : Promise < McpManager > {
29- const instance = new McpManager ( configPath )
30- await instance . loadConfig ( )
31- await instance . initAllServers ( )
32- return instance
29+ public static get instance ( ) : McpManager {
30+ if ( ! McpManager . #instance ) {
31+ throw new Error ( 'McpManager not initialized—call initMcpManager() first' )
32+ }
33+ return McpManager . # instance
3334 }
3435
3536 public async loadConfig ( ) : Promise < void > {
@@ -45,6 +46,7 @@ export class McpManager {
4546 }
4647
4748 public async initAllServers ( ) : Promise < void > {
49+ this . mcpTools = [ ]
4850 for ( const [ serverName , serverConfig ] of Object . entries ( this . mcpServers ) ) {
4951 if ( serverConfig . disabled ) {
5052 getLogger ( ) . info ( `MCP server [${ serverName } ] is disabled, skipping.` )
@@ -107,8 +109,13 @@ export class McpManager {
107109
108110 public static async initMcpManager ( configPath : string ) : Promise < McpManager | undefined > {
109111 try {
110- const manager = await McpManager . create ( configPath )
111- const discovered = manager . getAllMcpTools ( )
112+ if ( ! McpManager . #instance) {
113+ const mgr = new McpManager ( configPath )
114+ McpManager . #instance = mgr
115+ }
116+ await McpManager . #instance. loadConfig ( )
117+ await McpManager . #instance. initAllServers ( )
118+ const discovered = McpManager . #instance. getAllMcpTools ( )
112119 const builtInNames = new Set < string > ( Object . values ( ToolType ) )
113120 const discoveredNames = new Set ( discovered . map ( ( d ) => d . toolName ) )
114121
@@ -142,7 +149,7 @@ export class McpManager {
142149 }
143150 }
144151 getLogger ( ) . info ( `MCP: successfully discovered ${ discovered . length } new tools.` )
145- return manager
152+ return McpManager . instance
146153 } catch ( err ) {
147154 getLogger ( ) . error ( `Failed to init MCP manager: ${ ( err as Error ) . message } ` )
148155 return undefined
0 commit comments