reactive-resume
reactive-resume
A one-of-a-kind resume builder that keeps your privacy in mind. Completely secure, customizable, portable, open-source and free forever. Try it out today!
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:ArvinQi/dsh-mcp
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
English | 简体中文
支持版本:
dsh 0.1.6-alpha.2—— 本插件在0.1.6-alpha.2上开发与验证,package.json→dsh.supported同步声明。DSH 与插件两侧版本不匹配时,设置页会给出排查诊断(检查注册行 → 重启dsh web→ 硬刷新 → 同步升级)。

解决的核心问题:
search 按需检索模式让模型通过 mcp_tool_search 热注入所需工具,大幅节省 token。tools/list_changed 通知会让同名工具被反复注销/重注册,系统提示词工具列表抖动、prompt cache 频繁失效。工具列表稳定化让未变化的工具保留原注册,最大化 cache 命中。功能优势:
变量名 或 ${变量名} 即可在连接时自动替换为配置值(如 Authorization: Bearer ${TOKEN})search(按需检索,省 token)与 full(全量注入)streamable-http 服务器若走 MCP OAuth(授权码 + PKCE),连接时自动打开浏览器授权;token 与 client 信息持久化、由 SDK 自动刷新(24 小时内活跃自动续期),失效后自动重新授权mcp_servers)、按服务器挂载
@deepseek-ai/dsh-mcp-client 实例、环境变量注入(明文入定义、secret 走 credentials)、
连接探测(test)。lib/oauth.js):streamable-http 服务器遇 401 + OAuth 挑战时自动走
授权码 + PKCE 流程,打开浏览器授权、回环回调收码、token 持久化并按需自动刷新;
测试连接与挂载共用同一份 token。apply() 里自行 ctx.remote.$mount() 挂载 mcpManager
命名空间(原实现依赖 api-remotes 的 in-box 修改,独立版不再需要任何 in-box 包改动)。lib/cordis-servers.js):把 patch 层里原生声明的
@deepseek-ai/dsh-mcp-client 行一并展示到设置页(只读,见下节)。cordis.patch.yml)与优先级DSH 原生支持在组合里直接声明 MCP 服务器:一行一台,name: '@deepseek-ai/dsh-mcp-client',
放在 profile 级 $DSH_HOME/profiles/<profile>/cordis.patch.yml 或机器级
$DSH_HOME/cordis.patch.yml(机器级对所有 profile 生效,且按层级覆盖 profile 级同 id 行)。
- insert:
- id: mcp-github
name: '@deepseek-ai/dsh-mcp-client'
config:
transport: stdio # 或 streamable-http
serverName: github
command: npx
args: ['-y', '@modelcontextprotocol/server-github']
1.11.0 起,这些声明会出现在 Settings → MCP 列表中,标记「cordis 声明」,只读展示来源文件。 规则:
serverName 若已被 patch 层声明(且未 disabled),插件不再挂载存储里
的同名行——同名双挂载会撞工具注册表并让该服务器的工具整代回滚,页面会给出冲突说明。cordis.patch.yml(web/desktop
为 live reload,改完即生效;headless/sdk 等下次启动生效)。cordis:<rowId>,
带 origin/declaredIn/declaredRowId 来源标记),只导入不覆盖——插件自建行永不被改写;
声明消失的镜像自动删除(镜像只是声明的副本,无主后不应堆积);含 !!js 表达式的声明跳过导入并在页面标注
原因(值只能在 Loader 内求值)。镜像行永不挂载,挂载始终归组合。cordis.patch.yml 的受管块内写入 id-targeted disabled: true
(首次写入前生成 .dsh-mcp.bak 备份;原子替换、幂等、可逆,只动该块),声明让出 serverName,改由插件挂载
同名行——由此启用 OAuth 授权、凭据托管、${VAR} 头替换、测试连接。挂载硬失败会自动回滚(移除受管块、
行退回镜像)并返回失败原因;「释放」把挂载交还声明行并删除插件行。缺少显式 id 或含 !!js 的声明不可接管。needsPlugin):声明行本身既不能携带 OAuth provider,也不能解析
${VAR}/裸变量名占位符——这两件事只有插件会做。因此这类声明只能由插件挂载:页面会把它们标为
挂载失败并说明原因(不是"连接中"),「释放」会让工具消失(确认框与结果告警都会提示),恢复只需
重新「接管」。oauth: true(设置页「使用 OAuth 授权」勾选,默认关)
才会挂 OAuth provider。用静态 token 或自定义头认证的服务器不要勾——否则它返回 401 时会被当成 OAuth
挑战,插件会反复打开浏览器授权(并起 127.0.0.1:<port>/callback 回环回调)。另外,同一服务器每个进程
最多自动弹一次浏览器,之后只返回带授权链接的错误;手动「测试连接」仍可随时发起授权。升级时会按已有
OAuth 凭据自动迁移,真正需要 OAuth 的服务器不受影响。pendingTakeover),
重启 dsh 后由插件挂载;「释放」在同样情况下会提示需要重启。此外,挂载前若发现同名 mcp__<server>__
工具已存在且不是本插件挂载的,一律跳过——任何情况下都不会与仍在挂载的声明行争抢同名工具。mcp__ 前缀处理整个工具集,声明式服务器的
工具天然纳入,无需额外配置。dsh-mcp/
├── package.json name=dsh-mcp;dsh.client 声明;零 npm dependencies
├── lib/
│ ├── index.js host 半部(McpManagerService,源自 mcp-manager 构建产物)
│ ├── cordis-servers.js 读取 patch 层原生声明的 MCP 服务器(1.11.0)
│ ├── patch-writer.js 受管块写入器:接管时在 patch 文件里停用声明行(备份/原子/幂等)
│ ├── mcp-client.js vendored MCP 客户端(源自 @deepseek-ai/dsh-mcp-client,含工具列表稳定扩展)
│ ├── oauth.js MCP OAuth 客户端提供者(授权码 + PKCE、回环回调、token 持久化)
│ ├── probe.js vendored 连接探测(源自 mcp-client/src/probe.ts)
│ ├── transport.js vendored 传输工厂(源自 mcp-client/src/transport.ts)
│ └── client.js 浏览器半部(esbuild 打包,ModuleLoader wire format)
├── src/client/ 浏览器半部源码(TSX + CSS Modules + 本地 types + remote-contribution)
└── scripts/build.mjs 构建脚本(esbuild 取自 DSH checkout,见下)
node scripts/build.mjs
$DSH_SOURCE 未设置时尝试
~/.dsh/source/current。@deepseek-ai/*、zod、@modelcontextprotocol/sdk)不装 npm 包,
从 $DSH_HOME/profiles/node_modules(DSH profiles 模块 fallback,$DSH_HOME 默认 ~/.dsh)解析;构建时经
nodePaths 指向同一目录。<style data-plugin="dsh-mcp" data-file="…">,默认导出 identity 类名映射。npm test
npm test 会自动适配环境:依赖 DSH 模块闭包(@deepseek-ai/*、js-yaml)的测试文件
(cordis-servers / patch-writer / takeover)在缺少本地 DSH 安装时会被跳过(公共 CI
即如此),本机(profile 的 node_modules 可达)则跑全量,并在输出里说明跳过了哪些文件。scripts/test.mjs 的 NEEDS_DSH_CLOSURE 列表。方式一:npm(发布到 npm 后)
dsh plugin --profile web add dsh-mcp
方式二:GitHub git 源
dsh plugin --profile web add github:ArvinQi/dsh-mcp
# 或
dsh plugin --profile web add git+https://github.com/ArvinQi/dsh-mcp.git
方式三:本地开发(link)
dsh plugin --profile web add link:<本仓库绝对路径>
注意:本地
link:安装时,插件目录内含node_modules -> $DSH_HOME/profiles/node_modulessymlink(本机开发用,不入库),否则link:安装的 symlink 被 realpath 后无法解析@deepseek-ai/*。
在 $DSH_HOME/profiles/web/cordis.patch.yml($DSH_HOME 默认 ~/.dsh)追加:
- insert:
- id: dsh-mcp
name: dsh-mcp
⚠️ 这一步必须手动完成:dsh-mcp 未声明
dsh.bundle,dsh plugin add只负责把包装进 profile,不会自动进入运行组合。漏掉注册行则插件完全不生效。
然后重启 dsh web,并硬刷新浏览器(Cmd/Ctrl + Shift + R):
⚠️ 重启 + 硬刷新缺一不可:
- 设置页(client 半部)需要 client roster 生效,插件集变更必须重启
dsh web(刷新浏览器不够);- 重启后浏览器必须硬刷新(
Cmd/Ctrl + Shift + R),普通刷新可能仍使用缓存的旧页面。
打开管理页:重启后浏览器打开 DSH Web → 设置(Settings)→ MCP。
Q1:安装后设置页看不到「MCP」?
按顺序检查:
$DSH_HOME/profiles/web/cordis.patch.yml 已追加
- insert: [{ id: dsh-mcp, name: dsh-mcp }](id/name 必须与插件包名 dsh-mcp 完全一致)。
dsh plugin add 不等于生效,没有注册行插件不会挂载。dsh web:仅刷新浏览器不够——设置页入口来自 client roster,
插件集变更必须重启进程才进入 roster。Cmd/Ctrl + Shift + R(Windows/Linux:Ctrl + Shift + R)
强制刷新;普通 F5 可能加载缓存的旧页面。web profile
(dsh plugin --profile web add dsh-mcp + $DSH_HOME/profiles/web/cordis.patch.yml);
装到其他 profile 则在其他 profile 的设置页查看。dsh plugin --profile web add dsh-mcp@latest(或 @1.8.0)。Q2:设置页能看到「MCP」,但服务器列表为空/报错?
dsh web 进程日志中 mcp-manager 没有初始化错误;client api: ... 404 或 env is not iterable,都是新旧版本混用所致);transport failure for /api/mcpManager/list: HTTP 404 表示宿主端没有注册
mcpManager 服务:多半是插件 host 半未生效(漏了 cordis.patch.yml 注册行/装错 profile)或
client 与 host 版本不一致。请按 Q1 核对注册行、确认安装到了 web profile、重启后硬刷新;
仍不行则把 dsh web 与插件版本都升到最新再试。Q3:MCP 工具没有出现在 agent 会话里?
mcp_tool_search 检索后热注入,未检索到的工具不在
系统提示词中属正常现象;可切换到「全量注入」验证。Q4:服务器配置了 Authorization 头却提示需要 OAuth 授权 / 挂载失败?
Authorization(静态 Bearer/token),dsh-mcp 就不会把它当作 OAuth
服务器:真正的 OAuth(授权码 + PKCE)只对没有静态 Authorization 头的服务器启用,避免
401 被误当成 OAuth 挑战而打开浏览器授权。若你连的是需要静态 token 的服务器,确认请求头
正确即可;fetch failed / unable to verify the first certificate,是宿主 Node
不信任公司内网 CA:用 NODE_OPTIONS=--use-system-ca 启动 dsh web(或把根证书加入
NODE_EXTRA_CA_CERTS),再重启宿主与硬刷新浏览器。添加服务器:
serverName,决定工具前缀 mcp__<serverName>__)、传输方式
(streamable-http 填 URL / stdio 填命令)、请求头、工具调用超时等进程环境变量(注入模式下方,默认展开):
process.env)中已存在同名值,连接/展示时直接采用该值(不改名),
存储值仅作为兜底——请先在启动脚本里 export ADA_TOKEN=... 再重启 dsh webNAME=value)与「添加变量」逐行添加${变量名}(如 Authorization: Bearer ${GITLAB_TOKEN}),
连接时自动替换(优先级:服务器 env > 进程级 env > 系统环境变量)JSON 维护配置(MCP 配置模块右上角):
OAuth 服务器(streamable-http 走 MCP OAuth,如受 OAuth 保护的网关服务):
serverName 隔离),由 MCP SDK 自动刷新
(24 小时内活跃自动续期);失效后自动重新授权,授权一次后挂载与测试复用日常管理:
工具控制(省 token 的关键):
search(按需检索,默认)或 full(全量注入)search 模式下,模型需要某 MCP 工具时调用 mcp_tool_search 检索并热注入当前对话验证效果:
mcp__<服务器名>__<工具名>search 模式下未检索到的工具不占系统提示词,节省 token 并提升 prompt cache 命中率list_changed 通知不会反复注销/重注册同名工具,工具列表保持稳定lib/index.js 是 mcp-manager 的构建产物(spec/types 已内联),改动请直接编辑
lib 下文件,或改回 TS 后重新用仓库工具链构建。src/client/* 后重新 node scripts/build.mjs;host 半部改动无需重装
(link 安装直接生效)。dsh web 才进入 client roster。- **支持版本**:dsh <版本>,并同步更新 package.json 的 dsh.supported 与 README 顶部的「支持版本」。CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: mcp。