AI助手长期记忆存储服务

MCP Memory Bank是一个为AI助手设计的个人长期记忆存储服务器,用于在不同会话间保存和恢复上下文,支持任务管理和知识共享。

  • by hal9000cc
  • Python
  • 本地部署
  • 3 星标
  • 更新于
在 GitHub 查看 hal9000cc/mcp_memory_bank

使用说明

MCP存储体

用于AI助手的个人长期记忆服务器,实现为MCP服务器(模型上下文协议)。
专为个人使用而设计,不适合团队使用。允许您在会话之间保存和恢复上下文。需要Python 3.10+。

版本1.1.3

有什么新鲜事

  • 添加了需要绝对值的验证 project_id 在所有存储模式下。

版本1.1.2

  • 修复了在Windows上读取文档时的UTF-8编码问题。

版本1.1.1

  • 原子文件写入:Markdown文档现在通过临时文件写入+ fsync + os.replace,这可以防止崩溃时文件损坏。
  • 弹性文档解析:无效的YAML frontmatter和格式错误 tags 不再中断索引同步。

你为什么需要这个?

💰 代币节省

使用人工智能助手(尤其是在开发中)的主要成本来自阅读环境。代理读取的每个额外文件都会在上下文中结束,并在每次请求时支付费用。

记忆库通过以下方式解决了这个问题:

  • 在会话开始时,助理只接收最重要的内容——带有 core 旗帜。
  • 其他知识仅在实际需要时才按需加载。
  • 代理停止漫无目的地读取项目文件,并立即知道架构、当前任务、约束和状态。

🧠 长期记忆

聊天结束后,普通助理会忘记一切。内存库保存会话之间做出的决策、架构细节、协议和任何其他重要上下文。

  • 没有重复的解释——代理记得为什么选择这个特定的数据库,施加了什么约束,做出了什么架构权衡。
  • 当恢复工作时(即使在一周或一个月后),助理也会立即了解项目的最新状态。
  • 所有更改都是自动同步的——代理使用提供的工具自行编写文档。

✅ 任务管理

记忆库有助于组织项目工作:

  • 将大型任务分解为多个阶段。
  • 代理将任务列表直接存储在项目内存中。
  • 早上,问助理:“我们今天的任务是什么?”——它会通过检查电流来回答 activeTask.md 文件。
  • 代理跟踪进度,记录已完成的步骤,您始终了解任务的当前状态。

安装

pip install mcp-memory-bank

安装后 mcp-memory-bank 命令在PATH中可用。如果Python以非标准方式安装,则可能不会发生这种情况。在这种情况下,手动添加可执行文件的路径。

作者使用Cline,所以下面的配置是针对Cline的。由于协议是标准的,mcp内存库也应该与其他AI代理一起工作,但配置可能略有不同。

Cline中的设置

打开临床设置→ MCP服务器 → 手动添加服务器。

选择两种存储模式之一:


模式1:全局存储

所有项目都存储在一个地方,由 project_id.
默认情况下,数据存储在用户的系统目录中(通过 平台):

操作系统 路径
Linux ~/.local/share/mcp-memory-bank/
macOS ~/Library/Application Support/mcp-memory-bank/
窗户 C:\Users\<user>\AppData\Local\mcp-memory-bank\mcp-memory-bank\
{
  "mcpServers": {
    "memory-bank": {
      "disabled": false,
      "type": "stdio",
      "command": "mcp-memory-bank"
    }
  }
}

配置一次--自动适用于所有项目。
每次调用工具时,代理都会传递 project_id --并且数据被发送到正确的存储器。


模式2:项目中的本地存储(用于Cline)

每个项目的数据直接存储在其目录中(.memory_bank/ 项目内部)。
这在Cline中很方便,因为代理通过以下方式接收项目路径 Current Working Directory.

{
  "mcpServers": {
    "memory-bank": {
      "disabled": false,
      "type": "stdio",
      "command": "mcp-memory-bank",
      "args": ["--project-local"]
    }
  }
}

重要提示: 在 --project-local 模式 project_id 参数用作项目根的绝对路径。
Cline会自动通过 Current Working Directory.

添加 .memory_bank/ 到项目的 .gitignore --内存是特定于开发人员的。


连接规则.md

复制 RULES.md 文件从此存储库到Cline说明设置
(设置→ 自定义说明)或将其添加到您的项目中 .clinerules --这将教会助手如何使用记忆。

