让 MCP 服务端按对话隔离每次工具调用
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/13 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Liang-HZ/dsh-plugin-mcp-session-meta该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · chat
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 22 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令
查看扫描证据(共 2 处,展示前 2 条)
- 执行外部命令来自配置/变量install.mjs:236
const r = spawnSync(process.execPath, [path.join(installDir, "sync.mjs")], { encoding: "utf8", cwd: installDir }); - 执行外部命令来自配置/变量install.mjs:304
const r = spawnSync(process.execPath, [path.join(HERE, "sync.mjs"), "--check"], { encoding: "utf8" });
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-attachment@deepseek-ai/dsh-scope@deepseek-ai/dsh-subprocess@deepseek-ai/dsh-timeout@deepseek-ai/dsh-tools@deepseek-ai/dsh-util-values@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 按对话隔离工具调用
- 调用携带会话标识
DeepSeek Harness 的 MCP 客户端桥接,在 tools/call 的 params._meta 里带上发起调用的智能体会话 id
README
由 DeepSeek 最新模型翻译生成dsh-plugin-mcp-session-meta
让 DeepSeek Harness 告诉 MCP server:这一帧是哪一段对话在调。
DSH 发出的每一次 tools/call,都会带上发起调用的那个 Agent 的 session id: params._meta.session_id。这是 MCP server 维持「按对话隔离」所需的那一条信息,也正是 DSH 目前空着的那一条。
English documentation: README.md。
这是非官方社区插件,与 DeepSeek 无隶属或背书关系。
为什么
DSH 的 MCP 客户端把 { name, arguments } 原样当作请求参数发出去,_meta 一直空着:
call: (args, execution) => client.callTool({ name: tool.name, arguments: args }, { … })
而 _meta 是 MCP 协议里 BaseRequestParamsSchema 的一等可选字段:
const BaseRequestParamsSchema = z.object({ _meta: RequestMetaSchema.optional() })
于是服务端只能看到这个进程,看不到这一轮对话。
展开完整文档(README 剩余 1 节)
dsh-plugin-mcp-session-meta
让 DeepSeek Harness 告诉 MCP server:这一帧是哪一段对话在调。
DSH 发出的每一次 tools/call,都会带上发起调用的那个 Agent 的 session id: params._meta.session_id。这是 MCP server 维持「按对话隔离」所需的那一条信息,也正是 DSH 目前空着的那一条。
English documentation: README.md。
这是非官方社区插件,与 DeepSeek 无隶属或背书关系。
为什么
DSH 的 MCP 客户端把 { name, arguments } 原样当作请求参数发出去,_meta 一直空着:
call: (args, execution) => client.callTool({ name: tool.name, arguments: args }, { … })
而 _meta 是 MCP 协议里 BaseRequestParamsSchema 的一等可选字段:
const BaseRequestParamsSchema = z.object({ _meta: RequestMetaSchema.optional() })
于是服务端只能看到这个进程,看不到这一轮对话。对于状态按对话划分的服务端——按标签页分组的浏览器自动化、编辑器、任何带会话的东西——harness 里所有对话只能共用一个桶,服务端无从区分。
其它 MCP 客户端早就发了:ZCode 发 session_id、Antigravity 发 antigravity.google/conversation_id、Codex 发 thread_id、WorkBuddy 发 workbuddy.ai/conversationId。DSH 是落单的那一个。
身份其实就摆在调用点上——agent loop 会填 ToolExecutionInput.agent(注释原话 "The agent on whose behalf the call runs"),agent.id 就是 SessionId。
差的是把它递下去。
改了什么
两处补丁,都在派生出来的产物里:
| 补丁 | 之前 | 之后 |
| clientInfo | { name: "dsh-mcp-client", version: "0.0.1" }——中间件自报的机器串,版本还是占位符 | { name, title: "DeepSeek Harness", version: "<真实版本>" } |
| tools/call 的参数 | { name, arguments } | { name, arguments, _meta: { session_id: <agent.id> } } |
execution 上没有 Agent 时(嵌套派发)整个 _meta 都不带——缺键是「这一帧不知道」,和声称自己属于某段会话是两回事。
装
产物必须按你自己装的那版 DSH 重新生成:补丁打在 DeepSeek 的编译产物上,而那份产物每个版本都不一样。
git clone https://github.com/Liang-HZ/dsh-plugin-mcp-session-meta
cd dsh-plugin-mcp-session-meta
node sync.mjs # 从你的 app.asar 提取 + 打补丁(锚点对不上会硬失败)
node install.mjs --list # 列出你 profile 里的 MCP 注册项
node install.mjs --server NAME # 把其中一条指向本包
然后重启 DSH——理由见下面的「缓存」。
- --profile web —— 指定别的 profile(默认 desktop)
- --check —— 只看,不写盘
- --uninstall —— 把那条注册项还原成上游包
只会切换你点名的那一条,别的 MCP server 照旧用上游客户端,harness 里别的东西一个都不动。
⚠️ 改完必须重启 DSH
DSH 对插件模块有缓存。改插件的代码、甚至改条目指向的包名,都不会让新代码生效:
- Node 的 ESM 缓存按 URL 命中,同一个文件路径第二次导入拿到的是旧模块对象;
- 插件管理器 set_plugin 的启用/停用只重新跑已导入模块的 apply,不重新导入;
- patchReload: "live" 是每个 profile 自己的设置,出厂那个 web profile 有,没有这一项的 profile 不会热加载 patch 改动。
所以「条目已激活、moduleName 也变了、却仍跑旧行为」是常态而不是异常。
改动要生效只有两条路:重启 DSH,或者给条目换一个全新的 id(新条目才会重新导入)。
兼容性
- 针对 @deepseek-ai/dsh-mcp-client 0.2.0-rc.2(DeepSeek Harness 0.2.0-rc.2,macOS)实测通过。
- sync.mjs 对两处锚点都有断言。DSH 升级把它们挪走时它会硬失败,而不是产出一个没打补丁的副本——后者是这里最坏的结果:插件照样加载,只是从此什么都不做。
- Node ≥ 22.15(提取用到 zlib.zstdDecompressSync)。
它是怎么来的(以及为什么不直接 fork 一份)
DeepSeek 的 harness 仓库不收外部 PR;而 app 包有代码签名和逐文件 integrity 校验——改 app.asar 里的文件既破坏签名,又会在每次更新时被覆盖。
所以产物是提取 + 打补丁 + 可重生成,不是一份改完就冻住的拷贝:
node sync.mjs # 从已安装的 DSH 重新生成 lib/index.js
node sync.mjs --check # 产物还是不是当前这个 DSH 会生成的那一份
sync.mjs 还会把产物 import 到的外部包读出来写进 peerDependencies。这不是记账: DSH 的解析器是按 peer 声明供给包的(上游 app-boot 的 profile-resolution/resolver.ts:「Linked importers apply current peer declarations at each ancestor node_modules」——它读导入方自己 manifest 里的 peer 名单)。少声明一个,那一个就解析不到,插件在导入阶段就死,表现是 fiber 直接变成 disposed、连一句有意义的错误都没有。从产物里数出来,就不会漂。
给其它 DSH 插件作者的两条
两条都是花过时间才发现的:
1. 你 import 的每个包都要声明成 peerDependency。 @deepseek-ai/dsh-app-boot 的解析器读的是导入方自己的 manifest,据此决定供给哪些包。漏一个,fiber 会变成 DISPOSED,报错只有一句 fiber state 4,没有任何说明。
2. patchReload: "live" 是 profile 设置。 出厂的 web profile 有;没有这一项的 profile 不会热加载 patch 改动,必须重启。
什么时候可以删掉它
等 DSH 自己把 session id 透传下来。上游那处改动很小——身份本来就在调用点的作用域里——本插件只是为了在这之前把缺口补上。
这个请求已经提上去了,带着确切的改法和证据: https://github.com/deepseek-ai/deepseek-harness/discussions/9519
它一旦落地,这个包就是纯负担——卸掉。
许可
MIT。派生的 lib/index.js 是 @deepseek-ai/dsh-mcp-client (MIT,© DeepSeek)的补丁构建,见 NOTICE。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Liang-HZ/dsh-plugin-mcp-session-meta
让 MCP 服务端按对话隔离每次工具调用
相关插件 · 对话 / 记忆
上下文中枢oceanbase/powercontext
上下文跟着工作走 —— 跨会话、跨智能体、跨人。
★ 1,489已汉化DSH
73.1
智能体记忆库plastic-labs/honcho
Honcho 是记忆基础设施,用来构建有状态的智能体。这些智能体能理解不断变化的人、智能体、群组、项目和想法。
★ 7,918已汉化DSH
71.7
长程智能体控制面loopx-project/loopx
给 Agent 一个目标,让工作持续向前。
★ 6,358已汉化DSH
71.3
智能体上下文数据库volcengine/OpenViking
给 AI 智能体用的上下文数据库
★ 41,453已汉化DSH
71.3
长效机器人团队Fei2411/DS-Bot
Download DS Bot for Windows 10/11 64-bit / 下载 Windows…
★ 5,293已汉化DSH
71.2
可携带记忆层EverMind-AI/EverOS
为什么选择 EverOS
★ 13,797已汉化DSH
71.1
这是你的仓库?认领条目