dsh-lazy-toolbox:把 skill 与 MCP 改成按需热加载的懒工具箱

前言

DeepSeek Harness(DSH)默认会把本机所有 skill、所有 MCP 服务的完整工具定义——名称、描述、参数 schema——推进每一次请求。skill 和 MCP 装得越多,每轮对话消耗的 token 越大,模型在工具列表里「挑错工具」的噪声也越高。常见做法是少装、手动关服务,但能力和上下文体积往往绑在一起,很难在「功能齐全」和「请求够小」之间折中。

dsh-lazy-toolbox 由社区维护者 anyi-520 发布,在 SkillHub 插件目录 中归类为「工作流」。下面介绍它如何改 DSH 加载 skill / MCP 的方式,以及安装与典型用法。

这是什么

一句话:dsh-lazy-toolbox 是 DSH 插件,把 skill 与 MCP 从「每轮都塞进工具定义」改成「系统提示里只留目录,用时再注入、用完可卸载」。

安装后,全局工具表里通常只保留一个常驻入口 toolbox;skill 与 MCP 在系统提示中分开列出,每条仅有一句话用途,不含调用参数。模型需要某项能力时调用 toolbox 的 load,把定义注册进当前会话(agent.ctx 作用域);用完 unload 或依赖回合结束自动卸载,后续请求体积立刻回落。

核心功能

资料中归纳的三件事如下。

1. 搬走:从全局工具定义里撤下 skill 与 MCP

安装并完成迁移后,本机 skill 目录、profile 里的 mcp-client 配置会整体迁入插件库,DSH 不再把它们放进全局工具定义。卸载时按原文原位置还原。

2. 留目录:系统提示里只有清单

系统提示增加「懒工具箱」段落:skills 与 mcp 分列,每条一行用途说明;已加载项可标 [已加载],仅作本会话状态提示。

3. 热加载:会话级注入与卸载

  • toolbox { action: "load", ids: ["skill:<名字>" | "mcp:<服务>" | "mcp:<服务>:<工具>"] }:把对应定义注入当前会话。
  • toolbox { action: "unload", ids: [...] } 或 all: true:撤掉注入,缩小后续请求。
  • toolbox { action: "list", ids: [...] }:查看目录;对某个 mcp:<服务> 可展开工具清单。

此外,插件还为新会话注册运行时上下文提醒(systemPrompt.context),避免模型因工具列表里看不到 skill/MCP 而跳过或凭记忆作答;加载过内容后该提醒变为空串并被过滤。默认配置 autoUnloadOnTurnEnd: true 时,每个新用户回合会再次提醒按需 load。

skill 大纲与按需取节

体积较大的 skill 在 load 时不整篇注入,而是给出大纲;需要某一节时用 toolbox { action: "skill", id: "skill:<名字>", section: "<节号>" },section: "all" 才取全文。可在 store.json 为单个 skill 设 loadMode: "full",或全局 skillInjectMode: full。

插件工具托管

其他插件可通过全局桥把成组工具交给懒工具箱托管,启动时不注册,用时 load 组 id(如 group:memstudio)。未安装本插件时,接入方可回退为照旧 ctx.tools.register。

设置页与开关

DSH 内「设置 → 懒工具箱」提供懒加载、工具、关于等标签:可按条目选择懒加载或跳过;关闭的 skill/MCP 不出现在目录里,load 会被拒绝,文件与配置仍保留。外部工具链检测与安装已拆到独立插件 dsh-toolchain,本插件 toolbox 不再提供 requirements / install。

其他 toolbox 动作(节选)

资料中的动作表还包括:status、add_skill、add_mcp、remove、enable / disable、mode、update(云更新)、code(内置代码编辑器)、discover(扫描已装插件自带 skill/MCP)等。云更新针对本仓库 GitHub Release,安装后需手动重启 DSH。

安装与启用

