DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Mcp Ctl — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins

dsh-mcp-ctl

Mcp Ctl

适用于 DeepSeek Harness 的 Claude Code 风格 /mcp 斜杠命令:列出 MCP 服务器及其实时状态,并切换其启用/停用状态。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add dsh-mcp-ctl@0.1.3
README兼容性版本

兼容性与来源证明

Mcp Ctl 以 dsh-mcp-ctl 发布,当前版本为 0.1.3。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
npm
Registry 更新时间
2026/10/16

版本

0.1.3stable
2026/9/29

相关插件

正在加载相关插件…

最新版
0.1.3
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
37.5 kB
文件数
6
Surface
web
许可证
MIT
发布源
npm
GitHub
★ 0
周下载
22
最近提交
2026/9/29
查看源码 ↗项目主页 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 integrations-communication 分类下经过校验的插件。

Acp App@deepseek-ai/dsh-acp-appdsh ACP 配置文件包:基于 dsh-base 的仅限自动化的 JSON-RPC stdio 和进程生命周期管理Ab Publishdsh-ab-publish浏览器自动化发布工具,可登录任意网站并发布内容,整合为一个可发布的插件包Ab Wechat Scrapedsh-ab-wechat-scrape--- description: "树外 wechat_scrape 工具:获取微信公众号文章,过滤推广区块,并将每篇文章保存为 Markdown 文件,供此机器的 dsh 配置文件维护者使用。" kind: "package-reference" ---Ds Botds-botDS Bot:DeepSeek Harness 的一组长期运行的 Bot,支持主 Bot、Bot 间消息和群聊

README

dsh-mcp-ctl

Claude Code 风格的 /mcp 指令 for DeepSeek Harness (DSH): list every MCP server mounted in the harness with its live status, and toggle each one on/off — from the chat.

What it does

In DSH, each MCP server is a composition row running @deepseek-ai/dsh-mcp-client (one plugin instance per server, e.g. mcp-github, mcp-gitee). This plugin:

  • registers the human slash command /mcp (command plane — results never enter model history);
  • auto-discovers every @deepseek-ai/dsh-mcp-client row in the live loader tree (including disabled ones), reading its enablement, loader fiber phase (pending / loading / active / failed / unloading) and the number of tools registered as mcp__<serverName>__*;
  • renders an interactive card in the conversation (via the conversation.chat.commandview slot, key mcp) with per-server toggle buttons, status dots and tool counts — a warning flag when a server is enabled but exposes zero tools (likely a failed connection);
  • toggles live and durably: the loader entry is restarted/disposed immediately (entry.update), and the row's disabled: flag is written back into the profile's cordis.patch.yml so the choice survives restarts (HMR applies the file change; the in-memory state already matches, so the reload is a no-op).

Usage

/mcp                          # open the interactive server card
/mcp github                   # open the card with that server highlighted
/mcp on github                # enable  (text shortcut, no card needed)
/mcp off gitee                # disable (text shortcut, no card needed)
/mcp toggle chrome-devtools   # flip

The card's buttons are equivalent to the text shortcuts — each toggle logs a compact confirmation row in the chat, and every open card converges on the fresh state.

Install

首选:从 npm 安装

Requires a DSH 0.1.5-rc.x web profile (pnpm workspace) — see Compatibility for the exact contracts each half uses. In the profile directory:

cd "$DSH_HOME/profiles/web"                 # e.g. ~/.dsh/profiles/web
dsh plugin --profile web add dsh-mcp-ctl    # installs AND mounts

The package declares dsh.bundle.patch, so dsh plugin add reconciles it into dsh.profile.bundles and the profile boot merges this package's own cordis.patch.yml. One command installs and mounts — there is no row to add by hand any more.

中国大陆镜像注意:若 npmmirror 尚未同步新版本,显式指定官方源 --registry=https://registry.npmjs.org/。

Legacy / manual channel. Only needed when the package sits in node_modules but is not listed in dsh.profile.bundles — that is, after a plain pnpm add without the CLI, which is also the shape dsh-market mounts as a client-only shim. Add one row to the profile's cordis.patch.yml — as an insert (a bare top-level - id: entry would be treated as an override of an existing entry and silently skipped):

- insert:
    - id: mcp-ctl
      name: 'dsh-mcp-ctl'

Both channels insert the same row id mcp-ctl. If the profile patch still carries the manual row, delete it before switching to the bundle channel, or the host half mounts twice (two /mcp registrations, two client cards).

The loader's HMR mounts the host half immediately; the /mcp command works right away. The Web client card appears after one browser refresh (the client bundle is served by the profile's client-modules route once the entry is live). No process restart is required.

备选:从源码安装 (git)

For unreleased code or development:

cd "$DSH_HOME/profiles/web"
dsh plugin --profile web add git+https://github.com/elephanttalkheads/dsh-mcp-ctl.git

The bundle layer travels with the checkout, so the same one command installs and mounts. Note the harness process usually runs with the workspace directory as its cwd; a package with this repo's name/exports can then resolve to the checkout itself (Node self-reference) instead of the profile copy — keep the checkout in sync and restart after updating.

Config

