/ src / main / mcp / init.ts
init.ts
 1  import { McpClientObject, McpMetadataConfig, McpServerConfig, McpProgressCallback } from './types'
 2  // import { Notification } from 'electron'
 3  import { initializeClient } from './client'
 4  import { loadConfigFile } from './config'
 5  import Constants from '../utils/Constants'
 6  import { getMcpConfigForDxt } from './dxt'
 7  import path from 'node:path'
 8  
 9  export async function loadConfig(): Promise<McpClientObject[]> {
10    try {
11      const config = loadConfigFile(Constants.ASSETS_PATH.mcp)
12      if (config) {
13        console.log('Config loaded:', config)
14        return Object.entries(config).map(([name, configJson]) => ({ name, configJson }))
15      }
16    } catch {
17      return []
18    }
19  }
20  
21  export async function initClients(
22    metadata: McpMetadataConfig,
23    callback?: McpProgressCallback
24  ): Promise<McpClientObject[]> {
25    if (!metadata) {
26      console.log('NO clients initialized.')
27      return []
28    }
29  
30    console.log('Config init:', metadata)
31  
32    try {
33      const entries = Object.entries(metadata)
34      const clientPromises = entries.map(async ([name, object]) => {
35        if (object.type === 'metadata__stdio_config') {
36          return initSingleClient(name, object.config, callback)
37        } else if (object.type === 'metadata__mcpb_manifest') {
38          const stdioConfig = await getMcpConfigForDxt(
39            Constants.getPosixPath(path.join(Constants.ASSETS_PATH.mcpb, name)),
40            object.config,
41            object.user_config
42          )
43          console.log(stdioConfig)
44          return initSingleClient(name, stdioConfig, callback)
45        } else {
46          return { name }
47        }
48      })
49  
50      const clients = await Promise.all(clientPromises)
51      console.log('All clients initialized.')
52      return clients
53    } catch (error) {
54      console.error('Error during client initialization:', error?.message)
55      throw new Error(`${error?.message}`)
56    }
57  }
58  
59  export async function initSingleClient(
60    name: string,
61    serverConfig: McpServerConfig,
62    callback?: McpProgressCallback
63  ): Promise<McpClientObject> {
64    console.log(`Initializing client for ${name} with config:`, serverConfig)
65    const connection = await initializeClient(name, serverConfig, callback)
66    console.log(`${name} initialized.`)
67    const configJson = serverConfig
68    return { name, connection, configJson }
69  }