|
67 | 67 | (get server-config :disabled false)) |
68 | 68 | (let [transport (->transport server-config workspaces) |
69 | 69 | client (->client transport config)] |
70 | | - (swap! db* assoc-in [:mcp-clients name :client] client) |
| 70 | + (swap! db* assoc-in [:mcp-clients name] {:client client |
| 71 | + :status :starting}) |
71 | 72 | (doseq [{:keys [name uri]} workspaces] |
72 | 73 | (.addRoot client (McpSchema$Root. uri name))) |
73 | | - (.initialize client))) |
| 74 | + (.initialize client) |
| 75 | + (swap! db* update-in [:mcp-clients name] dissoc :status))) |
74 | 76 | (catch Exception e |
75 | 77 | (logger/warn logger-tag (format "Could not initialize MCP server %s. Error: %s" name (.getMessage e))) |
76 | 78 | (on-error name e)))))) |
|
87 | 89 | :mcp-name name |
88 | 90 | :mcp-client client |
89 | 91 | :description (.description tool-client) |
90 | | - ;; We convert to json to then read so we have the clojrue map |
| 92 | + ;; We convert to json to then read so we have the clojure map |
91 | 93 | ;; TODO avoid this converting to clojure map directly |
92 | 94 | :parameters (json/parse-string (.writeValueAsString obj-mapper (.inputSchema tool-client)) true)}] |
93 | 95 | (swap! db* assoc-in [:mcp-tools (:name tool)] tool))))))) |
94 | 96 |
|
95 | | -(defn list-tools [db] |
| 97 | +(defn all-tools [db] |
96 | 98 | (vals (:mcp-tools db))) |
97 | 99 |
|
98 | 100 | (defn call-tool! [^String name ^Map arguments db] |
|
114 | 116 | (swap! db* assoc |
115 | 117 | :mcp-clients {} |
116 | 118 | :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