npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dsh-work-components

v0.2.2

Published

DSH 工作组件插件:统一挂载并管理控制其他工作软件的 MCP 服务器(Office / Blender / Unity / Figma / Photoshop / Chrome / Godot / Windows / Notion / Cloudflare / GitHub / ComfyUI / FFmpeg / Obsidian),带「工作组件」设置页;另含多模态工具 mm_send_image。

Readme

dsh-work-components(工作组件)

兼容 DeepSeek Harness(DSH)的插件,用来统一挂载和管理「控制其他工作软件」的 MCP 服务器(Office / 创作工具 / Windows 桌面 / Notion / Cloudflare / GitHub / ComfyUI 等)。每个工作组件以 @deepseek-ai/dsh-mcp-client 子插件的形式挂载:不写进 profile,随本插件卸载,设置改动后只重挂受影响的组件。

自有代码采用 MIT 许可证。vendor/dsh-tools/ 是 DeepSeek 的代码副本,版权归 DeepSeek,许可同样是 MIT,全文和保留义务见 NOTICE 与 vendor/dsh-tools/LICENSE。

文中的产品名称只用来说明兼容对象,是各自权利人的商标。本项目与 DeepSeek、微软、Blender Foundation、Unity Technologies、Figma、Adobe、Google、Godot Foundation、Notion、Cloudflare、GitHub、Comfy、FFmpeg、Obsidian 等没有隶属、赞助或授权关系。设置页图标是通用线条;仓库不收录第三方产品标志。插件自身设置页的实装截图见下文「实装截图」。

| 组件 | MCP 服务器 | 工具名前缀 | 前提(简述) | |---|---|---|---| | Office | OfficeMCP(COM) | mcp__officemcp__ | Windows + Office(Word / Excel / PowerPoint 等) | | Blender | mcp-for-blender(PyPI) | mcp__blender__ | Blender 开着并启用对应插件 | | Unity | mcp-for-unity / mcpforunityserver(Coplay) | mcp__unity__ | Unity 编辑器装了 MCP for Unity 包并开着工程 | | Figma | figma-console-mcp(npm;也可改连官方桌面版 MCP) | mcp__figma__ | Figma 桌面版 + Desktop Bridge(console)或 Dev Mode 官方 MCP | | Photoshop | @alisaitteke/photoshop-mcp(npm,COM / ExtendScript) | mcp__photoshop__ | Windows(或 macOS)装有 Photoshop 并开着 | | Chrome | chrome-devtools-mcp(npm) | mcp__chrome__ | 本机 Google Chrome;可独立启动或连已有实例 | | Windows | Windows-MCP(PyPI) | mcp__windows__ | Windows;stdio 由插件拉起,或连已有 HTTP 服务 | | Notion | Notion MCP(经 mcp-remote OAuth 桥) | mcp__notion__ | 首次 OAuth;token 在 %USERPROFILE%\.mcp-auth | | Cloudflare | Cloudflare API MCP(经 mcp-remote) | mcp__cloudflare__ | 首次 OAuth(scope=offline_access) | | Cloudflare Docs | Cloudflare Docs MCP(公开 HTTP) | mcp__cloudflare-docs__ | 无需登录 | | GitHub | GitHub MCP(托管 HTTP) | mcp__github__ | PAT:设置 githubToken 或环境变量 GITHUB_MCP_PAT | | ComfyUI | comfy-mcp(PyPI) | mcp__comfyui__ | 本机 ComfyUI / comfy-cli | | Godot | godot-ai(PyPI,godot-ai attach) | mcp__godot__ | Godot 4.7+ 编辑器开着项目,且项目启用了同版本 Godot AI 插件 | | FFmpeg | Kinocut(PyPI kinocut,原 mcp-video) | mcp__ffmpeg__ | 本机已安装 ffmpeg/ffprobe(PATH 或设置路径) | | Obsidian | obsidian-mcp-server(npm) | mcp__obsidian__ | Obsidian 开着 + 社区插件 Local REST API + API 密钥 |

