DeepSeek Harness Plugin Hub

Publish and manage complete Harness Profiles. Discover Plugins for your next setup.

Explore

PluginsPresetsDocsNews

Community

Publish a pluginContactReport an issue

Resources

Plugin Hub on GitHubDeepSeek HarnessSystem statusPrivacy notice
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

Independent and unofficial. Not affiliated with, authorized by, or endorsed by DeepSeek.

Skill Mcp Tool — DSH Plugin for DeepSeek Harness
DeepSeek Harness Plugin Hub
ProfilesPluginsCategoriesNewsDocsSign inManage Profiles
ProfilesPluginsCategoriesNewsDocsSign in
← Plugins
S

dsh-skill-mcp-tool

Skill Mcp Tool

DSH 插件:统一管理 Skills 与 MCP —— 设置菜单与主界面左侧栏双入口,支持从 Git/URL 获取与更新 skills(可配置 Git 代理),并对任意 Skill 与 MCP 服务器做热加载启用/停用。Unified Skills + MCP manager for DeepSeek Harness with hot-reload enable/disable toggles, Git-based skill install/update and an optional Git proxy.

The plugin will be installed here. Keep web if you are unsure.

npx -y @deepseek-ai/dsh plugin --profile web add github:artorias-zj/dsh-skill-mcp-tool#56b5c2d29b8451f9c5d5bdf0b507f034b9b542f5
READMECompatibilityVersions

Compatibility and provenance

Skill Mcp Tool is published as dsh-skill-mcp-tool and currently resolves to version 1.0.2. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.

DSH compatibility
*
Runtime surfaces
web
Release source
github
Registry updated
10/16/2026

Versions

1.0.2stable
10/16/2026
1.0.1stable
10/13/2026

Related plugins

Loading related plugins…

Latest
1.0.2
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
Unavailable
Files
Unavailable
Surface
web
License
MIT
Source
github
GitHub
★ 1
Weekly downloads
0
Last push
10/16/2026
View source ↗
README badge

Click the badge to copy Markdown for your README.

Do you maintain this Plugin?Claim benefit · Priority security scan

Verify the GitHub repository declared in package.json to manage this listing. After you claim it, Hub will prioritize a security scan of the current version and publish the result when it passes.

Claim this Plugin →
Report an issue

Related plugins

More verified plugins in developer-tools.

Web App@deepseek-ai/dsh-web-appThe dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)Sdk App@deepseek-ai/dsh-sdk-appThe dsh SDK profile bundle: stdio JSON-RPC serving and process lifecycle over dsh-baseExperimental Inspector@deepseek-ai/dsh-experimental-inspectorExperimental cross-realm CDP hub for Host debugging and Client Runtime inspectionExperimental Inspector Profile@deepseek-ai/dsh-experimental-inspector-profileOptional Web bundle for raw Session logs and Chat node inspection

README

dsh-skill-mcp-tool

English | 中文

A DeepSeek Harness (DSH) plugin that puts Skills and MCP servers under one roof, reachable from both the settings menu and a main-interface sidebar entry — with hot-reload enable/disable toggles and Git-based skill install/update.

Features

Two entry points, one panel

  • Settings menu → "技能与 MCP" / "Skills & MCP" page.
  • Main interface → a sidebar icon row that opens the same panel in the centre column.

Both render the identical component, so the four tabs (Skills / MCP / Remote sources / Backup) behave the same wherever you open them.

Layout: the two entry points are handled separately

The host's layout contract differs between the centre panel and the settings page, so the shell has two modes selected by data-surface:

  • Centre panel (opened from the sidebar icon): the host supplies neither padding nor a scroll container, so the plugin provides both — centred content with breathing room (up to 48px per side, shrinking responsively on narrow windows) plus its own scrolling.
  • Settings page: the host already renders the section inside its content column (padding and scrolling included), so the plugin adds nothing on top — no doubled inset, no nested scrollbars.

Scrolling: long skill lists stay reachable, with no visible scrollbar

In the centre panel only the list scrolls while the title and tabs stay pinned to the top, so the refresh button and tab strip remain reachable even at the bottom of a long list, with breathing room after the last row.

No visible scrollbar at all: the wheel, trackpad, touch, and keyboard (arrow keys / PageUp / PageDown) all keep working — only the bar is no longer drawn. The horizontal insets therefore always equal the inner padding: symmetric left and right regardless of content length or whether scrolling is needed, with no sideways jump when a scrollbar would have appeared or disappeared. The same rules cover modals, so long forms still scroll.

scrollbar-gutter: stable is deliberately not used: it reserves scrollbar width even when the content fits (measured: stable 15px, stable both-edges 30px), leaving an empty band on a page that has nothing to scroll. All three hiding mechanisms are declared — scrollbar-width, -ms-overflow-style, and ::-webkit-scrollbar — so no browser falls back to a native bar that would skew the insets.

Ordering: alphabetical, always

