返回 MCP 目录
public公开dns本地运行

ai_memory_protocol

AI记忆协议是一个为AI编程代理设计的版本化、基于图的持久记忆系统,使用Sphinx-Needs实现,支持记忆的创建、搜索、更新和通过MCP协议与AI客户端集成。

article

README

🚀 AI 内存协议

AI 内存协议 为 AI 编码代理提供了基于图结构的版本化持久内存,由 Sphinx-Needs 提供支持。该协议解决了 AI 代理在不同会话间丢失上下文的问题,为它们提供了一种结构化的方式来记忆回忆发展知识,具备完整的 Git 历史记录、类型化条目、图链接以及机器可读输出。

🚀 快速开始

# 1. 创建一个内存工作区
memory init .memories --name "My Project" --install

# 2. 添加你的第一条记忆
memory add fact "API runs on port 8080" \
  --tags "topic:api,repo:backend" \
  --confidence high \
  --body "Gateway listens on 0.0.0.0:8080 by default" \
  --rebuild

# 3. 搜索
memory recall api port
memory recall --tag topic:api --format brief

# 4. 获取完整详情
memory get FACT_api_runs_on_port_8080

✨ 主要特性

  • 类型化记忆:包括观察、决策、事实、偏好、风险、目标、未解决问题等。
  • 图链接:支持关联、支持、依赖、取代、矛盾、示例等关系。
  • 基于标签的发现:如 topic:apirepo:backendtier:core 等。
  • 上下文优化输出:提供简洁、紧凑、上下文、JSON 等格式,支持正文切换。
  • 陈旧检测:自动过期、审查提醒、陈旧性检查。
  • 自动扩展:RST 文件在 50 个条目时自动拆分,查询透明。
  • 原生 Git 支持:每个记忆都是一个 RST 指令,完全可差分和版本化。
  • MCP 服务器:将内存作为工具暴露给 Claude Desktop、VS Code Copilot 等 MCP 客户端。
  • 构建守护needs_warnings 质量门在构建时强制要求标签、链接和正文质量。
  • CLI 优先:提供 12 个子命令用于全生命周期管理。

📦 安装指南

git clone https://github.com/bburda/ai_memory_protocol.git
pipx install -e ai_memory_protocol/

# 支持 MCP 服务器
pipx install -e 'ai_memory_protocol/[mcp]'

这将在全局路径上安装 memory CLI 命令(可选安装 memory-mcp-stdio)。

💻 使用示例

基础用法

# 1. 创建一个内存工作区
memory init .memories --name "My Project" --install

# 2. 添加你的第一条记忆
memory add fact "API runs on port 8080" \
  --tags "topic:api,repo:backend" \
  --confidence high \
  --body "Gateway listens on 0.0.0.0:8080 by default" \
  --rebuild

# 3. 搜索
memory recall api port
memory recall --tag topic:api --format brief

# 4. 获取完整详情
memory get FACT_api_runs_on_port_8080

高级用法

# 更多的高级使用示例和场景说明
# 例如使用特定的参数进行搜索等操作
memory recall --tag topic:gateway --format brief --expand 0

📚 详细文档

工作原理

