| name | datadata-memory |
| description | Manage AI persistent memory via the Datadata MCP Server — add, search, update, and delete memories, with semantic search and multi-dimensional filtering.
Use when the user wants the AI to remember information, recall previous conversations, or manage persistent knowledge.
Triggers: remember, memory, recall, don't forget, note this down, previously mentioned, search memory, delete memory.
|
功能概览
本 skill 通过 Datadata MCP Server 的记忆工具管理 AI 持久化记忆。记忆是跨会话保留的原子事实、偏好或知识点,Agent 可在后续对话中检索使用。
- 添加记忆 — 存储原子事实,支持标签、分类、元数据(异步索引)
- 搜索记忆 — 关键词或语义搜索,支持按时间、分类、Agent、会话等多维度过滤
- 更新记忆 — 修正或补充已有记忆内容
- 合并压缩 — 检测相似记忆并合并为一条,消除冗余
- 冲突合并 — 发现信息冲突时保留最新、记录历史
- 删除记忆 — 按 ID 移除过时或错误的记忆
MCP 工具速查
| 工具 | 用途 | 关键参数 |
|---|
memory_add | 添加新记忆(异步) | content(必填), category, tags, agentId, metadata |
memory_search | 搜索记忆 | search(必填), limit, offset, agentId, category, sessionId, startTime, endTime |
memory_update | 更新已有记忆(异步) | id(必填), content(必填), tags, category, agentId, metadata |
memory_delete | 删除记忆 | id(必填) |
memory_task_wait | 等待异步任务完成 | taskId(必填), timeout(秒,默认 60) |
注意:所有工具名前缀为 mcp_datadata_,如 mcp_datadata_memory_add。文档中省略前缀以保持简洁。
概念
记忆范围(Scope)
| 范围 | 说明 | 使用场景 |
|---|
| 用户全局 | 不指定 agentId,跨所有 Agent 可见 | 用户偏好、通用知识、项目约定 |
| Agent 专属 | 指定 agentId,仅特定 Agent 可检索 | Agent 专属上下文、任务状态 |
记忆属性
| 属性 | 说明 | 示例 |
|---|
content | 原子事实或偏好,一句话说清楚 | "用户偏好使用中文提交信息" |
category | 自定义分类,用于组织和过滤 | "preferences", "project-notes" |
tags | 可搜索标签数组 | ["git", "convention"] |
metadata | 键值对附加信息 | {"project": "datadata-skills"} |
异步索引
memory_add 和 memory_update 是异步操作。调用后返回 taskId,记忆进入索引队列。在索引完成前,新添加的记忆不会出现在搜索结果中。
绝大多数情况下索引在毫秒级完成,无需显式等待。memory_task_wait 仅作为保险措施,在以下场景才需要调用:
- 添加/更新后立即要在同一轮对话中搜索该记忆
- 合并压缩/冲突合并后需要验证结果
日常添加/更新操作直接调用 memory_add / memory_update 即可,不必跟 memory_task_wait。
工作流
添加记忆
用户要求记住某事 → memory_add → 确认完成
如需立即检索刚添加的记忆,可在 memory_add 后调用 memory_task_wait 确保索引完成。
示例:
用户:"记住我喜欢用中文写 commit message"
→ memory_add(content="用户偏好使用中文编写 Git 提交信息", category="preferences", tags=["git", "commit", "chinese"])
→ 确认:"已记住。"
原则:
- 每条记忆应为单一原子事实,不要塞多个不相关信息
- 添加前先
memory_search 检查是否已有类似记忆,避免重复
- 选择合适的
category 便于后续过滤
搜索记忆
用户询问过去信息 → memory_search → 返回相关记忆
搜索策略:
| 场景 | 方法 |
|---|
| 关键词精确匹配 | search="关键词" |
| 语义相关 | 使用自然语言描述,如 search="用户的编码偏好" |
| 限定分类 | 加 category="preferences" |
| 限定时间范围 | 加 startTime / endTime(RFC3339 格式) |
| 首次对话了解用户 | memory_search(search="用户偏好和习惯", limit=10) |
优先级:搜索记忆应在新对话开始时进行,以获取用户上下文。Agent 应在处理用户请求前检查相关记忆。
更新记忆
用户纠正或补充信息 → memory_update(id=<记忆ID>, content="修正后的内容") → 确认完成
如需立即检索更新后的记忆,可调用 memory_task_wait 确保索引完成。
何时更新:
- 用户明确纠正之前的说法:"不对,我之前说的..."
- 信息已过时需要刷新
- 补充更多细节
合并压缩
当添加新记忆时,搜索发现存在语义相似的已有记忆,应将两者合并为一条,避免信息碎片化。
触发条件:memory_add 前的 memory_search 返回高度相关的结果(语义相似度 > 80%)
流程:
memory_search(新内容摘要) → 发现相似记忆
↓
合并内容(保留所有不重复信息)→ memory_update(已有记忆ID, 合并后内容)
↓
(可选)memory_task_wait → 确认合并完成
合并原则:
| 场景 | 处理方式 |
|---|
| 新信息是已有信息的子集 | 不操作,已有记忆已覆盖 |
| 新信息是已有信息的超集 | memory_update 替换为更完整的版本 |
| 新信息与已有信息互补 | 合并为一条,用分号或编号整合 |
| 新信息与已有信息重复 | 不操作,跳过添加 |
示例:
已有:"用户偏好使用中文编写 Git 提交信息"
新增:"用户用 AngularJS 风格写 commit,类型有 feat/fix/docs 等"
→ 合并为:"用户偏好使用中文编写 Git 提交信息,遵循 AngularJS 风格(feat/fix/docs/chore 等)"
冲突合并
当新信息与已有记忆矛盾(如用户先说电话是 1111,后又说电话是 2222),应以最新信息为准,同时保留变更历史。
触发条件:memory_add 前搜索发现语义相似但内容矛盾的记忆
流程:
memory_search → 发现冲突记忆
↓
将旧值写入 metadata.history,用新值更新 content
↓
memory_update(id, content="最新值", metadata={..., "history": [{"value": "旧值", "updatedAt": "..."}]})
↓
(可选)memory_task_wait → 确认
metadata.history 格式:
{
"history": [
{ "value": "电话: 1111", "updatedAt": "2026-06-01T10:00:00Z" },
{ "value": "电话: 2222", "updatedAt": "2026-06-10T14:00:00Z" }
]
}
history 数组按时间倒序,最新在前。每次冲突合并时追加一条记录。
判定冲突的标准:
- 同一主题下的事实性信息不一致(电话号码、地址、版本号等)
- 用户明确说"不对,我之前说的..."或"改一下,应该是..."
- 偏好或习惯发生明确变化("我现在不用 VS Code 了,改用 Fleet")
不是冲突的情况(应合并压缩而非冲突合并):
- 对同一主题的补充说明(不矛盾)
- 不同上下文的不同选择("项目 A 用 pnpm,项目 B 用 yarn")
删除记忆
用户要求忘记某事 / 记忆明显错误 → memory_delete(id=<记忆ID>)
删除是同步操作,无需等待索引。不可逆,执行前应确认。
规则
🟡 添加前先搜索,避免重复
调用 memory_add 前应先 memory_search 检查是否已有相似记忆。若存在相关记忆,优先 memory_update 更新而非重复添加。
🟡 仅在需要时等待索引
memory_add 和 memory_update 的索引通常在毫秒级完成,无需每次都调用 memory_task_wait。仅当需要在同一轮对话中立即检索刚添加/更新的记忆时才调用,作为保险措施。
🟡 记忆内容应原子化
每条记忆只包含一个独立事实。反面示例:
❌ "用户偏好中文 commit、喜欢用 VS Code、项目使用 TypeScript"
✅ "用户偏好使用中文编写 Git 提交信息"
✅ "用户使用 VS Code 作为主力编辑器"
✅ "项目 datadata-skills 使用 TypeScript"
🟡 搜索优先于猜测
当用户问"我之前说过..."或需要上下文时,必须先搜索记忆,不要凭当前对话猜测。
🟡 删除需确认
在 memory_delete 前,向用户展示要删除的记忆内容并请求确认。记忆删除不可逆。
常见问题
Q: 添加记忆后搜索不到?
索引通常在毫秒级完成,极少数情况下可能需要几秒。若添加后立即搜索不到,可调用 memory_task_wait 等待索引完成后再试。
Q: 搜索返回太多结果?
使用过滤参数缩小范围:category、agentId、startTime/endTime、或减小 limit。
Q: 如何区分 tags 和 metadata?
tags:用于搜索过滤的简短标签,会建立索引
metadata:附加键值对,用于存储不参与搜索过滤的补充信息
Q: 记忆和 session memory 有什么区别?
- Datadata 记忆(本 skill):持久化存储,跨会话、跨 Agent 保留
- Session memory(
/memories/session/):仅当前会话有效,会话结束后清除
References