zettelkasten-memory-server
Version:
基于 Zettelkasten 记忆片段盒方法的 MCP 记忆服务器 v1.6.X
436 lines (314 loc) • 13.4 kB
Markdown
# Zettelkasten Memory Server v1.3.10
基于 Zettelkasten 记忆片段盒方法的 MCP (Model Context Protocol) 记忆服务器,提供简化而强大的记忆片段化记忆管理功能。
## 🆕 v1.3.10 更新
- 🔧 **智能优化建议**: 重构 getOptimizeSuggestions 方法,提供更精准的低价值片段和孤立片段识别
- 📊 **信息散度计算**: 引入信息散度概念,更准确地评估记忆片段价值
- 🔒 **系统片段保护**: 增强系统片段的只读特性,防止意外修改
- 📝 **详细优化指南**: 提供具体的优化策略和操作步骤
- 🧪 **全面测试覆盖**: 新增测试文件,确保新方法的正确性和稳定性
- 🔄 **重复读取限制**: 新增重复读取限制机制,防止不必要的重复操作
## 设计理念
相比传统的记忆管理系统,本服务器采用了更加精简的 Zettelkasten 方法:
- **消除搜索开销**: 不提供复杂的搜索功能,避免提示词开销过大
- **记忆片段化存储**: 每个记忆都是独立的记忆片段,支持 `[[记忆片段名]]` 引用语法
- **自底向上**: 让知识结构自然呈现,而不是预设分类体系
- **权重计算**: 通过递归链接关系自动计算记忆片段重要性
- **优化建议**: 识别低价值记忆片段,协助维护系统健康
## 功能特性
### 核心操作
- `getMemory`: 获取记忆片段内容,支持递归展开引用
- `setMemory`: 创建或更新记忆片段内容
- `deleteMemory`: 删除记忆片段
- `renameMemory`: 重命名或合并记忆片段,自动更新所有引用
### 智能提示
- `getMemoryHints`: 获取按权重排序的重要记忆片段列表
- `getOptimizeSuggestions`: 获取记忆片段优化建议,包括低价值片段和孤立片段
### 资源访问
- **列出资源**: 自动列出所有记忆片段作为 MCP 资源
- **灵活访问**: 支持 `memory:///fragmentName#expandDepth` 格式,等效于 `getMemory(fragmentName, expandDepth)`
### 智能提示模板
- **话题灵感** (`topic_inspiration`): 当不知道聊什么话题时,基于重要记忆片段提供话题建议
- **聊天优化** (`chat_optimization`): 聊天结束时,提供系统优化建议和维护指导
## 安装和使用
### 安装依赖
```bash
npm install
```
### 构建项目
```bash
npm run build
```
### 启动服务器
```bash
npm start
```
或者直接运行:
```bash
node build/index.js
```
### 自定义存储目录
通过环境变量指定存储目录:
```bash
ZETTELKASTEN_STORAGE_DIR="/path/to/your/cards" npm start
```
### 重复读取限制机制
为了防止不必要的重复读取操作,系统引入了重复读取限制机制:
- **环境变量**: `MEMORY_REPEAT_ACCESS_RESTRICTION=true` 启用限制(默认启用)
- **机制说明**: 已获取最新内容的记忆片段无需重复 getMemory 操作
- **编辑操作影响**: 任何编辑操作(setMemory、extractMemory、insertLinkAt、renameMemory)后会移除最新内容标记
- **使用建议**: 编辑操作前必须先获取最新内容,否则操作会被拒绝
```bash
# 启用重复读取限制
MEMORY_REPEAT_ACCESS_RESTRICTION=true npm start
# 禁用重复读取限制
MEMORY_REPEAT_ACCESS_RESTRICTION=false npm start
```
## 记忆片段语法
### 基本记忆片段
每个记忆片段都是一个 `.md` 文件,内容可以是任意文本:
```markdown
这是一张关于 JavaScript 的记忆片段。
JavaScript 是一种编程语言,它有以下特点:
- 动态类型
- 原型继承
- 事件驱动
相关概念: [[编程语言]]、[[Web开发]]
```
### 引用语法
使用 `[[记忆片段名]]` 来引用其他记忆片段:
```markdown
今天学习了 [[React]],它是基于 [[JavaScript]] 的前端框架。
React 的核心概念包括:
- [[组件化]]
- [[状态管理]]
- [[虚拟DOM]]
```
### 展开引用
使用 `getMemory` 工具时,可以指定展开深度来递归获取引用记忆片段的内容:
```typescript
// 展开深度为 1,会展开第一层引用的记忆片段内容
getMemory("React", 1)
```
展开后的内容格式:
```markdown
今天学习了 React,它是基于 JavaScript 的前端框架。
![[JavaScript]]start
JavaScript 是一种编程语言,它有以下特点:
- 动态类型
- 原型继承
- 事件驱动
![[JavaScript]]end
React 的核心概念包括:
- 组件化
- 状态管理
- 虚拟DOM
```
## 权重计算机制
系统会自动计算每个记忆片段的权重:
- **叶子记忆片段** (无外链): 权重 = 1
- **有外链的记忆片段**: 权重 = 所有引用记忆片段权重的平均值
这个机制让经常被引用的基础概念获得更高权重,有助于识别知识体系中的核心节点。
## 信息散度与优化建议
系统提供智能优化建议功能,通过信息散度计算和孤立片段识别来帮助维护知识库的健康。
### 信息散度概念
信息散度是衡量记忆片段价值的重要指标:
**信息散度 = 权重 / 字符数**
- **低信息散度**: 表示信息过于集中,可能需要拆分
- 权重高但字符数少:信息密度过高,建议拆分为更小的概念单元
- 权重低且字符数少:可能是孤立或无用的片段
- **高信息散度**: 表示信息分布合理,网络连接良好
- 权重高且字符数适中:核心概念,保持现状
- 权重低但字符数少:可能是新兴概念,需要更多连接
### 系统片段的只读特性
系统片段是知识库的核心组成部分,具有特殊的保护机制:
- **识别方法**: 内容以 `<!-- core memory -->` 开头的记忆片段
- **只读特性**: 无法通过 setMemory、extractMemory 等方法修改
- **保护目的**: 确保系统核心的稳定性和一致性
- **操作建议**: 如需修改系统相关内容,应在其他可编辑片段中进行操作
### getOptimizeSuggestions 工具详解
`getOptimizeSuggestions` 工具提供全面的记忆片段优化建议:
**参数:**
- `optimizationThreshold` (number, 可选): 优化阈值,默认为 0.1
- `maxFileCount` (number, 可选): 返回的记忆片段最大数量,默认为 10
**功能特点:**
1. **低价值片段识别**: 识别信息散度低于阈值的记忆片段
2. **孤立片段检测**: 发现没有反向链接的孤立记忆片段
3. **系统片段过滤**: 自动跳过系统片段,只分析可编辑内容
4. **优化策略建议**: 提供具体的优化步骤和操作指导
**返回内容:**
- 信息散度计算原理说明
- 孤立片段概念解释
- 系统片段保护机制说明
- 低价值片段列表及优化建议
- 孤立片段列表及处理策略
- 维护建议和推荐工具使用
## MCP 工具列表
### getMemory
获取指定记忆片段的内容,支持递归展开引用。
**参数:**
- `fragmentName` (string): 记忆片段名称
- `expandDepth` (number, 可选): 展开深度,默认为 0
- `withLineNumber` (boolean, 可选): 是否显示行号,默认为 false
### setMemory
创建或更新记忆片段的内容。
**参数:**
- `fragmentName` (string): 记忆片段名称
- `content` (string): 记忆片段内容
### deleteMemory
删除指定的记忆片段。
**参数:**
- `fragmentName` (string): 要删除的记忆片段名称
### renameMemory
重命名记忆片段或将两个记忆片段合并。
**参数:**
- `oldFragmentName` (string): 原记忆片段名称
- `newFragmentName` (string): 新记忆片段名称
### extractMemory
从现有记忆片段中提取内容创建新片段。
**参数:**
- `sourceFragmentName` (string): 源记忆片段名称
- `newFragmentName` (string): 新记忆片段名称
- `startLine` (number): 起始行号
- `endLine` (number): 结束行号
### getMemoryHints
获取按权重排序的重要记忆片段提示。
**参数:**
- `fileCount` (number, 可选): 返回的记忆片段数量,默认为 10
### getOptimizeSuggestions
获取记忆片段优化建议,包括低价值片段和孤立片段。
**参数:**
- `optimizationThreshold` (number, 可选): 优化阈值,默认为 0.1
- `maxFileCount` (number, 可选): 返回的记忆片段最大数量,默认为 10
**使用示例:**
```javascript
// 获取默认的优化建议
const suggestions = await tools.call("getOptimizeSuggestions");
// 自定义参数获取更详细的建议
const detailedSuggestions = await tools.call("getOptimizeSuggestions", {
optimizationThreshold: 0.05, // 更低的阈值,识别更多需要优化的片段
maxFileCount: 20 // 返回更多建议
});
```
**优化策略示例:**
1. **低信息散度片段处理**:
```markdown
# 原始片段 (需要拆分)
这是一个包含多个概念的冗长记忆片段,包含了概念A、概念B和概念C...
# 优化后
# 概念A
[概念A的详细内容]
相关概念: [[概念B]]、[[概念C]]
# 概念B
[概念B的详细内容]
相关概念: [[概念A]]
# 概念C
[概念C的详细内容]
相关概念: [[概念A]]
```
2. **孤立片段处理**:
```markdown
# 孤立片段
这是一个没有其他记忆片段链接的内容...
# 优化方法
# 方法1: 在相关片段中添加链接
在 [[相关概念]] 中添加: "更多信息可参考 [[孤立片段]]"
# 方法2: 合并到相关片段
将孤立片段的内容合并到 [[相关概念]] 中
# 方法3: 删除无用片段
如果内容不再需要,可直接删除
```
3. **系统片段注意事项**:
```markdown
<!-- core memory -->
# 系统片段
这是系统核心内容,无法直接修改...
# 正确操作方式
# 1. 在其他可编辑片段中引用系统片段
# 2. 使用 extractMemory 从系统片段中提取内容到新片段
# 3. 在新片段中进行编辑操作
```
## 新特性说明
- getMemory 支持 withLineNumber 参数,输出带行号内容。
- getMemory 返回内容最大长度为 2k,超出会被截断并提示。
- 已获取最新内容的文件无需重复 getMemory,编辑操作前必须先获取最新内容,否则拒绝。
- 编辑操作(setMemory、extractMemory、insertLinkAt、renameMemory)后会移除最新内容标记。
- 新增重复读取限制机制,通过环境变量 MEMORY_REPEAT_ACCESS_RESTRICTION 控制。
## 最佳实践
### 1. 建立入口记忆片段
创建 `hints` 记忆片段作为系统的入口点:
```markdown
# 知识体系入口
## 编程相关
- [[JavaScript]]
- [[Python]]
- [[算法与数据结构]]
## 项目管理
- [[项目规划]]
- [[团队协作]]
## 学习笔记
- [[今日学习]]
- [[问题记录]]
```
### 2. 保持记忆片段原子化
每张记忆片段只包含一个核心概念:
```markdown
# React Hooks
React Hooks 是 React 16.8 引入的新特性,让你可以在函数组件中使用状态和其他 React 特性。
常用的 Hooks:
- [[useState]]
- [[useEffect]]
- [[useContext]]
相关概念:[[React]]、[[函数组件]]
```
### 3. 建立有意义的连接
不要只是罗列链接,要说明关系:
```markdown
# 设计模式
设计模式是软件设计中常用的解决方案。
## 创建型模式
- [[单例模式]] - 确保类只有一个实例
- [[工厂模式]] - 创建对象的接口
## 行为型模式
- [[观察者模式]] - 用于 [[事件驱动编程]]
设计模式在 [[JavaScript]] 和 [[Python]] 中都有广泛应用。
```
### 4. 定期维护
使用 `getOptimizeSuggestions` 工具定期检查记忆片段,进行优化:
- **识别低价值片段**: 使用信息散度计算找出需要拆分的片段
- **发现孤立片段**: 找出没有链接的孤立内容
- **精简冗长内容**: 拆分过于复杂的记忆片段
- **删除过时信息**: 移除不再需要的孤立片段
- **增强连接性**: 在相关片段间建立有意义的链接
- **保护系统片段**: 避免直接修改系统核心内容
## 智能提示功能
### 话题灵感提示
当不知道聊什么话题时,使用 `topic_inspiration` 提示:
```bash
# 在 MCP 客户端中
请使用 "话题灵感" 提示模板
```
系统会:
1. 自动获取重要记忆片段
2. 按权重分类为核心话题、深度话题、轻松话题
3. 提供对话建议和操作指导
### 聊天优化提示
聊天结束时,使用 `chat_optimization` 提示:
```bash
# 在 MCP 客户端中
请使用 "聊天优化" 提示模板
```
系统会:
1. 分析当前知识库状态
2. 识别需要优化的低价值记忆片段
3. 提供具体的优化建议和行动计划
4. 给出系统健康度评估
### 提示功能优势
- **智能上下文**: 自动收集相关数据生成个性化提示
- **一键操作**: 复杂的分析任务变成简单的模板选择
- **引导学习**: 帮助发现知识网络中的机会和问题
- **持续优化**: 保持知识库的健康和高质量
- 合并相似内容
- 删除过时信息
- 改进内容质量
## 许可证
MIT License