List order is predictable, so you never have to hunt through entries:

  • Skills: grouped by source, with a fixed group order of project → user → plugin → other (it does not shift as skills come and go, so group headings stay put); alphabetical by name within each group.
  • MCP servers: managed and external rows are each sorted alphabetically by server name.
  • Remote sources: sorted alphabetically by repository label.
  • Sorting is case-insensitive: Chrome_DevTools_MCP sorts before REA, instead of all uppercase names clumping at the top. Only when two names are identical in lowercase does the raw string break the tie, keeping the order stable.
  • Managed rows are written to cordis.patch.yml in that same order, so the file and the UI never disagree.
  • Ordering is applied at the single choke point every write path goes through, so add/edit/enable/disable/delete can't bypass it.

Skills

  • Lists every skill from all four standard roots, in official rank order: project .dsh/skills (100) → project .agents/skills (200) → user ~/.dsh/skills (400) → user ~/.agents/skills (500).

  • Handles both layouts: directory bundles (<name>/SKILL.md) and flat files (<name>.md), plus nested/categorised trees.

  • Enable/disable is a lossless rename: SKILL.md ⇄ SKILL.md.disabled (or <name>.md ⇄ <name>.md.disabled). The official provider only recognises the exact filenames, so the skill leaves the catalog while its files and references/, scripts/, assets/ stay fully intact. The provider's watcher picks the change up on the next catalog refresh — no restart.

  • Malformed skills stay listed but flagged 格式不合规 / Invalid format, so you can fix or delete them rather than being unable to see them.

  • Plugin-registered skills (no file on disk) are listed read-only.

  • Create, edit, and delete skills through the built-in editor; frontmatter is validated before anything touches disk.

  • Install / update from Git: shallow-clone a repository (or a subdirectory of one), discover every valid skill inside, and copy it to the chosen root. Records the source so you can re-pull later; git ls-remote tells you whether an update exists.

  • Junk directories are filtered out on write: .git, .hg, .svn, node_modules, __pycache__, .venv and friends never land in the skill directory. When the repository root is the skill bundle (a SKILL.md at the top level), the clone's .git would otherwise be copied wholesale — worth several MB of commit history and remote URLs. The UI lists exactly what was skipped.

  • Type / in a session to pick a skill: this plugin registers the skills it manages into DSH's skill registry, so the / menu matches and invokes them directly. A skill marked disable-model-invocation: true appears only there (the model never sees it), and a skill shown as disabled in the UI never appears in /. Changes take effect immediately — no restart.

Proxy: a Git proxy field above the tabs

On many networks a direct git clone of a repository times out, which makes installing and updating skills impossible. A proxy bar sits above the four tabs — it is a prerequisite shared by every Git operation in every tab (install, update, check for updates), not a setting belonging to one of them.

  • Command-scoped, never global. The address is injected as git -c http.proxy=… -c https.proxy=… <subcommand>. Your global git config is never rewritten — try git config --global --get http.proxy before and after; it is untouched. The plugin only adds flags to its own calls.
  • Off means "leave it alone", not "clear it". With the switch off, no -c flags are added at all, so git falls back to whatever you configured globally (direct, or your own git config proxy). A git p-on-style global setting keeps working.
  • One Test button answers "is it the network or the repo?" It probes the remote twice — once through the proxy and once direct — and reports both, so you can see at a glance which path is broken. If git isn't installed at all, the install dialog says so separately.
  • Credentials are treated as secrets. A URL like http://user:pass@host:port has its password masked (http://user:***@host:port) everywhere it is sent to the browser, and is omitted from exported bundles unless you tick "Include MCP secrets". The field echoes the masked form; saving it unchanged, or editing only the host/port, keeps the stored password rather than clearing it. If a bundle carries a masked password and this machine has none, the import plan says so instead of writing an empty one that would fail confusingly later.
  • Supported schemes: http, https, socks4, socks4a, socks5, socks5h. A blank or malformed address is rejected with a readable reason rather than silently disabling the proxy.
  • The chosen proxy is applied before any clone during an import, so a bundle that carries a proxy can rescue a fresh machine that has no working direct route yet.

