Logseq程序化交互工具

通过SQLite数据库查询和HTTP API实现与Logseq的程序化交互,支持任务管理、数据库查询和工作流自动化。

  • by slimslenderslacks
  • Clojure
  • 本地部署
  • 更新于
在 GitHub 查看 slimslenderslacks/mcp-logseq

使用说明

MCP Logseq

使用SQLite数据库查询和HTTP API与Logseq进行编程交互。

概述

此项目提供以下脚本和工具:

  • 创建和管理任务 通过Logseq HTTP API
  • 查询图形数据库 使用DataScript/DataLog
  • 自动化工作流程 使用Logseq

专为Logseq的现代SQLite支持架构而构建。

快速开始

先决条件

  1. Logseq安装 -需要在以下位置安装Logseq开发程序 /Users/slim/slimslenderslacks/logseq

    • 提供nbb-logseq运行时(v1.2.173-feat-db-v31)
    • 提供Logseq源代码依赖关系
    • 提供better squelite3原生模块
  2. Node.js -版本20.10.0或更高

安装

cd ~/slimslenderslacks/mcp-logseq

# Install dependencies
npm install

这将安装better-sqlite3(原生SQLite绑定)。所有其他依赖项都来自Logseq安装。

运行脚本

从项目根目录开始,使用 run-script.sh 包装:

# Query all tasks (defaults to 'mcp' graph)
./run-script.sh list_all_tasks.cljs

# Query tasks from a specific graph
./run-script.sh list_all_tasks.cljs Demo
./run-script.sh list_all_tasks.cljs mcp

# List tasks by status
./run-script.sh list_tasks_by_status.cljs mcp

# Create a task (API-based, doesn't need graph param)
./run-script.sh create_task_clean.cljs \
  "Feb 5th, 2026" \
  "My new task" \
  "Todo" \
  "High"

# Mark task as complete
./run-script.sh complete_task.cljs <uuid>

# Update task status
./run-script.sh update_task_status.cljs <uuid> "Doing"

# List available scripts
./run-script.sh

图形参数:

  • 数据库查询脚本接受可选的图形名称作为第一个参数
  • 图形名称默认为 "mcp" 如果未指定
  • 图表位于 ~/logseq/graphs/<graph-name>/db.sqlite
  • 示例: mcp, Demo, my-graph

注: 包装器脚本在以下位置使用Logseq安装 /Users/slim/slimslenderslacks/logseq 对于依赖关系。

项目结构

mcp-logseq/
├── scripts/              # ClojureScript scripts
│   ├── complete_task.cljs
│   ├── create_task_clean.cljs
│   ├── update_task_status.cljs
│   ├── get_task_info.cljs
│   ├── list_page_blocks.cljs
│   ├── list_page_tasks_api.cljs
│   ├── list_done_tasks_v2.cljs
│   ├── list_all_tasks.cljs
│   ├── query_status_tasks.cljs
│   ├── find_tasks.cljs
│   ├── find_block_by_title.cljs
│   ├── list_journals.cljs
│   ├── list_date_pages.cljs
│   ├── list_recent_pages.cljs
│   └── db_import.cljs
├── docs/                 # Documentation
│   ├── SUMMARY.md        # Comprehensive reference
│   ├── ESSENTIAL_FILES.md
│   └── ...
└── README.md            # This file

脚本概述

任务管理(HTTP API)

