|
59 | 59 | (.build))) |
60 | 60 | (.build))) |
61 | 61 |
|
62 | | -(defn initialize! [{:keys [on-error]} db* config] |
63 | | - (let [workspaces (:workspace-folders @db*)] |
| 62 | +(defn ^:private ->full-server [mcp-name server-config db] |
| 63 | + (let [tools (->> (vals (:mcp-tools db)) |
| 64 | + (filterv #(= mcp-name (:mcp-name %))) |
| 65 | + (map (fn [mcp-tool] |
| 66 | + {:name (:name mcp-tool) |
| 67 | + :description (:description mcp-tool) |
| 68 | + :parameters (:parameters mcp-tool)})))] |
| 69 | + (cond-> {:name (name mcp-name) |
| 70 | + :command (:command server-config) |
| 71 | + :args (:args server-config)} |
| 72 | + (seq tools) (assoc :tools tools)))) |
| 73 | + |
| 74 | +(defn initialize-servers-async! [{:keys [on-server-updated]} db* config] |
| 75 | + (let [workspaces (:workspace-folders @db*) |
| 76 | + db @db*] |
64 | 77 | (doseq [[name server-config] (:mcpServers config)] |
65 | | - (try |
66 | | - (when-not (and (get-in @db* [:mcp-clients name]) |
67 | | - (get server-config :disabled false)) |
68 | | - (let [transport (->transport server-config workspaces) |
69 | | - client (->client transport config)] |
70 | | - (swap! db* assoc-in [:mcp-clients name] {:client client |
71 | | - :status :starting}) |
72 | | - (doseq [{:keys [name uri]} workspaces] |
73 | | - (.addRoot client (McpSchema$Root. uri name))) |
74 | | - (.initialize client) |
75 | | - (swap! db* update-in [:mcp-clients name] dissoc :status))) |
76 | | - (catch Exception e |
77 | | - (logger/warn logger-tag (format "Could not initialize MCP server %s. Error: %s" name (.getMessage e))) |
78 | | - (on-error name e)))))) |
| 78 | + (let [full-server (->full-server name server-config db)] |
| 79 | + (when-not (get-in db [:mcp-clients name]) |
| 80 | + (if (get server-config :disabled false) |
| 81 | + (on-server-updated (assoc full-server :status :disabled)) |
| 82 | + (future |
| 83 | + (try |
| 84 | + (let [transport (->transport server-config workspaces) |
| 85 | + client (->client transport config)] |
| 86 | + (on-server-updated (assoc full-server :status :starting)) |
| 87 | + (swap! db* assoc-in [:mcp-clients name] {:client client}) |
| 88 | + (doseq [{:keys [name uri]} workspaces] |
| 89 | + (.addRoot client (McpSchema$Root. uri name))) |
| 90 | + (.initialize client) |
| 91 | + (on-server-updated (assoc full-server :status :running))) |
| 92 | + (catch Exception e |
| 93 | + (logger/warn logger-tag (format "Could not initialize MCP server %s. Error: %s" name (.getMessage e))) |
| 94 | + (on-server-updated (assoc full-server :status :failed))))))))))) |
79 | 95 |
|
80 | 96 | (defn tools-cached? [db] |
81 | 97 | (boolean (:mcp-tools db))) |
|
116 | 132 | (swap! db* assoc |
117 | 133 | :mcp-clients {} |
118 | 134 | :mcp-tools {})) |
119 | | - |
120 | | -(defn all-servers [db config] |
121 | | - (reduce |
122 | | - (fn [servers [name server]] |
123 | | - (let [{:keys [status client]} (get-in db [:mcp-clients name]) |
124 | | - tools (->> (vals (:mcp-tools db)) |
125 | | - (filterv #(= name (:mcp-name %))) |
126 | | - (map (fn [mcp-tool] |
127 | | - {:name (:name mcp-tool) |
128 | | - :description (:description mcp-tool) |
129 | | - :parameters (:parameters mcp-tool)})))] |
130 | | - (conj servers (cond-> {:name (clojure.core/name name) |
131 | | - :command (:command server) |
132 | | - :args (:args server) |
133 | | - :status (or status |
134 | | - (if client |
135 | | - (if (.isInitialized ^McpSyncClient client) |
136 | | - :running |
137 | | - :stopped) |
138 | | - :disabled))} |
139 | | - (seq tools) (assoc :tools tools))))) |
140 | | - [] |
141 | | - (:mcpServers config))) |
0 commit comments