Start every enabled server. Returns once all start attempts have finished (success or failure).
()
| 76 | |
| 77 | /** Start every enabled server. Returns once all start attempts have finished (success or failure). */ |
| 78 | async startAll(): Promise<void> { |
| 79 | const entries = Object.entries(this.config.servers ?? {}); |
| 80 | if (entries.length === 0) { |
| 81 | logger.debug('MCPManager: no servers configured'); |
| 82 | return; |
| 83 | } |
| 84 | |
| 85 | const startup = entries.map(async ([name, srvConfig]) => { |
| 86 | if (srvConfig.enabled === false) { |
| 87 | logger.info(`MCP server '${name}' is disabled, skipping`); |
| 88 | return; |
| 89 | } |
| 90 | try { |
| 91 | await this.startOne(name, srvConfig); |
| 92 | } catch (e: any) { |
| 93 | // Don't propagate — one bad server shouldn't kill QodeX startup |
| 94 | logger.warn(`MCP server '${name}' failed to start: ${e.message}`); |
| 95 | } |
| 96 | }); |
| 97 | |
| 98 | await Promise.allSettled(startup); |
| 99 | const total = Array.from(this.clients.values()).reduce((sum, c) => sum + c.tools.length, 0); |
| 100 | logger.info(`MCPManager: ${this.clients.size} server(s), ${total} tool(s) total`); |
| 101 | } |
| 102 | |
| 103 | /** Start a single server and register its tools. */ |
| 104 | async startOne(name: string, config: MCPServerConfig): Promise<void> { |