MCP servers

  • Add, edit, delete and toggle @deepseek-ai/dsh-mcp-client rows, and inspect servers declared elsewhere in config read-only.
  • Shows live state per server: enabled/disabled, reconnection phase, and how many tools are currently registered.
  • Secret handling: API tokens and headers are never read back to the browser — only key names. Editing preserves keys you didn't retype, and lets you delete individual keys explicitly.
  • Type ${MY_TOKEN} in any env or header value and it is written as a real !!js expression (\Bearer ${process.env.MY_TOKEN}`) — DSH has no ${VAR}interpolation, so this is the only mechanism that actually reads the environment. The!!js` tag round-trips byte-exactly through every edit.

Backup: export / import your setup (for moving machines)

The Backup tab packs everything this plugin manages — Skills + MCP servers + Git source records — into a single JSON file you can import on a new machine.

Two payload modes, chosen at export time:

ModeContainsSizeOn import
Recipe (default)Just the source: repository + commit + layoutusually a few KBRe-clones from the recorded repo — needs network
Full contentsThe skill files too (binaries as base64)can be several MBRestores files directly — works offline
  • Skills with no recoverable source always carry their contents, in either mode — otherwise they would be lost on the new machine. That is not left to the UI to get wrong.
  • Import reviews before it writes: the plan lists every entry's action (create / overwrite), conflicts, secrets that need re-entering, and blocked items. Nothing is written until you confirm.
  • Secrets are excluded by default. This plugin normally never returns a secret to the browser; exporting breaks that boundary, so it takes an explicit opt-in and then shows a plain-text warning. Without it, only key names are written and you are told which ones to fill in.
  • Import is idempotent: re-importing the same file overwrites rather than duplicating.
  • If an upstream repository has moved on, the import reports that the commit it got differs from the one exported.

Install

# From GitHub (recommended; works with any profile)
dsh plugin --profile web add github:artorias-zj/dsh-skill-mcp-tool

# The desktop profile also accepts the full URL
dsh plugin --profile desktop add https://github.com/artorias-zj/dsh-skill-mcp-tool

Or install from the DSH sidebar Plugins page by pointing at this directory. Then restart DSH so the client bundle is served.

Restart required. The plugin's client JavaScript is addressed by URL and cached by the browser/module system. Enabling the plugin compiles and mounts the host half immediately; the settings page and sidebar entry appear after a restart.

How hot reload works

DSH has no runtime API to add, remove, or restart an MCP connection. A server is a loader row, and the supported way to change it is to edit its configuration and let HMR remount the row. This plugin writes to the profile's cordis.patch.yml, which DSH's HMR watches, then polls the loader to confirm the row actually remounted.

  • MCP enable/disable sets the row's disabled boolean → HMR disposes or mounts the connection in place.
  • MCP add/edit rewrites the row → HMR swaps in a fresh connection. Tool names stay stable across the swap.
  • Skill enable/disable renames a file → the provider's watcher invalidates the catalog.

The panel reports what actually happened: when a change is written but the host has not finished remounting, it says so rather than claiming success.

Configuration isolation

MCP rows are written inside a dedicated managed block:

# >>> dsh-skill-mcp-tool:mcp:begin
- insert:
    - id: smt-mcp-<serverName>
      name: "@deepseek-ai/dsh-mcp-client"
      config: { ... }
# <<< dsh-skill-mcp-tool:mcp:end

Everything outside the markers is preserved byte for byte, so other plugins' managed blocks (for example dsh-skill-mcp-panel) and your hand-written rows are never touched. Rows owned by other tools appear as read-only "external" servers. Writes take a <file>.smt.lock lock and use an atomic temp-file rename, so a concurrent writer cannot corrupt the file.

Plugin configuration

Optional config on the row in cordis.patch.yml:

FieldDefaultMeaning
dshHome$DSH_HOME or ~/.dshHarness home used to locate skill roots, the profile patch, and the source record

Files it touches

PathPurpose
<profile>/cordis.patch.ymlMCP server rows, inside the managed block
<dshHome>/skills/**Skills it installs, creates, edits, or toggles
<dshHome>/skill-mcp-tool/sources.jsonIndex of Git install sources (an index only — deleting it never affects installed skills)
<dshHome>/skill-mcp-tool/settings.jsonPlugin settings — currently just the Git proxy. Kept out of cordis.patch.yml on purpose: this plugin owns only the bytes between its MCP markers

HTTP routes

All routes are same-origin, POST-only for writes, with an origin check that rejects cross-site requests.

RoutePurpose
stateSkills + MCP + sources + proxy + environment in one read
skill/set-enabled, skill/remove, skill/read, skill/writeSkill management
skill/install, skill/update, skill/check-updates, skill/forget-sourceGit sources
mcp/list, mcp/save, mcp/remove, mcp/set-enabledMCP management
proxy/get, proxy/save, proxy/testGit proxy: read / write / probe both paths
bundle/export, bundle/plan, bundle/importSettings export / review / import

Plugin Info

FieldValue
One-line valueUnified Skills + MCP manager with hot-reload toggles and Git-based skill install/update
CategorySkills & MCP
Supported profilesdesktop / web
CompatibilityDeepSeek Harness 0.2.x; Node.js ^22.15 or >=24; Windows / macOS / Linux
Permissions & servicesReads/writes the profile cordis.patch.yml and local skill roots; runs git for install/update (optionally through a proxy you configure); no telemetry
LicenseMIT

License

MIT

Why this plugin supplies its own provider: the host-level @deepseek-ai/dsh-skill-filesystem row is deliberately disabled by the web app (its comment reads “presets own local discovery”), leaving each agent preset to mount its own. On some presets that provider does not actually take effect — skills on disk then appear neither in / nor to the model. This plugin does not depend on the preset being correct; it registers the roots it manages itself.