Browse Source

fix: getPage should also return data about page

This was causing write tools to fail as llm's usually reach for
getPage over listPages to get a page id. Moved remove-hidden-properties
since it's also used by mcp api responses
Gabriel Horner 3 weeks ago
parent
commit
bfcc3590ac

+ 2 - 2
deps/cli/src/logseq/cli/commands/mcp_server.cljs

@@ -11,8 +11,8 @@
             [promesa.core :as p]))
 
 (defn- local-get-page [conn args]
-  (if-let [blocks (cli-common-mcp-tools/get-page-blocks @conn (aget args "pageName"))]
-    (cli-common-mcp-server/mcp-success-response blocks)
+  (if-let [resp (cli-common-mcp-tools/get-page-data @conn (aget args "pageName"))]
+    (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]

+ 26 - 7
deps/cli/src/logseq/cli/common/mcp/tools.cljs

@@ -45,14 +45,33 @@
                 (:logseq.property/description e)
                 (update :logseq.property/description db-property/property-value-content))))))
 
-(defn get-page-blocks
-  "Get page blocks for GetPage tool"
-  [db page-name-or-uuid]
-  (when-let [page-id (:db/id (ldb/get-page db page-name-or-uuid))]
-    (let [blocks (ldb/get-page-blocks db page-id)]
+(defn- get-page-blocks
+  [db page-id]
+  (let [blocks (ldb/get-page-blocks db page-id)]
       ;; Use repo stub since this is a DB only tool
-      (->> (otree/blocks->vec-tree "logseq_db_repo_stub" db blocks page-id)
-           (map #(update % :block/uuid str))))))
+    (->> (otree/blocks->vec-tree "logseq_db_repo_stub" db blocks page-id)
+         (map #(update % :block/uuid str)))))
+
+(defn ^:api remove-hidden-properties
+  "Given an entity map, remove properties that shouldn't be returned in api calls"
+  [m]
+  (->> (remove (fn [[k _v]]
+                 (or (= "block.temp" (namespace k))
+                     (contains? #{:logseq.property.embedding/hnsw-label-updated-at} k))) m)
+       (into {})))
+
+(defn get-page-data
+  "Get page data for GetPage tool including the page's entity and its blocks"
+  [db page-name-or-uuid]
+  (when-let [page (ldb/get-page db page-name-or-uuid)]
+    {:entity (-> (remove-hidden-properties page)
+                 (dissoc :block/tags :block/refs)
+                 (update :block/uuid str))
+     :blocks (map #(-> %
+                       remove-hidden-properties
+                       ;; remove unused and untranslated attrs
+                       (dissoc :block/children :block/page))
+                  (get-page-blocks db (:db/id page)))}))
 
 (defn list-pages
   "Main fn for ListPages tool"

+ 1 - 1
src/main/frontend/worker/db_worker.cljs

@@ -786,7 +786,7 @@
 (def-thread-api :thread-api/api-get-page-data
   [repo page-title]
   (let [conn (worker-state/get-datascript-conn repo)]
-    (cli-common-mcp-tools/get-page-blocks @conn page-title)))
+    (cli-common-mcp-tools/get-page-data @conn page-title)))
 
 (def-thread-api :thread-api/api-list-properties
   [repo]

+ 3 - 8
src/main/logseq/api.cljs

@@ -1193,14 +1193,9 @@
 (defn ^:export get_page_data
   "Like get_page_blocks_tree but for MCP tools"
   [page-title]
-  (p/let [tools (state/<invoke-db-worker :thread-api/api-get-page-data (state/get-current-repo) page-title)]
-    (if tools
-      (->> tools
-           (map #(-> %
-                     sdk-utils/remove-hidden-properties
-                     ;; remove unused and untranslated attrs
-                     (dissoc :block/children :block/page)))
-           clj->js)
+  (p/let [resp (state/<invoke-db-worker :thread-api/api-get-page-data (state/get-current-repo) page-title)]
+    (if resp
+      (clj->js resp)
       #js {:error (str "Page " (pr-str page-title) " not found")})))
 
 ;; ui

+ 2 - 6
src/main/logseq/sdk/utils.cljs

@@ -6,6 +6,7 @@
             [frontend.db :as db]
             [frontend.util :as util]
             [goog.object :as gobj]
+            [logseq.cli.common.mcp.tools :as cli-common-mcp-tools]
             [logseq.db.frontend.content :as db-content]))
 
 (defn- keep-json-keyword?
@@ -20,12 +21,7 @@
   (assert (de/entity? e))
   (assoc (into {} e) :db/id (:db/id e)))
 
-(defn remove-hidden-properties
-  [m]
-  (->> (remove (fn [[k _v]]
-                 (or (= "block.temp" (namespace k))
-                     (contains? #{:logseq.property.embedding/hnsw-label-updated-at} k))) m)
-       (into {})))
+(def remove-hidden-properties cli-common-mcp-tools/remove-hidden-properties)
 
 (defn normalize-keyword-for-json
   ([input] (normalize-keyword-for-json input true))