重要提示: 根据规则,如果存储体为空,则代理应在第一次请求时初始化存储体。但是,有时代理会立即专注于您的任务并跳过此步骤。在这种情况下,只需问:“初始化内存库”。


运作原理

项目识别

每个工具调用都包含一个 project_id 参数——一个唯一的项目标识符。
服务器使用它来隔离项目之间的数据。

建议通过 项目根的绝对路径 (对于克莱恩来说,这是 Current Working Directory).当经过一条路径时 project_id,您可以使用 --project-local 参数,并将银行文档存储在项目文件夹中。

但是,任何有意义的字符串标识符都是有效的 project_id在这种情况下,只有全局存储可用 --project-local 不能使用论点。

存储

全局模式 --存储结构:

~/.local/share/mcp-memory-bank/
├── index.db
├── common_storage/
│   └── documents/
│       └── shared-checklist.md
└── projects/
    ├── my_project_a1b2c3d4/    ← slug from project_id
    │   └── documents/
    │       ├── context.md
    │       └── activeTask.md
    └── another_project_e5f6a7b8/
        └── ...

本地模式 (--project-local)--存储结构:

/path/to/your/project/
└── .memory_bank/
    ├── documents/
    │   ├── context.md
    │   └── activeTask.md
    └── index.db

每个文档都是一个人类可读的Markdown文件,其中包含YAML frontmatter中的元数据:

---
tags:
  - decision
  - architecture
core: false
lastModified: '2026-03-09T01:00:00Z'
---
# Architectural Decisions

## Database Selection
...

SQLite索引在工具调用时增量同步——文件仍然是事实的来源。

共享存储

Memory Bank还支持与单个项目无关的共享存储区域。

  • 代理人使用 project_id="" (空字符串)读取或写入公共存储中的文档。
  • 要将文档放置在公共存储中,请让代理这样做——例如:“将此清单保存到共享存储中。”
  • 公共存储对于跨项目共享的可重用信息非常有用,例如发布清单、个人笔记或参考文档。
  • memory_bank_read_context(project_id=<project>) 做 不 自动加载常用文档。
  • memory_bank_search_by_tags(project_id=<project>, tags=[...]) 搜索当前项目存储和公共共享存储。

协议

