Doramagic 项目包 · 项目说明书
memory-mcp 项目
生成时间:2026-05-16 08:51:38 UTC
项目介绍
Memory MCP 是一个基于 Model Context Protocol (MCP) 的增强型记忆管理服务器,通过 MCP 协议为 AI 代理提供持久化记忆能力。该项目作为 MCP 服务器运行,封装了 @danielsimonjr/memoryjs 核心库的所有功能,向 AI 代理暴露 213 个工具函数,覆盖 58 个功能类别。资料来源:README.md
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
Memory MCP 是一个基于 Model Context Protocol (MCP) 的增强型记忆管理服务器,通过 MCP 协议为 AI 代理提供持久化记忆能力。该项目作为 MCP 服务器运行,封装了 @danielsimonjr/memoryjs 核心库的所有功能,向 AI 代理暴露 213 个工具函数,覆盖 58 个功能类别。资料来源:README.md
核心定位
Memory MCP 的设计目标是为 AI 代理提供类似于人类记忆的长期记忆存储与检索能力。通过知识图谱结构,代理可以:
- 持久化存储 - 将重要信息写入长期记忆
- 智能检索 - 根据语义、关键词、时间等多种维度检索记忆
- 层级管理 - 支持父子关系的层级记忆结构
- 衰减机制 - 自动对低价值记忆进行时间衰减
- 协同推理 - 支持多代理协作式的记忆综合分析
资料来源:CLAUDE.md
技术架构
分层架构设计
Memory MCP 采用清晰的分层架构,核心层由 memoryjs 库提供,MCP 层负责协议适配与工具暴露。
graph TD
subgraph "Memory MCP (本项目)"
A[src/index.ts] --> B[MCPServer]
B --> C[toolDefinitions.ts]
B --> D[toolHandlers.ts]
C --> D
end
subgraph "@danielsimonjr/memoryjs"
E[ManagerContext] --> F[EntityManager]
E --> G[RelationManager]
E --> H[ObservationManager]
E --> I[SearchManager]
E --> J[TagManager]
E --> K[HierarchyManager]
E --> L[CompressionManager]
E --> M[AnalyticsManager]
E --> N[GraphStorage]
end
D --> E资料来源:CLAUDE.md
ManagerContext 核心组件
ManagerContext 是 memoryjs 库的核心类,采用懒加载模式初始化所有管理器实例。资料来源:CLAUDE.md
| 管理器组件 | 访问方式 | 功能说明 |
|---|---|---|
| EntityManager | ctx.entityManager | 图节点(实体)的增删改查 |
| RelationManager | ctx.relationManager | 有向边管理,连接实体间关系 |
| ObservationManager | ctx.observationManager | 附加到实体的观察事实,支持归一化 |
| SearchManager | ctx.searchManager | 基础搜索、布尔搜索、模糊搜索 |
| TagManager | ctx.tagManager | 标签管理与重要性评分 |
| HierarchyManager | ctx.hierarchyManager | 父子树结构与子树遍历 |
| AnalyticsManager | ctx.analyticsManager | 图统计与完整性验证 |
| CompressionManager | ctx.compressionManager | 去重、合并、自动压缩、归档 |
| ArchiveManager | ctx.archiveManager | 记忆归档管理 |
| IOManager | ctx.ioManager | 数据导入导出 |
| SemanticSearch | ctx.semanticSearch | OpenAI 或本地模型的语义搜索 |
| RankedSearch | ctx.rankedSearch | TF-IDF 排序搜索 |
向后兼容性
src/index.ts 将 ManagerContext 重新导出为 KnowledgeGraphManager 别名,同时导出核心类型定义,确保与旧版 API 的兼容性。资料来源:CLAUDE.md
工具体系
工具分类总览
Memory MCP 提供 213 个工具函数,覆盖 58 个功能类别。资料来源:CLAUDE.md
| 类别 | 工具数量 | 核心功能 |
|---|---|---|
| Entity | 4 | 图节点的创建、读取、更新、删除 |
| Relation | 2 | 实体间的有向边管理 |
| Observation | 3 | 附加事实的增删改查,支持归一化 |
| Search | 7 | 基础搜索、排序搜索、布尔搜索、模糊搜索、自动选择 |
| Intelligent Search | 3 | 混合多层搜索、查询分析、基于反思的搜索 |
| Semantic Search | 3 | 通过 OpenAI 或本地模型的嵌入相似度搜索 |
| Saved Searches | 5 | 存储和重新执行常用查询 |
| Tag Management | 6 | 标签管理、批量操作、重要性评分 |
| Tag Aliases | 5 | 标签同义词/别名管理 |
| Hierarchy | 9 | 父子树结构、子树遍历 |
| Graph Algorithms | 4 | BFS/DFS 路径查找、中心性、连通分量 |
| Analytics | 2 | 图统计和完整性验证 |
| Compression | 4 | 去重检测、合并、自动压缩、归档 |
| Import/Export | 2 | 7 种导出格式 |
工具处理流程
sequenceDiagram
participant MCP as MCP 客户端
participant Server as MCPServer
participant Handler as toolHandlers.ts
participant Manager as ManagerContext
MCP->>Server: 工具调用请求
Server->>Handler: 路由到对应 handler
Handler->>Manager: 调用 ManagerContext 方法
Manager->>Manager: 执行业务逻辑
Manager-->>Handler: 返回结果
Handler-->>Server: 格式化响应
Server-->>MCP: MCP 格式响应资料来源:src/server/toolHandlers.ts
存储方案
存储类型
Memory MCP 支持两种存储后端,数据文件位于项目根目录(非 dist/ 目录)。资料来源:CLAUDE.md
| 存储类型 | 文件 | 环境变量 |
|---|---|---|
| JSONL (默认) | memory.jsonl, memory-saved-searches.jsonl, memory-tag-aliases.jsonl | - |
| SQLite | memory.db | MEMORY_STORAGE_TYPE=sqlite |
数据迁移工具
tools/migrate-from-jsonl-to-sqlite 目录提供了独立的迁移工具,支持 JSONL 与 SQLite 格式之间的双向转换。资料来源:tools/migrate-from-jsonl-to-sqlite/migrate-from-jsonl-to-sqlite.ts
# 基本用法
migrate-from-jsonl-to-sqlite --from <source> --to <target>
# 显示详细进度
migrate-from-jsonl-to-sqlite --from memory.jsonl --to memory.db --verbose
依赖管理
核心依赖
| 依赖包 | 版本 | 用途 |
|---|---|---|
| @modelcontextprotocol/sdk | ^1.0.0 | MCP 协议实现 |
| @danielsimonjr/memoryjs | ^2.1.0 | 核心记忆管理库 |
| zod | ^3.23.8 | Schema 验证 |
| better-sqlite3 | ^11.7.0 | SQLite 存储后端 |
开发依赖
| 依赖包 | 版本 | 用途 |
|---|---|---|
| typescript | ^5.7.0 | TypeScript 编译 |
| @types/node | ^22.0.0 | Node.js 类型定义 |
| vitest | ^2.0.0 | 单元测试框架 |
版本演进
版本历史要点
| 阶段 | 版本 | 主要内容 |
|---|---|---|
| Phase 13 | 初始版本 | 仅保留 5 个 TypeScript 源文件,核心逻辑移至 memoryjs |
| Phase 15 | v12.2.0 | 新增 23 个工具,暴露 memoryjs v1.14+ 功能 |
| Phase 16 | v12.3.0 | 新增 53 个工具,暴露 memoryjs v2.1.0 功能 |
Phase 16 (v12.3.0) 新增的功能包括:排除规则 (5)、决策理由与 ADR markdown 双写 (10)、结构化项目上下文 (12)、启发式指南 (10)、工具能力与观察管道 (11)、观察去重 (2)、拼写纠正 (3)。资料来源:CLAUDE.md
安装与使用
npm 包信息
# 安装
npm install @danielsimonjr/memory-mcp
# 或使用最新版本
npm install @danielsimonjr/memory-mcp@latest
资料来源:CLAUDE.md
构建与发布
项目使用 prepare 脚本在安装时自动构建,因此发布前无需单独执行构建命令。资料来源:CONTRIBUTING.md
# 发布到 npm
# 需要具有绕过 2FA 权限的 token
npm config set //registry.npmjs.org/:_authToken=$(cat ~/.npm_token)
npm publish --access public
# 发布前验证 tarball 内容
npm pack --dry-run
独立工具集
tools/ 目录包含可独立运行的工具,每个工具拥有自己的 package.json,可通过 pkg 编译为 Windows 可执行文件。资料来源:CLAUDE.md
| 工具目录 | 用途 |
|---|---|
chunking-for-files | 将大文件拆分为小块以适应上下文限制 |
compress-for-context | CTON 压缩以适应 LLM 上下文窗口 |
create-dependency-graph | 生成 TypeScript 项目依赖图 |
migrate-from-jsonl-to-sqlite | JSONL 与 SQLite 格式转换 |
开发指南
代码规范
- 遵循 TypeScript 最佳实践
- 使用有意义的变量命名
- 为公共方法添加 JSDoc 注释
- 保持函数专注于小而简洁
- 统一使用 2 空格缩进
测试要求
- 全面测试新功能
- 包含边界情况测试
- 测试向后兼容性
- 验证导出格式有效性
- 测试空图和大图场景
提交流程
- 创建功能分支:
git checkout -b feature/your-feature-name - 提交更改:
git add . && git commit -m "Description" - 推送并创建 PR:
git push origin feature/your-feature-name - PR 应包含:标题、描述、测试结果、文档更新、向后兼容性确认
资料来源:CONTRIBUTING.md
配置选项
环境变量
| 环境变量 | 说明 | 默认值 |
|---|---|---|
MEMORY_STORAGE_TYPE | 存储类型选择 | jsonl |
MEMORY_DB_PATH | SQLite 数据库路径 | memory.db |
TypeScript 配置
- 编译目标: ES2022
- 模块解析: Node16
相关资源
- npm 包: @danielsimonjr/memory-mcp
- 核心库: @danielsimonjr/memoryjs
- MCP 协议: Model Context Protocol
- 社区指南: MCP Community Guidelines
资料来源:[CLAUDE.md](https://github.com/danielsimonjr/memory-mcp/blob/main/CLAUDE.md)
快速开始
本文档帮助你在 5 分钟内完成 memory-mcp 的安装、配置和首次使用。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
项目概述
memory-mcp 是一个基于 Model Context Protocol (MCP) 的知识图谱记忆管理服务器。它为 AI 助手提供持久化记忆存储、语义搜索和层次化组织能力。
核心依赖:
- npm 包:
@danielsimonjr/memory-mcp - 核心库:
@danielsimonjr/memoryjs - 协议层:Model Context Protocol
- 存储后端:JSONL 文件或 SQLite 数据库
资料来源:README.md:1-15
系统架构
┌─────────────────────────────────────────────────────────────┐
│ memory-mcp (本仓库) │
├─────────────────────────────────────────────────────────────┤
│ src/index.ts │ 入口文件,导出公共 API │
│ src/server/MCPServer │ MCP 服务器实现 │
│ src/server/toolDefs │ 工具定义 (213 个工具,58 个类别) │
│ src/server/toolHandlers│ 工具处理逻辑 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ @danielsimonjr/memoryjs (npm 依赖) │
├─────────────────────────────────────────────────────────────┤
│ ManagerContext │ 懒加载管理器上下文 │
│ EntityManager │ 实体/节点管理 │
│ RelationManager │ 关系/边管理 │
│ SearchManager │ 搜索管理 │
│ IOManager │ 导入/导出管理 │
│ GraphStorage/SQLiteStorage │ 图存储/SQLite 存储后端 │
└─────────────────────────────────────────────────────────────┘
资料来源:CLAUDE.md:1-30
前置要求
| 要求 | 最低版本 | 说明 |
|---|---|---|
| Node.js | 18.0.0 | 推荐使用 LTS 版本 |
| npm | 9.0.0 | 用于安装依赖 |
| 操作系统 | Windows/macOS/Linux | 跨平台支持 |
| 磁盘空间 | 50MB | 基础安装占用 |
安装步骤
1. 全局安装
npm install -g @danielsimonjr/memory-mcp
2. 验证安装
安装完成后,系统会创建以下组件:
| 组件 | 位置 | 说明 |
|---|---|---|
| 构建产物 | dist/index.js | 编译后的入口文件 |
| CLI 二进制文件 | mcp-server-memory | 命令行工具 |
| 源码入口 | src/index.ts | TypeScript 源码 |
安装过程中 prepare 脚本会自动运行 npm run build 进行构建。 资料来源:CLAUDE.md:40-45
存储配置
memory-mcp 支持两种存储后端,在项目根目录创建配置文件即可:
JSONL 存储(默认)
默认使用 JSONL 格式存储,数据文件位于项目根目录(不是 dist/):
├── memory.jsonl # 主记忆数据
├── memory-saved-searches.jsonl # 保存的搜索
├── memory-tag-aliases.jsonl # 标签别名
└── memory.db # (可选) SQLite 数据库
SQLite 存储
设置环境变量切换到 SQLite 存储:
export MEMORY_STORAGE_TYPE=sqlite
使用 SQLite 时,所有数据存储在 memory.db 文件中。 资料来源:CLAUDE.md:30-35
工具类别总览
memory-mcp 提供 213 个工具,分为 58 个类别:
| 类别 | 工具数量 | 核心功能 |
|---|---|---|
| 实体 (Entity) | 4 | 图节点的基础增删改查 |
| 关系 (Relation) | 2 | 实体间的有向边管理 |
| 观察 (Observation) | 3 | 附加到实体的属性和事实 |
| 搜索 (Search) | 7 | 基础、布尔、模糊搜索 |
| 智能搜索 (Intelligent Search) | 3 | 混合多层、查询分析 |
| 语义搜索 (Semantic Search) | 3 | OpenAI 或本地模型嵌入 |
| 标签管理 (Tag Management) | 6 | 标签及重要性评分 |
| 层级管理 (Hierarchy) | 9 | 父子树和子树遍历 |
| 图算法 (Graph Algorithms) | 4 | BFS/DFS、中心性计算 |
| 分析 (Analytics) | 2 | 图统计和完整性验证 |
| 压缩 (Compression) | 4 | 去重、合并、自动压缩 |
| 导入/导出 (Import/Export) | 2 | 7 种导出格式 |
资料来源:CLAUDE.md:15-25
首次使用
1. 启动服务器
在支持 MCP 的客户端(如 Claude Desktop)中配置服务器连接。服务器通过 Model Context Protocol 暴露所有工具。
2. 创建第一个实体
使用 create_entity 工具创建记忆节点:
工具:create_entity
参数:
- name: "我的第一个记忆"
- entityType: "memory"
3. 添加观察数据
使用 create_observation 为实体添加属性:
工具:create_observation
参数:
- entityName: "我的第一个记忆"
- content: "这是一个测试记忆"
- importance: 0.8
4. 执行搜索
使用 search 或 semantic_search 查找记忆:
工具:search
参数:
- query: "测试"
- limit: 10
数据流图
graph TD
A[用户请求] --> B[MCP 客户端]
B --> C[MCPServer]
C --> D[ToolHandlers]
D --> E[memoryjs ManagerContext]
E --> F{存储类型判断}
F -->|JSONL| G[GraphStorage]
F -->|SQLite| H[SQLiteStorage]
G --> I[memory.jsonl]
H --> J[memory.db]
J --> K[结果返回]
I --> K
K --> C
C --> B
B --> L[用户响应]常见操作示例
层级组织
创建实体间的父子关系:
工具:set_entity_parent
参数:
- entityName: "项目A"
- parentName: "工作"
标签管理
为实体添加标签:
工具:add_tag
参数:
- entityName: "项目A"
- tag: "重要"
- importance: 0.9
导入导出
导出记忆为指定格式:
工具:export_graph
参数:
- format: "json"
- includeObservations: true
开发指南
如果你想为 memory-mcp 做贡献:
# 克隆仓库
cd c:/mcp-servers/memory-mcp
# 创建功能分支
git checkout -b feature/your-feature-name
# 安装依赖
npm install
# 编写代码,遵循以下规范:
# - TypeScript 最佳实践
# - 使用有意义的变量名
# - 为公共方法添加 JSDoc 注释
# - 保持函数小而专注
# - 使用 2 空格缩进
# 运行类型检查
npm run typecheck
# 提交更改
git add .
git commit -m "Description of your changes"
# 推送并创建 PR
git push origin feature/your-feature-name
资料来源:CONTRIBUTING.md:1-25
独立工具
tools/ 目录包含独立工具,每个都有独立的 package.json:
| 工具 | 用途 |
|---|---|
chunking-for-files | 拆分/合并大文件以适应上下文限制 |
compress-for-context | CTON 压缩以适应 LLM 上下文窗口 |
create-dependency-graph | 生成 TypeScript 项目依赖图 |
migrate-from-jsonl-to-sqlite | 在 JSONL 和 SQLite 格式间转换 |
资料来源:CLAUDE.md:50-55
下一步
资料来源:[README.md:1-15]()
系统架构
memory-mcp 是一个基于 Model Context Protocol (MCP) 的知识图谱管理服务器,为 AI 代理提供持久化记忆能力。该项目采用分层架构设计,核心逻辑委托给 @danielsimonjr/memoryjs 库处理,而本仓库专注于 MCP 协议适配层、工具定义和请求处理。
继续阅读本节完整说明和来源证据。
概述
memory-mcp 是一个基于 Model Context Protocol (MCP) 的知识图谱管理服务器,为 AI 代理提供持久化记忆能力。该项目采用分层架构设计,核心逻辑委托给 @danielsimonjr/memoryjs 库处理,而本仓库专注于 MCP 协议适配层、工具定义和请求处理。
核心职责:
- 将 memoryjs 的知识图谱能力暴露为 MCP 工具(当前版本共 213 个工具,覆盖 58 个类别)
- 处理 MCP 协议的请求/响应生命周期
- 提供多格式存储支持(JSONL 和 SQLite)
- 支持语义搜索、嵌入向量、权限控制等高级功能
资料来源:CLAUDE.md
资料来源:[CLAUDE.md](https://github.com/danielsimonjr/memory-mcp/blob/main/CLAUDE.md)
数据流处理
数据流处理是 memory-mcp 架构的核心机制,负责将 MCP(Model Context Protocol)工具调用转化为底层知识图谱操作,并确保大规模响应的有效传输。该系统采用分层架构,上层为 MCP 服务器,下层为核心库 @danielsimonjr/memoryjs,两者通过 ManagerContext 进行解耦通信。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
数据流处理是 memory-mcp 架构的核心机制,负责将 MCP(Model Context Protocol)工具调用转化为底层知识图谱操作,并确保大规模响应的有效传输。该系统采用分层架构,上层为 MCP 服务器,下层为核心库 @danielsimonjr/memoryjs,两者通过 ManagerContext 进行解耦通信。
核心职责:
- 接收并验证工具调用参数
- 路由至对应的 Manager 处理器
- 管理知识图谱实体的 CRUD 操作
- 对超过 256KB 的大规模响应自动压缩
- 支持多种存储后端(JSONL / SQLite)
资料来源:CLAUDE.md:1-5
系统架构
分层架构图
graph TD
subgraph "memory-mcp (本仓库)"
A["src/index.ts<br/>入口点"] --> B["MCPServer.ts<br/>MCP服务器"]
B --> C["toolHandlers.ts<br/>工具处理器"]
C --> D["responseCompressor.ts<br/>响应压缩器"]
end
subgraph "@danielsimonjr/memoryjs (npm依赖)"
E["ManagerContext<br/>管理器上下文"]
E --> F["EntityManager<br/>实体管理器"]
E --> G["RelationManager<br/>关系管理器"]
E --> H["SearchManager<br/>搜索管理器"]
E --> I["ObservationManager<br/>观察管理器"]
E --> J["IOManager<br/>IO管理器"]
end
D --> E
F --> K["GraphStorage<br/>图存储"]
G --> K
H --> K
I --> K
J --> K
K --> L["JSONL / SQLite<br/>存储后端"]资料来源:CLAUDE.md:10-18
组件职责表
| 组件 | 文件位置 | 职责 |
|---|---|---|
| 入口点 | src/index.ts | 初始化 MCP 服务器,导出 ManagerContext 别名 |
| MCP 服务器 | src/server/MCPServer.ts | 处理协议握手、工具定义分发 |
| 工具处理器 | src/server/toolHandlers.ts | 工具业务逻辑、参数验证、响应格式化 |
| 响应压缩器 | src/server/responseCompressor.ts | 检测并压缩大规模响应 |
| ManagerContext | memoryjs 内部 | 懒加载初始化所有管理器实例 |
资料来源:CLAUDE.md:22-25
工具处理流程
标准处理管道
sequenceDiagram
participant Client as MCP客户端
participant Server as MCPServer
participant Handler as toolHandlers
participant Compressor as withCompression
participant Manager as ManagerContext
participant Storage as GraphStorage
Client->>Server: 工具调用请求
Server->>Handler: 路由至对应handler
Handler->>Handler: 参数验证 (zod schemas)
Handler->>Handler: 数据预处理
Handler->>Manager: 调用manager方法
Manager->>Storage: 持久化/查询
Storage-->>Manager: 返回结果
Manager-->>Handler: 格式化响应
Handler->>Compressor: 包装响应
Compressor->>Compressor: 检查大小 >256KB?
alt 响应过大
Compressor->>Compressor: CTON压缩
Compressor-->>Server: 压缩后的JSON
else 响应正常
Compressor-->>Server: 原始响应
end
Server-->>Client: ToolResponse工具处理器模式
所有工具处理器遵循统一模式:参数验证 → 调用管理器 → 格式化响应 资料来源:CLAUDE.md:33-34
// 标准处理器示例 - create_artifact
create_artifact: async (ctx, args) => {
// 1. 参数验证
const content = validateWithSchema(args.content, z.string().min(1), 'Invalid content');
const toolName = validateWithSchema(args.toolName, z.string().min(1), 'Invalid toolName');
const artifactType = validateWithSchema(
args.artifactType,
z.enum(['tool_output', 'code_snippet', 'api_response', 'search_result', 'file_content', 'user_input']),
'Invalid artifactType'
);
// 2. 调用管理器
const artifact = await getArtifactManager(ctx).createArtifact({
content,
toolName,
artifactType,
description: args.description,
sessionId: args.sessionId,
});
// 3. 格式化响应
return formatToolResponse(artifact);
},
资料来源:src/server/toolHandlers.ts:1-25
参数验证机制
系统使用 zod 进行参数模式验证,支持类型约束和错误消息自定义:
function validateWithSchema<T>(
value: unknown,
schema: z.ZodType<T>,
errorMessage: string
): T
验证失败时抛出错误,中断处理流程。 资料来源:src/server/toolHandlers.ts:3-5
过滤参数验证
对于可选的过滤参数,采用宽松验证策略——单个无效字段不会导致整个请求失败,而是使用管理器默认值:
function parseObservationDedupFilter(args: Record<string, unknown>): {
entityType?: string | string[];
projectId?: string;
sessionId?: string;
minOccurrences?: number;
maxGroups?: number;
}
资料来源:src/server/toolHandlers.ts:85-93
响应压缩机制
压缩触发条件
| 条件 | 阈值 | 处理方式 |
|---|---|---|
| 文本响应大小 | > 256KB | CTON 压缩 |
| 非文本响应 | 任何大小 | 直接返回 |
资料来源:src/server/toolHandlers.ts:95-97
压缩工作流
graph TD
A["handler返回ToolResponse"] --> B{"textContent?.type<br/>=== 'text'?"}
B -->|是| C{"text.length<br/>> 256KB?"}
B -->|否| Z["直接返回原始响应"]
C -->|是| D["maybeCompressResponse"]
C -->|否| Z
D --> E{"compressed?"}
E -->|是| F["包装为JSON.stringify<br/>{compressed: true, data}"]
E -->|否| Z
F --> G["返回压缩后的响应"]
Z --> H["返回给客户端"]
G --> H压缩配置参数
| 参数 | 类型 | 说明 | ||
|---|---|---|---|---|
MEMORY_AUTO_INDEX_EMBEDDINGS | boolean | 实体创建时自动索引嵌入向量 | ||
MEMORY_EMBEDDING_PROVIDER | openai \ | local \ | none | 嵌入向量生成提供者 |
MEMORY_EMBEDDING_MODEL | string | 嵌入模型名称 |
资料来源:CLAUDE.md:42-48
存储层数据流
存储类型支持
| 存储类型 | 默认路径 | 环境变量 |
|---|---|---|
| JSONL | memory.jsonl | MEMORY_STORAGE_TYPE=jsonl |
| SQLite | memory.db | MEMORY_STORAGE_TYPE=sqlite |
存储文件位于项目根目录,而非 dist/ 构建目录。 资料来源:CLAUDE.md:54-56
数据流层级
graph LR
subgraph "访问接口层"
A["ManagerContext<br/>入口"]
end
subgraph "管理器层"
B["EntityManager"]
C["RelationManager"]
D["SearchManager"]
E["ObservationManager"]
F["TagManager"]
G["HierarchyManager"]
end
subgraph "存储抽象层"
H["GraphStorage<br/>统一接口"]
end
subgraph "存储实现层"
I["JSONLStorage"]
J["SQLiteStorage"]
end
A --> B
A --> C
A --> D
A --> E
A --> F
A --> G
B --> H
C --> H
D --> H
E --> H
F --> H
G --> H
H --> I
H --> J可用管理器接口
ManagerContext 提供以下管理器访问:
| 管理器 | 访问方式 | 主要功能 |
|---|---|---|
| 实体管理 | ctx.entityManager | 创建、读取、更新、删除图节点 |
| 关系管理 | ctx.relationManager | 管理有向边 |
| 观察管理 | ctx.observationManager | 附加到实体的观察/事实 |
| 搜索管理 | ctx.searchManager | 基础和高级搜索 |
| 标签管理 | ctx.tagManager | 标签 CRUD 和批量操作 |
| 层级管理 | ctx.hierarchyManager | 父子树结构 |
| 分析管理 | ctx.analyticsManager | 图统计和完整性验证 |
| 压缩管理 | ctx.compressionManager | 去重和自动压缩 |
| IO 管理 | ctx.ioManager | 导入导出操作 |
| 图遍历 | ctx.graphTraversal | BFS/DFS 路径查找 |
| 语义搜索 | ctx.semanticSearch | 嵌入相似度搜索 |
| 排名搜索 | ctx.rankedSearch | TF-IDF 排名搜索 |
| 存储 | ctx.storage | 直接访问 GraphStorage |
资料来源:CLAUDE.md:25-30
工具分类数据流
按功能分类的处理器组
系统包含 213 个工具,分布在 58 个类别中:
| 类别 | 数量 | 数据流特点 |
|---|---|---|
| Entity | 4 | 直接写入存储,可能触发自动嵌入索引 |
| Relation | 2 | 边创建涉及关系完整性验证 |
| Observation | 3 | 支持规范化处理和去重检测 |
| Search | 7 | 查询密集型,结果可能超过 256KB 阈值 |
| Semantic Search | 3 | 嵌入向量计算,延迟较高 |
| Import/Export | 2 | IO 密集型,大文件处理 |
| Compression | 4 | 涉及存储重写和数据压缩 |
资料来源:CLAUDE.md:31-46
大数据量工具处理
以下工具因可能返回无界结果集而被标记为需要压缩处理:
| 工具名 | 潜在问题 |
|---|---|
read_graph | 全图数据可能极大 |
search_nodes | 匹配结果无明确上界 |
get_subtree | 子树深度不可预测 |
open_nodes | 展开节点可能指数增长 |
资料来源:src/server/toolHandlers.ts:98-101
响应格式化
格式化函数
系统提供两种响应格式化函数:
// 结构化响应 - 用于成功操作的 JSON 结构
function formatToolResponse(data: unknown): ToolResponse
// 文本响应 - 用于简单消息或未找到结果
function formatTextResponse(message: string): ToolResponse
ToolResponse 结构
interface ToolResponse {
content: Array<{
type: 'text';
text: string | CompressedPayload;
}>;
}
interface CompressedPayload {
compressed: true;
originalSize: number;
compressedSize: number;
algorithm: 'cton';
data: string;
}
资料来源:src/server/toolHandlers.ts:108-120
独立压缩工具
除了 MCP 服务器内置的压缩机制,项目还提供独立的命令行压缩工具 compress-for-context: 资料来源:tools/compress-for-context/compress-for-context.ts:1-50
功能特性
| 功能 | 说明 |
|---|---|
| 批量压缩 | 支持批量处理多个文件 |
| 递归压缩 | 可递归处理子目录 |
| 格式支持 | JSON、YAML、Markdown、CSV、TSV、Text、Log、TypeScript、JavaScript、XML、HTML |
| 压缩级别 | light(轻度)、medium(中度)、aggressive(激进) |
| 解压缩 | 支持从 .compact 文件恢复原始内容 |
命令行用法
# 单文件压缩
node compress-for-context.js data.json
node compress-for-context.js README.md -l aggressive
# 批量递归压缩
node compress-for-context.js -b -r -p "*.md" ./docs
# 预览压缩(不写入文件)
node compress-for-context.js log.txt --dry-run
# 解压缩
node compress-for-context.js -d data.json.compact
资料来源:tools/compress-for-context/compress-for-context.ts:15-40
数据迁移工具
JSONL 与 SQLite 互转
独立工具 migrate-from-jsonl-to-sqlite 支持存储格式间的迁移:
migrate-from-jsonl-to-sqlite --from <source> --to <target> [--verbose]
使用 better-sqlite3 实现原生 SQLite 性能。 资料来源:tools/migrate-from-jsonl-to-sqlite/migrate-from-jsonl-to-sqlite.ts:1-30
测试覆盖
测试统计
| 指标 | 数值 |
|---|---|
| 测试文件数 | 26 |
| 测试用例数 | ~665 |
| 语句覆盖率 | 80.7% |
| 行覆盖率 | 81.4% |
| 函数覆盖率 | 79% |
资料来源:CLAUDE.md:58-59
数据流相关测试
新增工具应按以下流程添加测试:
- 在
tests/e2e/tools/目录添加端到端测试 - 测试空图和大图场景
- 验证导出格式正确性
- 验证压缩机制触发条件
扩展新工具数据流
添加新工具的标准流程
graph TD
A["定义工具schema"] --> B["添加handler函数"]
B --> C["注册到handler映射表"]
C --> D["添加端到端测试"]
D --> E["更新文档"]
subgraph "步骤1: toolDefinitions.ts"
A
end
subgraph "步骤2: toolHandlers.ts"
B
end
subgraph "步骤3: 注册"
C
endHandler 注册模式
// 在 toolHandlers.ts 中
export const toolHandlers = {
[TOOL_NAME]: async (ctx, args) => {
// 1. 参数验证
// 2. 调用 manager
// 3. 格式化响应
},
};
资料来源:CLAUDE.md:33-37
最佳实践
性能优化建议
| 场景 | 建议 |
|---|---|
| 大结果集查询 | 使用分页参数限制返回量 |
| 频繁搜索 | 利用 saved_searches 缓存查询 |
| 批量操作 | 优先使用 bulk API 而非循环单条 |
| 嵌入搜索 | 设置 MEMORY_AUTO_INDEX_EMBEDDINGS=true |
错误处理
- 参数验证失败:抛出包含具体字段名的错误
- 存储操作失败:向上传递错误,不做静默处理
- 网络相关:内存 MCP 无外部网络依赖,此项不适用
压缩策略选择
| 压缩级别 | 适用场景 |
|---|---|
| light | 需要保留可读性的配置文件、日志 |
| medium | 日常开发文档和中等复杂度数据(默认) |
| aggressive | 传输给 LLM 的上下文、极限压缩场景 |
资料来源:tools/compress-for-context/compress-for-context.ts:18-22
资料来源:[CLAUDE.md:1-5]()
实体与关系模型
memory-mcp 是一个基于 Model Context Protocol 的记忆管理服务器,其核心数据模型采用属性图模型(Property Graph Model)。系统以实体(Entity)作为图节点,以关系(Relation)作为有向边,通过观察(Observation)附加事实信息,构建具有语义关联的知识图谱。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
资料来源:CLAUDE.md:1-10
1. 架构概述
memory-mcp 的实体与关系模型构建在 @danielsimonjr/memoryjs 库之上,通过分层架构提供服务能力。
graph TD
subgraph "memory-mcp (本仓库)"
A[MCPServer] --> B[toolHandlers]
B --> C[ManagerContext]
C --> D[memoryjs 核心库]
end
subgraph "@danielsimonjr/memoryjs"
E[EntityManager]
F[RelationManager]
G[ObservationManager]
H[GraphStorage]
end
C --> E
C --> F
C --> G
H --> I[(SQLite/JSONL)]
D --> E
D --> F
D --> G
D --> H1.1 核心管理器
| 管理器 | 职责 | 存储后端 |
|---|---|---|
| EntityManager | 实体 CRUD 操作 | GraphStorage |
| RelationManager | 关系创建、查询、删除 | GraphStorage |
| ObservationManager | 观察事实的添加与检索 | GraphStorage |
| SearchManager | 全文与语义搜索 | 索引层 |
| TagManager | 标签分类管理 | GraphStorage |
| HierarchyManager | 层级结构管理 | GraphStorage |
资料来源:CLAUDE.md:18-28
2. 实体模型
实体是知识图谱中的核心节点,代表现实世界中的概念对象。
2.1 实体数据结构
interface Entity {
id: string; // 唯一标识符(UUID)
name: string; // 实体名称
entityType?: string; // 实体类型(如 "person", "project")
observations: string[]; // 关联的观察 ID 列表
tags: string[]; // 标签数组
metadata?: Record<string, unknown>; // 扩展元数据
importance?: number; // 重要性评分 (0-10)
createdAt: string; // ISO 时间戳
updatedAt: string; // ISO 时间戳
archived?: boolean; // 归档状态
}
2.2 实体操作工具
| 工具名称 | 功能 | 核心参数 |
|---|---|---|
| create_entity | 创建新实体 | name, entityType, metadata, tags |
| get_entity | 获取实体详情 | name 或 id |
| update_entity | 更新实体属性 | name/id, updates |
| delete_entity | 删除实体 | name 或 id |
| list_entities | 列出实体 | filter, limit, offset |
| merge_entities | 合并实体 | sourceIds, targetName |
| archive_entities | 批量归档 | filter |
资料来源:src/server/toolDefinitions.ts:1-150
2.3 实体创建示例
// 工具调用示例:create_entity
{
name: "create_entity",
arguments: {
name: "Alice Developer",
entityType: "person",
metadata: {
role: "software_engineer",
company: "TechCorp"
},
tags: ["developer", "ai-expert"],
importance: 8
}
}
3. 关系模型
关系是有向边,连接两个实体并携带语义信息。
3.1 关系数据结构
interface Relation {
id: string; // 唯一标识符
from: string; // 源实体 ID 或名称
to: string; // 目标实体 ID 或名称
relationType: string; // 关系类型(如 "works_for", "knows")
metadata?: Record<string, unknown>; // 关系属性
bidirectional?: boolean; // 是否双向关系
createdAt: string;
}
3.2 关系类型示例
| 关系类型 | 语义 | 示例 |
|---|---|---|
| works_for | 雇佣关系 | Alice → TechCorp |
| knows | 社交关系 | Alice → Bob |
| created | 创建关系 | Alice → ProjectX |
| depends_on | 依赖关系 | ModuleA → ModuleB |
| part_of | 包含关系 | Chapter1 → Book |
3.3 关系操作工具
| 工具名称 | 功能 | 核心参数 |
|---|---|---|
| create_relation | 创建关系 | from, to, relationType, bidirectional |
| get_relation | 获取关系 | from, to, relationType |
| delete_relation | 删除关系 | from, to, relationType |
| list_relations | 列出关系 | filter, entityName, limit |
资料来源:src/server/toolHandlers.ts:1-100
4. 观察模型
观察(Observation)是附加在实体上的事实片段,是知识图谱的信息载体。
4.1 观察数据结构
interface Observation {
id: string; // 唯一标识符
entityId: string; // 关联实体
content: string; // 事实内容
normalizedContent?: string; // 规范化后的内容
source?: string; // 信息来源
importance?: number; // 重要性评分
tags?: string[]; // 观察标签
metadata?: Record<string, unknown>;
createdAt: string;
updatedAt: string;
}
4.2 观察操作工具
| 工具名称 | 功能 | 核心参数 |
|---|---|---|
| create_observation | 添加观察 | entityName/id, content, source, tags |
| get_observations | 获取观察 | entityName/id, limit |
| update_observation | 更新观察 | observationId, updates |
| delete_observation | 删除观察 | observationId |
| normalize_observation | 规范化文本 | observationId |
| create_observation_ref | 创建观察引用 | observationId, entityName, relationType |
资料来源:src/server/toolDefinitions.ts:200-350
4.3 观察流程图
graph LR
A[实体] -->|关联| B[观察]
B -->|内容| C[规范化处理]
C -->|索引| D[SearchManager]
D -->|检索| E[全文搜索]
D -->|检索| F[语义搜索]
B --> G[重要性评分]
G --> H[衰减引擎]
H --> I[遗忘决策]5. 存储模型
5.1 存储类型
memory-mcp 支持两种存储后端,通过环境变量 MEMORY_STORAGE_TYPE 配置。
| 存储类型 | 环境变量 | 文件位置 | 适用场景 |
|---|---|---|---|
| JSONL | MEMORY_STORAGE_TYPE=jsonl | memory.jsonl | 小规模数据、开发测试 |
| SQLite | MEMORY_STORAGE_TYPE=sqlite | memory.db | 生产环境、大规模数据 |
资料来源:CLAUDE.md:50-55
5.2 数据文件
# 项目根目录下的数据文件
memory.jsonl # 主数据(JSONL 格式)
memory-saved-searches.jsonl # 保存的搜索查询
memory-tag-aliases.jsonl # 标签别名映射
memory.db # SQLite 数据库
5.3 环境变量配置
| 变量名 | 描述 | 默认值 |
|---|---|---|
| MEMORY_FILE_PATH | 存储文件路径 | memory.jsonl |
| MEMORY_STORAGE_TYPE | 存储类型 | jsonl |
| MEMORY_EMBEDDING_PROVIDER | 向量化 provider | none |
| MEMORY_OPENAI_API_KEY | OpenAI API 密钥 | — |
| MEMORY_EMBEDDING_MODEL | 向量化模型 | text-embedding-3-small |
| MEMORY_AUTO_INDEX_EMBEDDINGS | 自动索引嵌入 | false |
资料来源:CLAUDE.md:45-49
6. 图遍历与算法
6.1 图遍历管理器
ctx.graphTraversal 提供图结构遍历能力:
// 可用的遍历方法
ctx.graphTraversal.bfs(from, to); // 广度优先搜索
ctx.graphTraversal.dfs(from, to); // 深度优先搜索
ctx.graphTraversal.findPath(from, to); // 最短路径
ctx.graphTraversal.findAllPaths(from, to); // 所有路径
6.2 图算法工具
| 工具名称 | 功能 | 描述 |
|---|---|---|
| find_path | 路径查找 | BFS/DFS 查找两实体间路径 |
| find_shortest_path | 最短路径 | 实体间的最短关系路径 |
| find_connected_entities | 连通分量 | 查找所有连通的实体群组 |
| compute_centrality | 中心性计算 | 计算实体的图中心性指标 |
6.3 图遍历示例
graph TD
A[Alice] -->|works_for| B[TechCorp]
A -->|knows| C[Bob]
C -->|works_for| B
A -->|knows| D[Carol]
D -->|created| E[ProjectX]
B -->|created| E
style A fill:#e1f5fe
style B fill:#fff3e0
style E fill:#e8f5e8查询 Alice 到 ProjectX 的路径:
- Alice → TechCorp → ProjectX(2跳)
- Alice → Carol → ProjectX(2跳)
7. 标签与层级
7.1 标签系统
// 标签操作
ctx.tagManager.add(entityId, tag); // 添加标签
ctx.tagManager.remove(entityId, tag); // 移除标签
ctx.tagManager.findByTag(tag); // 按标签查询
ctx.tagManager.setImportance(entityId, score); // 设置重要性
7.2 层级结构
// 层级操作
ctx.hierarchyManager.setParent(childId, parentId); // 设置父节点
ctx.hierarchyManager.getChildren(parentId); // 获取子节点
ctx.hierarchyManager.getSubtree(nodeId); // 获取子树
ctx.hierarchyManager.getAncestors(nodeId); // 获取祖先链
8. 搜索功能
8.1 搜索类型
| 搜索类型 | 工具 | 描述 |
|---|---|---|
| 基础搜索 | search_entities | 关键词全文搜索 |
| 布尔搜索 | boolean_search | AND/OR/NOT 逻辑组合 |
| 模糊搜索 | fuzzy_search | 容错匹配 |
| 语义搜索 | semantic_search | 向量相似度检索 |
| 排名搜索 | ranked_search | TF-IDF 加权排序 |
| 自动选择 | auto_select_search | 自适应最佳搜索策略 |
8.2 语义搜索配置
启用语义搜索需要配置嵌入模型:
# OpenAI 嵌入
MEMORY_EMBEDDING_PROVIDER=openai
MEMORY_OPENAI_API_KEY=sk-...
MEMORY_EMBEDDING_MODEL=text-embedding-3-small
MEMORY_AUTO_INDEX_EMBEDDINGS=true
# 本地嵌入
MEMORY_EMBEDDING_PROVIDER=local
MEMORY_EMBEDDING_MODEL=Xenova/all-MiniLM-L6-v2
9. 数据导出
9.1 导出格式
| 格式 | 工具 | 用途 |
|---|---|---|
| JSON | export_graph | 通用数据交换 |
| CSV | export_graph | 电子表格分析 |
| Markdown | export_graph | 文档生成 |
| XML | export_graph | 企业系统集成 |
| JSON-LD | export_graph | 语义网应用 |
| GraphML | export_graph | 图可视化工具 |
9.2 导出工具
// 导出图数据
export_graph({
format: "json", // json|csv|markdown|xml|json-ld
includeArchived: false,
redactPii: true // PII 脱敏
})
资料来源:CLAUDE.md:30-35
10. 完整工作流示例
sequenceDiagram
participant Client
participant MCPServer
participant ToolHandlers
participant EntityManager
participant GraphStorage
Client->>MCPServer: create_entity
MCPServer->>ToolHandlers: route to create_entity handler
ToolHandlers->>EntityManager: createEntity(data)
EntityManager->>GraphStorage: persist
GraphStorage-->>EntityManager: entity with id
EntityManager-->>ToolHandlers: result
ToolHandlers-->>MCPServer: formatted response
MCPServer-->>Client: MCP response
Note over Client,GraphStorage: 创建实体后添加观察
Client->>MCPServer: create_observation
MCPServer->>ToolHandlers: route to create_observation handler
ToolHandlers->>EntityManager: getEntity(name)
EntityManager-->>ToolHandlers: entity
ToolHandlers->>ObservationManager: createObservation(data)
ObservationManager->>GraphStorage: persist
GraphStorage-->>ObservationManager: observation with id
ObservationManager-->>ToolHandlers: result
ToolHandlers-->>MCPServer: formatted response
MCPServer-->>Client: MCP response11. 相关资源
- 核心库文档: @danielsimonjr/memoryjs
- 项目地址: https://github.com/danielsimonjr/memory-mcp
- npm 包: @danielsimonjr/memory-mcp
资料来源:[CLAUDE.md:1-10]()
存储后端
Memory MCP 的存储后端是整个系统的核心基础设施,负责持久化知识图谱数据。系统支持两种存储格式:JSONL(基于文本行的 JSON 格式)和 SQLite(关系型数据库)。存储后端通过 @danielsimonjr/memoryjs 库提供统一的访问接口,实现了数据的抽象化存储,使得上层业务逻辑无需关心底层存储细节。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
Memory MCP 的存储后端是整个系统的核心基础设施,负责持久化知识图谱数据。系统支持两种存储格式:JSONL(基于文本行的 JSON 格式)和 SQLite(关系型数据库)。存储后端通过 @danielsimonjr/memoryjs 库提供统一的访问接口,实现了数据的抽象化存储,使得上层业务逻辑无需关心底层存储细节。
项目的存储架构采用分层设计,memory-mcp 作为前端封装,通过 ManagerContext 访问 memoryjs 核心库提供的各种管理器,这些管理器再与底层存储层(GraphStorage 或 SQLiteStorage)进行交互。资料来源:CLAUDE.md
支持的存储格式
Memory MCP 支持两种存储后端格式,开发者可根据数据规模、性能需求和使用场景选择合适的格式。
| 格式 | 文件扩展名 | 适用场景 | 性能特点 |
|---|---|---|---|
| JSONL | .jsonl, .json | 小规模数据、简单部署、调试 | 易于阅读和编辑,人类可读 |
| SQLite | .db, .sqlite, .sqlite3 | 大规模数据、生产环境 | 原生 C++ 实现,性能提升 3-10 倍 |
SQLite 后端通过 better-sqlite3 原生绑定实现,比 WASM 实现快 3-10 倍。资料来源:tools/migrate-from-jsonl-to-sqlite/README.md
存储文件布局
根据架构规范,数据文件位于项目根目录(而非 dist/ 输出目录)。这种设计确保了数据文件的独立性和可移植性。
JSONL 格式文件
项目根目录/
├── memory.jsonl # 实体和关系数据
├── memory-saved-searches.jsonl # 保存的搜索查询
└── memory-tag-aliases.jsonl # 标签别名映射
SQLite 格式文件
项目根目录/
└── memory.db # 单一数据库文件(所有数据)
配置环境变量 MEMORY_STORAGE_TYPE=sqlite 可启用 SQLite 存储模式。资料来源:CLAUDE.md
架构分层
┌─────────────────────────────────────────────────────────────┐
│ memory-mcp (本项目) │
├─────────────────────────────────────────────────────────────┤
│ src/index.ts │ 入口点,重新导出核心类型 │
│ src/server/MCPServer.ts │ MCP 服务器实现 │
│ src/server/toolDefs.ts │ 工具定义 │
│ src/server/toolHandlers │ 工具处理器 │
└───────────────────────────┼─────────────────────────────────┘
│ 依赖导入
▼
┌─────────────────────────────────────────────────────────────┐
│ @danielsimonjr/memoryjs (npm 依赖) │
├─────────────────────────────────────────────────────────────┤
│ ManagerContext (延迟初始化) │
│ ├── EntityManager │ 实体管理器 │
│ ├── RelationManager │ 关系管理器 │
│ ├── ObservationManager │ 观察数据管理器 │
│ ├── SearchManager │ 搜索管理器 │
│ ├── TagManager │ 标签管理器 │
│ ├── HierarchyManager │ 层级管理器 │
│ ├── AnalyticsManager │ 分析管理器 │
│ ├── CompressionManager │ 压缩管理器 │
│ ├── ArchiveManager │ 归档管理器 │
│ ├── IOManager │ IO 管理器 │
│ ├── GraphTraversal │ 图遍历 │
│ ├── SemanticSearch │ 语义搜索 │
│ ├── RankedSearch │ 排名搜索 │
│ └── Storage │ 直接访问 GraphStorage │
├─────────────────────────────────────────────────────────────┤
│ 存储层 (GraphStorage) │
│ ├── SQLiteStorage │ SQLite 原生实现 │
│ └── JsonlStorage │ JSONL 文件实现 │
└─────────────────────────────────────────────────────────────┘
资料来源:CLAUDE.md
SQLite 存储特性
SQLite 后端实现了多项企业级特性,以提供高性能和可靠的数据存储。
自动全文搜索索引
SQLite 后端会自动创建 FTS5(Full-Text Search version 5)索引,启用高级全文搜索功能。这使得系统能够支持复杂的文本搜索查询,无需额外的搜索基础设施。资料来源:tools/migrate-from-jsonl-to-sqlite/README.md
WAL 模式
SQLite 数据库启用 WAL(Write-Ahead Logging)模式,该模式允许读写操作并发进行,显著提升多客户端访问场景下的性能。WAL 模式相比传统的回滚日志模式,在大多数场景下提供更好的并发性能。资料来源:tools/migrate-from-jsonl-to-sqlite/README.md
原子事务
所有数据写入操作都使用原子事务包装,确保在系统崩溃或异常断电情况下的数据完整性。原子事务保证要么所有操作成功提交,要么全部回滚,不会出现部分写入的损坏状态。资料来源:tools/migrate-from-jsonl-to-sqlite/README.md
存储迁移工具
项目提供了独立的迁移工具 migrate-from-jsonl-to-sqlite,支持在两种存储格式之间双向转换。
工具位置
tools/
└── migrate-from-jsonl-to-sqlite/
├── migrate-from-jsonl-to-sqlite.ts # TypeScript 源码
├── package.json # 工具依赖配置
└── README.md # 使用文档
安装与构建
cd tools/migrate-from-jsonl-to-sqlite
npm install
npm run build
构建完成后可生成 Windows 可执行文件 migrate-from-jsonl-to-sqlite.exe。资料来源:tools/migrate-from-jsonl-to-sqlite/README.md
命令行参数
| 参数 | 简写 | 描述 | 示例 |
|---|---|---|---|
--from | -f | 源文件路径(JSONL 或 SQLite) | --from memory.jsonl |
--to | -t | 目标文件路径(JSONL 或 SQLite) | --to memory.db |
--verbose | -v | 显示详细进度信息 | --verbose |
--help | -h | 显示帮助信息 | --help |
使用示例
# JSONL 转换为 SQLite
migrate-from-jsonl-to-sqlite --from memory.jsonl --to memory.db
# SQLite 转换为 JSONL
migrate-from-jsonl-to-sqlite --from memory.db --to memory.jsonl
# 使用位置参数
migrate-from-jsonl-to-sqlite memory.jsonl memory.db
# 详细输出模式
migrate-from-jsonl-to-sqlite -f memory.jsonl -t memory.db -v
资料来源:tools/migrate-from-jsonl-to-sqlite/README.md
迁移流程
graph TD
A[开始迁移] --> B{检测源文件类型}
B -->|JSONL| C[loadFromJsonl]
B -->|SQLite| D[loadFromSqlite]
C --> E[加载数据到内存]
D --> E
E --> F{实体数=0 且 关系数=0?}
F -->|是| G[输出警告,终止]
F -->|否| H[写入目标文件]
H --> I{目标类型}
I -->|SQLite| J[创建数据库 + FTS5 索引 + WAL 模式]
I -->|JSONL| K[逐行写入 JSONL]
J --> L[使用原子事务提交]
K --> L
L --> M[迁移完成]注意事项
- 目标文件不存在时会自动创建
- 目标文件已存在时会覆盖原有数据
- 迁移会保留所有实体、关系和元数据
- 缺失的时间戳会被设置为迁移时间并输出警告
- 已保存的搜索和标签别名不会迁移到 SQLite 格式
- 迁移工具使用
better-sqlite3原生绑定,性能优于 WASM 实现
资料来源:tools/migrate-from-jsonl-to-sqlite/migrate-from-jsonl-to-sqlite.ts
核心数据模型
Memory MCP 的存储后端管理以下核心数据结构:
实体 (Entity)
实体是知识图谱中的节点,代表独立的概念、对象或事物。
| 字段 | 类型 | 描述 |
|---|---|---|
| id | string | 唯一标识符 |
| name | string | 实体名称 |
| observation | string | 主要观察/描述数据 |
| metadata | object | 附加元数据 |
| createdAt | timestamp | 创建时间 |
| updatedAt | timestamp | 更新时间 |
关系 (Relation)
关系是连接两个实体的有向边,定义实体间的关联。
| 字段 | 类型 | 描述 |
|---|---|---|
| id | string | 唯一标识符 |
| from | string | 源实体 ID |
| to | string | 目标实体 ID |
| relationType | string | 关系类型 |
观察数据 (Observation)
观察数据是附加到实体的客观事实,支持数据归一化。
| 字段 | 类型 | 描述 |
|---|---|---|
| id | string | 唯一标识符 |
| entityId | string | 所属实体 ID |
| content | string | 观察内容 |
| normalized | object | 归一化后的数据 |
产物 (Artifact)
产物是工具输出、代码片段、API 响应等内容的存储容器。
| 字段 | 类型 | 描述 |
|---|---|---|
| ref | string | 稳定的引用标识符 |
| content | string | 产物内容 |
| toolName | string | 产生该产物的工具名 |
| artifactType | enum | 产物类型 |
| sessionId | string | 会话上下文(可选) |
产物类型枚举值包括:tool_output、code_snippet、api_response、search_result、file_content、user_input。资料来源:src/server/toolDefinitions.ts
存储配置
环境变量
| 变量名 | 值 | 描述 |
|---|---|---|
MEMORY_STORAGE_TYPE | sqlite | 启用 SQLite 存储 |
MEMORY_FILE_PATH | 文件路径 | 指定自定义存储路径 |
安全配置示例
在容器化环境中,建议通过环境变量或 Kubernetes Secret 管理存储路径:
apiVersion: v1
kind: Pod
spec:
containers:
- name: memory-mcp
env:
- name: MEMORY_FILE_PATH
value: "/secure/path/memory.jsonl"
资料来源:SECURITY.md
安全考量
存储后端的安全性直接影响整体系统的数据保护能力。
静态数据安全
| 风险 | 描述 | 缓解措施 |
|---|---|---|
| 文件可读性 | 本地文件可被任何有权限的进程读取 | 限制文件权限,使用专用存储路径 |
| 无内置加密 | 存储文件未加密 | 依赖文件系统加密或全磁盘加密 |
| 无访问控制 | 无用户认证授权机制 | 通过系统权限和网络隔离实现 |
导出安全
CSV 和 JSON 导出包含完整的实体数据,在分享前应检查敏感信息。GraphML 格式需要正确的 XML 实体转义处理。资料来源:SECURITY.md
备份建议
# 备份存储文件
cp memory.jsonl memory.jsonl.backup
# 或对于 SQLite
cp memory.db memory.db.backup
性能优化
SQLite 性能特性
| 特性 | 作用 | 性能影响 |
|---|---|---|
| better-sqlite3 原生绑定 | 直接调用 SQLite C 库 | 比 WASM 快 3-10x |
| WAL 模式 | 支持读写并发 | 提升多客户端性能 |
| FTS5 全文索引 | 自动创建的全文搜索索引 | 加速文本搜索 |
| 原子事务 | 保证数据一致性 | 防止数据损坏 |
压缩管理
存储后端集成压缩管理器,支持以下操作:
- 重复检测:识别知识图谱中的重复实体
- 智能合并:合并重复数据,保留最新信息
- 自动压缩:根据配置阈值自动触发压缩
- 归档:将历史数据归档以优化活跃数据访问
资料来源:CLAUDE.md
依赖配置
npm 依赖
{
"dependencies": {
"@danielsimonjr/memoryjs": "^2.1.0",
"@modelcontextprotocol/sdk": "^1.21.1",
"zod": "^3.24.1"
}
}
迁移工具依赖
{
"dependencies": {
"better-sqlite3": "^11.7.0"
},
"devDependencies": {
"@types/better-sqlite3": "^7.6.12",
"@yao-pkg/pkg": "^6.11.0",
"typescript": "^5.6.2"
}
}
资料来源:package.json
工具构建
项目提供了便捷的脚本用于构建所有独立工具:
# 安装所有工具依赖
npm run tools:install
# 构建所有工具(包括迁移工具)
npm run tools:build
构建后的迁移工具位于 tools/migrate-from-jsonl-to-sqlite/ 目录,可生成独立的 Windows 可执行文件。资料来源:package.json
总结
Memory MCP 的存储后端提供了灵活、高效、可靠的数据持久化能力。通过支持 JSONL 和 SQLite 两种格式,开发者可以根据实际需求选择合适的存储方案。SQLite 后端凭借原生绑定、WAL 模式、FTS5 索引等特性,在生产环境中提供卓越的性能表现。独立的迁移工具简化了格式转换过程,而分层架构则确保了系统的可维护性和扩展性。
资料来源:[CLAUDE.md]()
层级嵌套
层级嵌套(Hieararchy)是 memory-mcp 知识图谱系统中用于管理实体间父子关系和树形结构的核心功能模块。该模块通过 ctx.hierarchyManager 提供9个专用工具,支持实体间的父子树构建和子树遍历操作。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
层级嵌套(Hieararchy)是 memory-mcp 知识图谱系统中用于管理实体间父子关系和树形结构的核心功能模块。该模块通过 ctx.hierarchyManager 提供9个专用工具,支持实体间的父子树构建和子树遍历操作。
层级管理是知识图谱组织结构化信息的重要手段,允许用户将实体组织成树形层级关系,便于表达分类、归属、继承等概念。资料来源:CLAUDE.md:1。
架构设计
访问方式
层级管理器通过 ManagerContext 实例访问:
ctx.hierarchyManager
可用的层级操作方法包括:
| 方法 | 功能描述 |
|---|---|
setEntityParent(entityName, parentName) | 设置实体的父节点 |
getChildren(entityName) | 获取直接子节点 |
getParent(entityName) | 获取父节点 |
getAncestors(entityName) | 获取所有祖先节点 |
getDescendants(entityName) | 获取所有后代节点 |
getSubtree(entityName) | 获取完整子树结构 |
资料来源:src/server/toolHandlers.ts:1
与其他模块的关系
┌─────────────────────────────────────────────┐
│ ManagerContext │
├─────────────────────────────────────────────┤
│ hierarchyManager ──────────────────────────▶│
│ ├── setEntityParent() │
│ ├── getChildren() │
│ ├── getParent() │
│ ├── getAncestors() │
│ ├── getDescendants() │
│ └── getSubtree() │
└─────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ @danielsimonjr/memoryjs │
│ (底层存储: EntityManager + 层级索引) │
└─────────────────────────────────────────────┘
工具清单
工具分类:Hierarchy(共9个)
| 工具名称 | 功能描述 | 核心参数 |
|---|---|---|
set_entity_parent | 设置实体的父节点 | entityName, parentName |
get_children | 获取实体的直接子节点 | entityName |
get_parent | 获取实体的直接父节点 | entityName |
get_ancestors | 获取实体的所有祖先节点 | entityName |
get_descendants | 获取实体的所有后代节点 | entityName |
get_subtree | 获取实体的完整子树 | entityName |
资料来源:CLAUDE.md:1
API 详细说明
set_entity_parent
设置或更新实体的父节点关系。
输入参数:
| 参数名 | 类型 | 必填 | 描述 | |
|---|---|---|---|---|
entityName | string | 是 | 要设置父节点的实体名称 | |
parentName | `string \ | null` | 否 | 父实体名称,设为 null 可移除父子关系 |
处理器实现:
set_entity_parent: async (ctx, args) => {
const entityName = validateWithSchema(args.entityName, z.string().min(1), 'Invalid entity name');
const parentName = args.parentName !== undefined
? validateWithSchema(args.parentName, z.string().min(1).nullable(), 'Invalid parent name')
: null;
return formatToolResponse(await ctx.hierarchyManager.setEntityParent(entityName, parentName));
}
资料来源:src/server/toolHandlers.ts:1
get_children
获取指定实体的所有直接子节点。
输入参数:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
entityName | string | 是 | 目标实体名称 |
处理器实现:
get_children: async (ctx, args) => {
const entityName = validateWithSchema(args.entityName, z.string().min(1), 'Invalid entity name');
return formatToolResponse(await ctx.hierarchyManager.getChildren(entityName));
}
get_parent
获取指定实体的直接父节点。
输入参数:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
entityName | string | 是 | 目标实体名称 |
处理器实现:
get_parent: async (ctx, args) => {
const entityName = validateWithSchema(args.entityName, z.string().min(1), 'Invalid entity name');
return formatToolResponse(await ctx.hierarchyManager.getParent(entityName));
}
get_ancestors
获取指定实体的所有祖先节点(从直接父节点到根节点)。
输入参数:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
entityName | string | 是 | 目标实体名称 |
处理器实现:
get_ancestors: async (ctx, args) => {
const entityName = validateWithSchema(args.entityName, z.string().min(1), 'Invalid entity name');
return formatToolResponse(await ctx.hierarchyManager.getAncestors(entityName));
}
get_descendants
获取指定实体的所有后代节点(所有子节点、孙节点等)。
输入参数:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
entityName | string | 是 | 目标实体名称 |
处理器实现:
get_descendants: async (ctx, args) => {
const entityName = validateWithSchema(args.entityName, z.string().min(1), 'Invalid entity name');
return formatToolResponse(await ctx.hierarchyManager.getDescendants(entityName));
}
get_subtree
获取指定实体及其所有后代组成的完整子树结构。
输入参数:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
entityName | string | 是 | 子树根节点实体名称 |
处理器实现:
get_subtree: async (ctx, args) => {
// 处理器定义(截断显示)
return formatToolResponse(await ctx.hierarchyManager.getSubtree(entityName));
}
使用流程
典型操作流程
graph TD
A[开始] --> B[创建或获取实体]
B --> C{是否需要设置父子关系}
C -->|是| D[调用 set_entity_parent]
C -->|否| E[直接进行层级查询]
D --> F[关联层级索引]
F --> G[查询层级关系]
E --> G
G --> H{查询类型}
H -->|直接子节点| I[get_children]
H -->|父节点| J[get_parent]
H -->|所有祖先| K[get_ancestors]
H -->|所有后代| L[get_descendants]
H -->|完整子树| M[get_subtree]
I --> N[返回结果]
J --> N
K --> N
L --> N
M --> N
N --> O[结束]使用示例
1. 构建组织层级结构:
// 设置公司 -> 部门 -> 团队的层级关系
{
"entityName": "后端团队",
"parentName": "技术部"
}
{
"entityName": "技术部",
"parentName": "XX公司"
}
2. 查询实体信息:
// 获取某实体的所有祖先
{
"entityName": "后端团队"
}
3. 遍历子树:
// 获取完整子树结构
{
"entityName": "XX公司"
}
层级遍历算法
树形结构示意
┌─────────────┐
│ 根节点 │
│ (Root) │
└──────┬──────┘
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 节点A │ │ 节点B │ │ 节点C │
│ (Child 1) │ │ (Child 2) │ │ (Child 3) │
└──────┬─────┘ └──────┬─────┘ └─────────────┘
│
▼
┌─────────────┐
│ 节点D │
│ (Grandchild)│
└─────────────┘
各方法返回范围
| 方法 | 返回内容 | 说明 |
|---|---|---|
get_parent | [A] | 仅返回直接父节点 |
get_children | [A, B, C] | 仅返回直接子节点 |
get_ancestors | [A] → [Root] | 从父到根的完整路径 |
get_descendants | [D] → [D] | 所有后代节点的扁平列表 |
get_subtree | 完整树结构 | 包含根节点及其所有后代 |
存储机制
层级关系数据存储于项目的存储文件中,支持两种存储格式:
| 存储类型 | 文件路径 | 说明 |
|---|---|---|
| JSONL | memory.jsonl | 默认存储格式 |
| SQLite | memory.db | 设置 MEMORY_STORAGE_TYPE=sqlite 启用 |
层级数据以实体属性的形式存储,由 memoryjs 库的底层存储系统管理。资料来源:CLAUDE.md:1
错误处理
工具处理器使用 validateWithSchema 进行参数校验:
| 错误类型 | 校验规则 | 处理方式 |
|---|---|---|
| 空字符串 | z.string().min(1) | 返回验证错误信息 |
| 类型错误 | Zod schema | 返回类型不匹配提示 |
| 层级不存在 | 运行时检查 | 返回空结果或 not found 提示 |
最佳实践
1. 避免循环引用
设置父子关系时,应避免创建环形结构:
graph LR
A --> B
B --> C
C --> A系统不会自动检测循环引用,创建时请确保层级结构的有效性。
2. 合理设置层级深度
过深的层级会增加查询复杂度,建议:
- 保持层级深度在合理范围内(建议 ≤ 10 层)
- 对于过深的结构,考虑拆分为多个独立树
3. 批量操作优化
如需创建多个层级关系,建议按拓扑顺序执行,确保父节点先于子节点存在。
相关文档
| 文档 | 路径 | 说明 |
|---|---|---|
| 工具定义 | src/server/toolDefinitions.ts | 层级工具的 MCP schema 定义 |
| 工具处理器 | src/server/toolHandlers.ts | 层级工具的业务逻辑实现 |
| 核心架构 | CLAUDE.md | 项目整体架构说明 |
更新日志
| 版本 | 更新内容 |
|---|---|
| v12.2.0 | 基础层级管理工具集(6个) |
| v12.3.0 | 扩展层级操作,新增子树查询能力 |
资料来源:[src/server/toolHandlers.ts:1]()
搜索能力
memory-mcp 的搜索能力是该知识图谱系统的核心功能之一,通过多层架构提供从基础关键词匹配到高级语义理解的全面搜索能力。系统支持超过 20 种搜索工具,涵盖基础搜索、智能搜索、语义搜索三大类别,并提供保存搜索和定时搜索等高级功能。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
memory-mcp 的搜索能力是该知识图谱系统的核心功能之一,通过多层架构提供从基础关键词匹配到高级语义理解的全面搜索能力。系统支持超过 20 种搜索工具,涵盖基础搜索、智能搜索、语义搜索三大类别,并提供保存搜索和定时搜索等高级功能。
搜索功能由 ManagerContext 中的多个管理器协同工作实现,包括 SearchManager(基础和高级搜索)、semanticSearch(语义向量搜索)和 rankedSearch(TF-IDF 排名搜索)。
搜索架构
分层搜索模型
graph TD
A[用户查询] --> B[搜索路由层]
B --> C{查询类型判断}
C -->|基础关键词| D[SearchManager<br/>基础搜索]
C -->|TF-IDF排名| E[rankedSearch<br/>排名搜索]
C -->|向量相似度| F[semanticSearch<br/>语义搜索]
C -->|时间范围| G[temporalSearch<br/>时序搜索]
C -->|复合条件| H[IntelligentSearch<br/>智能搜索]
D --> I[GraphStorage<br/>数据存储]
E --> I
F --> I
G --> I
H --> I
I --> J[结果聚合]
J --> K[排序与去重]
K --> L[返回结果]核心组件
| 组件名称 | 类型 | 功能描述 |
|---|---|---|
SearchManager | 管理器 | 基础搜索、布尔搜索、模糊搜索的入口 |
semanticSearch | 访问器 | 基于嵌入向量的语义相似度搜索 |
rankedSearch | 访问器 | TF-IDF 算法的排名搜索 |
SearchByTimeHandler | 处理器 | 基于时间范围的时序搜索 |
GraphStorage | 存储层 | 底层图数据库查询接口 |
搜索工具分类
1. 基础搜索(7 个工具)
基础搜索提供最常用的关键词和模式匹配功能。
| 工具名称 | 功能 | 关键参数 |
|---|---|---|
search_entities | 基础实体搜索 | query, limit |
search_by_time | 时间范围搜索 | query, field, since, until |
search_by_relation | 关系路径搜索 | entity, relationType, depth |
search_by_tag | 标签关联搜索 | tags, matchAll |
fuzzy_search | 模糊匹配搜索 | query, threshold |
auto_search | 自动选择最佳搜索 | query |
boolean_search | 布尔逻辑搜索 | query, operators |
#### 时间范围搜索
search_by_time 工具支持时序查询,允许用户限定搜索结果的时间范围:
// toolHandlers.ts 中的实现
search_by_time: async (ctx, args) => {
const query = validateWithSchema(args.query, z.string().min(1), 'Invalid query');
const options: { field: string; since?: Date; until?: Date } = {};
// 支持 since/until 参数进行时间过滤
}
资料来源:src/server/toolHandlers.ts:1-50
#### 模糊搜索
模糊搜索通过编辑距离算法容忍拼写错误,支持配置相似度阈值:
threshold:相似度阈值(0-1 之间)- 自动纠错和建议
2. 智能搜索(3 个工具)
智能搜索提供更高级的查询理解和结果优化能力。
| 工具名称 | 功能描述 |
|---|---|
intelligent_search | 多层混合搜索,结合多种搜索策略 |
analyze_query | 查询分析,理解用户意图 |
reflected_search | 基于反思的搜索优化 |
graph LR
A[原始查询] --> B[analyze_query<br/>查询分析]
B --> C[查询重写]
C --> D[intelligent_search<br/>智能搜索]
D --> E[reflected_search<br/>反思优化]
E --> F[最终结果]3. 语义搜索(3 个工具)
语义搜索基于嵌入向量(embeddings)实现语义级别的相似度匹配。
| 工具名称 | 功能描述 | 嵌入提供者 |
|---|---|---|
semantic_search | 向量相似度搜索 | OpenAI / 本地模型 |
hybrid_search | 混合向量+关键词搜索 | 两者结合 |
semantic_filter | 基于语义的过滤 | 两者结合 |
#### 环境配置
# 环境变量配置
MEMORY_EMBEDDING_PROVIDER=openai|local|none # 嵌入提供者
MEMORY_OPENAI_API_KEY=sk-xxx # OpenAI API 密钥
MEMORY_EMBEDDING_MODEL=text-embedding-3-small # OpenAI 模型
# 本地默认: Xenova/all-MiniLM-L6-v2
MEMORY_AUTO_INDEX_EMBEDDINGS=false # 是否自动索引
资料来源:CLAUDE.md:95-100
4. 保存搜索(5 个工具)
保存搜索允许用户存储和重用常用查询。
| 工具名称 | 功能描述 |
|---|---|
save_search | 保存当前搜索条件 |
list_saved_searches | 列出所有保存的搜索 |
execute_saved_search | 执行已保存的搜索 |
update_saved_search | 更新保存的搜索 |
delete_saved_search | 删除保存的搜索 |
保存的搜索存储在 memory-saved-searches.jsonl 文件中。
搜索 API
核心参数
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
query | string | 是 | 搜索查询字符串 |
limit | number | 否 | 返回结果数量限制(默认 50) |
offset | number | 否 | 结果偏移量 |
since | string | 否 | ISO 8601 格式起始时间 |
until | string | 否 | ISO 8601 格式结束时间 |
搜索工具定义示例
// toolDefinitions.ts 中的时间搜索定义
{
name: 'search_by_time',
description: 'Search for entities by time range and query string',
inputSchema: {
type: 'object',
properties: {
query: { type: 'string', description: 'Search query' },
field: { type: 'string', description: 'Time field to search' },
since: { type: 'string', description: 'Start time (ISO 8601)' },
until: { type: 'string', description: 'End time (ISO 8601)' },
},
required: ['query'],
},
}
资料来源:src/server/toolDefinitions.ts:200-220
搜索流程
完整搜索流程
sequenceDiagram
participant U as 用户
participant H as ToolHandler
participant SM as SearchManager
participant SS as SemanticSearch
participant RS as RankedSearch
participant G as GraphStorage
U->>H: search_entities(query)
H->>SM: 路由到基础搜索
alt 语义搜索模式
SM->>SS: 执行向量搜索
SS->>G: 查询嵌入向量
G-->>SS: 相似度结果
SS-->>SM: 语义匹配结果
end
alt 排名搜索模式
SM->>RS: 执行TF-IDF排名
RS->>G: 词频统计
G-->>RS: 排名结果
RS-->>SM: 排名匹配结果
end
SM->>SM: 结果聚合去重
SM-->>H: 排序后结果
H-->>U: 返回最终结果查询验证流程
所有搜索请求都经过以下验证流程:
- 参数校验:使用
validateWithSchema验证输入参数 - 类型检查:确保数据类型符合 schema 定义
- 边界处理:限制
limit在 1-1000 范围内 - 错误处理:返回格式化的错误信息
// toolHandlers.ts 中的查询验证
const limit = args.limit !== undefined
? validateWithSchema(args.limit, z.number().int().min(1).max(1000), 'Invalid limit')
: 50;
存储与索引
存储位置
搜索索引和数据文件位于项目根目录:
| 文件类型 | 文件路径 | 描述 |
|---|---|---|
| 主数据 | memory.jsonl | 实体和关系数据 |
| 保存搜索 | memory-saved-searches.jsonl | 预设查询 |
| 标签别名 | memory-tag-aliases.jsonl | 标签同义词 |
| SQLite | memory.db | 结构化查询(需配置) |
索引策略
| 索引类型 | 触发条件 | 配置项 |
|---|---|---|
| 全文索引 | 实体创建时 | MEMORY_AUTO_INDEX_EMBEDDINGS |
| 向量索引 | 嵌入生成后 | 自动 |
| 标签索引 | 标签赋值时 | 自动 |
| 时间索引 | 时间字段更新时 | 自动 |
最佳实践
1. 搜索策略选择
graph TD
A[开始搜索] --> B{知道确切实体名?}
B -->|是| C{需要语义匹配?}
B -->|否| D{需要模糊匹配?}
C -->|是| E[semantic_search<br/>语义搜索]
C -->|否| F{需要排名?}
D -->|是| G[fuzzy_search<br/>模糊搜索]
D -->|否| H{需要布尔逻辑?}
F -->|是| I[ranked_search<br/>排名搜索]
F -->|否| J[search_entities<br/>基础搜索]
H -->|是| K[boolean_search<br/>布尔搜索]
H -->|否| L[auto_search<br/>自动选择]2. 性能优化建议
- 批量搜索:使用
list_saved_searches预加载常用查询 - 时间过滤:在有明确时间范围时使用
search_by_time - 限制结果:合理设置
limit参数避免返回过多结果 - 选择存储:大数据量场景使用 SQLite 存储
3. 常见查询模式
| 场景 | 推荐工具 | 示例 |
|---|---|---|
| 快速查找 | auto_search | 未知最佳搜索方式时 |
| 精确匹配 | search_entities | 知道实体名称 |
| 容忍错别字 | fuzzy_search | 用户输入可能有误 |
| 学术研究 | semantic_search | 概念相似但表述不同 |
| 时间追溯 | search_by_time | 查看某时间段的记忆 |
总结
memory-mcp 的搜索能力通过分层架构实现了从基础到高级的完整搜索覆盖。基础搜索满足日常查询需求,智能搜索提供查询理解和优化,语义搜索实现深度的语义理解能力。开发者应根据具体使用场景选择合适的搜索工具,以获得最佳的用户体验和性能表现。
资料来源:[src/server/toolHandlers.ts:1-50]()
高级功能
memory-mcp 是一个基于 Model Context Protocol 的知识图谱管理工具,提供超过 213 个工具,分布在 58 个类别中。Phase 15 和 Phase 16 引入的大量高级功能使该系统具备企业级特性,包括双时态有效性、并发控制、访问控制、程序化记忆、因果推理等能力。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
1. 版本演进与功能概览
memory-mcp 的高级功能通过两个主要版本迭代实现:
| 版本 | 版本号 | 新增工具数 | 核心功能 |
|---|---|---|---|
| Phase 15 | v12.2.0 | 23 | 双时态有效性、OCC、RBAC、程序化记忆、主动检索、因果推理、世界模型 |
| Phase 16 | v12.3.0 | 53 | do_not_remember 排除、决策理由与 ADR 双写、结构化项目上下文、启发式指南、ToolCallObserver 管道、观察去重、拼写纠正 |
资料来源:CLAUDE.md:3-10
2. 记忆衰减与优先级管理
系统提供基于时间的记忆重要性衰减机制,用于自动管理长期记忆的价值。
2.1 衰减工具
| 工具名称 | 功能描述 |
|---|---|
run_decay_cycle | 对所有 agent 记忆执行单次时间衰减,返回衰减和遗忘的记忆数量 |
get_decayed_memories | 列出重要性降至阈值以下的记忆(不同于 get_stale_entities 使用新鲜度时间戳) |
forget_weak_memories | 批量删除低于衰减阈值的记忆(不同于 forget_memory 的内容匹配或 archive_entities 的条件移动) |
资料来源:src/server/toolDefinitions.ts:衰减工具定义
2.2 衰减流程
graph TD
A[运行 run_decay_cycle] --> B{计算记忆重要性}
B --> C{是否低于阈值?}
C -->|是| D[标记为弱记忆]
C -->|否| E[保留记忆]
D --> F[get_decayed_memories 查询]
F --> G{forget_weak_memories}
G -->|dryRun=true| H[预览待删除列表]
G -->|dryRun=false| I[批量删除]2.3 阈值配置
threshold:重要性阈值,低于此值将被遗忘(默认 0.1)maxCount:单次操作最大遗忘数量dryRun:预览模式,不执行实际删除
资料来源:src/server/toolDefinitions.ts:衰减工具参数
3. 访问控制与治理
Phase 15 引入的 RBAC 功能提供细粒度的访问控制。
3.1 治理策略
| 操作 | 说明 |
|---|---|
set_governance_policy | 设置全局治理策略,控制创建、更新、删除权限 |
audit_query | 查询审计日志,支持按操作类型、agentId、实体名称、时间范围过滤 |
资料来源:src/server/toolHandlers.ts:治理处理器
3.2 审计过滤器
interface AuditFilter {
operation?: 'create' | 'update' | 'delete' | 'merge' | 'archive';
agentId?: string;
entityName?: string;
fromTime?: string; // 注意:使用 fromTime/toTime 而非 since/until
toTime?: string;
}
3.3 治理架构
graph TD
A[MCP Client] --> B[Tool Call]
B --> C{Governance Policy Check}
C -->|canCreate| D[允许创建]
C -->|canUpdate| E[允许更新]
C -->|canDelete| F[允许删除]
C -->|禁止| G[返回权限错误]
D --> H[写入审计日志]
E --> H
F --> H
H --> I[Audit Log]资料来源:src/server/toolHandlers.ts:audit_query 实现
4. 工件管理系统
Artifacts 是系统用于存储工具输出、代码片段、API 响应等内容的实体。
4.1 工件类型
| 类型标识 | 用途 |
|---|---|
tool_output | 工具执行输出 |
code_snippet | 代码片段 |
api_response | API 响应数据 |
search_result | 搜索结果 |
file_content | 文件内容 |
user_input | 用户输入 |
资料来源:src/server/toolDefinitions.ts:工件类型定义
4.2 工件管理工具
| 工具 | 功能 |
|---|---|
create_artifact | 创建带稳定自动生成 ref 的工件实体 |
get_artifact | 通过 ref 或实体名称检索工件 |
list_artifacts | 列出工件,支持按 toolName、artifactType、sessionId 过滤 |
4.3 工件创建参数
{
content: string; // 必填:存储为实体观察的内容
toolName: string; // 必填:生成此工件的来源工具名
artifactType: ArtifactType; // 必填:工件分类
description?: string; // 可选:人类可读描述
sessionId?: string; // 可选:会话上下文,用于分组相关工件
}
资料来源:src/server/toolHandlers.ts:工件处理器
5. 上下文压缩工具
compress-for-context 工具用于将大型文件压缩至 LLM 上下文窗口可接受的大小。
5.1 压缩级别
| 级别 | 说明 |
|---|---|
light | 最小改动,保持可读性 |
medium | 平衡大小与可读性(默认) |
aggressive | 最大压缩,可能降低可读性 |
资料来源:tools/compress-for-context/compress-for-context.ts:压缩级别定义
5.2 支持格式
- JSON、YAML、Markdown、CSV、TSV
- Text、Log、TypeScript、JavaScript
- XML、HTML
5.3 使用示例
# 单文件压缩
node compress-for-context.js data.json
node compress-for-context.js README.md -l aggressive
# 批量压缩
node compress-for-context.js -b -p "*.json" ./src
node compress-for-context.js -b -r -p "*.md" ./docs
# 解压还原
node compress-for-context.js -d input.compact
5.4 压缩算法
工具使用类 CTON(Concise Textual Notation)风格的压缩:
- 移除多余空白字符
- 缩写键名
- 提取图例(Legend)映射完整名称
- 批量处理时按缩写长度降序替换以避免冲突
资料来源:tools/compress-for-context/compress-for-context.ts:压缩实现
6. 文件分块工具
chunking-for-files 工具将大型文件分割为可管理的块。
6.1 命令
| 命令 | 功能 |
|---|---|
split | 将文件分割为多个块 |
merge | 合并块文件还原原文件 |
status | 显示分块状态 |
6.2 分块元数据
interface Manifest {
version: '1.1.0';
sourceFile: string; // 原始文件路径
sourceHash: string; // 原始文件哈希
createdAt: string; // ISO 时间戳
fileType: string; // 文件类型
splitLevel: string; // 分割级别
chunks: Chunk[]; // 块信息数组
}
interface Chunk {
index: number;
filename: string;
title: string;
startLine: number;
endLine: number;
lineCount: number;
hash: string;
modified: boolean;
}
资料来源:tools/chunking-for-files/chunking-for-files.ts:分块实现
6.3 分块流程
graph TD
A[输入文件] --> B[解析文件结构]
B --> C{文件类型}
C -->|Markdown| D[按标题级别分块]
C -->|TypeScript| E[按类型声明/函数分块]
C -->|其他| F[按行数/语义分块]
D --> G[生成 Manifest]
E --> G
F --> G
G --> H[写入块文件]
H --> I[生成 manifest.json]7. Phase 16 新增特性 (v12.3.0)
7.1 功能分类
| 类别 | 工具数 | 描述 |
|---|---|---|
do_not_remember 排除 | 5 | 主动排除特定记忆被检索 |
| 决策理由与 ADR 双写 | 10 | 同时生成决策理由和架构决策记录 |
| 结构化项目上下文 | 12 | 提取和管理项目结构化元数据 |
| 启发式指南 | 10 | 基于规则的推荐和指导 |
| ToolCallObserver 管道 | 11 | 工具调用观察和监控 |
| 观察去重 | 2 | 自动去除重复观察 |
| 拼写纠正 | 3 | 搜索和输入的拼写纠正 |
资料来源:CLAUDE.md:6-10
7.2 ToolCallObserver 管道
该管道允许观察和记录工具调用模式,支持:
- 工具使用频率统计
- 调用链追踪
- 异常模式检测
- 性能监控
7.3 观察去重机制
自动检测并合并语义相同的观察,避免知识图谱中的冗余信息。
7.4 拼写纠正
支持三种语言的拼写纠正功能,提升搜索准确性:
- 搜索查询的拼写纠正
- 实体名称的拼写纠正
- 观察内容的拼写纠正
8. 依赖图生成工具
create-dependency-graph 工具扫描代码库并生成依赖文档。
8.1 功能特性
- 扫描
src/下所有 TypeScript 文件 - 解析导入和导出
- 检测循环依赖
- 生成统计信息
- 输出 Markdown 和 JSON 两种格式
8.2 生成的文档结构
docs/architecture/
├── DEPENDENCY_GRAPH.md # 人类可读文档
└── dependency-graph.json # 机器可读数据
8.3 输出内容
| 内容 | 说明 |
|---|---|
| 外部依赖 | npm 包依赖 |
| Node.js 内置依赖 | fs, path 等 |
| 内部依赖 | 相对路径导入 |
| 循环依赖分析 | 运行时和类型级别 |
| 导出统计 | 类、接口、函数、常量数量 |
资料来源:tools/create-dependency-graph/README.md:功能说明
9. 存储与迁移
9.1 存储格式
| 格式 | 文件位置 | 说明 |
|---|---|---|
| JSONL | memory.jsonl | 项目根目录 |
| SQLite | memory.db | 设置 MEMORY_STORAGE_TYPE=sqlite |
9.2 迁移工具
migrate-from-jsonl-to-sqlite 工具支持两种格式的双向转换:
# 基本用法
migrate-from-jsonl-to-sqlite --from <source> --to <target>
# 详细输出
migrate-from-jsonl-to-sqlite --from source.jsonl --to target.db --verbose
资料来源:tools/migrate-from-jsonl-to-sqlite/migrate-from-jsonl-to-sqlite.ts:迁移实现
10. 环境变量配置
| 变量 | 描述 | 默认值 |
|---|---|---|
MEMORY_FILE_PATH | 存储文件路径 | memory.jsonl |
MEMORY_STORAGE_TYPE | 存储类型 | jsonl |
MEMORY_EMBEDDING_PROVIDER | 向量化提供者 | none |
MEMORY_OPENAI_API_KEY | OpenAI API 密钥 | — |
MEMORY_EMBEDDING_MODEL | 向量化模型 | text-embedding-3-small |
MEMORY_AUTO_INDEX_EMBEDDINGS | 自动索引 | false |
资料来源:CLAUDE.md:环境变量配置
11. 贡献与扩展指南
11.1 添加新工具流程
graph TD
A[定义工具架构] --> B[添加 schema 到 toolDefinitions.ts]
B --> C[添加处理器到 toolHandlers.ts]
C --> D[验证参数和错误处理]
D --> E[添加端到端测试]
E --> F[更新文档]11.2 代码规范
- 遵循 TypeScript 最佳实践
- 使用有意义的变量名
- 公共方法添加 JSDoc 注释
- 保持函数小而专注
- 一致缩进(2 空格)
资料来源:CONTRIBUTING.md:代码风格指南
资料来源:[CLAUDE.md:3-10]()
工具参考手册
本文档是 Memory MCP 项目的完整工具参考手册,详细介绍所有 MCP(Model Context Protocol)工具的定义、参数、返回值以及使用方法。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
继续阅读本节完整说明和来源证据。
概述
Memory MCP 提供了一套基于 Model Context Protocol 的工具集,用于与知识图谱进行交互。该项目包含 213 个工具,分布在 58 个分类中,涵盖了知识图谱的创建、查询、更新、压缩、导入导出等完整生命周期管理。
工具系统架构
工具系统采用分层架构设计:
graph TD
A[MCP 客户端] --> B[MCPServer]
B --> C[toolHandlers.ts]
C --> D[memoryjs ManagerContext]
D --> E[EntityManager]
D --> F[RelationManager]
D --> G[ObservationManager]
D --> H[SearchManager]
D --> I[TagManager]
D --> J[其他管理器]
J --> K[SQLiteStorage]
J --> L[JSONLStorage]核心组件包括:
| 组件 | 文件路径 | 职责 |
|---|---|---|
| 工具定义 | src/server/toolDefinitions.ts | 定义所有工具的 JSON Schema |
| 工具处理器 | src/server/toolHandlers.ts | 实现工具的业务逻辑 |
| 管理器上下文 | @danielsimonjr/memoryjs | 提供底层数据操作接口 |
资料来源:CLAUDE.md:1-10
工具分类总览
| 分类 | 工具数量 | 核心功能 |
|---|---|---|
| 实体 (Entity) | 4 | 图谱节点的 CRUD 操作 |
| 关系 (Relation) | 2 | 实体间的有向边管理 |
| 观察 (Observation) | 3 | 附加到实体的知识事实 |
| 搜索 (Search) | 7 | 基础、排名、布尔、模糊搜索 |
| 智能搜索 (Intelligent Search) | 3 | 混合多层、查询分析、反思搜索 |
| 语义搜索 (Semantic Search) | 3 | OpenAI 或本地模型的嵌入相似度 |
| 保存的搜索 (Saved Searches) | 5 | 存储和重用频繁查询 |
| 标签管理 (Tag Management) | 6 | 标签及其重要性评分 |
| 标签别名 (Tag Aliases) | 5 | 标签同义词管理 |
| 层级结构 (Hierarchy) | 9 | 父子树结构和子树遍历 |
| 图算法 (Graph Algorithms) | 4 | BFS/DFS 路径发现、中心性、连通分量 |
| 分析 (Analytics) | 2 | 图谱统计和完整性验证 |
| 压缩 (Compression) | 4 | 重复检测、合并、自动压缩、归档 |
| 导入/导出 (Import/Export) | 2 | 多种格式的数据交换 |
资料来源:CLAUDE.md:18-33
核心实体工具
创建实体 (create_entity)
在知识图谱中创建新的实体节点。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| name | string | 是 | 实体名称 |
| entityType | string | 否 | 实体类型,用于分类 |
| observations | string[] | 否 | 初始观察/知识列表 |
| tags | string[] | 否 | 关联标签 |
| importance | number | 否 | 重要性分数 (0-1) |
返回值: 创建成功的实体对象,包含自动生成的唯一引用 ID
获取实体 (get_entity)
通过名称或引用 ID 检索实体信息。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| ref | string | 是 | 实体引用或名称 |
更新实体 (update_entity)
修改现有实体的属性。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| ref | string | 是 | 实体引用 |
| name | string | 否 | 新名称 |
| entityType | string | 否 | 新类型 |
| tags | string[] | 否 | 新的标签列表 |
删除实体 (delete_entity)
从知识图谱中移除实体及其关联的关系和观察。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| ref | string | 是 | 要删除的实体引用 |
关系工具
创建关系 (create_relation)
在两个实体之间创建有向关系边。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| from | string | 是 | 源实体引用 |
| to | string | 是 | 目标实体引用 |
| relationType | string | 是 | 关系类型(如 "depends_on"、"implements") |
| bidirectional | boolean | 否 | 是否双向关系(默认 false) |
获取关系 (get_relations)
查询满足特定条件的实体关系。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| from | string | 否 | 源实体过滤 |
| to | string | 否 | 目标实体过滤 |
| relationType | string | 否 | 关系类型过滤 |
搜索工具
基础搜索 (search_entities)
在知识图谱中搜索实体。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| query | string | 是 | 搜索查询词 |
| limit | number | 否 | 结果上限(默认 10) |
| entityType | string | 否 | 按类型过滤 |
排名搜索 (search_entities_ranked)
基于 TF-IDF 算法的加权排名搜索。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| query | string | 是 | 搜索查询 |
| limit | number | 否 | 结果上限 |
| boostRecent | boolean | 否 | 是否提升近期结果 |
模糊搜索 (search_entities_fuzzy)
支持拼写容错的模糊匹配搜索。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| query | string | 是 | 可能包含拼写错误的查询 |
| threshold | number | 否 | 匹配阈值(0-1,默认 0.6) |
布尔搜索 (search_entities_boolean)
支持 AND、OR、NOT 运算符的布尔搜索。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| query | string | 是 | 布尔表达式(如 "AI AND (machine OR deep)") |
语义搜索 (semantic_search)
基于向量嵌入的语义相似度搜索。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| query | string | 是 | 自然语言查询 |
| limit | number | 否 | 返回结果数 |
| provider | string | 否 | 嵌入提供者(openai/local/none) |
资料来源:CLAUDE.md:26-27
标签管理工具
添加标签 (add_tags)
为实体添加一个或多个标签。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| ref | string | 是 | 实体引用 |
| tags | string[] | 是 | 要添加的标签列表 |
移除标签 (remove_tags)
从实体移除指定标签。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| ref | string | 是 | 实体引用 |
| tags | string[] | 是 | 要移除的标签列表 |
获取标签 (get_tags)
获取实体的所有标签。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| ref | string | 是 | 实体引用 |
列出所有标签 (list_tags)
返回知识图谱中的所有标签及其使用统计。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| limit | number | 否 | 返回数量上限 |
标签别名管理
用于管理标签的同义词和别名关系。
| 工具名称 | 功能描述 |
|---|---|
| create_tag_alias | 创建标签别名映射 |
| get_tag_alias | 获取标签的别名 |
| list_tag_aliases | 列出所有标签别名 |
| delete_tag_alias | 删除标签别名 |
| resolve_tag_alias | 将别名解析为规范标签 |
图算法工具
路径发现 (find_path)
使用 BFS 或 DFS 算法查找两个实体之间的路径。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| from | string | 是 | 起始实体 |
| to | string | 是 | 目标实体 |
| algorithm | string | 否 | BFS 或 DFS(默认 BFS) |
| maxDepth | number | 否 | 最大深度限制 |
连通分量 (get_connected_components)
识别知识图谱中的连通分量。
中心性分析 (calculate_centrality)
计算实体的度中心性或介数中心性。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| entityRef | string | 是 | 实体引用 |
| type | string | 否 | 中心性类型(degree/betweenness) |
导入导出工具
导出图谱 (export_graph)
将知识图谱导出为多种格式。
支持的格式:
| 格式 | 描述 |
|---|---|
| json | 标准 JSON 格式 |
| jsonl | JSON Lines 格式 |
| xml | XML 格式 |
| markdown | Markdown 格式 |
| csv | CSV 表格格式 |
| ttl | Turtle RDF 格式 |
| json-ld | JSON-LD 格式 |
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| format | string | 是 | 输出格式 |
| includeObservations | boolean | 否 | 是否包含观察数据 |
| redactPii | boolean | 否 | 是否进行 PII 脱敏 |
资料来源:CLAUDE.md:32
导入图谱 (import_graph)
从外部文件导入知识图谱数据。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| source | string | 是 | 导入源(路径或内容) |
| format | string | 是 | 数据格式 |
| mergeStrategy | string | 否 | 合并策略(replace/merge/skip) |
压缩与归档工具
检测重复 (find_duplicates)
识别知识图谱中的重复或高度相似的实体。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| threshold | number | 否 | 相似度阈值(默认 0.85) |
合并实体 (merge_entities)
将多个相似实体合并为一个。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| refs | string[] | 是 | 要合并的实体引用列表 |
| keepRef | string | 否 | 保留的主实体引用 |
运行压缩 (run_compression)
自动压缩知识图谱,移除冗余数据。
归档旧数据 (archive_old_entities)
将长期未访问的实体移至归档存储。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| daysOld | number | 否 | 天数阈值(默认 90) |
| archiveType | string | 否 | 归档类型标签 |
工件管理工具
用于存储和管理工具输出、代码片段、API 响应等工件。
创建工件 (create_artifact)
创建工件实体并获取稳定的自动生成引用。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| content | string | 是 | 工件内容 |
| toolName | string | 是 | 生成工件的源工具名称 |
| artifactType | string | 是 | 工件类型枚举 |
| description | string | 否 | 人类可读描述 |
| sessionId | string | 否 | 会话上下文标识 |
artifactType 枚举值:
| 类型 | 描述 |
|---|---|
| tool_output | 工具执行输出 |
| code_snippet | 代码片段 |
| api_response | API 响应内容 |
| search_result | 搜索结果 |
| file_content | 文件内容 |
| user_input | 用户输入 |
获取工件 (get_artifact)
通过引用或实体名称检索工件。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| ref | string | 是 | 工件引用或实体名称 |
列出工件 (list_artifacts)
列出满足过滤条件的工件。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| toolName | string | 否 | 按工具名称过滤 |
| artifactType | string | 否 | 按类型过滤 |
| since | string | 否 | ISO 8601 时间过滤 |
治理与审计工具
设置治理策略 (set_governance_policy)
配置实体的创建、更新、删除权限策略。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| entityType | string | 否 | 应用策略的实体类型 |
| canCreate | boolean | 是 | 是否允许创建 |
| canUpdate | boolean | 是 | 是否允许更新 |
| canDelete | boolean | 是 | 是否允许删除 |
审计查询 (audit_query)
查询实体的操作历史日志。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| operation | string | 否 | 操作类型(create/update/delete/merge/archive) |
| agentId | string | 否 | 代理 ID 过滤 |
| entityName | string | 否 | 实体名称过滤 |
| since | string | 否 | 开始时间 |
| until | string | 否 | 结束时间 |
| limit | number | 否 | 结果上限(默认 50) |
衰减与显著性工具
运行衰减周期 (run_decay_cycle)
执行基于时间的显著性衰减计算。
获取衰减记忆 (get_decayed_memories)
列出重要性已降至阈值以下的记忆。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| threshold | number | 否 | 重要性阈值(默认 0.1) |
遗忘弱记忆 (forget_weak_memories)
批量删除重要性低于衰减阈值的记忆。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| threshold | number | 是 | 重要性阈值 |
| maxCount | number | 否 | 最大遗忘数量 |
| dryRun | boolean | 否 | 是否为试运行模式 |
时间查询工具
按时间搜索 (search_by_time)
基于时间范围查询知识图谱数据。
输入参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| query | string | 是 | 查询内容 |
| startTime | string | 否 | 开始时间 |
| endTime | string | 否 | 结束时间 |
| field | string | 否 | 查询字段(created/updated/observed) |
独立工具集
项目还包含一组独立的命令行工具,位于 tools/ 目录下。
文件分块工具 (chunking-for-files)
用于将大型文件分割为适合编辑的块,或合并已分割的文件块。
# 分割文件
chunker split <file> [options]
# 合并块
chunker merge <manifest.json> [options]
# 查看状态
chunker status <manifest.json>
分割选项:
| 选项 | 描述 |
|---|---|
| -o, --output | 输出目录 |
| -l, --max-lines | 每块最大行数(默认 500) |
| --by-structure | 按代码结构分割(类、函数等) |
| --dry-run | 预览分割结果 |
资料来源:tools/chunking-for-files/chunking-for-files.ts:1-50
上下文压缩工具 (compress-for-context)
使用 CTON(Context-optimized Notation)压缩格式压缩文件以适应 LLM 上下文窗口。
# 单文件压缩
node compress-for-context.js data.json
# 批量压缩
node compress-for-context.js -b -p "*.json" ./src
# 解压缩
node compress-for-context.js -d file.compact.json
压缩级别:
| 级别 | 描述 |
|---|---|
| light | 最小化改动,保留可读性 |
| medium | 平衡压缩率和可读性(默认) |
| aggressive | 最大压缩,可能降低可读性 |
资料来源:tools/compress-for-context/compress-for-context.ts:1-40
存储迁移工具 (migrate-from-jsonl-to-sqlite)
在 JSONL 和 SQLite 存储格式之间迁移数据。
# 从 JSONL 迁移到 SQLite
migrate-from-jsonl-to-sqlite --from memory.jsonl --to memory.db
# 从 SQLite 迁移到 JSONL
migrate-from-jsonl-to-sqlite --from memory.db --to memory.jsonl
# 详细输出模式
migrate-from-jsonl-to-sqlite -f source.jsonl -t target.db -v
资料来源:tools/migrate-from-jsonl-to-sqlite/migrate-from-jsonl-to-sqlite.ts:1-30
依赖图生成工具 (create-dependency-graph)
分析 TypeScript 项目并生成依赖关系文档。
# 通过 npm 脚本运行(推荐)
npm run docs:deps
# 直接使用 tsx 运行
npx tsx tools/create-dependency-graph.ts
输出文件:
docs/architecture/DEPENDENCY_GRAPH.md- Markdown 格式文档docs/architecture/dependency-graph.json- JSON 数据结构
生成内容包括:
- 外部依赖(npm 包)
- Node.js 内置依赖
- 内部依赖(相对导入)
- 导出的类、接口、函数、常量
- 循环依赖分析
- Mermaid 可视化图表
- 统计摘要
资料来源:tools/create-dependency-graph/README.md:1-50
环境变量配置
工具行为可通过以下环境变量配置:
| 变量 | 描述 | 默认值 |
|---|---|---|
MEMORY_FILE_PATH | 存储文件路径 | memory.jsonl(当前目录) |
MEMORY_STORAGE_TYPE | 存储类型 | jsonl |
MEMORY_EMBEDDING_PROVIDER | 嵌入提供者 | none |
MEMORY_OPENAI_API_KEY | OpenAI API 密钥 | — |
MEMORY_EMBEDDING_MODEL | 嵌入模型名称 | text-embedding-3-small / Xenova/all-MiniLM-L6-v2 |
MEMORY_AUTO_INDEX_EMBEDDINGS | 自动索引嵌入 | false |
资料来源:CLAUDE.md:45-52
添加工具流程
在项目中添加新的 MCP 工具需要以下步骤:
graph LR
A[定义工具 Schema] --> B[实现工具处理器]
B --> C[添加 E2E 测试]
C --> D[更新文档]
A1[toolDefinitions.ts] --> |同一分类区域| A
B1[toolHandlers.ts] --> |handler 逻辑| B步骤 1:定义工具 Schema
在 src/server/toolDefinitions.ts 的适当分类区域添加 JSON Schema 定义:
{
name: 'tool_name',
description: '工具功能描述',
inputSchema: {
type: 'object',
properties: {
paramName: { type: 'string', description: '参数描述' }
},
required: ['paramName'],
additionalProperties: false,
},
},
步骤 2:实现工具处理器
在 src/server/toolHandlers.ts 中添加工具处理器:
tool_name: async (ctx, args) => {
// 1. 验证参数
const param = validateWithSchema(args.paramName, z.string(), 'Invalid param');
// 2. 调用管理器方法
const result = await getManager(ctx).method(param);
// 3. 返回格式化响应
return formatToolResponse(result);
},
步骤 3:添加测试
在 tests/e2e/tools/ 目录下添加端到端测试。
资料来源:CLAUDE.md:35-44
工具响应格式
所有工具返回遵循 MCP 协议的统一响应格式:
// 成功响应
{
content: [{ type: 'text', text: JSON.stringify(result) }]
}
// 错误响应
{
isError: true,
content: [{ type: 'text', text: errorMessage }]
}
格式化辅助函数
| 函数 | 用途 |
|---|---|
formatToolResponse() | 格式化工具返回数据为 MCP 响应 |
formatTextResponse() | 格式化纯文本响应 |
validateWithSchema() | 使用 Zod schema 验证输入参数 |
错误处理
工具调度采用统一的错误处理机制:
graph TD
A[工具调用] --> B[handleToolCall]
B --> C{执行中异常?}
C -->|是| D[捕获异常]
D --> E[返回 MCP 错误响应]
C -->|否| F[返回正常响应]
E --> G{isError 字段}
F --> GhandleToolCall 会捕获处理器中的所有异常,并将其作为 MCP 格式的错误响应返回。调试时可检查响应的 isError 字段。
资料来源:CLAUDE.md:57-59
存储后端
工具支持两种存储后端:
JSONL 存储
- 数据文件:
memory.jsonl、memory-saved-searches.jsonl、memory-tag-aliases.jsonl - 位于项目根目录
- 适合小型部署和版本控制
SQLite 存储
- 数据文件:
memory.db - 设置
MEMORY_STORAGE_TYPE=sqlite启用 - 使用
better-sqlite3实现原生性能 - 适合生产环境和大规模数据
资料来源:CLAUDE.md:12-16
版本历史
| 版本 | 描述 |
|---|---|
| v12.3.0 (Phase 16) | 添加 53 个工具,涵盖 do_not_remember、决策理由、工具能力等 |
| v12.2.0 (Phase 15) | 添加 23 个工具,支持双时态有效性、OCC、RBAC、程序性记忆等 |
| v2.1.0 | memoryjs 核心库版本,支持完整工具集 |
资料来源:CLAUDE.md:3-7
资料来源:[CLAUDE.md:1-10]()
失败模式与踩坑日记
保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。
假设不成立时,用户拿不到承诺的能力。
新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
下游已经要求复核,不能在页面中弱化。
用户安装前需要知道权限边界和敏感操作。
Pitfall Log / 踩坑日志
项目:danielsimonjr/memory-mcp
摘要:发现 7 个潜在踩坑项,其中 0 个为 high/blocking;最高优先级:能力坑 - 能力判断依赖假设。
1. 能力坑 · 能力判断依赖假设
- 严重度:medium
- 证据强度:source_linked
- 发现:README/documentation is current enough for a first validation pass.
- 对用户的影响:假设不成立时,用户拿不到承诺的能力。
- 建议检查:将假设转成下游验证清单。
- 防护动作:假设必须转成验证项;没有验证结果前不能写成事实。
- 证据:capability.assumptions | github_repo:1093926095 | https://github.com/danielsimonjr/memory-mcp | README/documentation is current enough for a first validation pass.
2. 维护坑 · 维护活跃度未知
- 严重度:medium
- 证据强度:source_linked
- 发现:未记录 last_activity_observed。
- 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
- 建议检查:补 GitHub 最近 commit、release、issue/PR 响应信号。
- 防护动作:维护活跃度未知时,推荐强度不能标为高信任。
- 证据:evidence.maintainer_signals | github_repo:1093926095 | https://github.com/danielsimonjr/memory-mcp | last_activity_observed missing
3. 安全/权限坑 · 下游验证发现风险项
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 对用户的影响:下游已经要求复核,不能在页面中弱化。
- 建议检查:进入安全/权限治理复核队列。
- 防护动作:下游风险存在时必须保持 review/recommendation 降级。
- 证据:downstream_validation.risk_items | github_repo:1093926095 | https://github.com/danielsimonjr/memory-mcp | no_demo; severity=medium
4. 安全/权限坑 · 存在安全注意事项
- 严重度:medium
- 证据强度:source_linked
- 发现:No sandbox install has been executed yet; downstream must verify before user use.
- 对用户的影响:用户安装前需要知道权限边界和敏感操作。
- 建议检查:转成明确权限清单和安全审查提示。
- 防护动作:安全注意事项必须面向用户前置展示。
- 证据:risks.safety_notes | github_repo:1093926095 | https://github.com/danielsimonjr/memory-mcp | No sandbox install has been executed yet; downstream must verify before user use.
5. 安全/权限坑 · 存在评分风险
- 严重度:medium
- 证据强度:source_linked
- 发现:no_demo
- 对用户的影响:风险会影响是否适合普通用户安装。
- 建议检查:把风险写入边界卡,并确认是否需要人工复核。
- 防护动作:评分风险必须进入边界卡,不能只作为内部分数。
- 证据:risks.scoring_risks | github_repo:1093926095 | https://github.com/danielsimonjr/memory-mcp | no_demo; severity=medium
6. 维护坑 · issue/PR 响应质量未知
- 严重度:low
- 证据强度:source_linked
- 发现:issue_or_pr_quality=unknown。
- 对用户的影响:用户无法判断遇到问题后是否有人维护。
- 建议检查:抽样最近 issue/PR,判断是否长期无人处理。
- 防护动作:issue/PR 响应未知时,必须提示维护风险。
- 证据:evidence.maintainer_signals | github_repo:1093926095 | https://github.com/danielsimonjr/memory-mcp | issue_or_pr_quality=unknown
7. 维护坑 · 发布节奏不明确
- 严重度:low
- 证据强度:source_linked
- 发现:release_recency=unknown。
- 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
- 建议检查:确认最近 release/tag 和 README 安装命令是否一致。
- 防护动作:发布节奏未知或过期时,安装说明必须标注可能漂移。
- 证据:evidence.maintainer_signals | github_repo:1093926095 | https://github.com/danielsimonjr/memory-mcp | release_recency=unknown
来源:Doramagic 发现、验证与编译记录