dsh-toolbox:用分组与三种状态管理 DSH 全局工具上下文

前言

在 DeepSeek Harness(DSH)里接 MCP 或装多个插件后,全局注册的工具名会一起进模型侧的工具 schema。名字一多,每条定义都占上下文;很多工具日常根本不会调用,却长期挂在列表里。常见做法是手动删插件或改 MCP 配置,但那样要么动基础设施,要么失去「需要时再连」的灵活性。

@littleplus/dsh-toolbox(GitHub:littleplus/dsh-toolbox)是社区维护的工作流类插件:按正则把全局工具分组,用 open / close / request 三种状态控制它们在会话上下文里的呈现方式,并在左侧栏提供面板,直接读写 profile 的 cordis.patch.yml。下面介绍它的定位、机制、安装与典型配置。

这是什么

一句话:DeepSeek Harness 工具箱——管理插件与 MCP 引入的工具,减少上下文里不必要的工具 schema,并提供渐进式工具获取(request 模式)。

  • 维护者:littleplus
  • 分类:工作流(社区目录 SkillHub)
  • 许可证:MIT(见仓库 package.json)
  • 当前包版本:0.2.0(以仓库发布信息为准)

插件不替代 MCP 或宿主本身的工具注册,而是在工具已经全局注册之后,在 agent 作用域里通过 ctx.tools.restrict() 从 schema 中隐藏匹配项,或在 request 模式下先只暴露一个与分组同名的入口工具。

三种状态

status 行为
open(开启) 完全不处理(默认)。
close(关闭) 匹配到的工具从该会话的工具 schema 里消失,不注入任何上下文。
request(按需) 匹配到的工具先隐藏,同时注册一个与分组同名的入口工具(描述 = 分组 description)。模型调用该入口后,该组工具才出现在下一次请求的工具列表里。

request 即渐进式披露:模型默认只看到「这组有什么」的说明,需要时才展开整组工具。展开状态按会话记录,并在 agent 重建(resume / fork)时从 session 日志里的 tool/call 事件重放。

优先级:有序分组,先匹配先得

分组是有序的。一个工具只归属第一个匹配它的分组,后面的分组只看剩下的名字。这不是按状态比强弱,而是按顺序裁决。

- { id: vk_read,  tools_regex: '^mcp__openviking__read$', status: open  }   # 先认领 read
- { id: vk_rest,  tools_regex: '^mcp__openviking__',      status: close }   # 只剩 write/…,吃不掉 read

上面这样写,open 先把 mcp__openviking__read 认领走,后面 close 的通配碰不到它——open 组既可以是「什么都不做」,也可以是占位保护,取决于顺序。把两行对调则 close 先吃光,open 一个也拿不到。

面板上每张卡片左上角有序号,↑ / ↓ 直接改 YAML 里的顺序。若某组正则能匹配工具却一个都没拿到,卡片会提示「N 个匹配已被上面更靠前的分组认领」。

核心功能

左侧栏「工具箱」面板

安装成功后左侧栏出现「工具箱」。面板读写的是 profile 自己的 patch 层,写入经宿主 configEditor:加锁、保留 YAML 注释、原子替换,Loader 热协调后配置立即生效,无需重启 DSH。

推荐用法包括:

  1. 工具状态表(默认):按名字密排全部工具,颜色表示经本插件处理后的实际状态——正常色会进上下文,灰色删除线表示 close,灰色虚线表示 request 下尚未展开;悬停可见归属分组。
  2. 列表:每个分组一节,带序号、状态、正则、当前命中的工具名。
  3. 新增 / 编辑 / 删除 / 调序 / 状态下拉:正则输入时可预览命中;改 id 会按旧 id 定位并替换对应行。

缺 configEditor 时面板退化为只读。

手写 cordis.patch.yml

配置写在 profile 的 cordis.patch.yml(Windows 下路径形如 %USERPROFILE%\.dsh\profiles\<profile>\),用与本插件相同的 id: toolbox 覆盖 config。config 为分组数组(也接受 { groups: [...] }):

