PerryLink/dsh-mcp-panel
MCP management console for the official DeepSeek Harness MCP client: /mcp command with health diagnostics and pipeline trial calls, a Settings MCP tab with server CRUD (approval-gated writes, automatic backups) and a tool trial console over the official tool pipeline (Apache-2.0, dsh-plugin).
Listed
9
Dev
Bundle verified
What it does
Read-only runtime management panel for the official DSH MCP client: connection status, registered tools, errors, and reconnect counts through the /mcp command and a Settings tab, with sanitized display and enable/disable patch suggestions.
Best for
- DSH Web GUI users who need visibility into official MCP client connections, tools, errors, and reconnects.
- Operators who want sanitized MCP status and diagnostics through /mcp and a Settings tab.
- Teams that benefit from enable/disable profile-patch suggestions without replacing the official MCP bridge.
Not ideal for
- Deployments that do not use the official DSH MCP client; the panel is an experience layer, not an MCP bridge.
- Terminal-only environments that cannot use its Web GUI Settings surface.
- Users expecting the panel itself to establish MCP transports or register tools.
README
dsh-mcp-panel
The MCP management console for the official DeepSeek Harness MCP client — add, edit, remove, and trial-call MCP servers from a settings page, with honest status, health diagnostics, and safe, reversible profile writes.
Official client = bridge, this plugin = console: read status through the mcp/status seam, write only append-only, approval-gated profile patches.
Compatibility
| Surface | Status |
|---|---|
| Harness | DeepSeek Harness 0.1.0-rc.5–0.1.0-rc.6
|
| Node | ^22.19.0 \|\| >=24.0.0 |
| Platforms | Web GUI (dual-face: host + browser) |
| Model | Any (the panel is read-only; only /mcp output is model-readable) |
What you get
dsh-mcp-panel is the experience layer on top of the official MCP client: a read-only runtime view plus safe, reversible profile writes.
-
/mcpcommand — one row per server: transport, target, tool count, connection status (from the upstream seam;unknownwhen unobserved), last error, reconnect count — model-readable, session-log reconstructable, five output languages. -
/mcp <server> tools— model-visiblemcp__*tool names and descriptions. -
/mcp <server> health— derived self-heal suggestions (ENOENT → missing dependency, ECONNREFUSED, timeouts, 401/403/404, DNS, rate limit, reconnect exhaustion…); exit code / stderr tail honestly labeled pending upstream support until the client exposes them. -
/mcp <server> call <tool> [json]— trial-call through the official tool pipeline (ctx.tools.execute()); pre-execute permission policy, approval, guards, and post-execute all apply. - Settings → Plugins → MCP tab — status cards with badges, diagnostics, and probes, plus the server CRUD and the tool trial console.
-
Server CRUD — add/edit/remove forms →
insert/set/set disabledfragments → clipboard copy or approval-gated write with automatic backups. -
Tool trial console — server →
mcp__*tool → JSON args → canonical JSON result + rendered content; capped bytrialMaxResultChars; panel-only, never model context.
Architecture: official client = bridge, this plugin = console
@deepseek-ai/dsh-mcp-client is the only bridge: one plugin instance per MCP server, configured as a hand-written cordis.yml row, connecting the transport, syncing tools, and registering mcp__<server>__<tool> names. This plugin never replaces it — it is the experience layer on top:
┌────────────────────────────────────────────┐
profile │ cordis.yml / cordis.patch.yml │
composition │ - id: mcp-github │
(one row per │ name: '@deepseek-ai/dsh-mcp-client' │
server, hand- │ config: { serverName, transport, … } │
written) │ - id: mcp-panel │
│ name: dsh-mcp-panel ◄── this plugin │
└───────────────┬────────────────────────────┘
│
┌───────────────────────────┴───────────────────────────┐
│ │
┌────▼──────────────┐ ┌───────────────────────────┐ │
│ @deepseek-ai/dsh- │ │ dsh-mcp-panel (console) │ │
│ mcp-client │ │ │ │
│ • transport │ │ • /mcp command │ │
│ • tool sync │ │ • Settings → Plugins → │ │
│ • mcp__* tools │◄──────►│ MCP tab: CRUD, trial │ │
│ • mcp/status seam │ status │ • health diagnostics │ │
└───────────────────┘ │ • probes, capabilities │ │
└───────────────────────────┘ │
The console reads the client through its shipped mcp/status observability seam (event + mcpStatus query service), the tool registry, and the loader; it writes only the profile’s patch layer — append-only, approval-gated, always backed up. Transport, OAuth, and protocol stay untouched.
Console vs. hand-written cordis.yml
| Hand-written cordis.yml | dsh-mcp-panel console | |
|---|---|---|
| Add a server | Edit YAML, mind indent/quoting | Form → patch fragment → copy or write (approval + auto backup) |
| Edit a server | Edit YAML, restart/hot-reload | Form pre-filled from the live row; unchanged secrets keep their raw values host-side |
| Remove a server | Delete the row |
set disabled: true operation (the patch vocabulary has no remove) — re-enableable anytime |
| See status | Read logs | Badges + reconnects + last error, live from the mcp/status seam |
| Try a tool | Ask the model to call it | Trial console → official ctx.tools.execute() pipeline (permission & approval stay in force) |
| Diagnose failures | Grep logs |
/mcp <server> health with derived self-heal suggestions |
| Mistakes | Manual revert | Every write is append-only and leaves a timestamped backup |
The console’s output IS cordis.patch.yml vocabulary — the same lines you would write by hand, generated, previewed, and applied safely.
Quick start
# 1. install the bundle into your profile
dsh plugin --profile web add "github:PerryLink/dsh-mcp-panel#main"
# or from npm (published releases)
dsh plugin --profile web add dsh-mcp-panel
# 2. restart and verify the row
dsh --profile web --dump-config | grep -A3 'id: mcp-panel'
Then open Settings → Plugins → MCP, or run:
/mcp
/mcp everything tools
/mcp everything health
/mcp everything call echo '{"message": "hi"}'
Install & uninstall
-
git channel (latest
main):dsh plugin --profile web add "github:PerryLink/dsh-mcp-panel#main"— thepreparescript builds with production dependencies only. -
npm channel (published releases):
dsh plugin --profile web add dsh-mcp-panel. -
tarball channel:
pnpm packin this repo, thendsh plugin --profile web add ./dsh-mcp-panel-<version>.tgz. -
uninstall: remove the
mcp-panelrow fromcordis.patch.yml(the web surface hot-reloads it), delete the package from the profile’snode_modules, and verify withdsh web --dump-configthat nomcp-panelrow remains.
Configuration
All tunables are Schemastery Config fields (changeable from cordis.yml). cordis.patch.yml documents each key inline.
| Key | Default | Meaning |
|---|---|---|
probeEnabled |
true |
Register the mcp_probe background-job tool (panel-only results) |
probeTimeoutMs |
10000 |
Per-probe timeout in ms |
maxProbes |
10 |
Probe records shown in the panel |
refreshIntervalMs |
0 |
Suggested panel refresh in ms; 0 = on demand |
outputLanguage |
en |
/mcp output language: en \| zh \| es \| pt \| hi
|
passiveProbeEnabled |
false |
Periodically probe streamable-http servers |
passiveProbeIntervalMs |
60000 |
Passive probe interval in ms |
trialEnabled |
true |
Tool trial console (settings tab + /mcp call) |
trialTimeoutMs |
120000 |
Panel-side deadline per trial call in ms |
trialMaxResultChars |
60000 |
Cap on the trial result payload in chars |
writeEnabled |
true |
Kill switch: false rejects every profile write (copy still works) |
backupCount |
5 |
cordis.patch.yml backups retained per write |
Tools & surfaces
| Surface | Kind | Notes |
|---|---|---|
/mcp |
command | Per-server status row; model-readable and log-reconstructable |
/mcp <server> tools |
command | Model-visible mcp__* tool names + descriptions |
/mcp <server> health |
command | Derived self-heal suggestions from sanitized error text |
/mcp <server> call <tool> [json] |
command | Trial-call through the official tool pipeline |
mcp_probe |
tool | Optional Streamable HTTP connectivity probe (background job) |
| Settings → Plugins → MCP tab | UI slot | Status cards, server CRUD, and the tool trial console |
mcpPanel Typert Remote |
service | Read-only snapshot channel (host → client) |
Resources & Prompts
The official client documents that “Tools are the only bridged MCP capability” — Resources and Prompts are deferred. The console feature-detects a proposed upstream catalog seam and will show read-only lists the day it ships; until then the capabilities board marks both pending upstream support.
Permissions & data
-
Permissions: the
dshWorkshopmanifest declaresnetwork:outboundandnative-code:none. -
Data: the panel is read-only; it writes only append-only
cordis.patch.ymlfragments (approval-gated, backup-first). URL query credentials, userinfo passwords, header values, bearer tokens, and JWTs are redacted before rendering; configuredheadersnever enter any snapshot, and env/header values never leave the host (the editor sees keys only).
Security boundaries
- The bridge stays the bridge. No transport, OAuth, or protocol changes; one mcp-client row per server, exactly as hand-written.
-
No fake status. Connection fields without upstream observations read
unknown/—withstatusSource: 'derived'; exit codes and stderr tails are never invented. -
Writes are append-only, approval-gated, and backed up. The console never rewrites
cordis.patch.yml; it appends generated operations and keeps the newestbackupCountbackups. - No prompt injection. The panel registers no prompt sections; its only model-facing text is the two tool/command descriptions.
Known limitations
- Resources & Prompts are pending upstream support — the official client bridges tools only.
- Exit codes / stderr tails are labeled pending upstream support until the client exposes them.
-
Read-only panel — the console never fakes a connection state; unobservable fields read
unknown/-1/—.
Development
pnpm run typecheck && pnpm run typecheck:ci && pnpm test && pnpm run build && pnpm run verify:self-contained && pnpm run verify:artifacts && pnpm pack
scripts/verify-headless.mjs boots the real web profile and prints the exact /mcp output. Releases: node scripts/release.mjs <x.y.z> runs the full gate, commits, and tags v<x.y.z> locally (never pushes).
Topics
dsh, dsh-plugin, deepseek-harness, deepseek, cordis, mcp, mcp-client, observability, panel
Contributors
- @PerryLink — creator and maintainer.
- @xiaoyuyu6420 — diagnosed the missing client devDependencies behind clean-checkout build failures (PR #5).
PerryLink DSH Plugin Family
This project is one of the DeepSeek Harness plugins maintained by PerryLink. If this one helps you, the others likely will too:
| Plugin | One-liner |
|---|---|
| dsh-mask | PII masking middleware: anonymize at the model boundary, restore at the display layer |
| dsh-mcp-panel | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors |
| dsh-doublecheck | Engineering-discipline guard: requirements grill, test gates, adversary review |
| dsh-background-agents | Durable background child agents with a Web UI sidebar, messaging and interrupt |
| dsh-lsp-actions | LSP diagnostics, formatting, completion, code actions and rename over language servers |
| dsh-output-styles | Claude Code outputStyles-equivalent runtime style switching |
| dsh-checkpoint-rewind | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore |
| dsh-permission-rules | Claude Code-style declarative allow/deny/ask permission rules with audit |
| dsh-auto-review | Second-model auto-review on the approval chain, fail-closed by default |
| dsh-memento | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool |
| dsh-skill-pack-security | Security-audit skill pack: secret scan, dependency and supply-chain review |
| dsh-session-pin | Pin sessions in the Web sidebar with durable ordering |
| dsh-composer-history | Terminal-style input history for the web composer: arrows, Ctrl+R search |
| dsh-github | GitHub PR/issues integration for DSH, every write gated by approval |
| dsh-plugin-guide | Plugin-development knowledge base as an on-demand agent skill |
| dsh-claude-move | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH |
License
Apache License 2.0 © 2026 dsh-mcp-panel contributors
Frequently Asked QuestionsFAQ
Use the verified command dsh plugin --profile default add github:PerryLink/dsh-mcp-panel in a DSH-enabled shell. The command resolves the public package metadata and keeps the plugin attached to the catalog identity shown on this page.
Compatibility follows the bundle and profile status shown above. If a profile is not detected, keep the plugin disabled there and check the repository documentation before enabling it in production.
The GitHub link and activity metadata are the source of truth for releases and maintenance. Revisit this page after a new release to confirm the catalog has observed the latest version.