mem0 mcp自托管
自托管 mem0 Claude Code的MCP服务器。针对自托管的Qdrant+Neo4j+Ollama运行一个完整的内存服务器,您可以选择Anthropic(Claude)或Ollama作为主要的LLM。
使用 mem0ai 直接作为库的包,支持Claude的OAT令牌和完全本地的Ollama设置,并公开了11个MCP工具用于完全内存管理。
先决条件
| 服务 | 必需 | 目的 |
|---|---|---|
| Qdrant | 是 | 矢量内存存储和搜索 |
| 奥拉玛 | 是 | 嵌入生成(bge-m3)以及可选的本地LLM |
| Neo4j 5+ | 可选 | 知识图(实体关系) |
| Google API密钥 | 可选 | 仅适用于 gemini/gemini_split 图形提供者 |
Python>=3.10和 紫外线.
身份验证: 默认设置使用Claude(Anthropic)作为事实提取的LLM。不需要API密钥,服务器会自动使用您的ClaudeCode会话令牌。对于完全本地设置,请设置 MEM0_PROVIDER=ollama。参见 认证 高级选项。快速开始
默认值(人为)
全局添加MCP服务器(可在所有项目中使用):
claude mcp add --scope user --transport stdio mem0 \
--env MEM0_USER_ID=your-user-id \
-- uvx --from git+https://github.com/elvismdev/mem0-mcp-selfhosted.git mem0-mcp-selfhosted所有默认设置都是开箱即用的:Qdrant on localhost:6333Ollama嵌入 localhost:11434 随着 bge-m3 (1024调暗)。通过以下方式覆盖任何默认值 --env (参见 配置).
uvx 在隔离环境中自动下载、安装和运行服务器,无需手动安装。当MCP连接开始时,Claude Code会按需启动它。
服务器自动从以下位置读取OAT令牌 ~/.claude/.credentials.json,无需手动配置令牌。
完全本地化(Ollama)
对于没有云依赖的完全本地设置,请将Ollama用于主要的LLM和嵌入:
claude mcp add --scope user --transport stdio mem0 \
--env MEM0_PROVIDER=ollama \
--env MEM0_LLM_MODEL=qwen3:14b \
--env MEM0_USER_ID=your-user-id \
-- uvx --from git+https://github.com/elvismdev/mem0-mcp-selfhosted.git mem0-mcp-selfhostedMEM0_PROVIDER=ollama 级联到主要的LLM和图LLM提供商。相同的基础设施默认值适用(Qdrant on localhost:6333, bge-m3 嵌入)。按服务覆盖(例如。 MEM0_LLM_URL, MEM0_EMBED_URL)在需要时仍然工作。
或者通过创建将其添加到单个项目中 .mcp.json 在项目根目录中:
{
"mcpServers": {
"mem0": {
"command": "uvx",
"args": ["--from", "git+https://github.com/elvismdev/mem0-mcp-selfhosted.git", "mem0-mcp-selfhosted"],
"env": {
"MEM0_PROVIDER": "ollama",
"MEM0_LLM_MODEL": "qwen3:14b",
"MEM0_USER_ID": "your-user-id"
}
}
}
}试试看
重新启动克劳德代码,然后:
> Search my memories for TypeScript preferences
> Remember that I prefer Hatch for Python packaging
> Show me all entities in my knowledge graphCLAUDE.md集成
将这些规则添加到项目的 CLAUDE.md (或 ~/.claude/CLAUDE.md 全局使用),因此Claude Code在整个会话中主动使用内存工具:
# MCP Servers
- **mem0**: Persistent memory across sessions. At the start of each session, `search_memories` for relevant context before asking the user to re-explain anything. Use `add_memory` whenever you discover project architecture, coding conventions, debugging insights, key decisions, or user preferences. Use `update_memory` when prior context changes. Save information like: "This project uses PostgreSQL with Prisma", "Tests run with pytest -v", "Auth uses JWT validated in middleware". When in doubt, save it, future sessions benefit from over-remembering.这为Claude Code提供了在会话期间主动搜索和保存记忆的行为指令。为了获得最佳效果,请结合 克劳德代码挂钩,CLAUDE.md规则告诉克劳德 *如何使用* 内存工具在会话中期,而钩子处理 *自动的* 在会话边界进行注入和保存。
克劳德代码挂钩
会话挂钩在会话边界自动调用内存,在启动时注入内存,并在退出时保存摘要。这会自动发生,无需手动调用工具。
| Hook | 事件 | 它的作用 |
|---|---|---|
mem0-hook-context | 会话开始(startup, compact) | 在mem0中搜索与项目相关的内存,并将其作为 additionalContext |
mem0-hook-stop | 停止 | 从成绩单中读取最后~3次用户/助理交流,并通过以下方式将摘要保存到mem0 infer=True |
这两个钩子都是非致命的,如果mem0不可访问或发生任何错误,Claude代码将正常继续。
安装
在项目中安装挂钩:
mem0-install-hooks或全局安装(所有项目):
mem0-install-hooks --global这将钩子条目添加到 .claude/settings.json安装程序是幂等的,运行两次不会创建重复项。
运作原理
会话开始时,上下文挂钩使用两个查询(项目架构+最近会话摘要)搜索mem0,按内存ID进行重复数据消除,并将结果格式化为 # mem0 Cross-Session Memory 头球这些是通过钩子注射的 additionalContext 响应字段。
会话停止,stop钩子读取JSONL转录,提取最后6条用户/助理消息(通过有界双端队列的滑动窗口),构建摘要提示,并调用 memory.add(infer=True) 提取原子事实。在钩子中强制禁用Graph,以保持在15s/30s的超时预算内。
入口点
| 命令 | 功能 | 已注册 pyproject.toml |
|---|---|---|
mem0-hook-context | hooks:context_main | 会话启动挂钩 |
mem0-hook-stop | hooks:stop_main | 止动钩 |
mem0-install-hooks | hooks:install_main | CLI安装程序 |
挂钩+CLAUDE.md
Hooks和CLAUDE.md是互补的层,可以最好地协同工作:
| 层 | 角色 | 何时 |
|---|---|---|
| 钩子 | 自动数据流,启动时注入存储的内存,退出时保存会话摘要 | 会话边界(启动/停止) |
| CLAUDE.md | 行为指导,告诉克劳德在会话期间积极搜索和保存记忆 | 整个会话 |
仅钩子就可以让你被动回忆(记忆在启动时出现)和被动保存(摘要在退出时保存)。CLAUDE.md指令添加了活动的会话中期行为,CLAUDE在遇到新主题时搜索相关记忆,并立即保存重要发现,而不是等待会话结束。
为了获得最佳体验,请同时使用两者。钩子确保内存在会话边界自动流入和流出,而CLAUDE.md确保CLAUDE在会话期间积极使用内存工具。
认证
服务器使用优先级回退链解析Anthropic令牌:
| 优先级 | 来源 | 详细信息 |
|---|---|---|
| 1 | MEM0_ANTHROPIC_TOKEN env var | 显式,用户控制 |
| 2 | ~/.claude/.credentials.json | 自动读取Claude Code的OAT令牌(零配置) |
| 3 | ANTHROPIC_API_KEY env var | 标准付费每次使用API密钥 |
| 4 | 禁用 | 警告并禁用Anthropic LLM功能 |
在Claude Code中,优先级2总是获胜,只要您登录,凭据文件就存在。这意味着 ANTHROPIC_API_KEY (优先级3)从未达到。要覆盖Claude代码中的OAT令牌,请使用 MEM0_ANTHROPIC_TOKEN (优先级1)。 ANTHROPIC_API_KEY 仅适用于非Claude Code部署(Docker、CI、独立)。
OAT令牌 (sk-ant-oat...)使用您的Claude订阅。服务器会自动检测令牌类型并相应地配置SDK。OAT令牌在到期前会自动刷新:服务器会主动检查令牌的生命周期,并在接近到期时(默认值:30分钟)通过Anthropic OAuth端点进行刷新。在身份验证失败时,会启动一个三步防御策略,利用Claude Code的凭据文件,通过OAuth进行自我刷新,然后等待重试,因此长时间运行的会话可以无缝地在令牌轮换中生存。
API密钥 (sk-ant-api...)使用标准的按使用付费计费。
工具
内存工具(9核)
| 工具 | 说明 |
|---|---|
add_memory | 将文本或对话历史记录存储为记忆。支持 enable_graph, infer, metadata. |
search_memories | 语义搜索,可选 filters, threshold, rerank, enable_graph. |
get_memories | 列出/过滤内存(非搜索)。支持 limit 以及范围过滤器。 |
get_memory | 通过UUID获取单个内存。 |
update_memory | 替换内存文本。在Qdrant中重新嵌入和重新索引。 |
delete_memory | 按UUID删除单个内存。 |
delete_all_memories | 批量删除作用域中的所有内存。 |
list_entities | 列出具有内存计数的用户/代理/运行。使用Qdrant Facet API。 |
delete_entities | 级联删除一个实体及其所有记忆。 |
图形工具
| 工具 | 说明 |
|---|---|
search_graph | 按名称子字符串搜索Neo4j实体。返回实体+传出关系。 |
get_entity | 获取实体的所有关系(双向:传入+传出)。 |
提示
服务器注册了一个 memory_assistant MCP提示为Claude提供了有效使用内存工具的快速入门指南。
参数
所有工具都使用Pydantic Annotated[type, Field(description=...)] 用于自文档化参数模式。常见模式:
user_id默认为MEM0_USER_ID未提供env-var时enable_graph覆盖默认值MEM0_ENABLE_GRAPH每次呼叫filters支持结构化运算符:{"key": {"eq": "value"}},{"AND": [...]}- 所有响应都是JSON字符串,通过
json.dumps(result, ensure_ascii=False)
配置
所有配置都是通过环境变量进行的。创建一个 .env 文件或在MCP配置中设置它们。
认证
| 变量 | 默认值 | 描述 |
|---|---|---|
MEM0_ANTHROPIC_TOKEN | -- | Anthropic OAT或API令牌(优先级1) |
ANTHROPIC_API_KEY | -- | 标准无烟煤API密钥(优先级3) |
MEM0_OAT_HEADERS | auto | OAT标识标头: auto 或 none |
MEM0_OAT_REFRESH_THRESHOLD_SECONDS | 1800 | 到期前几秒触发主动OAT令牌刷新 |
LLM
| 变量 | 默认值 | 描述 |
|---|---|---|
MEM0_PROVIDER | anthropic | 顶级供应商(anthropic 或 ollama).级联到 MEM0_LLM_PROVIDER 和 MEM0_GRAPH_LLM_PROVIDER 当这些未设置时。是否 不 影响 MEM0_EMBED_PROVIDER. |
MEM0_LLM_PROVIDER | _(成员_供应商)_ | 主要法学硕士提供者: anthropic 或 ollama.继承自 MEM0_PROVIDER 当未设置时。 |
MEM0_OLLAMA_URL | http://localhost:11434 | 共享Ollama基本URL。级联到 MEM0_LLM_URL, MEM0_EMBED_URL,以及 MEM0_GRAPH_LLM_URL 当这些未设置时。 |
MEM0_LLM_MODEL | _(每个供应商)_ | 所选LLM提供程序的模型。默认为 claude-opus-4-6 对于Anthropic来说, qwen3:14b 对于Ollama |
MEM0_LLM_URL | _(级联)_ | Ollama主LLM的基本URL。级联: MEM0_LLM_URL → MEM0_OLLAMA_URL → http://localhost:11434仅在以下情况下使用 MEM0_LLM_PROVIDER=ollama |
MEM0_LLM_MAX_TOKENS | 16384 | LLM响应的最大令牌数(仅适用于Anthropic) |
MEM0_GRAPH_LLM_PROVIDER | _(成员_供应商)_ | Graph LLM提供程序(anthropic, anthropic_oat, ollama, gemini, gemini_split).继承自 MEM0_PROVIDER 当未设置时。 |
MEM0_GRAPH_LLM_URL | _(级联)_ | 图LLM的Ollama基本URL。级联: MEM0_GRAPH_LLM_URL → MEM0_LLM_URL → MEM0_OLLAMA_URL → http://localhost:11434 |
MEM0_GRAPH_LLM_MODEL | _(变化)_ | 图形模型。继承 MEM0_LLM_MODEL 用于人/胶原蛋白;默认为 gemini-2.5-flash-lite 双子座/双子座分裂 |
GOOGLE_API_KEY | -- | Google API密钥(对于 gemini/gemini_split 图形提供者) |
MEM0_GRAPH_CONTRADICTION_LLM_PROVIDER | anthropic | LLM提供者在 gemini_split 模式(anthropic, anthropic_oat, ollama) |
MEM0_GRAPH_CONTRADICTION_LLM_MODEL | _(供应商知道)_ | 矛盾模型 gemini_split 模式。默认为 claude-opus-4-6 为了 anthropic/anthropic_oat 提供者;继承 MEM0_LLM_MODEL 对于其他人。 |
MEM0_OLLAMA_KEEP_ALIVE | 30m | Ollama在调用之间将模型保持在VRAM中多长时间(例如。, 1h, 5m).防止在多调用图管道期间卸载模型 |
MEM0_OLLAMA_THINK | false | 设置为 true 重新启用qwen3思维模式(默认禁用以防止 ` + format:"json"` 碰撞) |
嵌入器
| 变量 | 默认值 | 描述 |
|---|---|---|
MEM0_EMBED_PROVIDER | ollama | 嵌入提供者(ollama 或 openai) |
MEM0_EMBED_MODEL | bge-m3 | 嵌入模型名称 |
MEM0_EMBED_URL | _(级联)_ | Ollama嵌入URL。级联: MEM0_EMBED_URL → MEM0_OLLAMA_URL → http://localhost:11434 |
MEM0_EMBED_DIMS | 1024 | 嵌入向量维度 |
矢量存储(Qdrant)
| 变量 | 默认值 | 描述 |
|---|---|---|
MEM0_QDRANT_URL | http://localhost:6333 | Qdrant REST API URL |
MEM0_QDRANT_API_KEY | -- | Qdrant API密钥(用于Qdrant Cloud) |
MEM0_QDRANT_ON_DISK | false | 将矢量存储在磁盘上(减少RAM,搜索速度较慢) |
MEM0_QDRANT_TIMEOUT | _(客户端默认)_ | Qdrant REST API超时(以秒为单位)(例如。, 30).只有当你击中时才设置 ReadTimeout 在收集操作期间 |
MEM0_COLLECTION | mem0_mcp_selfhosted | Qdrant集合名称 |
图形库(Neo4j)
| 变量 | 默认值 | 描述 |
|---|---|---|
MEM0_ENABLE_GRAPH | false | 启用图形内存(实体提取到Neo4j) |
MEM0_NEO4J_URL | bolt://127.0.0.1:7687 | Neo4j螺栓端点 |
MEM0_NEO4J_USER | neo4j | Neo4j用户名 |
MEM0_NEO4J_PASSWORD | mem0graph | Neo4j密码 |
MEM0_NEO4J_DATABASE | -- | Neo4j数据库名称(多数据库设置) |
MEM0_NEO4J_BASE_LABEL | -- | 用于节点类型分组的自定义Neo4j基本标签 |
MEM0_GRAPH_THRESHOLD | 0.7 | 嵌入相似度阈值进行节点匹配 |
服务器
| 变量 | 默认值 | 描述 |
|---|---|---|
MEM0_TRANSPORT | stdio | 运输: stdio, sse,或 streamable-http |
MEM0_HOST | 0.0.0.0 | SSE/HTTP传输主机 |
MEM0_PORT | 8081 | SSE/HTTP传输端口 |
MEM0_USER_ID | user | 内存作用域的默认用户ID |
MEM0_LOG_LEVEL | INFO | 日志记录级别(DEBUG, INFO, WARNING, ERROR) |
MEM0_HISTORY_DB_PATH | -- | 内存更改历史的SQLite路径 |
建筑
Claude Code
|
├── MCP stdio/SSE/streamable-http
│ |
│ ├── env.py ← Centralized env var readers (whitespace-safe)
│ ├── auth.py ← Hybrid token fallback chain + OAT self-refresh
│ ├── llm_anthropic.py ← Custom Anthropic LLM provider (OAT + structured outputs)
│ ├── llm_ollama.py ← Custom Ollama LLM provider (restored tool-calling)
│ ├── config.py ← Env vars → MemoryConfig dict (provider + URL cascades)
│ ├── helpers.py ← Error wrapper, concurrency lock, safe bulk-delete, monkey-patches
│ ├── graph_tools.py ← Direct Neo4j Cypher queries (lazy driver)
│ ├── llm_router.py ← Split-model graph LLM router (gemini_split)
│ ├── __init__.py ← Telemetry suppression (before any mem0 import)
│ └── server.py ← FastMCP orchestrator (11 tools + prompt)
│ |
│ ├── mem0ai Memory class
│ │ ├── Vector: LLM fact extraction → Ollama embed → Qdrant
│ │ └── Graph: LLM entity extraction (tool calls) → Neo4j
│ |
│ └── Infrastructure
│ ├── Qdrant ← Vector store
│ ├── Ollama ← Embeddings
│ ├── Neo4j ← Knowledge graph (optional)
│ └── Anthropic/Ollama ← Main LLM (configurable)
|
└── Session Hooks (subprocess, not MCP)
|
└── hooks.py ← Cross-session memory (SessionStart + Stop hooks)
├── context_main() → Injects memories as additionalContext on startup/compact
├── stop_main() → Saves session summary to mem0 on exit
└── install_main() → CLI to patch .claude/settings.json图形内存和配额
图形内存为 默认情况下禁用 (MEM0_ENABLE_GRAPH=false)为了保护你的克劳德配额。每 add_memory 启用图形后,会触发3个额外的LLM调用,用于实体提取、关系生成和冲突解决。
使用Ollama进行图形操作
要消除图操作的Claude配额使用,请使用本地Ollama模型:
MEM0_ENABLE_GRAPH=true
MEM0_GRAPH_LLM_PROVIDER=ollama
MEM0_GRAPH_LLM_MODEL=qwen3:14bQwen3:14b具有0.971的工具调用F1(几乎与GPT-4的0.974匹配),并在~7-8GB的VRAM中运行,采用Q4_K_M量化。
使用Gemini进行图形操作
谷歌的Gemini 2.5 Flash Lite是图形操作最便宜的选择,同时保持了很强的实体提取准确性:
MEM0_ENABLE_GRAPH=true
MEM0_GRAPH_LLM_PROVIDER=gemini
MEM0_GRAPH_LLM_MODEL=gemini-2.5-flash-lite
GOOGLE_API_KEY=your-google-api-key使用分割模型获得最佳精度
这 gemini_split 提供程序根据操作将图形管道调用路由到不同的LLM。实体提取(调用1和2)转到Gemini以获得速度和成本;矛盾检测(呼叫3)的准确性由Claude负责。
MEM0_ENABLE_GRAPH=true
MEM0_GRAPH_LLM_PROVIDER=gemini_split
GOOGLE_API_KEY=your-google-api-key
MEM0_GRAPH_CONTRADICTION_LLM_PROVIDER=anthropic
MEM0_GRAPH_CONTRADICTION_LLM_MODEL=claude-opus-4-6248个测试用例的基准结果:Gemini在实体提取方面的得分为85.4%(Claude为79.1%),而Claude在矛盾检测方面的得分是100%(Gemini为80%)。拆分模型结合了两者的优点。
运输方式
| 模式 | 用例 | 配置 |
|---|---|---|
stdio (默认) | 克劳德代码集成 | MEM0_TRANSPORT=stdio |
sse | 传统远程客户端 | MEM0_TRANSPORT=sse |
streamable-http | 现代远程客户端 | MEM0_TRANSPORT=streamable-http |
对于远程部署,MCP SDK>=1.23.0默认启用DNS重新绑定保护。
发展
# Install with dev dependencies
pip install -e ".[dev]"
# Run unit tests
python3 -m pytest tests/unit/ -v
# Run contract tests (validates mem0ai internal API assumptions)
python3 -m pytest tests/contract/ -v
# Run integration tests (requires live Qdrant + Neo4j + Ollama)
python3 -m pytest tests/integration/ -v
# Run all tests
python3 -m pytest tests/ -v测试结构
tests/unit/--具有模拟依赖关系的纯单元测试(env、auth、config、配置矩阵、并发性、MCP协议、助手、钩子、LLM提供者、图形工具、LLM路由器、服务器)tests/contract/--验证关于mem0ai内部的假设(模式检测不变性,vector_store.client访问路径,LlmFactory注册幂等性)tests/integration/--针对真实Qdrant+Neo4j+Ollama的实时基础设施测试(内存生命周期、图操作、批量操作、钩子)。标记为@pytest.mark.integration.
合同测试捕捉到以下方面的突破性变化 mem0ai 在投入生产之前进行升级。
遥测
所有mem0ai遥测被抑制。 os.environ["MEM0_TELEMETRY"] = "false" 在包导入时间设置,早于任何时间 mem0 模块已加载。没有发送PostHog事件。
许可证
麻省理工学院
