如何利用 OpenMemory MCP 增强客户端的上下文感知能力
人工智能发展日新月异,大型语言模型 (LLM) 让事情变得简单得多。然而,它们也面临一个根本性的限制: 它们会在会话间忘记所有信息。
如果有一种方法可以实现个人的、可移植的 LLM“内存层”,它位于您的系统本地,并且能够完全控制您的数据,那会怎样?
今天,我们将学习 OpenMemory MCP,这是一个基于 Mem0(AI 代理的内存层)构建的私有、本地优先的内存层。它支持在兼容 MCP 的客户端(例如 Cursor、Claude Desktop、Windsurf、Cline 等)上实现持久且上下文感知的 AI。
本指南讲解了如何安装、配置和操作 OpenMemory MCP 服务器。此外,它还涵盖了内部架构、流程、底层组件以及实际用例。
让我们开始吧。
涵盖哪些内容?
简而言之,我们正在详细介绍这些主题。
- OpenMemory MCP Server 是什么以及它为什么重要?
- 设置和运行 OpenMemory 的分步指南。
- 仪表板中可用的功能(以及 UI 背后的功能)。
- 安全、访问控制和架构概述。
- 带有示例的实际用例。
1.什么是OpenMemory?它为什么重要?
OpenMemory MCP是专为 MCP 客户提供的私有本地解决方案 memory layer
。它提供跨平台存储、管理和利用 AI 内存的基础设施,同时将数据存储在本地系统上。
简单来说,它就像是memories
使用标准MCP 协议的任何 LLM 客户端的矢量支持层,并且可以与Mem0等工具一起开箱即用。
主要功能:
-
在会话中存储和调用任意文本块(
memories
),因此您的 AI 无需从零开始。 -
Qdrant
使用底层的向量存储( )来执行基于相关性的检索,而不仅仅是关键字匹配。 -
完全在您的基础设施上运行(
Docker + Postgres + Qdrant
),无需向外发送任何数据。 -
暂停或撤销任何客户端的访问
app or memory level
,并对每次读取或写入进行审计日志。 -
包括一个仪表板(
next.js & redux
),显示谁在读/写记忆以及状态变化的历史记录。
🔁 工作原理(基本流程)
以下是核心流程:
-
您可以使用单个命令启动 OpenMemory(API、Qdrant、Postgres)
docker-compose
。 -
API 进程本身托管一个 MCP 服务器(在后台使用 Mem0),该服务器通过 SSE 使用标准 MCP 协议。
-
您的 LLM 客户端打开一个 SSE 流到 OpenMemory 的
/mcp/...
端点并调用诸如add_memories()
或search_memory()
之类的方法list_memories()
。 -
其余所有内容,包括向量索引、审计日志和访问控制,均由 OpenMemory 服务处理。
您可以在mem0.ai/openmemory-mcp上观看官方演示并阅读更多内容!
2. 设置和运行 OpenMemory 的分步指南。
在本节中,我们将介绍如何设置 OpenMemory 并在本地运行它。
该项目有两个需要运行的主要组件:
api/
- 后端 API 和 MCP 服务器ui/
- 前端 React 应用程序(仪表板)
步骤 1:系统先决条件
在开始之前,请确保你的系统已安装以下软件。我已附上文档链接,方便你查看。
- Docker和Docker Compose
- Python 3.9+ - 后端开发所需
- Node.js - 前端开发必需
- OpenAI API 密钥- 用于 LLM 交互
- GNU Make
GNU Make 是一个自动化构建工具。我们将使用它来完成安装过程。
在继续下一步之前,请确保 Docker Desktop 正在运行。
第 2 步:克隆 repo 并设置你的 OpenAI API 密钥
您需要使用以下命令克隆github.com/mem0ai/mem0上可用的 repo 。
git clone <https://github.com/mem0ai/mem0.git>
cd openmemory
接下来,将您的OpenAI API 密钥设置为环境变量。
export OPENAI_API_KEY=your_api_key_here
此命令仅针对当前终端会话设置密钥。该密钥仅持续到您关闭该终端窗口为止。
步骤 3:设置后端
后端在 Docker 容器中运行。要启动后端,请在根目录中运行以下命令:
# Copy the environment file and edit the file to update OPENAI_API_KEY and other secrets
make env
# Build all Docker images
make build
# Start Postgres, Qdrant, FastAPI/MCP server
make up
该.env.local
文件将具有以下约定。
OPENAI_API_KEY=your_api_key
设置完成后,您的 API 将在 上线http://localhost:8000
。
您还应该看到在 Docker Desktop 中运行的容器。
以下是您可以使用的一些其他有用的后端命令:
# Run database migrations
make migrate
# View logs
make logs
# Open a shell in the API container
make shell
# Run tests
make test
# Stop the services
make down
步骤 4:设置前端
前端是一个 Next.js 应用程序。要启动它,只需运行:
# Installs dependencies using pnpm and runs Next.js development server
make ui
安装成功后,您可以导航到http://localhost:3000
OpenMemory 仪表板,它将指导您在 MCP 客户端中安装 MCP 服务器。
仪表板的外观如下。
对于上下文,您的 MCP 客户端打开一个 SSE 通道到GET /mcp/{client_name}/sse/{user_id}
,该通道连接两个上下文变量(user_id
,client_name
)。
在仪表板上,您将找到根据您选择的客户端偏好(如 Cursor、Claude、Cline、Windsurf)安装 MCP 服务器的单行命令。
让我们在 Cursor 中安装它,命令看起来像这样。
npx install-mcp i https://mcp.openmemory.ai/xyz_id/sse --client cursor
install-mcp
如果尚未安装,它将提示您安装,然后您只需为服务器提供一个名称。
我目前使用的是虚拟命令,所以请忽略它。打开光标设置,检查侧边栏中的 MCP 选项以验证连接。
在 Cursor 中打开一个新聊天并提供示例提示,就像我要求它记住一些关于我的事情(我从我的 GitHub 个人资料中获取的)。
这将触发add_memories()
调用并存储记忆。刷新仪表板并转到选项Memories
卡以检查所有这些记忆。
系统会自动为记忆创建类别,这些类别就像可选标签(通过 GPT-4o 分类)。
您还可以连接其他 MCP 客户端,如 Windsurf。
每个 MCP 客户端可以“调用”四个标准内存操作之一:
-
add_memories(text)
→ 在 Qdrant 中存储文本,插入/更新Memory
行和审计条目 -
search_memory(query)
→ 嵌入查询,使用可选的 ACL 过滤器运行向量搜索,记录每次访问 -
list_memories()
→ 检索用户的所有存储向量(通过 ACL 过滤)并记录列表 -
delete_all_memories()
:清除所有记忆
所有响应都通过同一个 SSE 连接进行传输。仪表板显示所有活动连接、哪些应用正在访问内存以及读/写操作的详细信息。
3. 仪表板中可用的功能(以及 UI 背后的内容)
OpenMemory 仪表板包括三个主要路线:
/
- 仪表板/memories
– 查看和管理存储的记忆/apps
– 查看已连接的应用程序
简而言之,让我们看看仪表板上的所有可用功能,以便您了解基本概念。
1)安装OpenMemory客户端
- 获取您唯一的 SSE 端点或使用单行安装命令
- 在各种客户端选项卡之间切换
MCP Link
(Claude、Cursor、Cline 等)
2)查看内存和应用程序统计信息
- 查看你存储了多少回忆
- 查看已连接的应用程序数量
- 输入任意文本即可在所有记忆中进行实时搜索(去抖动)
代码可在 处获取ui/components/dashboard/Stats.tsx
,其中:
- 从 Redux 读取(
profile.totalMemories
,profile.totalApps
,profile.apps[]
) - 调用
useStats().fetchStats()
mount 来填充存储 - 呈现“总记忆数”和“已连接的应用程序总数”,最多可显示 4 个应用程序图标
3)刷新或手动创建记忆
Refresh button
(重新调用当前路线的适当获取器)Create Memory
按钮(从 CreateMemoryDialog 打开模式)
5)您可以打开过滤器面板进行选择:
- 包含哪些应用程序
- 包括哪些类别
- 是否显示已归档项目
- 按哪一列排序(内存、应用程序名称、创建日期)
- 一键清除所有过滤器
6)您可以检查和管理个人记忆
单击任意内存即可:
- 存档、暂停、恢复或删除记忆
- 检查访问日志和相关记忆
您还可以选择多个记忆并执行批量操作。
🖥️ UI 背后:关键组件
以下是涉及的一些重要前端组件:
-
ui/app/memories/components/MemoryFilters.tsx
:处理搜索输入、过滤对话框触发以及存档/暂停/删除等批量操作。同时管理行的选择状态。 -
ui/app/memories/components/MemoriesSection.tsx
:加载、分页和显示记忆列表的主要容器。 -
ui/app/memories/components/MemoryTable.tsx
– 呈现实际的记忆表(ID、内容、客户端、标签、创建日期、状态)。每行都可以通过 MemoryActions 进行相应的操作(编辑、删除、复制链接)。
对于状态管理和 API 调用,它使用干净的钩子:
useStats.ts
:加载高级统计数据,如总内存和应用程序数量。useMemoriesApi.ts
:处理获取、删除和更新记忆。useAppsApi.ts
:检索应用程序信息和每个应用程序的内存详细信息。useFiltersApi.ts
:支持获取类别和更新过滤器状态。
这些部分共同构成了一个响应迅速的实时仪表板,让您可以控制 AI 内存层的各个方面。
4. 安全、访问控制和架构概述。
在使用 MCP 协议或任何 AI 代理系统时,安全性是不可妥协的。因此,我们来简单讨论一下。
🎯 安全
OpenMemory 的设计遵循隐私优先原则。它存储所有内存数据均本地存储在您的基础设施中,使用 Dockerized 组件(FastAPI
,Postgres
,Qdrant
)。
敏感输入通过 SQLAlchemy 进行安全处理,并带有参数绑定功能,以防止注入攻击。每次内存交互(包括添加、检索和状态更改)都会记录下来,以便通过MemoryStatusHistory
和MemoryAccessLog
表进行追溯。
虽然身份验证不是内置的,但所有端点都需要user_id
并准备在外部身份验证网关(如 OAuth 或 JWT)后面进行保护。
FastAPI 上的 CORSallow_origins=["*"]
对于本地/开发来说是完全开放的( ),但对于生产环境,您应该将其从默认开放状态收紧,以限制对受信任客户端的访问。
🎯 访问控制
细粒度的访问控制是 OpenMemory 的核心关注点之一。从高层次上讲,该access_controls
表定义了应用程序与特定内存之间的允许/拒绝规则。
这些规则通过函数强制执行check_memory_access_permissions
,该函数考虑内存状态(active
、paused
等等)、应用程序活动状态(is_active
)和现有的 ACL 规则。
在实际应用中,您可以暂停整个应用(禁用写入)、归档或暂停单个内存,或按类别或用户应用过滤器。已暂停或非活动状态的条目将被隐藏,无法通过工具访问和搜索。这种分层访问模型确保您能够自信地控制任何级别的内存访问。
正如你所看到的,我暂停了对记忆的访问,这导致了一种inactive
状态。
🎯 建筑
让我们简要介绍一下系统架构。您可以随时参考代码库了解更多详细信息。
1)后端(FastAPI + FastMCP over SSE
):
- 公开普通的 REST 表面(
/api/v1/memories
,/api/v1/apps
,/api/v1/stats
)和 - 代理使用MCP“工具”接口(
/mcp/messages
, )通过服务器发送事件 (SSE)调用( ,, )。/mcp/sse/<client>/<user>
add_memories
search_memory
list_memories
- 它连接到 Postgres 获取关系元数据,并连接到 Qdrant 获取向量搜索。
2)向量存储(Qdrant via the mem0 client
):所有记忆均在 Qdrant 中进行语义索引,并在查询时应用用户和应用程序特定的过滤器。
3)关系元数据(SQLAlchemy + Alembic
):
- 跟踪用户、应用程序、内存条目、访问日志、类别和访问控制。
- Alembic 管理模式迁移。
- 默认数据库是 SQLite (openmemory.db),但您可以指向
DATABASE_URL
Postgres
4)前端仪表板(Next.js
):
- Redux 支持实时可观察性界面
- Hooks + Redux Toolkit 管理状态,Axios 与 FastAPI 端点通信
- 实时图表(Recharts)、轮播、表单(React Hook Form)探索你的记忆
5)基础设施和开发工作流程
docker-compose.yml
(api/docker-compose.yml)包括 Qdrant 服务和 API 服务Makefile
提供迁移、测试、热重载的快捷方式- 测试与后端逻辑同时存在(通过
pytest
)
总的来说,这给了你自托管 LLM 内存平台:
⚡ 在关系数据库和向量索引中存储和版本控制您的聊天内存
⚡ 使用每个应用程序的 ACL 和状态转换(活动/暂停/存档)来保护它
⚡ 通过 Qdrant 进行语义搜索
⚡ 通过丰富的 Next.js UI 进行观察和控制。
在下一部分中,我们将探讨可以使用 OpenMemory 构建的一些高级用例和创造性的工作流程。
5. 带有示例的实际用例。
一旦你熟悉了 OpenMemory,你就会意识到它可以用在任何你想要 AIremember
跨交互的地方,这使得它非常个性化。
以下是一些可以使用 OpenMemory 的先进且有创意的方法。
✅ 具有记忆层的多智能体研究助理
想象一下构建一个工具,其中不同的 LLM 代理专门负责不同的研究领域(例如,一个负责学术论文,一个负责 GitHub 存储库,另一个负责新闻)。
每个代理都会存储其发现的内容add_memories(text)
,然后主代理会运行search_memory(query)
所有先前的结果。
技术流程可以是:
-
每个子代理都是一个 MCP 客户端:
- 将检索到的数据摘要添加到 OpenMemory。-
使用自动分类 (GPT) 标记记忆。 -
主代理打开 SSE 通道并使用:
-search_memory("latest papers on diffusion models")
提取所有相关上下文。
-
仪表板显示哪个代理存储了什么,您可以使用 ACL 限制代理之间的内存访问。
如果您仍然好奇,可以查看这个 GitHub repo,其中展示了如何使用 Gemini 2.0 构建研究多代理系统 - 设计模式概述。
提示:我们可以添加一个 LangGraph 编排层,其中每个代理都是一个节点,内存的写入/读取操作会随时间推移被跟踪。这样,我们就可以可视化每个研究线程的知识流和来源。
✅ 具有持久跨会话记忆的智能会议助理
我们可以构建类似会议笔记记录器(Zoom、Google Meet 等)的东西,它可以:
- 通过 LLM 提取摘要。
- 记住通话过程中的行动事项。
- 在未来的会议中自动检索相关背景。
我们来看看技术流程是什么样的:
add_memories(text)
每次通话后,提供通话记录和行动事项。- 下次会议:
search_memory("open items for Project X")
在通话开始前运行。 - 相关内存(标有
appropriate category
)显示在 UI 中,并且审计日志会跟踪读取了哪个内存以及何时读取。
提示:与工具(如 Google Drive、Notion、GitHub)集成,以便存储的行动项链接回实时文档和任务。
✅ 随着使用而不断发展的代理编码助手
基于 CLI 的编码助手可以通过存储使用模式、重复问题、编码偏好和项目特定的提示来了解您的工作方式。
技术流程如下:
-
当您问:“为什么我的 SQLAlchemy 查询失败?”时,它会通过存储错误和修复来存储
add_memories
。 -
下次您输入:“SQLAlchemy 连接再次出现问题”时,助手会自动运行
search_memory("sqlalchemy join issue")
并检索之前的修复。 -
您可以通过仪表板检查所有存储的内存
/memories
,并暂停任何过时或不正确的内存。
提示:它甚至可以连接到 codemod 工具(如jscodeshift),以便在代码库发展时根据您存储的偏好自动重构代码。
在每种情况下,OpenMemory 的矢量搜索(用于semantic recall
)、关系元数据(用于audit/logging
)和实时仪表板(用于observability
和动态)的组合可让您构建感觉像
记忆一样的access control
上下文感知应用程序。
现在您的 MCP 客户端拥有真正的内存。
您可以在一个仪表板上追踪每次访问,暂停所需的操作并审核所有内容。最棒的是,所有内容都本地存储在您的系统上。
如果您有任何问题或反馈,请告诉我。
祝你今天过得愉快!下次再见 :)
你可以在anmolbaranwal.com 查看 我的作品。 感谢阅读!🥰 |
![]() ![]() ![]() |
---|