组件依赖的运行时(uv + Python,或 Node.js)与各上游 MCP 包,都可以在设置页「下载安装」到插件自己的 tools/ 目录。新鲜安装时所有工作组件 MCP 与会话控制均默认关闭(*Enabled: false),装好后在管理页逐个打开「启用」才会挂载对应 MCP。具体安装、桥接、端口与项目侧配置都在设置 UI 里完成,本 README 不重复操作步骤。

计划加入:TRIX-GAMEBOT。

多模态:mm_send_image(本地图片 → Host attachmentId;render=text+image;UI:presentationMeta.mm → turnTail MmCard,toolview 仅 pending/compact)。

实装截图

工作组件列表

设置页

DSH 设置里的「工作组件」页:首页是功能列表(按分组),行首应用图标、行尾实时状态,点进该项的管理页。

| 分组 | 功能 | 列表状态(示意) | 管理页要点 | | --- | --- | --- | --- | | 多模态 | 媒体卡片 | mm_send_image · 可用 | mm_send_image 发图(API text+image;settled MmCard 在 turnTail,toolview 折叠后仍可见) | | 工作组件 | Office / Blender / Unity / Figma / Photoshop / Chrome / Godot / Windows / Notion / Cloudflare / Cloudflare Docs / GitHub / ComfyUI / FFmpeg / Obsidian(徽标「已验证」) | 已连接 / 已启用 / 未启用 / 未安装 / 出错 / 安装中… | 运行与连接说明、下载安装 / 卸载、「启用」、组件专属配置 | | 本地兼容 | local-components/<id>/ 下的用户模块(徽标「本地」;可用 env DSH_WORKBENCH_LOCAL_COMPONENTS_DIR) | 同上 | 与仓库自带同接口;详情页「启用」;管理页复制 PR 清单 / 打开 Compare(不自动 commit / push / gh pr create) | | 通用 | uv / Node.js / 下载代理 | 可用 / 未安装 / 已设置… | 运行时安装与代理等共用项 | | 基础工具 | 添加工作组件 | 提示词工具 | Token 声明 + 可复制 AI 提示词:写成本地模块(不装进 tools/)。选型功能最全优先;应补可配置/必填参数(中文 label);本地阶段 keys + launch/spec 硬编码默认,拟议 schema 写注释;自定义键未进 schema 前不持久化。模块就位后重启 DSH,再在设置页下载安装。 |

有上游仓库的功能在标题旁显示蓝色网址文字(新标签打开)。管理页「‹ 返回」或 Esc 回列表;每页各自「保存」;「启用」拨动后立即单独保存(本地组件同样有启用开关,键 <id>Enabled,缺省关)。安装进行中列表与管理页约每 1.5 秒刷新;有组件已启动时约每 5 秒刷新以跟上「已连接」。设置命名空间:dsh-workbench。

「已连接」

优先级:安装中 / 排队中 → 出错 → 已连接 → 已启动 → 未启动 / 未安装。

  • 已启动(status: on):MCP 服务器已挂载,尚未确认够得着目标程序。
  • 已连接(status: connected):已启动,且 (a) 对应程序在运行,(b) MCP 层可达。

探测在 GET /components 时按需进行(src/connect.mjs):只读、不拉起程序;结果缓存 PROBE_TTL_MS(6s),同一组件不并发,一轮共用一次进程列表;单次探测限时 PROBE_TIMEOUT_MS(15s)、工具调用默认限时 4s;请求最多等 1.5s,未完成的下次再带。工具经 ctx.tools 里 dsh-mcp-client 已有连接直接执行。上次已连接而本次工具超时则暂保持已连接并注明。组件重挂后旧结果作废。

