NexMem MCP
团队共享代理内存 --具有可插拔数据库后端的即插即用MCP内存服务器。
NexMem为AI编码代理(Cursor、Claude Desktop等)提供了一个整个团队共享的持久知识图。代理在工作中学习——发现服务、架构模式和约定——然后在未来的会话中立即回忆起这些知识。
特性
- 自我或团队记忆 --个人图或共享团队图,可通过env-var切换
- 5个存储后端 --JSONL(默认)、SQLite、MongoDB、PostgreSQL、Redis
- 原子操作 --当多个团队成员同时写作时,没有比赛条件
- 强一致性 --reads总是返回最新状态
- 电线兼容 --JSONL格式与
@modelcontextprotocol/server-memory用于进口/出口 - 引导式自主 --内置指令告诉代理保存什么(不保存什么)
- 可扩展 --通过实现添加自定义后端
StorageAdapterABC
快速开始
1.安装
pip install mcp-nexmem或者使用数据库后端:
pip install "mcp-nexmem[mongodb]" # MongoDB
pip install "mcp-nexmem[postgres]" # PostgreSQL
pip install "mcp-nexmem[redis]" # Redis
pip install "mcp-nexmem[all]" # All backends2.配置
添加到您的 ~/.cursor/mcp.json:
{
"mcpServers": {
"nexmem": {
"command": "nexmem-mcp",
"env": {
"NEXMEM_MODE": "self"
}
}
}
}3.重新启动IDE
就是这样。代理现在有持久内存。
交互式设置
有关为您生成配置的指导设置:
nexmem-mcp init或者运行安装脚本:
bash scripts/install.sh配置参考
所有配置都是通过环境变量(前缀: NEXMEM_):
| 变量 | 默认值 | 描述 |
|---|---|---|
NEXMEM_MODE | self | self 为了个人记忆, team 为共享 |
NEXMEM_USER_NAME | 操作系统用户名 | 您的身份 |
NEXMEM_TEAM_NAME | *(团队要求)* | 团队标识符 |
NEXMEM_BACKEND | jsonl | jsonl / sqlite / mongodb / postgres / redis |
NEXMEM_READ_ONLY | false | 禁用写入工具 |
NEXMEM_INSTRUCTIONS | *(内置)* | 自定义指令文件路径或内联文本 |
后端特定变量
| 变量 | 默认值 |
|---|---|
NEXMEM_JSONL_PATH | ~/.nexmem/memory.jsonl |
NEXMEM_SQLITE_PATH | ~/.nexmem/memory.db |
NEXMEM_MONGODB_URI | mongodb://localhost:27017/nexmem |
NEXMEM_POSTGRES_URI | postgresql://localhost:5432/nexmem |
NEXMEM_REDIS_URL | redis://localhost:6379/0 |
命名空间:数据隔离的工作原理
NEXMEM_TEAM_NAME 和 NEXMEM_USER_NAME 控制哪个 命名空间 您的数据存储在下。命名空间在同一数据库中提供完全的数据隔离。
| Config | 命名空间 | 谁可以查看数据 |
|---|---|---|
MODE=self, USER_NAME=alice | self:alice | 只有爱丽丝 |
MODE=self, USER_NAME=bob | self:bob | 只有鲍勃 |
MODE=team, TEAM_NAME=platform-eng | team:platform-eng | 每个人都有相同的团队名称 |
MODE=team, TEAM_NAME=frontend | team:frontend | 不同的团队,单独的图表 |
每个实体和关系都用数据库中的命名空间标记:
{ "namespace": "team:platform-eng", "name": "AuthService", "entity_type": "service", ... }- 在团队模式下,
NEXMEM_TEAM_NAME确定命名空间。所有设置相同团队名称的团队成员共享一个知识图。 - 在自我模式下,
NEXMEM_USER_NAME确定命名空间。每个用户都有一个私有图。 - 多个团队可以共享同一个数据库——他们的数据由名称空间隔离。
- 切换模式不会删除数据。两者
self:alice和team:platform-eng可以共存。
为什么团队共享?
如果没有共享内存,团队中的每个代理都会独立工作。爱丽丝的经纪人花了20分钟追踪 PaymentService 对请求进行身份验证,然后Bob的代理在第二天执行完全相同的工作。新员工的经纪人从头开始重新发现每一个建筑决策。知识被锁在单独的会话中,并在对话结束时消失。
当NexMem处于团队模式时,这个循环就会打破:
之前 --每个开发人员的代理在每个会话中都从零开始。同样的服务、模式和陷阱一次又一次地被重新发现。上车很慢。部落知识存在于代理无法阅读的Slack线程和过时的维基页面中。
之后 --一名特工发现 PaymentService 使用gRPC并依赖于 AuthService几秒钟后,每个团队成员的经纪人都知道了。新员工的代理在第一天就已经了解了团队花费数月时间积累的架构、命名约定和不明显的配置细节。
这种情况发生在 零额外努力 --代理读取和写入共享图是其工作流程的自然组成部分。没有人需要记住“保存到内存”或手动维护文档。知识图随着团队的工作而有机增长,并保持最新状态,因为它是由实际接触代码的代理编写的。
团队组建
步骤1:提供共享数据库
选择一个你的团队都能访问的数据库。
选项A:MongoDB Atlas(推荐,提供免费层)
- 注册地址: mongodb.com/atlas 并创建免费M0集群
- 创建数据库用户并将网络访问设置为
0.0.0.0/0(允许所有IP) - 单击连接>驱动程序>复制连接字符串
- 将其用作
NEXMEM_MONGODB_URI(附加/nexmem作为数据库名称)
选项B:本地Docker(用于测试)
docker compose --profile mongodb up -d步骤2:共享配置
每个团队成员都将此添加到他们的 ~/.cursor/mcp.json:
{
"mcpServers": {
"nexmem": {
"command": "nexmem-mcp",
"env": {
"NEXMEM_MODE": "team",
"NEXMEM_TEAM_NAME": "platform-eng",
"NEXMEM_BACKEND": "mongodb",
"NEXMEM_MONGODB_URI": "mongodb://shared-host:27017/nexmem"
}
}
}
}第三步:正常工作
代理将主动对共享知识图进行读写操作。当爱丽丝的经纪人发现 PaymentService 使用gRPC,Bob的代理也会立即知道,无需手动同步。
运作原理
数据模型
NexMem存储了一个包含两种记录的知识图:
实体 --代理知道的事情(服务、仓库、API等):
{"type":"entity","name":"PaymentAPI","entityType":"service","observations":["Uses gRPC","Handles billing"]}关系 --实体之间的连接:
{"type":"relation","from":"PaymentAPI","to":"AuthService","relationType":"depends_on"}工具
服务器公开了11个MCP工具:
| 工具 | 说明 |
|---|---|
read_graph | 阅读整个知识图谱 |
search_nodes | 按名称、类型或观察值搜索实体 |
open_nodes | 按名称获取特定实体 |
create_entities | 创建新实体 |
create_relations | 在实体之间创建关系 |
add_observations | 向现有实体添加观察结果 |
delete_entities | 删除实体及其关系 |
delete_observations | 删除具体观察结果 |
delete_relations | 删除特定关系 |
get_memory_status | 显示当前配置、模式和运行状况 |
import_jsonl | 从上游服务器内存格式导入 |
代理行为
服务器包括指导代理的内置指令:
- 自动读取 --在相关任务开始时搜索内存
- 主动写作 --无需询问即可保存有用的发现(服务、模式、决策)
- 抖动噪音 --不会保存琐碎或临时的信息
您可以通过以下方式自定义此行为 NEXMEM_INSTRUCTIONS.
冲突安全
与基于文件的加载方法不同→ 修改→ 覆盖(导致竞争条件),NexMem使用 原子数据库操作:
create_entities→INSERT ... ON CONFLICT DO NOTHINGadd_observations→ 原子阵列附加delete_entities→ 按名称进行原子删除
两名团队成员同时写作,两人都成功了,没有相互覆盖。
存储后端
Jsonl(默认)
零依赖。商店1 .jsonl 中每个命名空间的文件 ~/.nexmem/。为了安全起见,使用文件锁定。最适合自我模式。
SQLite
零额外依赖(使用stdlib)。存储单个 .db 带有适当表和索引的文件。使用WAL模式和交易。适合轻量级本地使用。
MongoDB
安装: pip install "mcp-nexmem[mongodb]"
推荐给团队。文档模型很自然。用途 insertMany(ordered=false) 因为幂等创建, $push 用于原子观测。
PostgreSQL
安装: pip install "mcp-nexmem[postgres]"
使用JSONB列进行观察。 INSERT ... ON CONFLICT DO NOTHING 用于安全的并发写入。通过asyncpg实现连接池。
瑞迪斯
安装: pip install "mcp-nexmem[redis]"
将实体存储为哈希字段,将关系存储为集合成员。快速阅读。 HSETNX 原子创造。
自定义适配器
实施 StorageAdapter ABC并注册:
from nexmem_mcp.adapters import register_adapter
from nexmem_mcp.adapters.base import StorageAdapter
@register_adapter("dynamodb")
class DynamoDBAdapter(StorageAdapter):
...导入现有数据
如果您有来自的JSONL文件 @modelcontextprotocol/server-memory 或其他MCP内存服务器使用 import_jsonl 工具:
"Import this data into memory:
"或者通过编程,代理可以调用 import_jsonl(jsonl_content="...").
码头工人
数据库后端
docker compose --profile mongodb up -d # MongoDB on :27017
docker compose --profile postgres up -d # PostgreSQL on :5432
docker compose --profile redis up -d # Redis on :6379在Docker中运行服务器
docker build --target all -t nexmem-mcp .
docker run -e NEXMEM_MODE=team -e NEXMEM_BACKEND=mongodb \
-e NEXMEM_MONGODB_URI=mongodb://host:27017/nexmem nexmem-mcp发展
git clone https://github.com/arpanroy41/nexmem-mcp.git
cd nexmem-mcp
pip install -e ".[dev]"
pytest许可证
麻省理工学院
