给 DeepSeek Harness 加记忆:用 MCP 接记忆服务,也接别的 MCP 服务器
按 DeepSeek Harness 官方文档整理:它自己不带跨会话的记忆,官方给了三份默认关闭的参考配置,通过 MCP 接上第三方的记忆服务。讲清它负责什么不负责什么、三种服务怎么选怎么装、怎么验证新会话里真的记得,以及用同样的写法接任何别的 MCP 服务器。
本文根据公开分享整理,本站尚未实测。操作前请对照文末的原始来源。
DeepSeek Harness 的每个会话是各自独立的:在一个会话里告诉它的事,到另一个会话里它不知道。想让它跨会话记住东西,官方的办法是通过 MCP 接一个专门的记忆服务。
官方文档给了三份现成的参考配置,都是默认关闭的,启动时带上其中一份就能用:
dsh web --patch "/绝对路径/memorix.cordis.yml"
同样的写法也能接任何别的 MCP 服务器,本文后半部分讲。
还没装的,先看DeepSeek Harness 安装和上手。
先看清楚谁负责什么
官方文档把分工写得很明白,这决定了出问题时该去哪里查。
DeepSeek Harness 负责的:
- 读你选的那份配置;
- 启动配置里写的本地命令,或者连上配置里写的远程地址;
- 发现服务提供了哪些工具,以
mcp__服务器名__工具名的名字交给模型用。
它不负责的:
- 下载和安装记忆服务本身;
- 初始化服务的数据库;
- 替服务选模型或向量化的提供方;
- 创建云端账户、迁移数据;
- 看管一个独立运行的 HTTP 服务。
也就是说,记忆服务要你自己先装好。记不住、记错了、搜不到,多半是记忆服务那一侧的事。
官方文档还有一句声明:这三份配置只是互操作的参考,收录它们不代表 DeepSeek 的认可、推荐、合作关系或持续支持的承诺。
三种服务怎么选
| 服务 | 需要先装什么 | 特点 |
|---|---|---|
| Memorix | Node 22.18 以上,npm install --global memorix@1.3.0 |
不需要模型或向量服务也能在本地运行 |
| MCP Reference Memory | npm install --global @modelcontextprotocol/server-memory@2026.7.4 |
MCP 官方的参考实现,把内容存成本地的知识图谱 |
| Engram | Go 1.25.10 以上,go install 安装,或者下载对应版本的二进制文件 |
按 Git 项目区分记忆 |
表里的版本号是官方文档注明测试过的版本。三种都通过本地命令(stdio)连接,数据都存在你自己的电脑上。
选哪个,官方没有给建议。下面是我们按文档里的描述给的参考:
- 只想先试试效果:MCP Reference Memory 最简单,一条 npm 命令,不依赖别的。
- 它的短板官方写明了:搜索只是不区分大小写的子字符串匹配,不是按意思检索;没有自动摘要、冲突处理和遗忘策略。记的东西多了、说法不统一时会搜不到。
启用
第一步:装好记忆服务
以 MCP Reference Memory 为例:
npm install --global @modelcontextprotocol/server-memory@2026.7.4
第二步:拿到配置文件
三份配置在官方仓库的 apps/cli/config/examples/mcp-memory/ 目录下:
| 服务 | 文件名 |
|---|---|
| Memorix | memorix.cordis.yml |
| MCP Reference Memory | mcp-reference-memory.cordis.yml |
| Engram | engram.cordis.yml |
官方文档说明,路径可以指向磁盘上任何位置的一份复制文件。所以不用克隆整个仓库,把需要的那一个文件下载到本机就行。
第三步:带着它启动
dsh web --patch "/绝对路径/mcp-reference-memory.cordis.yml"
不带 --patch 启动,三种记忆就都是关着的。
想每次启动都带上
每次都写 --patch 比较麻烦。官方的办法是把那份文件里的那一段 insert 合并进你自己的配置:
| 想让它对谁生效 | 写进哪个文件 |
|---|---|
| 只对一种运行方式,比如网页界面 | ~/.dsh/profiles/web/cordis.patch.yml |
| 对这台机器上所有的运行方式 | ~/.dsh/cordis.patch.yml |
官方特意提醒:不要覆盖已有的文件,里面可能已经有别的配置。模型页上的设置就写在第一个文件里,覆盖掉等于把接好的模型也删了。要做的是把那一段加进去。
各家存在哪里
知道数据在哪,才好备份和清理:
| 服务 | 默认位置 | 怎么改 |
|---|---|---|
| Memorix | ~/.memorix/data |
启动前设 MEMORIX_DATA_DIR |
| MCP Reference Memory | ~/.dsh-mcp-reference-memory.jsonl |
启动前设 MEMORY_FILE_PATH |
| Engram | ~/.engram |
设 ENGRAM_DATA_DIR 或 ENGRAM_PROJECT |
Memorix 和 Engram 都会根据当前工作目录所在的 Git 项目来区分记忆。
记忆文件里存的是你让它记住的原话,以明文放在本机。别让它记密码、密钥这类东西。这一句是我们的提醒。
验证:新会话里真的记得吗
装上之后要验证的不是“能不能写”,而是“换一个会话还能不能想起来”。官方文档给了一套三步的验证办法,用一个独一无二的值来测,免得模型是蒙对的:
一、在会话 A 里让它记住。
Remember that my validation drink is lapsang-7k2q.
确认它调用了记忆服务的写入工具,并且工具返回成功。
二、新建会话 B,问它。 不要把会话 A 的对话复制过来。
What is my validation drink? Check memory.
确认它调用了搜索或召回的工具,并且答出了那个值。
三、继续在会话 B 里让它用上。
Use that preference to suggest one drink for the meeting.
确认回答里用到了刚才想起来的内容。
官方说明,必须新建会话,但不需要重启程序。另外有一个细节:工具的发现是异步的,发第一条测试消息之前,先等 mcp__ 开头的工具出现,不然它还没有可用的记忆工具。
它不主动用记忆怎么办
有时候模型明明有记忆工具,却不去用。官方给了一段可以加进指令里的话:
用户要求记住某事时调用记忆写入工具;历史信息可能相关时,检索记忆并使用相关结果。
把它加到你的指令文件里,比如项目的 AGENTS.md。DeepSeek Harness 读哪些指令文件,见从 Claude Code、Codex 过来。
接入其他 MCP 服务器
记忆只是 MCP 的一种用途。官方文档说明,同样的写法可以接任何 MCP 服务器,每台服务器一条配置。
本地命令(stdio)
- insert:
- id: mcp-github
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: github
transport: stdio
command: npx
args: ['-y', '@modelcontextprotocol/server-github']
env:
GITHUB_TOKEN: !!js process.env.GITHUB_TOKEN
远程服务(Streamable HTTP)
- insert:
- id: mcp-web
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: web
transport: streamable-http
url: http://localhost:3000/mcp
headers:
Authorization: !!js '`Bearer ${process.env.MCP_TOKEN}`'
字段取自官方文档里的例子,最外面那层 insert 是写进配置文件时用的格式。几个字段的意思:
| 字段 | 说明 |
|---|---|
id |
这条配置的标识,每条要不一样 |
serverName |
服务器的名字,会出现在工具名里。只能用字母、数字、下划线和连字符,最长 32 个字符,不能重名 |
transport |
stdio 或 streamable-http |
command、args、env、cwd |
stdio 用:要运行的程序、参数、额外的环境变量、工作目录 |
url、headers |
远程用:地址和额外的请求头 |
密钥不要写进配置文件
上面例子里的 !!js process.env.GITHUB_TOKEN,意思是从环境变量里读,而不是把密钥的原文写在文件里。官方文档明确要求这样做。
还有一个容易踩的地方。官方说明,stdio 方式启动子进程之前,会主动去掉环境里名字看起来像凭据的变量,以及所有 DSH_ 开头的变量。所以你 shell 里设好的某个 token,MCP 服务器默认是拿不到的,必须像例子里那样在 env 里明确写出来传给它。
工具的名字
接上之后,工具以 mcp__服务器名__工具名 的形式出现,比如 mcp__github__create_issue。两台服务器都有叫 search 的工具也不冲突,它们分别是 mcp__github__search 和 mcp__web__search。
连不上的时候
官方文档描述的行为:
- 启动时连不上:DeepSeek Harness 照常启动,只是这台服务器的工具不出现,并记一条错误。
- 用着用着断了:自动重连,间隔从半秒开始逐次加倍,最多连续试 10 次。断开期间工具还列着,但调用会失败。
- 重连次数用完:工具被注销,不再重试,直到重新加载或重启。
- 单次调用超时:默认 60 秒。
第一条值得留意:服务器没连上时不会有醒目的提示。发现工具不见了,去看日志。
常见问题
| 现象 | 原因和办法 |
|---|---|
启动后没有 mcp__ 开头的工具 |
记忆服务没装好,或者启动时没连上。看日志里的错误 |
| 第一条消息它没用记忆 | 工具的发现是异步的,等工具出现再发 |
| 新会话里想不起来 | 先确认会话 A 里写入工具返回了成功;再看是不是换了项目目录,有的服务按项目区分记忆 |
| 换个说法就搜不到 | MCP Reference Memory 只做子字符串匹配,不按意思检索 |
| 它有工具但不主动用 | 把官方那段指令加进指令文件 |
| MCP 服务器报没有权限 | 凭据类的环境变量默认不传给子进程,在 env 里明确写出来 |
| 合并配置后模型没了 | 覆盖了原来的 cordis.patch.yml。要追加,不要替换 |
| 两条配置冲突 | serverName 重名了,后加载的那条会报错 |
相关文章
- DeepSeek Harness 安装和上手
- 从 Claude Code、Codex 过来:已有的 MCP 配置怎么迁
- DeepSeek Harness 的插件