|
28 | 28 | McpSchema$Tool |
29 | 29 | McpTransport] |
30 | 30 | [java.time Duration] |
31 | | - [java.util List Map])) |
| 31 | + [java.util List Map] |
| 32 | + [java.util.concurrent TimeoutException])) |
32 | 33 |
|
33 | 34 | (set! *warn-on-reflection* true) |
34 | 35 |
|
|
68 | 69 | (getProcessBuilder [] (-> (ProcessBuilder. ^List pb-init-args) |
69 | 70 | (.directory (io/file work-dir))))))) |
70 | 71 |
|
71 | | -(defn ^:private ->client ^McpSyncClient [name transport config workspaces] |
| 72 | +(defn ^:private ->client ^McpSyncClient [name transport init-timeout workspaces] |
72 | 73 | (-> (McpClient/sync transport) |
73 | 74 | (.requestTimeout (Duration/ofHours 10)) ;; required any value for initializationTimeout work |
74 | | - (.initializationTimeout (Duration/ofSeconds (:mcpTimeoutSeconds config))) |
| 75 | + (.initializationTimeout (Duration/ofSeconds init-timeout)) |
75 | 76 | (.capabilities (-> (McpSchema$ClientCapabilities/builder) |
76 | 77 | (.roots true) |
77 | 78 | (.build))) |
|
152 | 153 | (let [db @db* |
153 | 154 | workspaces (:workspace-folders @db*) |
154 | 155 | server-config (get-in config [:mcpServers name]) |
155 | | - obj-mapper (ObjectMapper.)] |
| 156 | + obj-mapper (ObjectMapper.) |
| 157 | + init-timeout (:mcpTimeoutSeconds config) |
| 158 | + transport (->transport server-config workspaces) |
| 159 | + client (->client name transport init-timeout workspaces)] |
| 160 | + (on-server-updated (->server name server-config :starting db)) |
| 161 | + (swap! db* assoc-in [:mcp-clients name] {:client client :status :starting}) |
156 | 162 | (try |
157 | | - (let [transport (->transport server-config workspaces) |
158 | | - client (->client name transport config workspaces)] |
159 | | - (on-server-updated (->server name server-config :starting db)) |
160 | | - (swap! db* assoc-in [:mcp-clients name] {:client client :status :starting}) |
161 | | - (.initialize client) |
162 | | - (swap! db* assoc-in [:mcp-clients name :tools] (list-server-tools obj-mapper client)) |
163 | | - (swap! db* assoc-in [:mcp-clients name :prompts] (list-server-prompts client)) |
164 | | - (swap! db* assoc-in [:mcp-clients name :resources] (list-server-resources client)) |
165 | | - (swap! db* assoc-in [:mcp-clients name :status] :running) |
166 | | - (on-server-updated (->server name server-config :running @db*))) |
| 163 | + (.initialize client) |
| 164 | + (swap! db* assoc-in [:mcp-clients name :tools] (list-server-tools obj-mapper client)) |
| 165 | + (swap! db* assoc-in [:mcp-clients name :prompts] (list-server-prompts client)) |
| 166 | + (swap! db* assoc-in [:mcp-clients name :resources] (list-server-resources client)) |
| 167 | + (swap! db* assoc-in [:mcp-clients name :status] :running) |
| 168 | + (on-server-updated (->server name server-config :running @db*)) |
167 | 169 | (logger/info logger-tag (format "Started MCP server %s" name)) |
168 | 170 | (catch Exception e |
169 | | - (logger/error logger-tag (format "Could not initialize MCP server %s." name) e) |
| 171 | + (let [cause-message (if (instance? TimeoutException (.getCause e)) |
| 172 | + (format "Timeout of %s secs waiting for server start" init-timeout) |
| 173 | + (.getMessage (.getCause e)))] |
| 174 | + (logger/error logger-tag (format "Could not initialize MCP server %s: %s: %s" name (.getMessage e) cause-message))) |
170 | 175 | (swap! db* assoc-in [:mcp-clients name :status] :failed) |
171 | | - (on-server-updated (->server name server-config :failed db)))))) |
| 176 | + (on-server-updated (->server name server-config :failed db)) |
| 177 | + (.close client))))) |
172 | 178 |
|
173 | 179 | (defn initialize-servers-async! [{:keys [on-server-updated]} db* config] |
174 | 180 | (let [db @db*] |
|
0 commit comments