logseq-mcp 0.3.3 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -72,7 +72,7 @@ Focus on creating a clear hierarchical structure that enhances readability and n
72
72
  }
73
73
  \`\`\``}}]})),$.prompt("extract-tasks",{source:A.string().optional(),status:A.string().optional()},(v)=>({messages:[{role:"user",content:{type:"text",text:`Extract all ${v.status||""} tasks from ${v.source||"my notes"} and organize them into a structured list. First search for task blocks, then analyze and group them by project, priority, or other relevant criteria.`}}]}))}function aH($){tH($),pH($),dH($)}import eH from"node:process";var zP=200,GP=2,QP=11,jP=36;function V0($,v){if(!$)return!1;let U=$.tags;if(Array.isArray(U))return U.includes(v);return!1}var wP=()=>{let $=eH.env.MOCK_LOGSEQ_API==="true";return X$(`Mock mode check: MOCK_LOGSEQ_API=${eH.env.MOCK_LOGSEQ_API}, isMockMode=${$}`),$};function HP($){if($.includes("getBlockProperty"))return!0;if($.includes("getProperty"))return!0;if($.includes("removeBlockProperty"))return!0;return!1}var r={pages:[{name:"MCP-Test-Page",uuid:"mock-page-1",properties:{"test-property":"test-value"}},{name:"Current-Test-Page",uuid:"mock-page-2",properties:{}},{name:"Reference-Test-Page",uuid:"mock-page-3",properties:{}},{name:"Recipe Page",uuid:"mock-page-4",properties:{tags:["recipe"]}},{name:"Tasks-Page",uuid:"mock-page-5",properties:{}}],blocks:[{uuid:"mock-block-uuid",content:"This is a test block created by MCP integration test",page:{id:"MCP-Test-Page"},parent:null},{uuid:"task-todo",content:"TODO This is a todo task",page:{id:"Tasks-Page"},parent:null},{uuid:"task-doing",content:"DOING This is a doing task",page:{id:"Tasks-Page"},parent:null},{uuid:"task-done",content:"DONE This is a done task",page:{id:"Tasks-Page"},parent:null},{uuid:"recipe-block",content:"This is a recipe block",page:{id:"Recipe Page"},properties:{tags:["recipe"]},parent:null}],currentPage:{name:"Current-Test-Page",uuid:"mock-page-2"}};async function C($,v=[]){if(wP())return lP($,v);X$(`Calling Logseq API: ${$} with args:`,JSON.stringify(v));let U=await fetch(oH,{method:"POST",headers:{Authorization:`Bearer ${rH}`,"Content-Type":"application/json"},body:JSON.stringify({method:$,args:v})});if(!U.ok)throw Error(`Logseq API error: ${U.status} ${U.statusText}`);let X=null;try{let J=await U.text();if(!J||J.trim()==="")return X$(`Empty response from Logseq API (${$})`),null;X=JSON.parse(J)}catch(J){let W;if(J instanceof Error)W=J.message;else W=String(J);if(X$(`JSON parse error for ${$}:`,J),HP($))return null;throw Error(`Failed to parse JSON response: ${W}`)}return X$("Logseq API response:",`${JSON.stringify(X).substring(0,zP)}...`),X}function NP($){let v=$[0],U=$[1]||{},X=$[2],J={name:v,uuid:`page-${Date.now()}`,properties:U};if(r.pages.push(J),X?.redirect)r.currentPage={name:v,uuid:J.uuid||"mock-page-2"};return{name:v,uuid:J.uuid||"mock-page-2",properties:U,id:Date.now()}}function IP($){let v=$[0],U=r.pages.find((X)=>X.name.toLowerCase()===v.toLowerCase());if(!U)return null;return{name:U.name.toLowerCase().replace(/\s/g,"-"),originalName:U.name,uuid:U.uuid||"mock-page-2",properties:U.properties,id:Date.now()}}function DP(){return{name:r.currentPage.name.toLowerCase().replace(/\s/g,"-"),originalName:r.currentPage.name,uuid:r.currentPage.uuid||"mock-page-2",id:Date.now()}}function OP(){return r.pages.map(($)=>({name:$.name.toLowerCase().replace(/\s/g,"-"),originalName:$.name,uuid:$.uuid||"mock-page-2",id:Date.now(),journal:!1}))}function bP($){let v=$[0];return r.blocks.filter((U)=>U.page.id.toLowerCase()===v.toLowerCase()||U.page.id.toLowerCase().replace(/\s/g,"-")===v.toLowerCase())}function VP($){return[{from:{name:"Another-Page",uuid:"mock-page-ref"},to:{name:$[0],uuid:"mock-page-target"},content:"Reference content"}]}var YW=0;function KP($){let v=$[0],U=$[1],X=$[2];YW+=1;let J={uuid:`mock-block-${Date.now()}-${YW}`,content:U,page:{id:v},properties:X?.properties||{},parent:null};return r.blocks.push(J),J}function AP($){let v=$[0],U=$[1],X=$[2];YW+=1;let J=`mock-block-${Date.now()}-${YW}`,W;if(typeof v==="string"&&!v.includes("-"))W=v;else W="MCP-Test-Page";let Y;if(typeof v==="string"&&v.includes("-"))Y=v;else Y=null;let z={uuid:J,content:U,page:{id:W},properties:X?.properties||{},parent:Y};return r.blocks.push(z),z}function BP($){let v=$[0],U=$[1],X=r.blocks.find((J)=>J.uuid===v);if(!X)return null;if(U?.includeChildren)return{...X,children:r.blocks.filter((J)=>J.parent===v)};return X}function SP($){let v=$[0],U=$[1],X=$[2],J=r.blocks.find((W)=>W.uuid===v);if(J){if(J.content=U,X?.properties)J.properties={...J.properties,...X.properties};return J}return null}function qP($){let v=$[0],U=r.blocks.findIndex((X)=>X.uuid===v);if(U>=0)r.blocks.splice(U,1);return null}function LP($){let v=$[0],U=$[1],X=r.blocks.find((W)=>W.uuid===v);if(!X?.properties)return null;let J=X.properties[U];if(J!==void 0)return J;return null}function FP($){let v=$[0],U=r.blocks.find((X)=>X.uuid===v);if(!U)return null;return U.properties||{}}function sH($){let v=$[0],U=$[1],X=$[2],J=r.blocks.find((W)=>W.uuid===v);if(!J)return null;if(!J.properties)J.properties={};return J.properties[U]=X,{"db/id":Date.now()}}function EP($){let v=$[0],U=$[1],X=r.blocks.find((J)=>J.uuid===v);if(!X?.properties)return null;return delete X.properties[U],{success:!0}}function MP($){let v=$[0],U=$[1],X=[],J=(W,Y)=>W.map((z)=>{let G={uuid:`mock-block-${Date.now()}-${Math.random().toString(jP).substring(GP,QP)}`,content:z.content||"",page:{id:v},parent:Y,properties:z.properties||{}};if(r.blocks.push(G),X.push(G),z.children&&Array.isArray(z.children))G.children=J(z.children,G.uuid);return G});if(J(U,null),X[0])return X[0];return null}function PP($){let v=$[0],U=r.blocks.findIndex((X)=>X.uuid===v);if(U>=0&&U<r.blocks.length-1){let X=r.blocks[U];if(X)for(let J=U+1;J<r.blocks.length;J+=1){let W=r.blocks[J];if(W&&W.parent===X.parent)return W}}return null}function RP($){let v=$[0],U=$[1],X=$[2],J=r.blocks.find((W)=>W.uuid===v);if(J){if(X?.children)J.parent=U;else J.parent=null;return{success:!0,uuid:v}}return null}function kP(){if(r.blocks.length>0)return r.blocks[0];return null}function CP($){if($.includes("TODO"))return["TODO"];if($.includes("DOING"))return["DOING"];if($.includes("DONE"))return["DONE"];return["TODO","DOING","DONE"]}function _P($){if(!$.includes("This is a test block created by MCP integration test"))return null;let v=r.blocks.filter((U)=>U.content.includes("This is a test block created by MCP integration test"));if(v.length>0)return v.map((U)=>[U]);return null}function ZP($){if(!$.includes("clojure.string/includes?"))return null;let v=$.match(/"(TODO|DOING|DONE|LATER|NOW|WAITING)"/g),U;if(v)U=v.map((X)=>X.replace(/"/g,""));else U=["TODO","DOING","DONE"];return r.blocks.filter((X)=>U.some((J)=>X.content.includes(J))).map((X)=>[X])}function TP($){if(!$.includes(":block/marker"))return null;let v=CP($);return r.blocks.filter((U)=>{let X=U.content.split(" ")[0];if(!X)return!1;return v.includes(X)}).map((U)=>[U])}function xP($){if(!$.includes("recipe"))return null;let v=r.blocks.filter((U)=>V0(U.properties,"recipe")||U.content.includes("#recipe")||U.content.includes("recipe"));if(v.length>0)return v.map((U)=>[U]);return null}function gP($){let v=$[0];if(!v||typeof v!=="string")return[[{uuid:"mock-query-result",content:"Mock query result",properties:{}}]];let U=_P(v);if(U)return U;let X=ZP(v);if(X)return X;let J=TP(v);if(J)return J;let W=xP(v);if(W)return W;return[[{uuid:"mock-query-result",content:"Mock query result",properties:{}}]]}function fP($){let v=$[0];if(v&&typeof v==="string"){if(v.includes("This is a test block created by MCP integration test")){let X=r.blocks.find((J)=>J.content.includes("This is a test block created by MCP integration test"));if(X)return[[X]]}let U=r.blocks.filter((X)=>X.content.includes(v)).map((X)=>[X]);if(U.length>0)return U;return[[{uuid:"search-result",content:`Search result for: ${v}`,properties:{}}]]}return[[{uuid:"default-search-result",content:"Default search result",properties:{}}]]}function yP($){let v=$[0];if(v&&typeof v==="string"&&v.includes("block/marker"))return r.blocks.filter((U)=>U.content.startsWith("TODO")||U.content.startsWith("DOING")||U.content.startsWith("DONE")).map((U)=>[U.uuid,U.content.split(" ")[0]]);if(v&&typeof v==="string"&&v.includes(":block/content"))return r.blocks.map((U)=>[{uuid:U.uuid,content:U.content,":block/content":U.content,page:U.page}]);if(v&&typeof v==="string"&&v.includes(":block/_refs"))return[["mock-reference-uuid"]];if(v&&typeof v==="string"&&v.includes(":block/properties")&&v.includes("recipe"))return r.blocks.filter((U)=>V0(U.properties,"recipe")).map((U)=>[U.uuid]);if(v&&typeof v==="string"&&v.includes(":page/properties")&&v.includes("recipe"))return r.pages.filter((U)=>V0(U.properties,"recipe")).map((U)=>[U.name]);return r.blocks.map((U)=>[{uuid:U.uuid,content:U.content}])}function uP(){return{blocks:r.blocks.filter(($)=>V0($.properties,"recipe")).map(($)=>({uuid:$.uuid,content:$.content})),pages:r.pages.filter(($)=>V0($.properties,"recipe")).map(($)=>({name:$.name}))}}var hP={"logseq.Editor.createPage":NP,"logseq.Editor.getPage":IP,"logseq.Editor.getCurrentPage":()=>DP(),"logseq.Editor.getAllPages":()=>OP(),"logseq.Editor.getPageBlocksTree":bP,"logseq.Editor.getPageLinkedReferences":VP,"logseq.Editor.createBlock":KP,"logseq.Editor.insertBlock":AP,"logseq.Editor.getBlock":BP,"logseq.Editor.updateBlock":SP,"logseq.Editor.removeBlock":qP,"logseq.Editor.getBlockProperty":LP,"logseq.Editor.getBlockProperties":FP,"logseq.Editor.setBlockProperty":sH,"logseq.Editor.upsertBlockProperty":sH,"logseq.Editor.removeBlockProperty":EP,"logseq.Editor.insertBatchBlock":MP,"logseq.Editor.setBlockCollapsed":()=>null,"logseq.Editor.toggleBlockCollapsed":()=>null,"logseq.Editor.getNextSiblingBlock":PP,"logseq.Editor.moveBlock":RP,"logseq.Editor.selectBlock":()=>null,"logseq.Editor.editBlock":()=>null,"logseq.Editor.getCurrentBlock":()=>kP(),"logseq.DB.datascriptQuery":gP,"logseq.DB.q":fP,"logseq.Datascript.q":yP,"logseq.Datascript.qUpsert":()=>uP()};function lP($,v=[]){X$(`[MOCK] Calling Logseq API: ${$} with args:`,JSON.stringify(v));let U=hP[$];if(U)return U(v);return X$(`[MOCK] Unhandled method: ${$}`),null}function $N($){$.resource("blocks",new R4("logseq:block:{uuid}",{list:void 0}),async(v,{uuid:U})=>{try{let X=await C("logseq.Editor.getBlock",[U]);if(X)return{contents:[{uri:v.href,mimeType:"application/json",text:JSON.stringify(X,null,2)}]};return{contents:[]}}catch{return{contents:[]}}})}async function mP(){try{return{resources:(await C("logseq.Editor.getAllPages",[])).map((v)=>{let U=String(v.originalName||v.name||"Untitled");return{uri:`logseq:page:${encodeURIComponent(U)}`,name:U,description:`Page: ${U}`,mimeType:"application/json"}})}}catch{return{resources:[]}}}async function nP($,v){try{let U=decodeURIComponent(v.pageName);X$(`Reading page resource for: "${U}"`);let X=await C("logseq.Editor.getPage",[U]);if(!X)return X$(`Page not found: "${U}"`),cP($,U);return await iP($,U,X)}catch(U){return rP($,U)}}function cP($,v){return{contents:[{uri:$.href,mimeType:"text/plain",text:`Page "${v}" not found`}]}}async function iP($,v,U){X$(`Getting blocks for page: "${v}"`);let X=await C("logseq.Editor.getPageBlocksTree",[v]),J={...U,blocks:X};return X$(`Successfully retrieved page resource: "${v}"`),{contents:[{uri:$.href,mimeType:"application/json",text:JSON.stringify(J,null,2)}]}}function rP($,v){return{contents:[{uri:$.href,mimeType:"text/plain",text:`Error reading page: ${v}`}]}}function vN($){$.resource("pages",new R4("logseq:page:{pageName}",{list:mP}),nP)}function UN($){$.resource("query",new R4("logseq:query:{query}",{list:void 0}),async(v,{query:U})=>{try{let X=decodeURIComponent(U),J=await C("logseq.DB.q",[X]);return{contents:[{uri:v.href,mimeType:"application/json",text:JSON.stringify(J,null,2)}]}}catch(X){return console.error("Failed to execute query resource:",X),{contents:[]}}})}function JN($){vN($),$N($),UN($)}var oP=50,pP=100,dP=946684800000,tP=4102444800000,k$={filterInternalProps:A.boolean().optional().default(!0).describe("Filter out internal Logseq properties (e.g., :plugin.property.*, :logseq.property.*)"),fields:A.array(A.string()).optional().describe('Only return these fields. Example: ["uuid", "content", "createdAt"]'),expandRefs:A.boolean().optional().default(!1).describe("Expand reference IDs to include name/uuid (requires additional API calls)"),expandParent:A.boolean().optional().default(!1).describe("Expand parent ID to include uuid/content"),expandPage:A.boolean().optional().default(!1).describe("Expand page ID to include name/uuid"),timestampFormat:A.enum(["ms","iso"]).optional().default("ms").describe('Timestamp format: "ms" (milliseconds) or "iso" (ISO 8601)'),deduplicateFields:A.boolean().optional().default(!0).describe("Remove redundant fields (title/fullTitle when same as content)")},XN={filterInternalProps:!0,fields:[],expandRefs:!1,expandParent:!1,expandPage:!1,timestampFormat:"ms",deduplicateFields:!0},aP=[/^:plugin\.property\./,/^:logseq\.property\./,/^:block\//,/^:db\//,/^:logseq\.property\//],eP=["createdAt","updatedAt","scheduled","deadline"],sP=[{primary:"content",duplicates:["title","fullTitle"]}];function zW($){if(!$||typeof $!=="object")return $;let v={};for(let[U,X]of Object.entries($))if(!aP.some((W)=>W.test(U)))if(X&&typeof X==="object"&&!Array.isArray(X))v[U]=zW(X);else if(Array.isArray(X))v[U]=X.map((W)=>{if(W&&typeof W==="object")return zW(W);return W});else v[U]=X;return v}function $2($,v,U){let[X,...J]=U.split(".");if(!X||!(X in $))return;let W=$[X];if(!W||typeof W!=="object")return;if(!v[X])v[X]={};let Y=QG(W,[J.join(".")]);v[X]={...v[X],...Y}}function QG($,v){if(!$||typeof $!=="object")return $;if(!v||v.length===0)return $;let U={};for(let X of v)if(X.includes("."))$2($,U,X);else if(X in $)U[X]=$[X];return U}function v2($){return $>dP&&$<tP}function U2($){for(let v of eP){if(!(v in $))continue;if(typeof $[v]!=="number")continue;let U=$[v];if(v2(U))$[v]=new Date(U).toISOString()}}function J2($,v){for(let[U,X]of Object.entries($))if(X&&typeof X==="object"&&!Array.isArray(X))$[U]=GW(X,v);else if(Array.isArray(X))$[U]=X.map((J)=>{if(J&&typeof J==="object")return GW(J,v);return J})}function GW($,v){if(!$||typeof $!=="object")return $;if(v==="ms")return $;let U={...$};return U2(U),J2(U,v),U}function X2($){for(let{primary:v,duplicates:U}of sP){if(!(v in $))continue;let X=$[v];for(let J of U)if(J in $&&$[J]===X)delete $[J]}delete $.order}function W2($){for(let[v,U]of Object.entries($))if(U&&typeof U==="object"&&!Array.isArray(U))$[v]=QW(U);else if(Array.isArray(U))$[v]=U.map((X)=>{if(X&&typeof X==="object")return QW(X);return X})}function QW($){if(!$||typeof $!=="object")return $;let v={...$};return X2(v),W2(v),v}async function Y2($,v){if(!($&&Array.isArray($))||$.length===0)return[];return await Promise.all($.map(async(X)=>{let J;if(typeof X==="number")J=X;else J=X.id;try{let W=await v("logseq.Editor.getBlock",[J]);if(W?.uuid)return{id:J,uuid:W.uuid,content:(W.content||"").substring(0,oP),type:"block"}}catch{}try{let W=await v("logseq.Editor.getPage",[J]);if(W?.name)return{id:J,name:W.name,uuid:W.uuid,type:"page"}}catch{}return{id:J}}))}async function z2($,v){if(!$)return;let U;if(typeof $==="number")U=$;else U=$.id;try{let X=await v("logseq.Editor.getBlock",[U]);if(X)return{id:U,uuid:X.uuid,content:(X.content||"").substring(0,pP)}}catch{}return{id:U}}async function G2($,v){if(!$)return;let U;if(typeof $==="number")U=$;else U=$.id;try{let X=await v("logseq.Editor.getPage",[U]);if(X)return{id:U,name:X.name||X.originalName,uuid:X.uuid}}catch{}return{id:U}}function Q2($,v){let U=$;if(v.filterInternalProps)U=zW(U);if(v.deduplicateFields)U=QW(U);return U}async function j2($,v,U){if(v.expandRefs&&$.refs)$.refs=await Y2($.refs,U);if(v.expandParent&&$.parent)$.parent=await z2($.parent,U);if(v.expandPage&&$.page)$.page=await G2($.page,U)}function w2($,v){let U=$;if(v.timestampFormat==="iso")U=GW(U,"iso");if(v.fields&&v.fields.length>0)U=QG(U,v.fields);return U}async function H2($,v,U){if($.children&&Array.isArray($.children))$.children=await Promise.all($.children.map((X)=>t$(X,v,U)));if($.blocks&&Array.isArray($.blocks))$.blocks=await Promise.all($.blocks.map((X)=>t$(X,v,U)))}async function t$($,v={},U){let X={...XN,...v};if(Array.isArray($))return await Promise.all($.map((Y)=>t$(Y,v,U)));if(!$||typeof $!=="object")return $;let J=Q2({...$},X);if(U)await j2(J,X,U);return J=w2(J,X),await H2(J,v,U),J}function d$($,v={}){let U={...XN,...v};if(Array.isArray($))return $.map((J)=>d$(J,v));if(!$||typeof $!=="object")return $;let X={...$};if(U.filterInternalProps)X=zW(X);if(U.deduplicateFields)X=QW(X);if(U.timestampFormat==="iso")X=GW(X,"iso");if(U.fields&&U.fields.length>0)X=QG(X,U.fields);if(X.children&&Array.isArray(X.children))X.children=X.children.map((J)=>d$(J,v));if(X.blocks&&Array.isArray(X.blocks))X.blocks=X.blocks.map((J)=>d$(J,v));return X}function M6($){return Boolean($.expandRefs||$.expandParent||$.expandPage)}var N2=/^\s*-\s+/;function jG($,v=!0){if(!v)return $;return $.split(`
74
74
  `).map((U)=>U.replace(N2,"")).join(`
75
- `)}function WN($,v=!0){return $.map((U)=>{if(typeof U==="string")return{content:jG(U,v)};if(U&&typeof U==="object"){let X={...U};if(U.content)X.content=jG(U.content,v);if("children"in U&&Array.isArray(U.children)&&U.children.length>0)X.children=WN(U.children,v);return X}return U})}function A1($){return{filterInternalProps:$.filterInternalProps??!0,fields:$.fields,expandRefs:$.expandRefs??!1,expandParent:$.expandParent??!1,expandPage:$.expandPage??!1,timestampFormat:$.timestampFormat??"ms",deduplicateFields:$.deduplicateFields??!0}}async function B1($,v){if(M6(v))return await t$($,v,C);return d$($,v)}function k4($){return{isError:!1,content:[{type:"text",text:JSON.stringify($,null,2)}]}}function U6($){return{isError:!1,content:[{type:"text",text:$}]}}function v$($){return{isError:!0,content:[{type:"text",text:$}]}}async function I2($){let{uuid:v,includeChildren:U=!0}=$;if(!v)return v$("UUID is required for get operation");let X=await C("logseq.Editor.getBlock",[v,{includeChildren:U}]);if(!X)return v$(`Block with UUID "${v}" not found`);let J=A1($),W=await B1(X,J);return k4(W)}async function D2($){let v=await C("logseq.Editor.getCurrentBlock",[]);if(!v)return v$("No block is currently focused");let U=A1($),X=await B1(v,U);return k4(X)}async function O2($){let v=await C("logseq.Editor.getSelectedBlocks",[]);if(!(v&&Array.isArray(v))||v.length===0)return v$("No blocks are currently selected");let U=A1($),X=await B1(v,U);return k4(X)}async function b2($){let{uuid:v,direction:U="next"}=$;if(!v)return v$("UUID is required for get-siblings operation");let X;if(U==="previous")X="logseq.Editor.getPreviousSiblingBlock";else X="logseq.Editor.getNextSiblingBlock";let J=await C(X,[v]);if(!J)return v$(`No ${U} sibling found for block "${v}"`);let W=A1($),Y=await B1(J,W);return k4(Y)}async function V2($,v,U,X,J){let W=WN(v,X);return await C("logseq.Editor.insertBatchBlock",[$,W,{sibling:U==="before"||U==="after",before:U==="before",keepId:J}])}async function K2($,v,U,X,J){let W=jG(v,X);if(U==="first")return await C("logseq.Editor.insertBlock",[$,W,{isPageBlock:!0,keepId:J}]);return await C("logseq.Editor.insertBlock",[$,W,{before:U==="before",sibling:U==="before"||U==="after",isPageBlock:U==="child",keepId:J}])}async function A2($){let{target:v,content:U,blocks:X,position:J="child",stripLeadingHyphen:W=!0,keepUUID:Y=!1}=$;if(!v)return v$("Target (page name or block UUID) is required for create operation");if(!(U||X))return v$("Content or blocks array is required for create operation");let z;if(X)z=await V2(v,X,J,W,Y);else if(U)z=await K2(v,U,J,W,Y);if(!z)return v$("Failed to create block");let G=A1($),Q=await B1(z,G);return k4(Q)}async function B2($){let{uuid:v,content:U,properties:X}=$;if(!v)return v$("UUID is required for update operation");if(!(U||X))return v$("Content or properties is required for update operation");try{if(U)return await C("logseq.Editor.updateBlock",[v,U]),U6(`Block "${v}" updated successfully`);if(X)return await C("logseq.Editor.setBlockProperties",[v,X]),U6(`Block "${v}" properties updated successfully`);return v$("Content or properties is required for update operation")}catch(J){return v$(`Failed to update block "${v}": ${J}`)}}async function S2($){let{uuid:v,target:U,position:X="child"}=$;if(!v)return v$("UUID is required for move operation");if(!U)return v$("Target is required for move operation");if(!await C("logseq.Editor.moveBlock",[v,U,{before:X==="before",children:X==="child"}]))return v$(`Failed to move block "${v}" to "${U}"`);return U6(`Block "${v}" moved successfully`)}async function q2($){let{uuid:v,uuids:U}=$;if(!(v||U))return v$("UUID or uuids array is required for remove operation");if(U&&Array.isArray(U))return await L2(U);try{return await C("logseq.Editor.removeBlock",[v]),U6(`Block "${v}" removed successfully`)}catch(X){return v$(`Failed to remove block "${v}": ${X}`)}}async function L2($){let v=await Promise.all($.map(async(J)=>{try{return await C("logseq.Editor.removeBlock",[J]),{uuid:J,success:!0}}catch(W){return{uuid:J,success:!1,error:W}}})),U=v.filter((J)=>J.success).length,X=v.filter((J)=>!J.success);if(X.length===0)return U6(`Successfully removed ${U} blocks`);return v$(`Removed ${U} blocks, failed to remove ${X.length}: ${X.map((J)=>J.uuid).join(", ")}`)}async function F2($){let{uuid:v,collapsed:U}=$;if(!v)return v$("UUID is required for toggle-collapse operation");if(U==="toggle")await C("logseq.Editor.toggleBlockCollapsed",[v]);else await C("logseq.Editor.setBlockCollapsed",[v,U]);return U6(`Block "${v}" collapse state toggled successfully`)}async function E2($){let{uuid:v}=$;if(!v)return v$("UUID is required for select operation");return await C("logseq.Editor.selectBlock",[v]),U6(`Block "${v}" selected successfully`)}async function M2($){let{uuid:v,pos:U}=$;if(!v)return v$("UUID is required for edit operation");return await C("logseq.Editor.editBlock",[v,U]),U6(`Block "${v}" is now in edit mode`)}async function P2($){let{uuid:v}=$;if(!v)return v$("UUID is required for open-sidebar operation");return await C("logseq.Editor.openInRightSidebar",[v]),U6(`Block "${v}" opened in right sidebar`)}async function R2($){let{uuid:v,pageName:U}=$;if(!v)return v$("UUID is required for scroll-to operation");await C("logseq.Editor.scrollToBlockInPage",[U||null,v]);let X=`Scrolled to block "${v}"`;if(U)X+=` in page "${U}"`;return U6(X)}async function k2($){let{uuid:v,propertyKey:U}=$;if(!v)return v$("UUID is required for get-property operation");if(!U)return v$("Property key is required for get-property operation");let X=await C("logseq.Editor.getBlockProperty",[v,U]);return k4(X)}async function C2($){let{uuid:v}=$;if(!v)return v$("UUID is required for get-properties operation");let U=await C("logseq.Editor.getBlockProperties",[v]),X=A1($),J=await B1(U,X);return k4(J)}async function _2($){let{uuid:v,propertyKey:U,propertyValue:X}=$;if(!v)return v$("UUID is required for set-property operation");if(!U)return v$("Property key is required for set-property operation");try{return await C("logseq.Editor.upsertBlockProperty",[v,U,X]),U6(`Property "${U}" set successfully for block "${v}"`)}catch(J){return v$(`Failed to set property "${U}" for block "${v}": ${J}`)}}async function Z2($){let{uuid:v,propertyKey:U}=$;if(!v)return v$("UUID is required for remove-property operation");if(!U)return v$("Property key is required for remove-property operation");if(!await C("logseq.Editor.removeBlockProperty",[v,U]))return v$(`Failed to remove property "${U}" from block "${v}"`);return U6(`Property "${U}" removed successfully from block "${v}"`)}async function T2($){switch($.operation){case"get":return await I2($);case"get-current":return await D2($);case"get-selected":return await O2($);case"get-siblings":return await b2($);default:return null}}async function x2($){switch($.operation){case"create":return await A2($);case"update":return await B2($);case"move":return await S2($);case"remove":return await q2($);default:return null}}async function g2($){switch($.operation){case"toggle-collapse":return await F2($);case"select":return await E2($);case"edit":return await M2($);case"open-sidebar":return await P2($);case"scroll-to":return await R2($);default:return null}}async function f2($){switch($.operation){case"get-property":return await k2($);case"get-properties":return await C2($);case"set-property":return await _2($);case"remove-property":return await Z2($);default:return null}}var y2=async($)=>{let v=$.operation;try{let U=await T2($);if(U)return U;let X=await x2($);if(X)return X;let J=await g2($);if(J)return J;let W=await f2($);if(W)return W;return v$(`Unknown operation: ${v}`)}catch(U){return v$(`Error in block operation (${v}): ${U}`)}},u2=["get","get-current","get-selected","get-siblings","create","update","move","remove","toggle-collapse","select","edit","open-sidebar","scroll-to","get-property","get-properties","set-property","remove-property"],h2=["previous","next"],l2=["child","before","after","first","last"],m2={operation:A.enum(u2).describe("Operation to perform on blocks"),uuid:A.string().optional().describe("UUID of the block (required for most operations)"),includeChildren:A.boolean().optional().default(!0).describe("Include child blocks in results (default: true)"),direction:A.enum(h2).optional().default("next").describe("Direction for sibling navigation (default: next)"),content:A.string().min(1).optional().describe("Block content for create/update operations"),properties:A.record(A.string(),A.unknown()).optional().describe("Block properties as key-value pairs"),target:A.string().optional().describe("Target block UUID or page name for create/move operations"),position:A.enum(l2).optional().default("child").describe("Position for create/move operations (default: child)"),stripLeadingHyphen:A.boolean().optional().default(!0).describe("Remove leading hyphens from content (default: true)"),blocks:A.array(A.record(A.string(),A.unknown())).optional().describe("Array of nested blocks for batch creation"),keepUUID:A.boolean().optional().default(!1).describe("Preserve custom UUIDs in block data (default: false)"),collapsed:A.union([A.boolean(),A.literal("toggle")]).optional().describe("Toggle collapse state: true/false/toggle"),pageName:A.string().optional().describe("Page name for scroll-to operations"),pos:A.number().int().nonnegative().optional().describe("Cursor position for edit operations"),propertyKey:A.string().describe("Property key for property operations"),propertyValue:A.unknown().optional().describe("Property value for set-property operations"),uuids:A.array(A.string()).optional().describe("Array of block UUIDs for batch operations"),...k$},n2=`Perform operations on Logseq blocks - read, write, organize, and manage properties.
75
+ `)}function WN($,v=!0){return $.map((U)=>{if(typeof U==="string")return{content:jG(U,v)};if(U&&typeof U==="object"){let X={...U};if(U.content)X.content=jG(U.content,v);if("children"in U&&Array.isArray(U.children)&&U.children.length>0)X.children=WN(U.children,v);return X}return U})}function A1($){return{filterInternalProps:$.filterInternalProps??!0,fields:$.fields,expandRefs:$.expandRefs??!1,expandParent:$.expandParent??!1,expandPage:$.expandPage??!1,timestampFormat:$.timestampFormat??"ms",deduplicateFields:$.deduplicateFields??!0}}async function B1($,v){if(M6(v))return await t$($,v,C);return d$($,v)}function k4($){return{isError:!1,content:[{type:"text",text:JSON.stringify($,null,2)}]}}function U6($){return{isError:!1,content:[{type:"text",text:$}]}}function v$($){return{isError:!0,content:[{type:"text",text:$}]}}async function I2($){let{uuid:v,includeChildren:U=!0}=$;if(!v)return v$("UUID is required for get operation");let X=await C("logseq.Editor.getBlock",[v,{includeChildren:U}]);if(!X)return v$(`Block with UUID "${v}" not found`);let J=A1($),W=await B1(X,J);return k4(W)}async function D2($){let v=await C("logseq.Editor.getCurrentBlock",[]);if(!v)return v$("No block is currently focused");let U=A1($),X=await B1(v,U);return k4(X)}async function O2($){let v=await C("logseq.Editor.getSelectedBlocks",[]);if(!(v&&Array.isArray(v))||v.length===0)return v$("No blocks are currently selected");let U=A1($),X=await B1(v,U);return k4(X)}async function b2($){let{uuid:v,direction:U="next"}=$;if(!v)return v$("UUID is required for get-siblings operation");let X;if(U==="previous")X="logseq.Editor.getPreviousSiblingBlock";else X="logseq.Editor.getNextSiblingBlock";let J=await C(X,[v]);if(!J)return v$(`No ${U} sibling found for block "${v}"`);let W=A1($),Y=await B1(J,W);return k4(Y)}async function V2($,v,U,X,J){let W=WN(v,X);return await C("logseq.Editor.insertBatchBlock",[$,W,{sibling:U==="before"||U==="after",before:U==="before",keepId:J}])}async function K2($,v,U,X,J){let W=jG(v,X);if(U==="first")return await C("logseq.Editor.insertBlock",[$,W,{isPageBlock:!0,keepId:J}]);return await C("logseq.Editor.insertBlock",[$,W,{before:U==="before",sibling:U==="before"||U==="after",isPageBlock:U==="child",keepId:J}])}async function A2($){let{target:v,content:U,blocks:X,position:J="child",stripLeadingHyphen:W=!0,keepUUID:Y=!1}=$;if(!v)return v$("Target (page name or block UUID) is required for create operation");if(!(U||X))return v$("Content or blocks array is required for create operation");let z;if(X)z=await V2(v,X,J,W,Y);else if(U)z=await K2(v,U,J,W,Y);if(!z)return v$("Failed to create block");let G=A1($),Q=await B1(z,G);return k4(Q)}async function B2($){let{uuid:v,content:U,properties:X}=$;if(!v)return v$("UUID is required for update operation");if(!(U||X))return v$("Content or properties is required for update operation");try{if(U)return await C("logseq.Editor.updateBlock",[v,U]),U6(`Block "${v}" updated successfully`);if(X)return await C("logseq.Editor.setBlockProperties",[v,X]),U6(`Block "${v}" properties updated successfully`);return v$("Content or properties is required for update operation")}catch(J){return v$(`Failed to update block "${v}": ${J}`)}}async function S2($){let{uuid:v,target:U,position:X="child"}=$;if(!v)return v$("UUID is required for move operation");if(!U)return v$("Target is required for move operation");if(!await C("logseq.Editor.moveBlock",[v,U,{before:X==="before",children:X==="child"}]))return v$(`Failed to move block "${v}" to "${U}"`);return U6(`Block "${v}" moved successfully`)}async function q2($){let{uuid:v,uuids:U}=$;if(!(v||U))return v$("UUID or uuids array is required for remove operation");if(U&&Array.isArray(U))return await L2(U);try{return await C("logseq.Editor.removeBlock",[v]),U6(`Block "${v}" removed successfully`)}catch(X){return v$(`Failed to remove block "${v}": ${X}`)}}async function L2($){let v=await Promise.all($.map(async(J)=>{try{return await C("logseq.Editor.removeBlock",[J]),{uuid:J,success:!0}}catch(W){return{uuid:J,success:!1,error:W}}})),U=v.filter((J)=>J.success).length,X=v.filter((J)=>!J.success);if(X.length===0)return U6(`Successfully removed ${U} blocks`);return v$(`Removed ${U} blocks, failed to remove ${X.length}: ${X.map((J)=>J.uuid).join(", ")}`)}async function F2($){let{uuid:v,collapsed:U}=$;if(!v)return v$("UUID is required for toggle-collapse operation");if(U==="toggle")await C("logseq.Editor.toggleBlockCollapsed",[v]);else await C("logseq.Editor.setBlockCollapsed",[v,U]);return U6(`Block "${v}" collapse state toggled successfully`)}async function E2($){let{uuid:v}=$;if(!v)return v$("UUID is required for select operation");return await C("logseq.Editor.selectBlock",[v]),U6(`Block "${v}" selected successfully`)}async function M2($){let{uuid:v,pos:U}=$;if(!v)return v$("UUID is required for edit operation");return await C("logseq.Editor.editBlock",[v,U]),U6(`Block "${v}" is now in edit mode`)}async function P2($){let{uuid:v}=$;if(!v)return v$("UUID is required for open-sidebar operation");return await C("logseq.Editor.openInRightSidebar",[v]),U6(`Block "${v}" opened in right sidebar`)}async function R2($){let{uuid:v,pageName:U}=$;if(!v)return v$("UUID is required for scroll-to operation");await C("logseq.Editor.scrollToBlockInPage",[U||null,v]);let X=`Scrolled to block "${v}"`;if(U)X+=` in page "${U}"`;return U6(X)}async function k2($){let{uuid:v,propertyKey:U}=$;if(!v)return v$("UUID is required for get-property operation");if(!U)return v$("Property key is required for get-property operation");let X=await C("logseq.Editor.getBlockProperty",[v,U]);return k4(X)}async function C2($){let{uuid:v}=$;if(!v)return v$("UUID is required for get-properties operation");let U=await C("logseq.Editor.getBlockProperties",[v]),X=A1($),J=await B1(U,X);return k4(J)}async function _2($){let{uuid:v,propertyKey:U,propertyValue:X}=$;if(!v)return v$("UUID is required for set-property operation");if(!U)return v$("Property key is required for set-property operation");try{return await C("logseq.Editor.upsertBlockProperty",[v,U,X]),U6(`Property "${U}" set successfully for block "${v}"`)}catch(J){return v$(`Failed to set property "${U}" for block "${v}": ${J}`)}}async function Z2($){let{uuid:v,propertyKey:U}=$;if(!v)return v$("UUID is required for remove-property operation");if(!U)return v$("Property key is required for remove-property operation");if(!await C("logseq.Editor.removeBlockProperty",[v,U]))return v$(`Failed to remove property "${U}" from block "${v}"`);return U6(`Property "${U}" removed successfully from block "${v}"`)}async function T2($){switch($.operation){case"get":return await I2($);case"get-current":return await D2($);case"get-selected":return await O2($);case"get-siblings":return await b2($);default:return null}}async function x2($){switch($.operation){case"create":return await A2($);case"update":return await B2($);case"move":return await S2($);case"remove":return await q2($);default:return null}}async function g2($){switch($.operation){case"toggle-collapse":return await F2($);case"select":return await E2($);case"edit":return await M2($);case"open-sidebar":return await P2($);case"scroll-to":return await R2($);default:return null}}async function f2($){switch($.operation){case"get-property":return await k2($);case"get-properties":return await C2($);case"set-property":return await _2($);case"remove-property":return await Z2($);default:return null}}var y2=async($)=>{let v=$.operation;try{let U=await T2($);if(U)return U;let X=await x2($);if(X)return X;let J=await g2($);if(J)return J;let W=await f2($);if(W)return W;return v$(`Unknown operation: ${v}`)}catch(U){return v$(`Error in block operation (${v}): ${U}`)}},u2=["get","get-current","get-selected","get-siblings","create","update","move","remove","toggle-collapse","select","edit","open-sidebar","scroll-to","get-property","get-properties","set-property","remove-property"],h2=["previous","next"],l2=["child","before","after","first","last"],m2={operation:A.enum(u2).describe("Operation to perform on blocks"),uuid:A.string().optional().describe("UUID of the block (required for most operations)"),includeChildren:A.boolean().optional().default(!0).describe("Include child blocks in results (default: true)"),direction:A.enum(h2).optional().default("next").describe("Direction for sibling navigation (default: next)"),content:A.string().min(1).optional().describe("Block content for create/update operations"),properties:A.record(A.string(),A.unknown()).optional().describe("Block properties as key-value pairs"),target:A.string().optional().describe("Target block UUID or page name for create/move operations"),position:A.enum(l2).optional().default("child").describe("Position for create/move operations (default: child)"),stripLeadingHyphen:A.boolean().optional().default(!0).describe("Remove leading hyphens from content (default: true)"),blocks:A.array(A.record(A.string(),A.unknown())).optional().describe("Array of nested blocks for batch creation"),keepUUID:A.boolean().optional().default(!1).describe("Preserve custom UUIDs in block data (default: false)"),collapsed:A.union([A.boolean(),A.literal("toggle")]).optional().describe("Toggle collapse state: true/false/toggle"),pageName:A.string().optional().describe("Page name for scroll-to operations"),pos:A.number().int().nonnegative().optional().describe("Cursor position for edit operations"),propertyKey:A.string().optional().describe("Property key for property operations"),propertyValue:A.unknown().optional().describe("Property value for set-property operations"),uuids:A.array(A.string()).optional().describe("Array of block UUIDs for batch operations"),...k$},n2=`Perform operations on Logseq blocks - read, write, organize, and manage properties.
76
76
 
77
77
  OPERATIONS:
78
78
  - get: Retrieve a block by UUID
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "logseq-mcp",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
4
4
  "description": "Logseq Model Context Protocol Agent",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",