概念

  • 所有信息都存储为 文件 (Markdown文本+元数据)
  • 每个文档都有:一个名称(name),内容(content),标签(tags一 core 标志和修改日期
  • 这 core=true 标志表示文档已加载 自动地 每次会话开始时
  • 无文件 core 已加载 按需 --保存上下文

工具

所有工具均接受要求 project_id 参数。

memory_bank_read_context(project_id)

启动会话的主要工具。退货:

  • 元数据 全部 文件(无内容)
  • 完整内容 仅核心文件 (core=true)

参数:

参数 类型 必填 说明
project_id string ✅ 项目标识符(推荐--项目根的绝对路径)

退货:

{
  "documents": [
    {
      "common": false,
      "name": "context.md",
      "tags": ["context", "global"],
      "core": true,
      "lastModified": "2026-03-09T01:00:00Z",
      "size": 753,
      "content": "# Project: ...\n\n..."
    },
    {
      "common": false,
      "name": "activeTask.md",
      "tags": ["task", "active"],
      "core": true,
      "lastModified": "2026-03-09T01:15:00Z",
      "size": 1024,
      "content": "# Current Task: ...\n\n..."
    },
    {
      "common": false,
      "name": "architecture.md",
      "tags": ["decision", "architecture"],
      "core": false,
      "lastModified": "2026-03-08T18:00:00Z",
      "size": 2048,
      "content": null
    }
  ]
}

memory_bank_read_documents(project_id, names)

按名称读取一个或多个文档。

参数:

参数 类型 必填 说明
project_id string ✅ 项目标识符
names list[string] ✅ 文件名称列表

退货:

{
  "documents": [
    {
      "common": false,
      "name": "architecture.md",
      "tags": ["decision", "architecture"],
      "core": false,
      "lastModified": "2026-03-08T18:00:00Z",
      "size": 2048,
      "content": "# Architectural Decisions\n\n## Database Selection\n\nDecided to use PostgreSQL..."
    }
  ]
}

如果找不到文档-- null 返回对应元素的值。


memory_bank_write_document(project_id, name, content, tags, core)

创建新文档或完全覆盖现有文档。

参数:

参数 类型 必填 说明
project_id string ✅ 项目标识符
name string ✅ 文档名称(例如。, activeTask.md)
content string ✅ Markdown格式的内容
tags list[string] ✅ 搜索标签(最少2个)
core boolean ❌ 会话开始时加载(默认值: false)

退货:

{
  "success": true,
  "name": "activeTask.md",
  "lastModified": "2026-03-09T01:20:00Z"
}

memory_bank_search_by_tags(project_id, tags)

按标签搜索文档。返回具有以下条件的文档 全部 指定的标签。
内容是 未归还 --只有元数据。要阅读内容,请使用 read_documents. 当 project_id 如果不是空的,则搜索包括当前项目存储和公共共享存储。

参数:

参数 类型 必填 说明
project_id string ✅ 项目标识符
tags list[string] ✅ 标签列表(文档必须包含所有标签)

退货:

{
  "documents": [
    {
      "common": false,
      "name": "architecture.md",
      "tags": ["decision", "architecture", "database"],
      "core": false,
      "lastModified": "2026-03-08T18:00:00Z",
      "size": 2048
    },
    {
      "common": true,
      "name": "release-checklist.md",
      "tags": ["release", "checklist", "shared"],
      "core": false,
      "lastModified": "2026-03-10T09:00:00Z",
      "size": 8192
    }
  ]
}

memory_bank_append_content(project_id, name, content, tags, core)

将文本附加到现有文档的末尾 而不将其内容阅读到LLM上下文中.
服务器在内部读取文件,用空行分隔符附加新内容,然后将其保存回去。

这是更新日志式文档的首选方式(例如。, progress.md)--它避免了在每次更新时将整个文档加载到上下文中。

如果文档不存在,将创建它(在这种情况下需要标签)。

参数:

参数 类型 必填 说明
project_id string ✅ 项目标识符
name string ✅ 文档名称(例如。, progress.md)
content string ✅ 在文档末尾附加的Markdown文本
tags list[string] ❌ 仅在创建新文档时需要(至少2个)。如果文档存在,则忽略。
core boolean ❌ 仅在创建新文档时使用(默认值: false)

退货:

{
  "success": true,
  "name": "progress.md",
  "lastModified": "2026-03-09T21:00:00Z",
  "contentLength": 1024
}

contentLength --附加后文档内容的总长度(以字符为单位)。


memory_bank_delete_document(project_id, name)

按名称删除现有文档。

如果文档不存在,该工具将返回错误。

参数:

参数 类型 必填 说明
project_id string ✅ 项目标识符
name string ✅ 要删除的文档名称

退货:

{
  "success": true,
  "name": "obsolete.md"
}

如果找不到文件:

{
  "error": "Document not found: obsolete.md"
}

推荐文件

名称 用途 标签 核心
context.md 项目目标、技术、限制 context, global true
projectStructure.md 目录结构、模块、组件关系 structure, global true
activeTask.md 当前任务、最近的行动、下一步、阻止程序 task, active true
progress.md 已完成任务和阶段日志 progress, log false
architecture.md 关键的架构和技术决策 decision, architecture false

文档名称是推荐名称。任何有意义的名字 camelCase.md 或 kebab-case.md 格式是允许的。


命令行参数

参数 类型 默认值 描述
--dir path 系统数据目录 全局存储的根目录。忽略与 --project-local
--project-local flag disabled 在每个项目中存储数据(<project_id>/.memory_bank/)
--log-level 字符串 INFO 日志级别: DEBUG, INFO, WARNING, ERROR
--log-file path stderr 用于写入日志的文件。如果未指定,则日志将转到stderr
--response-delay 数量(ms) 0 在向每个工具调用发送响应之前延迟。主要仅适用于具有扩展思维的旧版Cline;当前的Cline版本不需要它,因为根本问题已经得到解决。

在旧的Cline版本中,当使用具有扩展思维的模型(例如,具有“扩展思维”选项的Claude Opus)时,可能会出现竞争情况:Cline在收到MCP服务器的响应之前没有足够的时间将思维块传递回Claude API。这可能会导致“思考…”消息后出现挂起。

此问题已在当前Cline版本中修复,因此 --response-delay 通常不再需要。如果您使用的是较旧的Cline版本,但仍然看到这种行为,添加100毫秒等小延迟可能会有所帮助:

{
  "mcpServers": {
    "memory-bank": {
      "disabled": false,
      "type": "stdio",
      "command": "mcp-memory-bank",
      "args": ["--project-local", "--response-delay", "100"]
    }
  }
}