☰
当Cursor和Claude code拥有了记忆!用Graphiti MCP Server搭建时序知识图谱,代码规范与Bug修复历史永久保存
2026/9/27 18:16:00 网站建设 项目流程

1. 为什么你的 AI 编程助手总是“失忆”

用 Cursor 或者 Claude Code 写代码的人,大概率都经历过这种循环:今天跟它讲清楚“这个项目统一用 zod 做运行时校验,不要用 yup”,明天开个新会话,它又给你生成一堆 yup 的 schema。上周刚修完的那个“Next.js 图片组件在 Safari 下不显示”的坑,这周换个页面又踩一遍。你不得不把同样的规范、同样的背景、同样的历史决策,一遍又一遍地重新喂给它。

这不是模型笨,是它没有跨会话的长期记忆。每次对话对它来说都是全新的开始,上下文窗口一关,之前聊过的全部归零。传统的做法是把项目规范写进.cursorrules或者CLAUDE.md,但这类文件是静态的、手写的、不会自己生长的。你修了一个 bug,它不会自动记住“这个坑踩过、原因是这个、解法是那个”。下次遇到相似问题,AI 依然从零推理。

Graphiti MCP Server 想解决的就是这件事。它是一个基于时序知识图谱的记忆服务,通过 MCP 协议接入 Cursor 和 Claude Code,把你们的交互、代码规范、Bug 修复历史存成“episode”,自动抽取实体和关系,构建一张会随时间增长的知识图谱。之后 AI 在动手之前,可以先查这张图:有没有相关的偏好、程序、历史事实。有,就照着来;没有,再推理。

适合谁用:长期维护同一批项目、有明确团队规范、Bug 修复经验需要沉淀的开发者。如果你只是偶尔写个脚本,可能感知不强;但如果你每天和 Cursor 泡在一起,这套东西的价值会随着使用时间线性上升。

下面我把从零到跑通的完整流程拆开讲,包括 Neo4j 起库、Graphiti MCP Server 配置、Cursor 和 Claude Code 两端的接入、以及验证记忆是否真的生效的动作。

2. 前置准备:Neo4j、Python 环境与 TaoToken 接入

Graphiti 的存储后端是 Neo4j,一个图数据库。你可以理解成:普通数据库存的是表格,Neo4j 存的是“节点”和“边”。Graphiti 把每次交互抽成实体(节点)和关系(边),时间戳挂在边上,所以它能回答“三个月前我定的规范是什么”这种带时间维度的问题。

环境要求不复杂:Python 3.10 以上、Docker、Docker Compose、Neo4j 5.26 以上。包管理推荐用 uv,比 pip 快很多。

# 安装 uv curl -LsSf https://astral.sh/uv/install.sh | sh # 克隆 Graphiti 仓库 git clone https://github.com/getzep/graphiti.git cd graphiti/mcp_server uv sync

Neo4j 直接用 Docker 起最省事,避免本地装一堆依赖:

docker run -d \ --name graphiti-neo4j \ -p 7474:7474 -p 7687:7687 \ -e NEO4J_AUTH=neo4j/graphiti123! \ neo4j:5.26

起来之后浏览器打开http://localhost:7474,用neo4j / graphiti123!登录,能看到 Neo4j Browser 就说明库正常。7474 是 HTTP 管理端口,7687 是 Bolt 协议端口,MCP Server 连的是 7687。

接下来是模型 API。Graphiti 在抽取实体和关系时需要调用 LLM,所以你得给它一个可用的 API Key 和模型名。这里我用 TaoToken 的接口,它兼容 OpenAI 的调用格式,配置起来不用改代码,只换 base_url 和 key 就行。

先去控制台拿一个 API Key:

控制台入口:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=

拿到 key 之后,在graphiti/mcp_server目录下复制环境变量文件:

cp .env.example .env

编辑.env,填入 Neo4j 连接信息和模型配置:

NEO4J_URI=bolt://localhost:7687 NEO4J_USER=neo4j NEO4J_PASSWORD=graphiti123! OPENAI_API_KEY=你的TaoToken密钥 OPENAI_BASE_URL=https://taotoken.net/api MODEL_NAME=gpt-4.1-mini

注意OPENAI_BASE_URL指向 TaoToken 的 API 地址,末尾不要带斜杠。模型名按你实际可用的填,gpt-4.1-mini这类小模型在实体抽取任务上够用,成本也低。

