dsh-toolboxes
Identified★ 1Let AI directly invoke ffmpeg / ripgrep / fd / jq / yt-dlp: install tools, monitor the live console, and archive scripts—all in one page.
toolbox
官网:https://haikuotianko.github.io/dsh-toolboxes/(国内打不开可用 jsDelivr 镜像;源码在 docs/)
⚠️ 它会下载并执行第三方程序:ffmpeg / ripgrep / jq 等二进制从目录条目里的 URL 下载后直接运行,不经过任何沙箱,权限等于运行它的用户。目录条目可声明
sha256,装了就会在解包/执行前校验;请只使用你信任的下载源。详见安全模型。

一个可移植的 MCP 工具箱:把 ffmpeg / ripgrep / fd / jq / yt-dlp 这类命令行工具,按当前系统下载、安装、登记成 AI 可以直接调用的工具,并有一个能看实时控制台的管理页。
MCP 优先的原因:同一份服务可以同时给 DeepSeek Harness、opencode、Claude Code、Codex 用,不用为每个宿主重写一遍工具层。
AI ──MCP──▶ toolbox ──▶ 下载/安装/运行 CLI 工具
│
└─<root>/runs/*.log ──▶ 管理页(实时控制台、进度、速度、取消)
快速开始
方式一:下载二进制(Windows / macOS / Linux,无需 Go)
从 Releases 下载对应压缩包,解压后把 toolbox(Windows 是 toolbox.exe)放到 PATH 里。
方式二:从源码装(需要 Go ≥ 1.25)
go install github.com/haikuotianko/dsh-toolboxes@latest
# 模块名决定产物名字,装出来叫 dsh-toolboxes;想用下面文档里的 `toolbox`,重命名一下即可
mv "$(go env GOPATH)/bin/dsh-toolboxes" "$(go env GOPATH)/bin/toolbox" # Windows 换成 $(go env GOPATH)\bin\*.exe
方式三:DSH 插件(带管理页,自动准备二进制)
dsh plugin --profile web add dsh-toolboxes
# 不想走 npm、直接装源码也可以:
# dsh plugin --profile web add github:haikuotianko/dsh-toolboxes
插件在首次使用时从 GitHub Releases 下载匹配平台的二进制,校验
SHA256SUMS后缓存到<toolbox root>/bin/。想用自己的构建,设TOOLBOX_BIN指向它即可。npm 上的包名是
dsh-toolboxes:dsh-toolbox已被另一个用途完全不同的 DSH 插件占用。磁盘上的工具箱目录(~/.dsh/dsh-toolbox)和TOOLBOX_ROOT默认值没有跟着改,所以老安装不会丢数据。
接到你的 AI 客户端
toolbox -mcp # stdio MCP,客户端直接拉起
toolbox -http 127.0.0.1:8770 # MCP(streamable HTTP) + JSON API + 管理页
toolbox -ui # 只启动管理页并打开浏览器
Claude Code / Claude Desktop(claude_desktop_config.json):
{ "mcpServers": { "toolbox": { "command": "toolbox", "args": ["-mcp"] } } }
opencode(opencode.json):
{ "mcp": { "toolbox": { "type": "local", "command": ["toolbox", "-mcp"], "enabled": true } } }
DeepSeek Harness:管理器页面顶部有「接入 AI」一节,会按本机真实路径生成可直接粘贴的配置;源码安装也可以用 toolbox -setup -patch <profile>/node_modules/<包名>/cordis.patch.yml 一次写好(从 npm 装时包名是 dsh-toolboxes,从本地目录 link 时是你自己的目录名)。
管理页
toolbox -ui
独立页面和 DSH 插件页功能一致:工具管理、命令运行控制台、语言版本、脚本、本机环境检查。
- 工具:已安装工具、可安装清单、每个工具的多下载源与实时测速、启用/停用/卸载、导入本机已有程序。
- 命令运行:所有正在跑的命令(包括 AI 通过 MCP 发起的)都在这里,带工具、参数、耗时和实时控制台。
\r形式的进度行按终端语义原地刷新,所以 yt-dlp / curl / aria2 / ffmpeg 的百分比、速度、ETA 直接可读;「取消」会连子进程一起结束。 - 脚本:
toolbox_save_script归档的通用脚本,可以在页面填参数运行。
运行记录写在 <root>/runs/<id>.json + <id>.log,所以不同进程(AI 的 stdio 服务 / 管理页的 HTTP 服务)看到的是同一份状态。
语言版本
AI 写 PowerShell 时最容易踩的坑是版本:?:、??、&&/|| 只有 PowerShell 7 才有,Windows 自带的 5.1 会直接报错。所以工具箱在写脚本前会先报告本机真实可用的语言和版本:
python 3.12.14 interpreter .py
node 24.21.0 interpreter .mjs
powershell 5.1.26100 shell .ps1 ← 红标:按 5.1 语法写
go 1.25.0 compiler
- 探测结果缓存在
<root>/runtimes.json(12 小时有效),换窗口、换进程都不用重测;管理页点「重新检测」或 MCP 传refresh: true立即重测。 - 默认只读环境变量:扫描
PATH与JAVA_HOME/GOROOT/CARGO_HOME/DENO_INSTALL/BUN_INSTALL/DOTNET_ROOT/DSH_HOME这些变量指向的目录,不启动任何进程(实测 180ms,无副作用、不会闪黑窗)。版本取自环境变量或安装路径里的三段式版本号(…\node-versions\v24.21.0\…);读不到的留空,绝不瞎猜(WindowsPowerShell\v1.0这种目录不会被当成 1.0)。 - 需要准确版本时点「精确版本」(MCP 传
exec: true),才会每个语言跑一次--version(Windows 下隐藏窗口);结果里mode会写成exec,普通探测是env。 - 每个条目带
notes,把最容易踩的差异写清楚(5.1 没有三元/空合并/管道链、Python 3.8 以下没有match、Node 18 以下没有内置fetch)。 toolbox_save_script按语言取这里记录的真实解释器路径,归档的脚本和toolbox_run用的是同一套环境。- 内置覆盖 python / node / deno / bun / ruby / php / pwsh / powershell / go / rustc / cargo / dotnet / java / gcc / clang;其他语言在页面「脚本 → 语言…」里填 id + 命令名或绝对路径 + 可选脚本扩展名即可加入,AI 之后也能看到并选择。
- 命令填
rust这种裸命令名时按 PATH 解析,也可以填D:\rust\bin\rustc.exe;没装也会先存下来并标成「未找到」。 - 填了扩展名(比如
ts)就能用它归档脚本:toolbox_save_script { language: "rust" }会写成名字.ts,执行方式是<命令> 名字.ts。
- 命令填
内置工具
| 工具 | 作用 |
|---|---|
toolbox_list | 已装工具(含一行用法)+ 当前系统可装条目及其下载源 |
toolbox_install | 按目录安装;多源顺序尝试,失败自动切下一个;可传 url 自定义 |
toolbox_run | 运行已装工具,返回 exitCode / stdout / stderr(默认 120s 超时,上限 600s) |
toolbox_remove | 删除一个工具 |
toolbox_runtimes | 本机真正能跑的语言/编译器及版本号(python 3.12 / node 24 / powershell 5.1 / pwsh 7 / go / rustc…);结果缓存在磁盘,refresh 强制重测 |
toolbox_save_script | 把通用脚本归档进工具箱,之后可用 toolbox_run 调 |
目录默认 $TOOLBOX_ROOT,否则 ~/.toolbox。布局:
<root>/
catalog.json 可选:覆盖/新增目录条目
tools/<id>/tool.json 安装清单(命令、版本、来源)
tools/<id>/bin/ 可执行文件
tools/<id>/README.md 用法说明
runs/<id>.json 每条命令的运行记录
runs/<id>.log 该命令的实时输出(管理页控制台读它)
runtimes.json 语言探测结果(版本、路径、检测时间),12 小时内复用
.downloads/ 断点续传的临时文件
自己加工具
内置目录编译进二进制(internal/catalog/catalog.json)。用户在 <root>/catalog.json 写同名 id 即整条覆盖,写新 id 即追加:
{
"version": 1,
"tools": [
{
"id": "imagemagick",
"title": "ImageMagick",
"description": "图片批量转换、裁剪、加水印。",
"usage": "toolbox_run { tool: \"imagemagick\", args: [\"magick\",\"in.png\",\"-resize\",\"50%\",\"out.png\"] }",
"binaries": ["magick"],
"sources": [
{ "os": "windows", "arch": "amd64", "url": "https://…/ImageMagick.zip", "archive": "zip",
"sha256": "可选的十六进制摘要" },
{ "os": "darwin", "arch": "arm64", "url": "https://…/imagemagick.tar.gz", "archive": "tar.gz" }
]
}
]
}
os用 GOOS 值(windows/darwin/linux),arch用 GOARCH(amd64/arm64),留空表示不限。- 同一系统内
sources的顺序就是重试顺序;多个源时先各测 512KB 再按速度排序。 - 只有单文件(如
jq.exe)时标"single": true,下载完直接落到bin/。 sha256可选但建议给:填了就会在解包/执行之前校验,不匹配直接拒绝并删掉下载文件。滚动更新的 "latest" 链接不要填。- 支持的包格式:
.zip、.tar.gz、.tgz、裸可执行文件。tar.xz明确不支持(会给出错误而不是静默失败)。
JSON API
-http / -ui 模式下同时提供(管理页就是调它们):
GET /api/state { root, platform, installed[], available[] }
GET /api/runs { runs[], running } 最近命令(含 AI 发起的,跨进程)
GET /api/runlog?id=<id>&tail=24000 一条命令 + 控制台输出尾部
POST /api/runs/cancel { id } 结束某条正在运行的命令
POST /api/runs/clear 清掉已结束的记录
POST /api/install { tool, url?, archive? }
POST /api/remove { tool }
POST /api/run { tool, args[], cwd?, timeout_ms? }
POST /api/upload?tool=<id>&name=<file> 请求体是文件二进制
GET /api/scripts 已归档脚本
MCP 端点在同一端口的 /mcp(streamable HTTP)。
安全模型
请先读这一节再决定装什么:
- 按设计,工具箱会下载并执行程序,而且不经过 DSH 的文件沙箱——装进来的程序以你的用户身份运行,和在终端里直接跑等价。
- 下载默认不校验任何东西:目录条目没写
sha256时,信任建立在 URL 上。企业/多用户环境建议给目录条目补sha256,或自建镜像。 - 内置目录里个别源走了
gh-proxy.com这类第三方 GitHub 镜像(为了国内直连)。介意的话在<root>/catalog.json里覆盖成官方地址。 - 管理页只监听回环地址,并且要求同源/本机 cookie;它没有远程访问能力,别把它暴露到公网。
安全问题的报告方式见 SECURITY.md。
开发
go build -o build/bin/toolbox.exe . # 构建
go vet ./... && go test ./... # 检查与测试
node --check dsh-toolbox/client.js # 管理页语法
node _scripts/ui-smoke.mjs # 管理页组件冒烟测试(无需浏览器)
跨平台构建/发版由 GitHub Actions 完成,见 .github/workflows/release.yml。发版流程:
dsh-toolbox/package.json的version改成X.Y.Zgit tag vX.Y.Z && git push origin vX.Y.Z- CI 构建 6 个平台、生成
SHA256SUMS、发 Release,并(配好NPM_TOKEN时)发布 npm 包
版本号只有一个来源:二进制用 -ldflags "-X main.version=$TAG" 注入,插件用 package.json 的版本去下载对应 Release。
已知限制
tar.xz不支持(Linux 的 ffmpeg 官方包是 xz,需要换 zip/tar.gz 源或自己补解压)。- 下载走系统代理设置;企业代理需要自己配
HTTPS_PROXY。 - Windows 上下载的可执行文件没有签名,首次运行可能被 SmartScreen 拦一次。
- 管理页目前只有中文文案。
许可证
Comments
Loading…