RST files (memory/*.rst)          ← 人类和 AI 均可编辑,由 Git 跟踪
    │
    ▼ memory rebuild (sphinx-build)
needs.json (_build/html/needs.json)   ← 机器可读索引
    │
    ▼ memory recall / get / list
Formatted output                  ← 针对 LLM 上下文窗口进行优化

记忆以 Sphinx-Needs 指令的形式存储在 RST 文件中。memory rebuild 命令运行 Sphinx 生成 needs.json,作为所有搜索操作的单一查询层。这意味着记忆既是人类可读的文档,也是机器可查询的数据。

CLI 参考

memory init <dir>                       # 创建一个新的工作区
memory add <type> "<title>" [options]   # 记录一条记忆
memory recall [query] [--tag ...] [--format brief|compact|context|json]
memory get <ID>                         # 获取一条记忆的完整详情
memory related <ID> [--hops N]          # 从一条记忆开始进行图遍历
memory list [--type TYPE] [--status S]  # 浏览所有记忆
memory update <ID> [--confidence ...] [--add-tags ...] [--body ...] [--title ...]
memory deprecate <ID> [--by NEW_ID]     # 将一条记忆标记为已弃用
memory tags [--prefix PREFIX]           # 发现正在使用的标签
memory stale                            # 查找过期或逾期的记忆
memory review                           # 显示需要审查的记忆
memory rebuild                          # 重建 needs.json

recall 命令的关键标志:

  • --format brief:超紧凑,最少的令牌
  • --body:包含正文文本(默认关闭)
  • --sort newest|oldest|confidence|updated
  • --limit N:限制结果数量
  • --expand 0:禁用图扩展
  • --stale:仅显示过期或审查逾期的记忆

MCP 服务器

通过 Model Context Protocol 将内存工具暴露给 LLM 客户端。

设置

使用 MCP 额外功能进行安装:

pipx install -e 'ai_memory_protocol/[mcp]'

Claude 代码

claude mcp add --transport stdio --env MEMORY_DIR=/path/to/.memories memory -- memory-mcp-stdio

或者添加到项目根目录的 .mcp.json 文件中(项目范围):

{
  "mcpServers": {
    "memory": {
      "type": "stdio",
      "command": "memory-mcp-stdio",
      "env": {
        "MEMORY_DIR": "/path/to/.memories"
      }
    }
  }
}

VS Code (GitHub Copilot)

添加到 .vscode/mcp.json 文件中:

{
  "servers": {
    "memory": {
      "command": "memory-mcp-stdio",
      "env": {
        "MEMORY_DIR": "${workspaceFolder}/.memories"
      }
    }
  }
}

可用的 MCP 工具

| 工具 | 描述 | |------|-------------| | memory_recall | 通过文本/标签搜索记忆,并支持格式化选项 | | memory_get | 获取特定记忆的完整详情 | | memory_add | 记录一条带有标签和元数据的新记忆 | | memory_update | 更新记忆的内容或元数据(标题、正文、状态、置信度、标签等) | | memory_deprecate | 将一条记忆标记为已弃用 | | memory_tags | 列出所有标签及其计数 | | memory_stale | 查找过期/逾期的记忆 | | memory_rebuild | 重建 needs.json 索引 |

记忆类型

| 类型 | 前缀 | 使用场景 | |------|--------|----------| | mem | MEM_ | 观察、笔记或发现 | | dec | DEC_ | 设计或架构决策 | | fact | FACT_ | 经过验证的稳定知识 | | pref | PREF_ | 编码风格或约定 | | risk | RISK_ | 不确定性或假设 | | goal | GOAL_ | 目标或指标 | | q | Q_ | 需要解决的未解决问题 |

图链接

| 链接 | 含义 | |------|---------| | relates | 一般关联 | | supports | 证据或理由 | | depends | 硬依赖 | | supersedes | 取代旧记忆 | | contradicts | 冲突或矛盾 | | example_of | 概念的具体实例 |

元数据

| 字段 | 值 | 用途 | |-------|--------|---------| | confidence | low / medium / high | 信任级别 | | scope | global, repo:X, product:X | 适用性 | | tags | prefix:value 格式 | 分类 | | source | URL、提交记录、描述 | 来源 | | review_after | ISO 日期 | 陈旧性触发日期 | | expires_at | ISO 日期 | 自动过期日期 | | created_at | ISO 日期 | 捕获时间戳 |

标签约定

标签使用 prefix:value 格式,以便进行一致的发现:

  • topic::主题领域(如 topic:gatewaytopic:auth
  • repo::代码仓库(如 repo:backendrepo:web-ui
  • domain::知识领域(如 domain:roboticsdomain:web
  • tier::重要性级别(如 tier:coretier:detail
  • intent::目的(如 intent:decisionintent:coding-style

AI 代理集成

推荐工作流程

1. 读取 — 先预览再深入(两阶段回忆)

始终使用两阶段方法。在进行广泛查询时,不要直接访问正文文本。 阶段 A — 预览(扫描标题,不显示正文文本):

memory recall --tag topic:gateway --format brief --expand 0

返回 [ID] 标题 (置信度) 格式的单行信息,使用最少的令牌。首先执行此操作。 阶段 B — 深入(读取特定记忆的完整正文):

memory get DEC_handler_context_pattern

在预览之后,选择 2 - 3 个最相关的 ID 并分别使用 get 命令获取详细信息。 何时进行回忆 — 回忆不仅仅是会话开始时的仪式。在以下时刻进行回忆: | 触发条件 | 回忆内容 | |---------|---------------| | 会话开始 | recall --format brief --limit 20 --sort newest | | 新任务或主题 | recall --tag topic:<X> --format brief | | 进入不熟悉的代码 | recall --tag repo:<X> --type fact --format brief | | 进行设计决策之前 | recall --tag topic:<X> --type dec | | 遇到错误或失败 | recall <错误消息关键字> — 在调试之前的第一反应;检查该问题是否已经解决 | | 初始尝试后陷入困境 | recall --tag topic:<X> --type mem,fact — 扩大搜索范围到相关领域和过去的解决方案 | | 实现模式之前 | recall --tag intent:coding-style --type pref |

2. 写入 — 在特定触发点记录

记录记忆不是可选操作。在以下具体时刻进行记录: | 触发条件 | 类型 | 示例 | |---------|------|---------| | 选择方案 A 而非 B | dec | "使用 tl::expected 而非异常处理" | | 修复非显而易见的 bug | mem | "EntityCache 竞态条件修复" | | 发现未记录的 API | fact | "路由按注册顺序匹配" | | 用户表达偏好 | pref | "更喜欢 Zustand 而非 Redux" | | 识别出风险 | risk | "JWT 密钥在测试中硬编码" | | 问题仍未解决 | q | "合成组件是否应暴露操作?" | 任务结束时的写入:总结所学的架构知识(fact),记录约定(pref),记录未来代理需要的任何信息(mem),捕获未完成的目标(goal)。 写入质量规则

  • --tags 是必需的 — 没有标签,记忆将无法被找到。
  • --body 必须包含文件路径和具体细节,自成一体。
  • 使用 --rebuild 标志使新记忆立即可以被搜索到。
3. 取代,而非编辑

当知识发生变化时,使用 --supersedes OLD_ID 添加新条目,并将旧条目标记为已弃用。

4. 定期检查陈旧性

在长时间会话开始时运行 memory stale 命令,以保持图的准确性。

上下文窗口优化

  • recall 默认省略正文 — 这是有意为之,并非限制。
  • 预览使用 --format brief深入使用 get <ID> — 这是核心模式。
  • 在探索广泛主题时使用 --limit 10--expand 0
  • 使用 --tag 过滤器缩小结果范围,而不是使用自由文本。
  • 在过滤之前使用 memory tags 发现可用的标签前缀。

项目结构

ai_memory_protocol/
├── pyproject.toml           # 包定义,CLI + MCP 入口点
├── README.md
├── LICENSE                  # Apache 2.0
├── CONTRIBUTING.md
├── .pre-commit-config.yaml
├── .github/workflows/ci.yml
└── src/
    └── ai_memory_protocol/
        ├── __init__.py
        ├── cli.py           # CLI (argparse, 12 个子命令)
        ├── mcp_server.py    # MCP 服务器 (8 个工具,stdio 传输)
        ├── config.py        # 类型定义,常量
        ├── engine.py        # 工作区检测,搜索,图遍历
        ├── formatter.py     # 输出格式化 (简洁/紧凑/上下文/JSON)
        ├── rst.py           # RST 生成,编辑,文件拆分
        └── scaffold.py      # 工作区脚手架 (init 命令)

记忆数据存储在一个单独的工作区(例如 .memories/)中,使用 memory init 命令创建。

构建守护

Sphinx 构建充当记忆图的质量门。conf.py 中的 needs_warnings 定义了在 memory rebuild 期间触发的约束条件:

needs_warnings = {
    "missing_topic_tag": "type in ['mem','dec','fact',...] and not any(t.startswith('topic:') for t in tags)",
    "empty_body": "description == '' or description == 'TODO: Add description.'",
    "deprecated_without_supersede": "status == 'deprecated' and len(supersedes_back) == 0",
}

使用 sphinx-build -W(将警告视为错误),如果任何记忆违反这些约束条件,构建将失败。这意味着:

  • 每个记忆必须至少有一个 topic: 标签。
  • 索引中不会存在空占位符。
  • 已弃用的记忆必须被替换。 代理学会自我纠正:如果 rebuild 失败,它们会读取警告信息,修复有问题的记忆,然后重试。

人类角色

人类是观察者和编辑者,而非守门人:

  • 仪表盘memory/dashboards.rst 包含 needtableneedlistneedflow 指令,将记忆图的实时状态渲染为 HTML。
  • RST 编辑 — 记忆是普通的 RST 文件,可以在任何文本编辑器或 IDE 中编辑,并且在 Git 中具有完整的差异和 blame 信息。
  • 覆盖 — 人类可以通过 CLI 或直接编辑 RST 文件来更新任何记忆的状态、置信度或标签。
  • 审查memory review 会显示 review_after 日期已过的记忆,提示人类进行验证。 该协议的设计使得代理能够自主维护知识,而人类仍然可以保持完全的可见性和覆盖能力。

贡献指南

有关如何贡献的指南,请参阅 CONTRIBUTING.md

📄 许可证

Apache 2.0

help

运行方式说明

cloud

托管运行

托管运行通常表示这个 MCP Server 由服务方环境承载,用户一般按页面提供的连接方式或授权流程接入,不需要在本地长期启动一个 MCP 进程

  1. 打开服务方连接页
  2. 完成授权或复制端点
  3. 在 MCP 客户端中连接
terminal

本地运行 / 其它方式

本地运行通常需要用户在自己的电脑或服务器上安装依赖,把 server_config 复制到 MCP 客户端,并按 env_schema 补齐环境变量、密钥或其它配置

  1. 复制 server_config
  2. 安装所需依赖
  3. 补齐环境变量后重启客户端