DSH 生态采用「一切皆插件」;SkillHub 为社区目录站点,与 DeepSeek / 幻方无官方从属关系。安装前请自行查看 GitHub 仓库 源码与 MIT 许可证;插件以当前 DSH 进程权限运行,迁移会改动本机 skill 与 MCP 配置位置,生产环境请先备份 profile。

环境要求(来自 package.json):Node.js >= 20。包版本以仓库发布为准(资料中 package.json 示例为 0.7.3)。DSH 需 0.7.1+ 才能识别包内 dsh.bundle 声明;0.7.0 及更早安装器会报「没有声明组合包」。

从图形界面安装

在 DSH 中选择「插件 → 添加插件」,填写本地解压目录路径或 npm 包名。包内 cordis.patch.yml 会由 DSH 处理依赖、bundles 与配置行,重启后生效。

从 npm 安装

npm i -g dsh-lazy-toolbox
dsh-lazy-toolbox wire-profile

npm 发布后也可通过 DSH 插件管理器执行:

dsh plugin add dsh-lazy-toolbox

(以 README 原文为准。)

从本地目录接入(开发 / 自用)

将插件接到 profile 并写入配置(幂等):

node dsh-lazy-toolbox/bin/cli.mjs wire-profile

或安装全局 CLI 后:

dsh-lazy-toolbox wire-profile

然后重启 DSH;插件首次启动会自动迁移本机 skill 与 MCP 配置。

也可手动编辑 profile,例如在 package.json 中 link 依赖并在 cordis.patch.yml 末尾插入:

- insert:
    - id: lazy-toolbox
      name: dsh-lazy-toolbox
      inject: [systemPrompt, tools]
      config:
        autoImport: true
        autoUnloadOnTurnEnd: true

Release 附件解压后,同样执行 wire-profile 一类命令即可(见仓库 README 安装说明)。

典型用法

模型侧:先 load 再调用 MCP

系统提示中会说明:需要 GitHub MCP 时,先加载服务,再使用 mcp__github__* 类工具;用完卸载。

{ "action": "load", "ids": ["mcp:github"] }
{ "action": "unload", "ids": ["mcp:github"] }

或回合结束时依赖 autoUnloadOnTurnEnd 自动清理。

导入 skill / MCP

用户要求安装新能力时,模型可调用:

{ "action": "add_skill", "summary": "一句话用途", "...": "路径或 URL 等参数见工具 schema" }
{ "action": "add_mcp", "summary": "一句话用途", "...": "连接参数见工具 schema" }

add_mcp 会先连一次验证,失败自动回滚。

查看状态与目录

{ "action": "status" }
{ "action": "list" }

对某个 MCP 服务展开工具名:

{ "action": "list", "ids": ["mcp:github"] }

命令行(云更新示例)

dsh-lazy-toolbox update check
dsh-lazy-toolbox update download
dsh-lazy-toolbox update install

安装覆盖后按提示关闭并重新打开 DSH。

适用场景与注意

适合谁:本机已装多个 skill 或多个 MCP,希望默认对话请求保持较小工具定义;又希望在需要时仍能按需加载完整能力。也适合其他插件作者把成组工具改为懒加载托管。

注意:

  • 迁移与还原涉及文件与 profile 配置,卸载前确认插件文档中的还原行为。
  • 设置页关闭的条目不会出现在目录中,模型不应再尝试 load。
  • 内置「不做懒加载」名单(如部分破甲类插件名模式)不会进目录,仅影响接管策略,不删除文件。
  • 云更新、内置代码编辑器、discover 等能力均以 README 与 docs/ 为准,升级后留意 CHANGELOG。

结尾

dsh-lazy-toolbox 把 DSH 里 skill、MCP 以及可选的插件工具组,从「每轮全量工具定义」改为「目录 + 会话内热加载」,用常驻的 toolbox 统一入口,配合上下文提醒与回合结束卸载,减轻 token 与工具噪声问题。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