| 组件 | (a) 程序在运行 | (b) MCP 够得着 | | --- | --- | --- | | Office | 进程 WINWORD / EXCEL / POWERPNT 等(含 Visio、Outlook、WPS 等) | RunningApps(COM,只读)非空 | | Blender | 进程 blender | 已注册工具 + TCP 连插件端口(BLENDER_HOST:BLENDER_PORT,默认 localhost:9876) | | Unity | 进程 Unity | 已注册工具 + 按 ~/.unity-mcp(或 UNITY_MCP_STATUS_DIR)端口文件与默认 6400 做桥接 ping | | Figma(console) | 进程 Figma(不含 figma_agent) | figma_get_status 中 transport.websocket.available | | Figma(官方) | 进程 Figma | TCP 连官方 MCP 地址(默认 127.0.0.1:3845) | | Photoshop | 进程 Photoshop | photoshop_ping 成功(PSMCP_FEEDBACK=0、ANALYTICS_DISABLED=1) | | Chrome(launch) | chrome-devtools-mcp 专用配置目录被 Chrome 占用 | list_pages 成功(未占用时不调,避免拉起 Chrome) | | Chrome(autoConnect) | chrome + 渠道默认配置目录有 DevToolsActivePort 且端口开 | list_pages 成功 | | Chrome(browserUrl) | GET <调试地址>/json/version 成功 | list_pages 成功 | | Godot | 进程名以 Godot 开头(不含 venv 里的 godot-ai) | 已注册工具 + session_manage(op=list) 有会话 + editor_state 成功 | | FFmpeg | 本机能解析到 ffmpeg(PATH 或 ffmpegPath) | MCP 已就绪(Kinocut 不依赖常驻 GUI) | | Obsidian | 进程 Obsidian | 已注册工具 + TCP 连 Local REST API(obsidianBaseUrl,默认 127.0.0.1:27123) |

架构(给开发者)

组件文件夹约定见 docs/component-module.md(布局、稳定导出、共享层、新增检查清单)。

src/
  index.mjs            宿主入口:SettingsSchema、API、mm_send_image
  components.mjs       兼容再导出 → ./components/
  components/          仓库自带组件 + shared / registry / manager
  connect-lib.mjs      「已连接」共享原语(进程 / TCP / MCP 调用)
  connect.mjs          汇总各组件 app/probe,提供 probeComponent
  tools.mjs            tools/ 布局、下载、uv / Node / npm / venv 安装
lib/
  index.mjs            构建产物(宿主)
  client.js            前端设置页、mm_send_image toolview(pending)与 turnTail MmCard(ModuleLoader)
office/launch.py       OfficeMCP 启动包装(stdio 友好)
cordis.patch.yml       bundle 层,插入宿主插件行
docs/component-module.md  组件模块约定(含 bundled vs local)
scripts/               build、vendor:sync、各类 smoke
tools/                 本机「下载安装」落地(gitignore)
local-components/      用户本地兼容源码(gitignore;可用 DSH_WORKBENCH_LOCAL_COMPONENTS_DIR 覆盖)

托管安装:设置页可把 uv、Node.js 与各组件装进 tools/(.dsh-install.json 记版本)。启动查找顺序一般为:插件 tools/ → 设置路径 → 系统 / 旁路兜底(如 uvx、npx、旁边的 ../officemcp)。Figma「官方桌面版 MCP」模式走 streamable-http,不需本地包。测试可用环境变量 DSH_WORKBENCH_TOOLS_DIR 改落地目录。

同源 API(前缀 /dsh-workbench/api):

| 方法 | 路径 | 说明 | |---|---|---| | GET/POST | /settings | 读写 dsh-workbench 设置 | | GET | /components | { ok, toolsDir, localComponentsDir, contributeCompareUrl, components };组件含 moduleSource(bundled/local)、status、connection、install、source(启动来源)等 | | GET | /components/<id>/contribute | 仅 local:PR 清单、文件列表、compare URL、命令模板 | | POST | /components/<id>/install | 开始(重新)安装,202;冲突 409。id:uv / node / office / … / godot / ffmpeg / obsidian | | POST | /components/<id>/uninstall | 删除 tools/ 中该安装 | | POST | /components/godot/addon | body { project }:把同版本插件装进 Godot 项目 |