FieldDefaultDescription
patchFile<profile>/cordis.patch.ymlWhich composition patch file the toggle writes to. Defaults to cordis.patch.yml in the profile directory the plugin was mounted from (ctx.baseUrl, a file:// URL), falling back to $DSH_HOME/profiles/web/cordis.patch.yml. Set it when your servers live in another file.

Example:

- id: mcp-ctl
  name: 'dsh-mcp-ctl'
  config:
    patchFile: 'C:/Users/me/.dsh/profiles/web/cordis.patch.yml'

Re-enabling a row another manager disabled

A plugin manager (for example dshmarket) switches a row off by appending a top-level override to the patch file:

- id: mcp-ctl
  disabled: true

A file-order patch layer gives that override the last word, so /mcp (which cannot run while its own row is disabled) will not start by itself. Flip it by hand once — /mcp then keeps the row consistent from then on, because it edits the row's effective (last) mention and adds the same kind of override for rows a bundle layer defines.

Updating

cd "$DSH_HOME/profiles/web"
pnpm update dsh-mcp-ctl            # or: pnpm add dsh-mcp-ctl@latest
# restart `dsh web` — loader HMR ignores node_modules, so a running process
# keeps the module it imported at startup

Publishing

Releases go through npm Trusted Publishing: the GitHub Actions workflow exchanges an OIDC token for a short-lived publish credential, so no long-lived npm token is stored in this repository or in CI secrets. (npm also now refuses 2FA-bypassing tokens for direct publishing, so a stored token is not an option.)

One-time setup on npmjs.com — package → Settings → Trusted publishing → GitHub Actions:

FieldValue
Organization or userelephanttalkheads
Repositorydsh-mcp-ctl
Workflow filenamepublish.yml
Environment name(leave empty)
Allowed actionsnpm publish

Release:

npm version patch      # or minor / major — semver: fixes=patch, features=minor
git push --follow-tags # the v<version> tag runs .github/workflows/publish.yml

The workflow checks the tag against package.json, runs both test suites and publishes with provenance. To publish the version already on the default branch (or to retry a failed run), start the workflow manually from the Actions tab — the workflow_dispatch trigger skips the tag check.

How it works under the hood

PieceMechanism
commandctx.commands.register (@deepseek-ai/dsh-commands), with an input.hint for the composer
discoveryctx.loader.entries() filtered by name === '@deepseek-ai/dsh-mcp-client'
statusentry.disabled + entry.fiber.state (same mapping as dsh-host-plugin-inventory)
tool countctx.tools.schemas() prefix-matched by mcp__<serverName>__
live toggleentry.update({ disabled }) — the loader's own mutation API
persistencesurgical edit of the row's effective disabled: value in cordis.patch.yml — the last block mentioning the row id, or a newly appended top-level - id: override when no layer in that file defines it (comments, !!js expressions and line endings elsewhere are byte-preserved)
card UIconversation.chat.commandview keyed slot + the useChat session hook + ctx.remote.commands.execute

State travels as JSON inside the command result text; the card always renders the newest mcp command node found in the live chat snapshot.

Compatibility

The package is tested against the contracts shipped in DSH 0.1.5-rc.x (harness packages 0.1.5-rc.2). The version-sensitive points, all covered by npm test:

HalfContractNotes
Hostctx.commands.register({ name, description, input, handler }); the handler receives { commandId, agent, rawInput, attachments, signal } and returns { kind, text }input.hint was added to the descriptor in 0.1.5; the registry logs the command/run→command/done pair itself
Hostloader Entry.disabled, Entry.fiber.state, Entry.update({ disabled })fiber state → phase mapping matches dsh-host-plugin-inventory; Entry.update changes live state only, which is why the patch file is the durable channel
Hostctx.baseUrl is a file:// directory URL (dsh-app-boot anchors it with pathToFileURL)resolved with fileURLToPath; a plain directory path is still accepted
Hostpatch layers apply in file order (include's applyEntryPatches), so the last mention of a row id owns its fields, and a top-level - id: X overrides a row an earlier layer insertedthis is what makes a manager-written disabled: true override win
Clientconversation.chat.commandview is a keyed, session-scoped slot whose owner props are { node: CommandNode, compaction? }the key is the command name (mcp)
Clientthe live conversation nodes come from the useChat session standard prop (contributed by the Chat view); SessionSnapshot.chat no longer existsthe card falls back to useSession(...).chat.legacy.nodes on older releases and to its own node when neither hook is present
Clientctx.remote.commands.execute(agentId, line, submittedAttachments, signal?) returns { ok, value } / { ok, error }the same Remote the composer dispatches through
Clientdsh.client.inject is an informational package-edge list (not Cordis service injection); the bundle itself only requires the platform seed word react

Known limitation: if the home-level layer ($DSH_HOME/cordis.patch.yml) pins the same row, it is applied after the profile layer and outranks this plugin's edit; remove the entry there, or point patchFile at that file.

Development

pnpm check   # syntax-check host and client bundles
pnpm test    # patch semantics + client behaviour (incl. the real profile patch, read-only)

test/patch.test.mjs pins the patch-file editing rules (including the real $DSH_HOME/profiles/web/cordis.patch.yml, read-only, when present); test/client.test.mjs materializes the client bundle against a stub React and stub slot runtime and drives both the modern useChat path and the legacy useSession fallback.

The client half is a hand-written window.__ModuleLoader__.load bundle (plain JS, no build step), the format the web client runtime consumes.

License

MIT

it now names dsh-client-ui-chat, dsh-client-ui-slots, dsh-api-remotes