- id: toolbox
  config:
    - id: web
      tools_regex: '^web_'
      description: Web search and page fetch tools. Call this to load them.
      status: request
    - id: browser
      tools_regex: '^(browser|computer)_'
      description: Browser control tools.
      status: close
    - id: todo
      tools_regex: '^todo_'
      description: Task list tools.
      status: open

字段约束(摘自 README):

  • id:必填,须匹配 ^[A-Za-z][A-Za-z0-9_-]*$,不能是宿主保留名 run_code,不能重复。
  • tools_regex:必填,JS 正则,按 search 语义匹配工具名;不做整串锚定,^ / $ 需自行书写。
  • description:request 组必填(入口工具给模型的唯一说明);其它组可空。
  • status:open / close / request,缺省为 open。

写错的行不会导致插件整体加载失败,会出现在面板「配置问题」里;手写 YAML 中除这四个字段外的内容,面板修改时会原样保留。

安装与启用

在目标 profile 下执行官方安装命令:

dsh plugin --profile desktop add @littleplus/dsh-toolbox

将 desktop 换成你实际使用的 profile 名。安装后 profile 的 dsh.profile.bundles 会自动追加本包,dsh.bundle.patch 指向的 cordis.patch.yml 生效(往插件树插入 id: toolbox)。左侧栏出现「工具箱」即表示装好。

首次通过面板写入时,若 profile 里还没有本插件配置行,configEditor 会自动追加类似下面的结构(示例来自 README):

- id: toolbox
  name: '@littleplus/dsh-toolbox'
  config:
    - { id: web, tools_regex: '^web_', description: '...', status: request }

典型用法:OpenViking MCP 工具白名单

README 中有一份在用的示例:OpenViking MCP 工具名很多,日常只用检索与读写相关几个,其余(health、ACL、watch、用户/组管理等)不必进工具列表。

- id: toolbox
  name: '@littleplus/dsh-toolbox'
  config:
    - id: openviking_default_enable
      tools_regex: ^mcp__openviking__(read|list|forget|remember|write|find|search|edit|grep)$
      description: ""
      status: open
    - id: openviking_default_disable
      tools_regex: ^mcp__openviking__.*$
      description: ""
      status: close

读法:

  1. 第一组 open 先认领 9 个日常工具;对它们不做 restrict,但认领本身阻止第二组碰到这些名字。
  2. 第二组 close 的 ^mcp__openviking__.*$ 只能处理第一组剩下的名字,于是只有 health、ACL 等从会话工具列表消失。
  3. 两条正则都带 $,避免 read 误匹配 read_*,或 list 误抓 list_users 等。

若把两行对调,close 会先隐藏整组 mcp__openviking__*,后面的 open 无法 reclaim——面板上会直接暴露这种顺序错误。

适用场景与注意

适合谁

  • 已接多个 MCP / 插件、工具 schema 明显偏长,希望按名字批量隐藏或按需展开的 DSH 用户。
  • 需要在不改 MCP 服务端的前提下,用 profile 层配置做「白名单 + 通配兜底」一类规则的场景。

运行与权限

插件随当前 DSH 进程运行,对工具列表的 restrict / 注册入口工具都在 agent 作用域生效。安装前应在 GitHub 仓库阅读源码与 MIT 许可证,确认分组正则不会误伤仍需使用的工具名。入口工具名等于分组 id;若与已有工具重名,插件不会静默注册,面板会提示。

生态说明

DSH 采用「一切皆插件」的扩展方式;SkillHub 为社区插件目录,与 DeepSeek / 幻方无官方从属关系,本文安装与配置均以仓库 README 为准。

结尾

dsh-toolbox 用有序正则分组和三种状态,把「全量工具 schema」收成可管理的 profile 配置:该藏的从上下文去掉,该按需的只留一条入口,该原样留下的用 open 占位保护顺序。需要细节与 issue 时见 GitHub:https://github.com/littleplus/dsh-toolbox;目录页:https://www.skillhub.cn/plugins/littleplus/dsh-toolbox。

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

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

小夜