|
102 | 102 | (.arguments prompt-client))}) |
103 | 103 | (.prompts (.listPrompts client)))) |
104 | 104 |
|
105 | | -(defn initialize-servers-async! [{:keys [on-server-updated]} db* config] |
106 | | - (let [workspaces (:workspace-folders @db*) |
107 | | - db @db* |
| 105 | +(defn ^:private initialize-server! [name db* config on-server-updated] |
| 106 | + (let [db @db* |
| 107 | + workspaces (:workspace-folders @db*) |
| 108 | + server-config (get-in config [:mcpServers (keyword name)]) |
108 | 109 | obj-mapper (ObjectMapper.)] |
109 | | - (doseq [[name server-config] (:mcpServers config)] |
110 | | - (when-not (get-in db [:mcp-clients name]) |
111 | | - (if (get server-config :disabled false) |
112 | | - (on-server-updated (->server name server-config :disabled db)) |
113 | | - (future |
114 | | - (try |
115 | | - (let [transport (->transport server-config workspaces) |
116 | | - client (->client transport config)] |
117 | | - (on-server-updated (->server name server-config :starting db)) |
118 | | - (swap! db* assoc-in [:mcp-clients name] {:client client}) |
119 | | - (doseq [{:keys [name uri]} workspaces] |
120 | | - (.addRoot client (McpSchema$Root. uri name))) |
121 | | - (.initialize client) |
122 | | - (swap! db* assoc-in [:mcp-clients name :tools] (list-server-tools obj-mapper client)) |
123 | | - (swap! db* assoc-in [:mcp-clients name :prompts] (list-server-prompts client)) |
124 | | - (on-server-updated (->server name server-config :running @db*))) |
125 | | - (catch Exception e |
126 | | - (logger/warn logger-tag (format "Could not initialize MCP server %s. Error: %s" name (.getMessage e))) |
127 | | - (on-server-updated (->server name server-config :failed db)))))))))) |
| 110 | + (try |
| 111 | + (let [transport (->transport server-config workspaces) |
| 112 | + client (->client transport config)] |
| 113 | + (on-server-updated (->server name server-config :starting db)) |
| 114 | + (swap! db* assoc-in [:mcp-clients name] {:client client}) |
| 115 | + (doseq [{:keys [name uri]} workspaces] |
| 116 | + (.addRoot client (McpSchema$Root. uri name))) |
| 117 | + (.initialize client) |
| 118 | + (swap! db* assoc-in [:mcp-clients name :tools] (list-server-tools obj-mapper client)) |
| 119 | + (swap! db* assoc-in [:mcp-clients name :prompts] (list-server-prompts client)) |
| 120 | + (on-server-updated (->server name server-config :running @db*))) |
| 121 | + (catch Exception e |
| 122 | + (logger/warn logger-tag (format "Could not initialize MCP server %s. Error: %s" name (.getMessage e))) |
| 123 | + (on-server-updated (->server name server-config :failed db)))))) |
| 124 | + |
| 125 | +(defn initialize-servers-async! [{:keys [on-server-updated]} db* config] |
| 126 | + (let [db @db*] |
| 127 | + (doseq [[name-kwd server-config] (:mcpServers config)] |
| 128 | + (let [name (name name-kwd)] |
| 129 | + (when-not (get-in db [:mcp-clients name]) |
| 130 | + (if (get server-config :disabled false) |
| 131 | + (on-server-updated (->server name server-config :disabled db)) |
| 132 | + (future |
| 133 | + (initialize-server! name db* config on-server-updated)))))))) |
| 134 | + |
| 135 | +(defn stop-server! [name db* config {:keys [on-server-updated]}] |
| 136 | + (when-let [{:keys [client]} (get-in @db* [:mcp-clients name])] |
| 137 | + (let [server-config (get-in config [:mcpServers (keyword name)])] |
| 138 | + (on-server-updated (->server name server-config :stopping @db*)) |
| 139 | + (.closeGracefully ^McpSyncClient client) |
| 140 | + (swap! db* update :mcp-clients dissoc name) |
| 141 | + (on-server-updated (->server name server-config :stopped @db*)) |
| 142 | + (logger/info logger-tag (format "Stopped MCP server %s" name))))) |
| 143 | + |
| 144 | +(defn start-server! [name db* config {:keys [on-server-updated]}] |
| 145 | + (when-let [server-config (get-in config [:mcpServers (keyword name)])] |
| 146 | + (if (get server-config :disabled false) |
| 147 | + (logger/warn logger-tag (format "MCP server %s is disabled and cannot be started" name)) |
| 148 | + (do |
| 149 | + (initialize-server! name db* config on-server-updated) |
| 150 | + (logger/info logger-tag (format "Started MCP server %s" name)))))) |
128 | 151 |
|
129 | 152 | (defn all-tools [db] |
130 | 153 | (into [] |
|
0 commit comments