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.
| 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) |
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.
@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.
| 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.
# 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"}'
- 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.
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 |
| 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) |
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: 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).
- 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.
- 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/—.
pnpm run typecheck && pnpm run typecheck:ci && pnpm test && pnpm run build && pnpm run verify:self-contained && pnpm run verify:artifacts && pnpm packscripts/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).
dsh, dsh-plugin, deepseek-harness, deepseek, cordis, mcp, mcp-client, observability, panel
- @PerryLink — creator and maintainer.
- @xiaoyuyu6420 — diagnosed the missing client devDependencies behind clean-checkout build failures (PR #5).
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 |
Apache License 2.0 © 2026 dsh-mcp-panel contributors