创建任务

  • create_task_clean.cljs -创建标题清晰的任务(没有可见的#Task)

更新任务

  • complete_task.cljs -将任务标记为“完成”
  • update_task_status.cljs -更新到任何状态(待办、正在做、已完成等)

查询任务

  • get_task_info.cljs -获取详细的任务信息
  • list_page_blocks.cljs -列出页面上的所有块
  • list_page_tasks_api.cljs -在页面上列出任务

数据库查询(DataScript)

任务查询

  • list_done_tasks_v2.cljs -使用时间戳查询已完成的任务
  • list_all_tasks.cljs -查询所有任务
  • query_status_tasks.cljs -按状态查询
  • find_tasks.cljs -按条件查找任务

阻止和页面查询

  • find_block_by_title.cljs -按标题查找块
  • list_journals.cljs -列出日记页面
  • list_date_pages.cljs -列出日期页面
  • list_recent_pages.cljs -列出最近的页面

HTTP API配置

脚本连接到Logseq的HTTP API:

API URL: "http://localhost:12315/api"
Authorization: "Bearer whatever"

严重: 始终使用限定的属性名称:

  • ✓ "logseq.property/status"
  • ✓ "logseq.property/priority"
  • ✗ "status" (创建插件属性)

数据库配置

查询脚本连接到SQLite数据库:

  • ~/.logseq/graphs/<graph-name>

例子:

(require '[logseq.db.common.sqlite-cli :as sqlite-cli])

(def conn (sqlite-cli/open-db! "~/.logseq/graphs/my_graph"))
(def db @conn)

示例工作流

创建并完成任务

# 1. Create task
nbb-logseq -cp scripts scripts/create_task_clean.cljs \
  "Feb 5th, 2026" \
  "Implement authentication" \
  "Todo" \
  "High"
# Returns: UUID: 6985659e-59b1-47e7-8661-ee790462f263

# 2. Check task details
nbb-logseq -cp scripts scripts/get_task_info.cljs \
  "6985659e-59b1-47e7-8661-ee790462f263"

# 3. Update to Doing
nbb-logseq -cp scripts scripts/update_task_status.cljs \
  "6985659e-59b1-47e7-8661-ee790462f263" \
  "Doing"

# 4. Mark complete
nbb-logseq -cp scripts scripts/complete_task.cljs \
  "6985659e-59b1-47e7-8661-ee790462f263"

查询任务

# List all done tasks
nbb-logseq -cp scripts scripts/list_done_tasks_v2.cljs

# List all tasks on today's journal
nbb-logseq -cp scripts scripts/list_page_tasks_api.cljs "Feb 5th, 2026"

# Find all high-priority tasks
nbb-logseq -cp scripts scripts/find_tasks.cljs

文档

看 docs/ 目录:

  • 总结.md -API文档、数据模型、示例的综合参考
  • ESSENTIAL_FILES.md -所有脚本的快速参考
  • FILE_CLEANUP_PLAN.md -文件清理历史记录

关键概念

任务结构

正确的Logseq任务需要:

  1. 任务标签 (实体151)-通过无形方式添加 addBlockTag
  2. 状态属性 -引用状态实体(77=待办,78=正在进行,80=已完成)
  3. 优先财产 -参考优先级实体(83=低,84=中,85=高)

数据模型

Logseq将数据存储为 基准 (实体属性值交易):

[256 :block/uuid #uuid "..." 262]
[256 :block/title "Task content" 262]
[256 :block/tags 151 262]  ; Task class
[256 :logseq.property/status 80 262]  ; Done
[256 :logseq.property/priority 85 262]  ; High

最佳实践

  1. 使用HTTP API进行修改 当Logseq正在运行时
  2. 使用合格的属性名称 (logseq.property/status 不 status)
  3. 从不使用 updateBlock 对于任务 -使用 upsertBlockProperty 相反
  4. 不可见地添加标签 随着 addBlockTag 对于干净的标题

发展

依赖模型

该项目使用 父Logseq安装 对于运行时和源依赖关系:

优势:

  • ✓ 无代码重复(节省111MB+)
  • ✓ 始终使用最新的Logseq源
  • ✓ 单一事实来源
  • ✓ 易于维护
  • ✓ 使用Logseq的精确nbb-Logseq构建(使用feat-db-v31)

它是如何工作的:

  • run-script.sh 使用Logseq的nbb-Logseq运行时(v1.2.173-feat-db-v31)
  • 将Logseq源目录添加到类路径
  • 脚本访问: logseq.db.common.sqlite-cli, datascript.core等等。

为什么不使用npm的@logseq/nbb logseq?

  • Logseq使用自定义构建(1.2.173-feat-db-v31)未发布到npm
  • 此版本包括SQLite访问所需的数据库功能(feat-db-v31)
  • 标准npm版本(1.2.173)缺少这些功能

所需的Logseq安装结构:

/Users/slim/slimslenderslacks/logseq/
├── deps/
│   ├── cli/src
│   ├── common/src
│   ├── db/src
│   ├── graph-parser/
│   │   ├── src
│   │   └── node_modules/.bin/nbb-logseq (v1.2.173-feat-db-v31)
│   └── outliner/src
└── src/

添加新脚本

  1. 在中创建脚本 scripts/ 目录
  2. 添加shebang: #!/usr/bin/env nbb
  3. 包含命名空间和要求
  4. 使可执行文件: chmod +x scripts/your_script.cljs
  5. 测试: ./run-script.sh your_script.cljs

测试

根据演示数据库测试脚本或创建测试图。

资源

  • API日志文件: https://plugins-doc.logseq.com/
  • 数据脚本 : https://github.com/tonsky/datascript
  • nbb logseq: https://github.com/logseq/nbb-logseq

Docker支持

看 医生.md 有关在Docker中构建和运行mcp-logseq的说明。

快速启动:

# Build image
docker build -t mcp-logseq .

# Run script
./docker-run.sh list_all_tasks.cljs mcp

许可证

麻省理工学院

贡献

欢迎投稿!请确保:

  • 脚本使用HTTP API进行修改
  • 数据库查询是只读的
  • 文档已更新
  • 脚本已测试