3. 可复制的 MCP Server 配置骨架

Graphiti MCP Server 支持两种传输方式:stdio 和 SSE。stdio 适合本地单机,Cursor 和 Claude Code 都能直接拉起进程;SSE 适合你想让多个客户端共享一个常驻服务的情况。我先把两种配置都给出来,你按需选。

3.1 stdio 方式:Cursor 配置

在 Cursor 里,MCP 配置放在~/.cursor/mcp.json(全局)或项目下的.cursor/mcp.json。stdio 方式的关键是command指向 uv 的绝对路径,args里指定工作目录和启动脚本。

{ "mcpServers": { "graphiti-memory": { "transport": "stdio", "command": "/Users/你的用户名/.local/bin/uv", "args": [ "run", "--isolated", "--directory", "/Users/你的用户名/graphiti/mcp_server", "--project", ".", "graphiti_mcp_server.py", "--transport", "stdio" ], "env": { "NEO4J_URI": "bolt://localhost:7687", "NEO4J_USER": "neo4j", "NEO4J_PASSWORD": "graphiti123!", "OPENAI_API_KEY": "你的TaoToken密钥", "OPENAI_BASE_URL": "https://taotoken.net/api", "MODEL_NAME": "gpt-4.1-mini" } } } }

两个路径要改成你自己的:command里的 uv 路径用which uv查,--directory用pwd在graphiti/mcp_server目录下查。路径写错是 stdio 方式最常见的失败原因,Cursor 不会给你友好提示,只会静默连不上。

3.2 stdio 方式:Claude Code 配置

Claude Code 用命令行添加 MCP,一条命令搞定:

claude mcp add-json graphiti-memory '{ "type": "stdio", "command": "/Users/你的用户名/.local/bin/uv", "args": [ "run", "--isolated", "--directory", "/Users/你的用户名/graphiti/mcp_server", "--project", ".", "graphiti_mcp_server.py", "--transport", "stdio" ], "env": { "NEO4J_URI": "bolt://localhost:7687", "NEO4J_USER": "neo4j", "NEO4J_PASSWORD": "graphiti123!", "OPENAI_API_KEY": "你的TaoToken密钥", "OPENAI_BASE_URL": "https://taotoken.net/api", "MODEL_NAME": "gpt-4.1-mini" } }'

加完之后用claude mcp list确认graphiti-memory在列表里。

3.3 SSE 方式:常驻服务 + 多客户端共享

如果你想让 Cursor 和 Claude Code 同时连同一个记忆库,SSE 更合适。先手动起服务:

cd graphiti/mcp_server uv run graphiti_mcp_server.py --model gpt-4.1-mini --transport sse

服务默认监听 8000 端口,SSE 端点是http://localhost:8000/sse。然后 Cursor 配置改成:

{ "mcpServers": { "graphiti-memory": { "transport": "sse", "url": "http://localhost:8000/sse" } } }

Claude Code 对应命令:

claude mcp add --transport sse --scope user graphiti-memory http://localhost:8000/sse

--scope user表示对所有项目生效,不加则只对当前项目生效。

4. 验证请求:让记忆真的跑起来

配置写完不代表能用,得验证。分三步:先确认 MCP 工具被识别,再写入一条记忆,最后跨会话读出来。

4.1 确认工具列表

在 Cursor 里打开设置,找到 MCP 面板,看graphiti-memory是否显示为绿色已连接。点开应该能看到它暴露的工具,包括add_episode、search_nodes、search_facts等。如果显示红色或灰色,先去看第 5 节的排查。

Claude Code 里用:

claude mcp list

看到graphiti-memory后面是 connected 即可。

4.2 写入第一条记忆

在 Cursor 的对话里直接说:

请帮我记住:这个项目统一使用 zod 做运行时校验,禁止使用 yup。

AI 应该会调用add_episode工具,把这条信息存进图谱。你可以去 Neo4j Browser 里跑一句 Cypher 确认:

MATCH (n) RETURN n LIMIT 25

应该能看到新生成的节点,类型可能是Preference或Procedure,具体取决于 Graphiti 的抽取结果。

4.3 跨会话读取

关掉当前对话,新开一个会话,问:

这个项目用什么做运行时校验?

如果配置正确,AI 会先调用search_nodes或search_facts,然后回答“zod”。这一步是整个方案的核心价值验证——它证明记忆真的跨会话持久化了,而不是靠当前上下文窗口撑着。

