enhance: list* tools default to minimal info

Provide expand option to provide additional detail
This commit is contained in:
Gabriel Horner
2025-10-16 16:53:00 -04:00
parent 0122425e68
commit 0f7532e3c3
5 changed files with 85 additions and 60 deletions

View File

@@ -15,14 +15,17 @@
(cli-common-mcp-server/mcp-success-response resp)
(cli-common-mcp-server/mcp-error-response (str "Error: Page " (pr-str (aget args "pageName")) " not found"))))
(defn- local-list-pages [conn _args]
(cli-common-mcp-server/mcp-success-response (cli-common-mcp-tools/list-pages @conn)))
(defn- local-list-pages [conn args]
(cli-common-mcp-server/mcp-success-response
(cli-common-mcp-tools/list-pages @conn {:expand (aget args "expand")})))
(defn- local-list-properties [conn _args]
(cli-common-mcp-server/mcp-success-response (cli-common-mcp-tools/list-properties @conn)))
(defn- local-list-properties [conn args]
(cli-common-mcp-server/mcp-success-response
(cli-common-mcp-tools/list-properties @conn {:expand (aget args "expand")})))
(defn- local-list-tags [conn _args]
(cli-common-mcp-server/mcp-success-response (cli-common-mcp-tools/list-tags @conn)))
(defn- local-list-tags [conn args]
(cli-common-mcp-server/mcp-success-response
(cli-common-mcp-tools/list-tags @conn {:expand (aget args "expand")})))
(defn- local-upsert-nodes [conn args]
(cli-common-mcp-server/mcp-success-response

View File

@@ -97,16 +97,16 @@
(call-api-fn "logseq.cli.getPageData" [(aget args "pageName")]))
(defn- api-list-pages
[call-api-fn _args]
(call-api-fn "logseq.cli.listPages" []))
[call-api-fn args]
(call-api-fn "logseq.cli.listPages" [#js {:expand (aget args "expand")}]))
(defn- api-list-tags
[call-api-fn _args]
(call-api-fn "logseq.cli.listTags" []))
[call-api-fn args]
(call-api-fn "logseq.cli.listTags" [#js {:expand (aget args "expand")}]))
(defn- api-list-properties
[call-api-fn _args]
(call-api-fn "logseq.cli.listProperties" []))
[call-api-fn args]
(call-api-fn "logseq.cli.listProperties" [#js {:expand (aget args "expand")}]))
(defn- api-search-blocks
[call-api-fn args]
@@ -121,7 +121,9 @@
{:listPages
{:fn api-list-pages
:config #js {:title "List Pages"
:description "List all pages in a graph"}}
:description "List all pages in a graph"
:inputSchema
#js {:expand (-> (z/boolean) .optional (.describe "Provide additional detail on each page"))}}}
:getPage
{:fn api-get-page
:config #js {:title "Get Page"
@@ -189,7 +191,7 @@
:entityType (z/enum #js ["block" "page" "tag" "property"])
:id (.optional (z/union #js [(z/string) (z/number) (z/null)]))
:data (-> (z/object #js {}) (.passthrough))}))
:dry-run (-> (z/boolean) (.describe "Pretend to do batch update. Does everything except actually commit change to db e.g. validation."))}}}
:dry-run (-> (z/boolean) .optional (.describe "Pretend to do batch update. Does everything except actually commit change to db e.g. validation."))}}}
:searchBlocks
{:fn api-search-blocks
:config #js {:title "Search Blocks"
@@ -198,11 +200,15 @@
:listTags
{:fn api-list-tags
:config #js {:title "List Tags"
:description "List all tags in a graph"}}
:description "List all tags in a graph"
:inputSchema
#js {:expand (-> (z/boolean) .optional (.describe "Provide additional detail on each tag"))}}}
:listProperties
{:fn api-list-properties
:config #js {:title "List Properties"
:description "List all properties in a graph"}}})
:description "List all properties in a graph"
:inputSchema
#js {:expand (-> (z/boolean) .optional (.describe "Provide additional detail on each property"))}}}})
(defn call-api-tool [tool-fn api-fn args]
(tool-fn (partial api-tool api-fn) args))

View File

@@ -22,44 +22,50 @@
(defn list-properties
"Main fn for ListProperties tool"
[db]
[db {:keys [expand]}]
(ensure-db-graph db)
(->> (d/datoms db :avet :block/tags :logseq.class/Property)
(map #(d/entity db (: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))))))
(if expand
(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))
{:block/title (:block/title e)
:block/uuid (str (:block/uuid e))})))))
(defn list-tags
"Main fn for ListTags tool"
[db]
[db {:keys [expand]}]
(ensure-db-graph db)
(->> (d/datoms db :avet :block/tags :logseq.class/Tag)
(map #(d/entity db (: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)
(assoc :logseq.property.view/type (:db/ident (:logseq.property.view/type e)))
(:logseq.property/description e)
(update :logseq.property/description db-property/property-value-content))))))
(if expand
(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)
(assoc :logseq.property.view/type (:db/ident (:logseq.property.view/type e)))
(:logseq.property/description e)
(update :logseq.property/description db-property/property-value-content))
{:block/title (:block/title e)
:block/uuid (str (:block/uuid e))})))))
(defn- get-page-blocks
[db page-id]
@@ -92,16 +98,20 @@
(defn list-pages
"Main fn for ListPages tool"
[db]
[db {:keys [expand]}]
(ensure-db-graph db)
(->> (d/datoms db :avet :block/name)
(map #(d/entity db (:e %)))
(remove entity-util/hidden?)
(map #(-> %
;; Until there are options to limit pages, return minimal info to avoid
;; exceeding max payload size
(select-keys [:block/uuid :block/title :block/created-at :block/updated-at])
(update :block/uuid str)))))
(map (fn [e]
(if expand
(-> e
;; Until there are options to limit pages, return minimal info to avoid
;; exceeding max payload size
(select-keys [:block/uuid :block/title :block/created-at :block/updated-at])
(update :block/uuid str))
{:block/title (:block/title e)
:block/uuid (str (:block/uuid e))})))))
;; upsert-nodes tool
;; =================