另有 /dsh-workbench/assets/* 提供插件 assets/ 静态资源。

从纯 MCP(cordis.patch)迁入

本机原先在 ~/.dsh/profiles/desktop/cordis.patch.yml 里用 @deepseek-ai/dsh-mcp-client 直接挂的 Windows / Notion / Cloudflare / Cloudflare Docs / GitHub / ComfyUI,已收进本插件的「工作组件」。迁完后请去掉 profile 里对应的 mcp-* 插入项,避免工具双重注册;备份目录示例:~/.dsh/profiles/desktop/.backup-before-mcp-to-workbench-*。

新增组件:先写 local-components/<id>/(设置页「添加工作组件」提示词),再按 docs/component-module.md 合入 src/components/ 并开 PR。本地模块由 registry 自动发现,与 bundled 同 id 时 bundled 优先。宿主用 RuntimeSettingsSchema 合并本地 *Enabled(见 src/index.mjs)。运行时下载仍只落在 tools/(gitignore),仓库不附带已下载的 MCP 树。本机可有 gitignore 下的示例(如 local-components/docker/),文档只记约定,不强制提交该目录。测试可用 DSH_WORKBENCH_LOCAL_COMPONENTS_DIR 指向桩目录。

构建与测试

npm install
npm run build          # 不依赖已安装的 DSH;defineTool 在 vendor/dsh-tools(升级后可 npm run vendor:sync)
npm run smoke          # 假 ctx,mm_send_image → lib/smoke.png
npm run smoke:tools    # 走同一套安装代码装组件,再 MCP initialize / tools/list(可指定组件、--proxy、--skip-install、--uninstall)
npm run smoke:office   # 按插件启动方案拉起 OfficeMCP(可用 --expect-managed)
npm run smoke:connect  # 「已连接」实机冒烟(Windows):node scripts/connect-smoke.mjs chrome …
npm run smoke:local    # 本地兼容发现 / moduleSource / contribute 清单

从源码挂进 DSH Desktop:在 ~/.dsh/profiles/desktop 用 pnpm add link:<插件目录>,并在 dsh.profile.bundles 加入 "dsh-work-components"(若 profile 里曾直接挂同名 mcp-client,先去掉以免重复)。改 bundle 后需重启 Desktop。

会话控制(通用)

内置于本插件,不单独装包。面向官方 Harness 0.2.0-rc.2 会话日志。

功能

| 功能 | 入口 | 行为 | |------|------|------| | 撤回 | 用户消息下方操作行的「撤回」(设置 → 工作组件 → 通用 → 会话控制 可关) | 先把当前页正在看的会话恢复到内存,再追加一条 surfaceOp: replace,当前页收起该回合及之后的内容。恢复失败时才备份并物理截断磁盘日志,并由页面重新同步。 | | 重试 | 助手操作行的「重试」(复制与分支之间) | 先恢复会话,再保留这条用户消息,用 surfaceOp: replace 收起它后面的回复,然后 followup 同一条内容。新回复直接流在原问题下面。恢复失败时不改磁盘日志。 | | 熔断 | 输入框「暂停」按钮(随时可用,含思考中);或自动阈值 | 暂停只调用 agent.cancel({ kind: 'user' }, { keepInbox: true })。自动熔断在同一取消之后,等回合停写,再按撤回把失败尾轮从磁盘截掉。 |

使用注意

  1. 只打开着、还没在内存里的会话,会先按官方 sessionController 恢复,再在当前页收起内容。撤回收起该回合及之后的全部对话;重试留下原问题,收起原回复并立刻重新生成。页面不用退出再进。恢复失败时,撤回仍截断磁盘并由当前页重新同步;重试不先删日志。
  2. 备份目录:~/.dsh/repair-backups/workbench-session-controls-<时间戳>/。
  3. 聊天内自动使用当前会话 sessionId,无需粘贴;设置页仍可调自动熔断阈值。
  4. 自动熔断阈值在设置页「会话控制」中调整。
  5. 主开关 sessionControlsEnabled 经 /settings 保存。有 DSH 设置服务时写入该服务;Desktop 无设置服务时写入插件目录 .dsh-workbench-settings.json(可用 DSH_WORKBENCH_SETTINGS_FILE 覆盖路径)。启用后聊天内撤回/重试/暂停会立即出现,无需重启。

API(宿主)

  • GET /dsh-workbench/api/session/turns?sessionId=
  • POST /dsh-workbench/api/session/retract { sessionId, userMessageSeq? , messageId? }
  • POST /dsh-workbench/api/session/regenerate { sessionId, userMessageSeq?, messageId? }
  • POST /dsh-workbench/api/session/cancel { sessionId, reason? }
  • GET /dsh-workbench/api/session/notices