使用说明
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"]
}
}
}