Răsfoiți Sursa

enhance: list tags and properties for local mcp

Gabriel Horner 1 lună în urmă
părinte
comite
179f08cf90

+ 43 - 1
deps/cli/src/logseq/cli/commands/mcp_server.cljs

@@ -10,6 +10,7 @@
             [logseq.db.common.initial-data :as common-initial-data]
             [logseq.db.common.sqlite-cli :as sqlite-cli]
             [logseq.db.frontend.entity-util :as entity-util]
+            [logseq.db.frontend.property :as db-property]
             [logseq.outliner.tree :as otree]
             [nbb.core :as nbb]
             [promesa.core :as p]))
@@ -84,13 +85,54 @@
                 :updatedAt (:block/updated-at e)}))
        mcp-success-response))
 
+(defn- local-list-properties [conn _args]
+  (->> (d/datoms @conn :avet :block/tags :logseq.class/Property)
+       (map #(d/entity @conn (:e %)))
+       #_((fn [x] (prn :prop-keys (distinct (mapcat keys x))) x))
+       (map (fn [e]
+              (cond-> (into {} e)
+                true
+                (dissoc e :block/tags :block/order :block/refs :block/name :db/index
+                        :logseq.property.embedding/hnsw-label-updated-at :logseq.property/default-value)
+                true
+                (update :block/uuid str)
+                (:logseq.property/classes e)
+                (update :logseq.property/classes #(mapv :db/ident %))
+                (:logseq.property/description e)
+                (update :logseq.property/description db-property/property-value-content))))
+       mcp-success-response))
+
+(defn- local-list-tags [conn _args]
+  (->> (d/datoms @conn :avet :block/tags :logseq.class/Tag)
+       (map #(d/entity @conn (:e %)))
+       (map (fn [e]
+              (cond-> (into {} e)
+                true
+                (dissoc e :block/tags :block/order :block/refs :block/name
+                        :logseq.property.embedding/hnsw-label-updated-at)
+                true
+                (update :block/uuid str)
+                (:logseq.property.class/extends e)
+                (update :logseq.property.class/extends #(mapv :db/ident %))
+                (:logseq.property.class/properties e)
+                (update :logseq.property.class/properties #(mapv :db/ident %))
+                (:logseq.property.view/type e)
+                (update :logseq.property.view/type :db/ident)
+                (:logseq.property/description e)
+                (update :logseq.property/description db-property/property-value-content))))
+       mcp-success-response))
+
 (def ^:private local-tools
   "MCP Tools when running with a local graph"
   (merge-with
    merge
    api-tools
    {:getPage {:fn local-get-page}
-    :getAllPages {:fn local-get-all-pages}}))
+    :getAllPages {:fn local-get-all-pages}
+    :listProperties {:fn local-list-properties
+                     :config #js {:title "List Properties"}}
+    :listTags {:fn local-list-tags
+               :config #js {:title "List Tags"}}}))
 
 (defn start [{{:keys [debug-tool graph] :as opts} :opts :as m}]
   (when (and graph (not (fs/existsSync (cli-util/get-graph-dir graph))))

+ 1 - 1
deps/cli/src/logseq/cli/commands/query.cljs

@@ -37,7 +37,7 @@
        (mapv (fn [[k v]]
                [k
                 (cond
-                  (#{:block/tags :logseq.property.class/extends} k)
+                  (#{:block/tags :logseq.property.class/extends :logseq.property/classes :logseq.property.class/properties} k)
                   (mapv :db/ident v)
                   (and (set? v) (every? de/entity? v))
                   (set (map db-property/property-value-content v))