4.4 用 Cursor Rules 强化行为

光有工具还不够,你得告诉 AI 什么时候该查、什么时候该存。在项目根目录建.cursor/rules/graphiti.mdc,写入行为指令:

--- description: Graphiti 记忆使用规范 globs: alwaysApply: true --- ## 开始任务前 - 先用 search_nodes 查找相关偏好和程序 - 用 search_facts 查找相关事实关系 - 按实体类型过滤,优先看 Preference 和 Procedure ## 发现新信息时 - 用户表达偏好或需求,立即用 add_episode 存储 - 长需求拆成短逻辑块分别存 - 更新已有知识时明确标注是更新 ## 工作过程中 - 遵循检索到的偏好 - 严格按检索到的程序执行 - 与历史事实保持一致

这段规则的作用是让 AI 形成“先查后做、边做边存”的习惯。没有它,AI 可能整场对话都不碰记忆工具。

5. 本篇常见错排查

配置过程中最容易卡住的几个点,我按出现频率排一下。

MCP 显示未连接,日志里报command not found。九成是command里的 uv 路径写错了。stdio 方式下 Cursor 不会继承你 shell 的 PATH,必须写绝对路径。用which uv查出来填进去。同理--directory也必须是绝对路径。

Neo4j 连接被拒。检查三件事:容器是否在跑(docker ps)、端口是否映射正确(7687 是 Bolt,不是 7474)、密码是否和NEO4J_AUTH一致。如果之前用别的密码起过容器,得删掉重建,Neo4j 的密码只在首次初始化时生效。

调用工具时报模型相关错误。多半是OPENAI_BASE_URL或OPENAI_API_KEY的问题。确认 base_url 是https://taotoken.net/api,末尾无斜杠;确认 key 没有多余空格。如果模型名填错,也会报 404 之类的错误,换成你账号下确实可用的模型。

记忆写进去了但搜不出来。Graphiti 的检索是语义 + 关键词混合的,刚写入的 episode 需要一点时间做索引。如果立刻搜不到,等十几秒再试。另外确认group_id是否一致——如果你在多项目间切换,不同 group_id 的数据是隔离的,搜不到可能是搜错了分组。

SSE 方式下 Cursor 连不上。确认服务确实在跑,且监听的是 8000 端口。如果 8000 被占用,启动时加--port换一个,同时改 Cursor 配置里的 url。SSE 方式下服务必须先起,再开 Cursor,顺序反了会连不上。

Claude Code 里工具不出现。用claude mcp list看状态。如果是 failed,用claude mcp get graphiti-memory看详细错误。常见原因是 JSON 格式在 shell 里被转义搞坏了,建议把 JSON 写进文件再用claude mcp add-json graphiti-memory "$(cat config.json)"的方式加。

6. 把记忆变成习惯:接入文档与长期编码方案

跑通之后,真正决定这套东西价值的不是配置,而是你愿不愿意持续往里存、持续从里查。我的做法是把它嵌进日常节奏:每次修完一个非平凡的 bug,顺手让 AI 存一条“问题—原因—解法”的 episode;每次定下一个新规范,立刻存成 Preference;每次开始新任务前,先让它搜一遍相关记忆。

如果你还在选模型和配 key 的阶段,可以先去模型对话页面试试接口通不通:

模型对话:https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=

需要管理多个项目的 key、或者给团队分配额度,在控制台的 API Keys 页面操作:

API Keys:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=

如果你打算把 Cursor、Claude Code 这类工具长期用于编码和 Agent 任务,Coding Plan 比按量计费更划算,适合高频调用:

Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=

接入过程中遇到协议或参数问题,文档里有完整的接口说明:

接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=

Claude Code 用户如果走 Anthropic 兼容通道,参考这个页面:

ClaudeCodeAnthropic:https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=

最后说一个我自己的使用细节:Graphiti 的add_episode支持把长文本拆成短块存,我一般会把一次完整的 bug 修复拆成三条——现象、根因、解法。这样后续检索时命中率更高,因为每条 episode 的语义更聚焦。存的时候带上项目名和模块名作为标签,搜的时候用center_node_uuid围绕某个核心节点扩散,能快速拉出一整片相关记忆。这套习惯坚持两周左右,你会明显感觉到 AI 开始“记得住事”了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询