|
68 | 68 | (logger/info "ping")
|
69 | 69 | {})
|
70 | 70 |
|
71 |
| -(defmethod lsp.server/receive-request "initialize" [_ {:keys [db*]} params] |
72 |
| - (logger/info "Initializing " params) |
| 71 | +(defmethod lsp.server/receive-request "initialize" [_ {:keys [db* server-id]} params] |
| 72 | + (logger/info (format "Initializing server id %d %s" server-id params)) |
73 | 73 |
|
74 | 74 | ;; merges client-info capabilities and client protocol-version
|
75 |
| - (swap! db* merge params) |
| 75 | + (swap! db* assoc-in [:servers server-id] params) |
76 | 76 | {:protocol-version "2024-11-05"
|
77 | 77 | :capabilities {:prompts {:listChanged true}
|
78 | 78 | :tools {:listChanged true}
|
79 | 79 | :resources {}}
|
80 | 80 | :server-info {:name "docker-mcp-server"
|
81 | 81 | :version "0.0.1"}})
|
82 | 82 |
|
83 |
| -(defmethod lsp.server/receive-notification "notifications/initialized" [_ _ _] |
84 |
| - (logger/info "Initialized!")) |
| 83 | +(defmethod lsp.server/receive-notification "notifications/initialized" [_ {:keys [db* server server-id]} _] |
| 84 | + (logger/info "Initialized! " (-> @db* :servers (get server-id))) |
| 85 | + (lsp.server/discarding-stdout |
| 86 | + (when (get-in @db* [:servers server-id :capabilities :roots]) |
| 87 | + (let [response (lsp.server/deref-or-cancel |
| 88 | + (lsp.server/send-request server "roots/list" {}) |
| 89 | + 10e3 ::timeout)] |
| 90 | + (cond |
| 91 | + ;; |
| 92 | + (= ::timeout response) |
| 93 | + (logger/error "No response from client for workspace/inlayHint/refresh") |
| 94 | + ;; |
| 95 | + (:roots response) |
| 96 | + (do |
| 97 | + (logger/info "client sent roots " (:roots response)) |
| 98 | + (swap! db* update-in [:servers server-id] (fnil merge {}) response)) |
| 99 | + ;; |
| 100 | + :else |
| 101 | + (logger/warn "unexpected response " response)))))) |
85 | 102 |
|
86 | 103 | ; level is debug info notice warning error critical alert emergency
|
87 | 104 | (defmethod lsp.server/receive-request "logging/setLevel" [_ {:keys [db*]} {:keys [level]}]
|
|
216 | 233 | " params
|
217 | 234 | db* - uses mcp.prompts/registry and host-dir
|
218 | 235 | params - tools/call mcp params"
|
219 |
| - [{:keys [db*] :as components} params] |
| 236 | + [{:keys [db* server-id] :as components} params] |
220 | 237 | (volumes/with-volume
|
221 | 238 | (fn [thread-id]
|
222 | 239 | ;; TODO non-mcp tool calls are maps of content, role tool_call_id
|
|
235 | 252 | :thread-id thread-id})
|
236 | 253 | ;; tool calls are functions, which are arguments,name maps, and ids
|
237 | 254 | ;; mcp tool call params are also maps of name, and arguments
|
238 |
| - ;; TODO add the config parameters for just the registry entry that defines the tool |
239 | 255 | [{:function (update
|
240 | 256 | params :arguments
|
241 | 257 | (fn [arguments]
|
242 | 258 | (logger/trace
|
243 |
| - (-> arguments |
244 |
| - (merge (db/parameter-values (:name params))) |
245 |
| - (json/generate-string))))) |
| 259 | + (-> arguments |
| 260 | + (merge |
| 261 | + (db/parameter-values (:name params)) |
| 262 | + (select-keys (-> @db* :servers (get server-id)) [:roots])) |
| 263 | + (json/generate-string))))) |
246 | 264 | :id "1"}])
|
247 | 265 | (async/reduce conj [])
|
248 | 266 | (async/<!!))]
|
|
328 | 346 | (when (fs/exists? (fs/file registry))
|
329 | 347 | (db/registry-refs registry)))))
|
330 | 348 |
|
| 349 | +(def server-counter (atom 0)) |
| 350 | + |
331 | 351 | (defn server-context
|
332 | 352 | "create chan server options for any io chan server that we build"
|
333 | 353 | [{:keys [trace-level] :or {trace-level "off"} :as opts}]
|
|
361 | 381 | {:db* db*
|
362 | 382 | :logger timbre-logger
|
363 | 383 | :producer producer
|
| 384 | + :server-id (swap! server-counter inc) |
364 | 385 | :server server}))}
|
365 | 386 | (when (:mcp opts)
|
366 | 387 | {:in-chan-factory io-chan/mcp-input-stream->input-chan
|
|
0 commit comments