前言¶
DeepSeek Harness(DSH)在接入 REA(Reverse Engineer Anything)这类大型 MCP 工具集时,会带来明显的资源开销。REA 默认开启时提供 170 个 mcp__rea__* 工具,每次请求都会将这些工具定义加入 payload,在长会话中持续消耗 token 并占用内存。DSH 自带的插件开关对这一行无效,需要额外手段才能真正控制。
violetevergarden-zc/dsh-rea-mcp-toggle 是一个 DSH bundle 插件,在 Harness Web UI 中提供一键开关 REA MCP 服务器的能力,同时向模型暴露配套的工具 rea_mcp_toggle。开关状态按 profile 持久化,重启后依然生效。
核心功能¶
UI 开关¶
在会话标题栏(Session header)中,与「费用明细」等控件并列有一个按钮:
- 显示
REA 开/REA 关,绿点表示当前状态 - 点击即可切换,即时生效,不需要重启 Harness
- 切换失败时按钮变为
REA 失败(红框),鼠标悬停显示具体原因 - 鼠标悬停还会显示当前工具数与配置行 id
模型工具 rea_mcp_toggle¶
| action | 作用 |
|---|---|
status |
读当前开关状态、工具数、是否已持久化、状态文件路径 |
set |
切换(需 enabled: true/false);幂等,重复同向不发写、不产生副作用 |
probe |
诊断:Loader 行状态、REA 工具数、缝是否在位、服务可用性、Remote endpoint 解析情况 |
selftest |
用 Web UI 调用的同一条 Remote 网关路径自检本插件 |
UI 按钮与这个工具共用同一套实现(同一 service 的同一个方法)。
状态持久化¶
开关状态保存在插件自己的状态文件里:
{ "enabled": false, "savedAt": "..." }
路径为 %DSH_PROFILE_DIR%\.rea-mcp-toggle.state.json。写入是原子的(临时文件 + rename)。重启后由家目录层的一行 !!js 缝读取该文件,开机即按选择生效(关闭状态下开机根本不会拉起 REA)。
工具可见性真正变化¶
关闭时 170 个 mcp__rea__* 工具从模型可调用工具列表中消失(不只是「不执行」);开启时全部回来。
进程生命周期¶
- 开启:拉起 REA 的 stdio 子进程(每次切换恰好 1 个)
- 关闭:dispose 该行,回收子进程、注销工具
- 关闭后不会自己复活
安装与启用¶
前置条件¶
- 已安装 DSH,且 REA 已作为 MCP server 注册在家目录层
%DSH_HOME%\cordis.patch.yml - 该行 id 必须是
rea-mcp(本插件按这个 id 定位)
安装本 bundle¶
本插件以路径链接方式安装,因此包目录内需要有指向 DSH 安装的 node_modules 链接:
cd plugins\dsh-rea-mcp-toggle
node scripts/link-deps.mjs
脚本会按顺序尝试找到 harness 根目录(命令行参数、.harness-root 文件、DSH_HARNESS_ROOT 环境变量、平台标准安装位置、正在运行的 Harness)。
安装后必须在会话里执行:
plugin_manager → install_bundle → <本目录绝对路径>
安装后必须重启一次 dsh-desktop。Host 半边的模块是进程启动时导入的;不重启时插件行会处于 failed to import 或停在旧版本。
安装家目录层的「开关缝」¶
这是唯一需要手改家目录层的地方。在你已有的 rea-mcp 行里加一个行级 disabled(不要放进 config 里面):
- id: rea-mcp
name: '@deepseek-ai/dsh-mcp-client'
config:
# ...原有内容保持不动...
# ── 开关缝:由 dsh-rea-mcp-toggle 插件读取 ──
disabled: !!js >-
Boolean(ctx.get('profileContext')?.dir) && (() => { try { return process.getBuiltinModule('node:fs').readFileSync(process.getBuiltinModule('node:path').join(ctx.get('profileContext').dir, '.rea-mcp-toggle.state.json'), 'utf8') && JSON.parse(process.getBuiltinModule('node:fs').readFileSync(process.getBuiltinModule('node:path').join(ctx.get('profileContext').dir, '.rea-mcp-toggle.state.json'), 'utf8')).enabled === false } catch { return false } })()
改前先备份:Copy-Item .dsh\cordis.patch.yml .dsh\cordis.patch.yml.bak-<时间戳>
这段表达式是安全降级的:状态文件不存在 / JSON 损坏 / profileContext 不可用(例如离线 dsh --dump-config)时一律返回 false=保持启用,不会让 harness 起不来。
安装后自检¶
node scripts/acceptance.mjs
再在会话里执行 rea_mcp_toggle {action:"selftest"}。
典型用法¶
日常:点按钮¶
标题栏的 REA 开 / REA 关 按钮,点一下即可。不需要重启。
让模型帮你切¶
把 REA 关掉,我在省钱 → 模型调用 rea_mcp_toggle {action:"set", enabled:false}
REA 现在开着吗? → 模型调用 rea_mcp_toggle {action:"status"}
UI 按钮点了没反应,帮我看看 → 模型调用 rea_mcp_toggle {action:"selftest"}
关闭 / 禁用的几种情况¶
- 临时关:点按钮。状态文件写
enabled:false,当前进程立即生效(工具消失、子进程回收) - 永久不再启用:把家目录层的那段
disabled: !!js缝删掉(保留其余内容),该行即恢复为无条件启用 - 升级 REA 后失效:
rea setup --client dsh会把开关缝一起重写掉,用仓库里的scripts/ensure_seam.mjs补回即可 - 彻底卸载:见第 8 节
输入输出示例¶
查询状态¶
输入:
{ "action": "status" }
输出(REA 关闭时):
REA MCP (rea-mcp) is OFF: the mcp__rea__* tools are not callable; the choice is saved.
entry=rea-mcp module=@deepseek-ai/dsh-mcp-client
enabled=false persisted=false tools=0 seam=true
stateFile=<PROFILE_DIR>\.rea-mcp-toggle.state.json
输出(REA 开启时):
REA MCP (rea-mcp) is ON: 170 tool(s); the choice is saved.
entry=rea-mcp module=@deepseek-ai/dsh-mcp-client
enabled=true persisted=true tools=170 seam=false
stateFile=<PROFILE_DIR>\.rea-mcp-toggle.state.json
适用场景与注意¶
- 适合需要频繁在「启用 REA 工具」与「省 token、省内存」之间切换的场景
- 本插件以当前 dsh 进程权限运行,安装前应检查源码与许可证
短结尾¶
这个插件通过在 Harness Web UI 中提供一键开关,解决了 REA MCP 工具集带来的 token 与内存开销问题。配合 rea_mcp_toggle 工具,可以让模型自主管理 REA 的启停,同时通过 profile 持久化,确保重启后依然按预期生效。
插件主页:https://www.skillhub.cn/plugins/VioletEverGarden-zc/dsh-rea-mcp-toggle
GitHub:https://github.com/VioletEverGarden-zc/dsh-rea-mcp-toggle