dsh-mcp-panel 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,21 +1,51 @@
1
+ <div align="center">
2
+
1
3
  # dsh-mcp-panel
2
4
 
3
5
  **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.**
4
6
 
5
- [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
7
+ *Official client = bridge, this plugin = console: read status through the `mcp/status` seam, write only append-only, approval-gated profile patches.*
6
8
 
7
9
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
8
- [![npm](https://img.shields.io/npm/v/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
9
- [![downloads](https://img.shields.io/npm/dm/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
10
- [![CI](https://github.com/PerryLink/dsh-mcp-panel/actions/workflows/ci.yml/badge.svg)](https://github.com/PerryLink/dsh-mcp-panel/actions/workflows/ci.yml)
11
- [![dsh-plugin](https://img.shields.io/badge/ecosystem-dsh--plugin-8b5cf6)](https://github.com/topics/dsh-plugin)
12
- [![deepseek-harness](https://img.shields.io/badge/runtime-deepseek--harness-4f46e5)](https://github.com/deepseek-ai/deepseek-harness)
10
+ [![DSH plugin](https://img.shields.io/badge/dsh-plugin-✅-green)](https://github.com/topics/dsh-plugin)
11
+ [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
12
+ [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-mcp-panel/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-mcp-panel/actions)
13
+ [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-mcp-panel?label=version)](https://github.com/PerryLink/dsh-mcp-panel/releases)
14
+ [![npm version](https://img.shields.io/npm/v/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
15
+ [![npm downloads](https://img.shields.io/npm/dm/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
16
+
17
+ [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
18
+
19
+ </div>
20
+
21
+ ---
22
+
23
+ ## Compatibility
24
+
25
+ | Surface | Status |
26
+ |---|---|
27
+ | Harness | DeepSeek Harness `0.1.0-rc.8`–`0.2.0` |
28
+ | Node | `^22.19.0 \|\| >=24.0.0` |
29
+ | Platforms | Web GUI (dual-face: host + browser) |
30
+ | Model | Any (the panel is read-only; only `/mcp` output is model-readable) |
31
+
32
+ ## What you get
33
+
34
+ `dsh-mcp-panel` is the experience layer on top of the official MCP client: a read-only runtime view plus safe, reversible profile writes.
35
+
36
+ - **`/mcp` command** — one row per server: transport, target, tool count, connection status (from the upstream seam; `unknown` when unobserved), last error, reconnect count — model-readable, session-log reconstructable, five output languages.
37
+ - **`/mcp <server> tools`** — model-visible `mcp__*` tool names and descriptions.
38
+ - **`/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.
39
+ - **`/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.
40
+ - **Settings → Plugins → MCP tab** — status cards with badges, diagnostics, and probes, plus the server CRUD and the tool trial console.
41
+ - **Server CRUD** — add/edit/remove forms → `insert`/`set`/`set disabled` fragments → clipboard copy or approval-gated write with automatic backups.
42
+ - **Tool trial console** — server → `mcp__*` tool → JSON args → canonical JSON result + rendered content; capped by `trialMaxResultChars`; panel-only, never model context.
13
43
 
14
44
  ## Architecture: official client = bridge, this plugin = console
15
45
 
16
46
  [`@deepseek-ai/dsh-mcp-client`](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/mcp/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**:
17
47
 
18
- ```
48
+ ```text
19
49
  ┌────────────────────────────────────────────┐
20
50
  profile │ cordis.yml / cordis.patch.yml │
21
51
  composition │ - id: mcp-github │
@@ -54,31 +84,20 @@ The console **reads** the client through its shipped `mcp/status` observability
54
84
 
55
85
  The console's output IS `cordis.patch.yml` vocabulary — the same lines you would write by hand, generated, previewed, and applied safely.
56
86
 
57
- ## What you get
58
-
59
- | Surface | What it does |
60
- |---|---|
61
- | **`/mcp` command** | one row per server: transport, target, tool count, connection status (from the upstream seam; `unknown` when unobserved), last error, reconnect count — model-readable, session-log reconstructable, five output languages |
62
- | **`/mcp <server> tools`** | model-visible `mcp__*` tool names + descriptions |
63
- | **`/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 |
64
- | **`/mcp <server> call <tool> [json]`** | trial-call through the **official tool pipeline** — pre-execute permission policy, approval (routed through the command's agent), guards, post-execute all apply |
65
- | **`/mcp <server> disable\|enable`** | the exact `set` patch line, as before |
66
- | **Settings → Plugins → MCP tab** | status cards with badges, diagnostics, probes, plus the three consoles below |
67
- | **Server CRUD** | add/edit/remove forms → `insert`/`set`/`set disabled` fragments → clipboard copy or approval-gated write with automatic backups (`cordis.patch.yml.bak-<ts>`, newest `backupCount` kept) |
68
- | **Tool trial console** | server → `mcp__*` tool → JSON args → canonical JSON result + rendered content; capped by `trialMaxResultChars`; panel-only, never model context |
69
- | **Capabilities board** | Resources / Prompts availability, feature-detected; both read *pending upstream support* today (the official client bridges tools only) |
70
- | **Probes** | one-click / passive Streamable HTTP connectivity probes (panel-only results) |
71
-
72
87
  ## Quick start
73
88
 
74
89
  ```sh
75
- # git channel (builds via the package's prepare script)
76
- dsh plugin --profile web add github:PerryLink/dsh-mcp-panel#v0.4.0
77
- # npm channel (published tarball, no build approval needed)
78
- dsh plugin --profile web add dsh-mcp-panel@0.4.0
90
+ # 1. install the bundle into your profile
91
+ dsh plugin --profile web add "github:PerryLink/dsh-mcp-panel#main"
92
+
93
+ # or from npm (published releases)
94
+ dsh plugin --profile web add dsh-mcp-panel
95
+
96
+ # 2. restart and verify the row
97
+ dsh --profile web --dump-config | grep -A3 'id: mcp-panel'
79
98
  ```
80
99
 
81
- Then restart (or let the web surface hot-reload `cordis.patch.yml`) and open **Settings → Plugins → MCP**, or run:
100
+ Then open **Settings → Plugins → MCP**, or run:
82
101
 
83
102
  ```text
84
103
  /mcp
@@ -87,50 +106,65 @@ Then restart (or let the web surface hot-reload `cordis.patch.yml`) and open **S
87
106
  /mcp everything call echo '{"message": "hi"}'
88
107
  ```
89
108
 
90
- Manual install: put `dsh-mcp-panel` into the profile's `node_modules` (or the shared `$DSH_HOME/profiles/node_modules` fallback) and add the row to `cordis.patch.yml`:
109
+ ## Install & uninstall
91
110
 
92
- ```yaml
93
- - insert:
94
- - id: mcp-panel
95
- name: dsh-mcp-panel
96
- config:
97
- probeEnabled: true
98
- ```
99
-
100
- ### Uninstall
111
+ - **git channel** (latest `main`): `dsh plugin --profile web add "github:PerryLink/dsh-mcp-panel#main"` — the `prepare` script builds with production dependencies only.
112
+ - **npm channel** (published releases): `dsh plugin --profile web add dsh-mcp-panel`.
113
+ - **tarball channel**: `pnpm pack` in this repo, then `dsh plugin --profile web add ./dsh-mcp-panel-<version>.tgz`.
114
+ - **uninstall**: remove the `mcp-panel` row from `cordis.patch.yml` (the web surface hot-reloads it), delete the package from the profile's `node_modules`, and verify with `dsh web --dump-config` that no `mcp-panel` row remains.
101
115
 
102
- 1. Remove the `mcp-panel` row from `cordis.patch.yml` (the web surface hot-reloads it; other surfaces restart).
103
- 2. Delete the package from the profile's `node_modules` (or the shared `profiles/node_modules` fallback).
104
- 3. Verify with `dsh web --dump-config` that no `mcp-panel` row remains.
116
+ ## Configuration
105
117
 
106
- ## Honest by contract
118
+ All tunables are Schemastery `Config` fields (changeable from cordis.yml). `cordis.patch.yml` documents each key inline.
107
119
 
108
- - **The bridge stays the bridge.** No transport, OAuth, or protocol changes; one mcp-client row per server, exactly as hand-written.
109
- - **No fake status.** Connection fields without upstream observations read `unknown` / `—` with `statusSource: 'derived'`; exit codes / stderr tails are never invented.
110
- - **Sanitized display.** URL query credentials, userinfo passwords, header values, bearer tokens, and JWTs are redacted before rendering; configured `headers` never enter any snapshot; env/header **values** never leave the host (the editor sees keys only).
111
- - **Writes are append-only, approval-gated, and backed up.** The console never rewrites `cordis.patch.yml`: it appends generated operations. When an approval service exists and the caller's session has a live agent inside an open turn, the write asks `ctx.approval` (only `allowed-once` proceeds); otherwise the explicit interactive confirmation is the approval channel. `writeEnabled: false` is a hard kill switch.
112
- - **No prompt injection.** The panel registers **no prompt sections**; its only model-facing text is the two tool/command descriptions, in the official client's minimal style.
120
+ | Key | Default | Meaning |
121
+ |---|---|---|
122
+ | `probeEnabled` | `true` | Register the `mcp_probe` background-job tool (panel-only results) |
123
+ | `probeTimeoutMs` | `10000` | Per-probe timeout in ms |
124
+ | `maxProbes` | `10` | Probe records shown in the panel |
125
+ | `refreshIntervalMs` | `0` | Suggested panel refresh in ms; `0` = on demand |
126
+ | `outputLanguage` | `en` | `/mcp` output language: `en \| zh \| es \| pt \| hi` |
127
+ | `passiveProbeEnabled` | `false` | Periodically probe streamable-http servers |
128
+ | `passiveProbeIntervalMs` | `60000` | Passive probe interval in ms |
129
+ | `trialEnabled` | `true` | Tool trial console (settings tab + `/mcp call`) |
130
+ | `trialTimeoutMs` | `120000` | Panel-side deadline per trial call in ms |
131
+ | `trialMaxResultChars` | `60000` | Cap on the trial result payload in chars |
132
+ | `writeEnabled` | `true` | Kill switch: `false` rejects every profile write (copy still works) |
133
+ | `backupCount` | `5` | `cordis.patch.yml` backups retained per write |
113
134
 
114
- ## Config
135
+ ## Tools & surfaces
115
136
 
116
- | Key | Default | Description |
137
+ | Surface | Kind | Notes |
117
138
  |---|---|---|
118
- | `probeEnabled` | `true` | register the `mcp_probe` background-job tool (panel-only results) |
119
- | `probeTimeoutMs` | `10000` | per-probe timeout in ms |
120
- | `maxProbes` | `10` | probe records shown in the panel |
121
- | `refreshIntervalMs` | `0` | suggested panel refresh in ms; `0` = on demand |
122
- | `outputLanguage` | `en` | `/mcp` output language: `en\|zh\|es\|pt\|hi` |
123
- | `passiveProbeEnabled` | `false` | periodically probe streamable-http servers |
124
- | `passiveProbeIntervalMs` | `60000` | passive probe interval in ms |
125
- | `trialEnabled` | `true` | tool trial console (settings tab + `/mcp call`) |
126
- | `trialTimeoutMs` | `120000` | panel-side deadline per trial call |
127
- | `trialMaxResultChars` | `60000` | cap on the trial result payload |
128
- | `writeEnabled` | `true` | kill switch: `false` rejects every profile write (copy still works) |
129
- | `backupCount` | `5` | `cordis.patch.yml` backups retained per write |
139
+ | `/mcp` | command | Per-server status row; model-readable and log-reconstructable |
140
+ | `/mcp <server> tools` | command | Model-visible `mcp__*` tool names + descriptions |
141
+ | `/mcp <server> health` | command | Derived self-heal suggestions from sanitized error text |
142
+ | `/mcp <server> call <tool> [json]` | command | Trial-call through the official tool pipeline |
143
+ | `mcp_probe` | tool | Optional Streamable HTTP connectivity probe (background job) |
144
+ | Settings → Plugins → MCP tab | UI slot | Status cards, server CRUD, and the tool trial console |
145
+ | `mcpPanel` Typert Remote | service | Read-only snapshot channel (host → client) |
130
146
 
131
147
  ## Resources & Prompts
132
148
 
133
- The official client documents *"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** (see the harness `docs/upstream-proposal.md` addendum for the follow-up proposals).
149
+ 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**.
150
+
151
+ ## Permissions & data
152
+
153
+ - **Permissions**: the `dshWorkshop` manifest declares `network:outbound` and `native-code:none`.
154
+ - **Data**: the panel is read-only; it writes only append-only `cordis.patch.yml` fragments (approval-gated, backup-first). URL query credentials, userinfo passwords, header values, bearer tokens, and JWTs are redacted before rendering; configured `headers` never enter any snapshot, and env/header **values** never leave the host (the editor sees keys only).
155
+
156
+ ## Security boundaries
157
+
158
+ - **The bridge stays the bridge.** No transport, OAuth, or protocol changes; one mcp-client row per server, exactly as hand-written.
159
+ - **No fake status.** Connection fields without upstream observations read `unknown` / `—` with `statusSource: 'derived'`; exit codes and stderr tails are never invented.
160
+ - **Writes are append-only, approval-gated, and backed up.** The console never rewrites `cordis.patch.yml`; it appends generated operations and keeps the newest `backupCount` backups.
161
+ - **No prompt injection.** The panel registers **no prompt sections**; its only model-facing text is the two tool/command descriptions.
162
+
163
+ ## Known limitations
164
+
165
+ - **Resources & Prompts** are pending upstream support — the official client bridges tools only.
166
+ - **Exit codes / stderr tails** are labeled *pending upstream support* until the client exposes them.
167
+ - **Read-only panel** — the console never fakes a connection state; unobservable fields read `unknown` / `-1` / `—`.
134
168
 
135
169
  ## Development
136
170
 
@@ -138,15 +172,40 @@ The official client documents *"Tools are the only bridged MCP capability"* —
138
172
  pnpm run typecheck && pnpm run typecheck:ci && pnpm test && pnpm run build && pnpm run verify:self-contained && pnpm run verify:artifacts && pnpm pack
139
173
  ```
140
174
 
141
- - `src/patch.ts` — validation, keep-semantics merge, YAML fragment rendering (pure).
142
- - `src/write.ts` — backup + append + retention (the only file-write module).
143
- - `src/trial.ts` — official-pipeline trial calls via `ctx.tools.execute()`.
144
- - `src/diagnostics.ts` — error-pattern → suggestion mapping (pure).
145
- - `src/client/` — the settings console (server editor, trial console, diagnostics).
146
- - `scripts/verify-headless.mjs` boots the real web profile and prints exact `/mcp` output.
175
+ `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).
176
+
177
+ ## Topics
178
+
179
+ `dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `mcp`, `mcp-client`, `observability`, `panel`
147
180
 
148
- Releases: `node scripts/release.mjs <x.y.z>` runs the full gate, commits, and tags `v<x.y.z>` locally (never pushes).
181
+ ## Contributors
182
+
183
+ - [@PerryLink](https://github.com/PerryLink) — creator and maintainer.
184
+ - [@xiaoyuyu6420](https://github.com/xiaoyuyu6420) — diagnosed the missing client devDependencies behind clean-checkout build failures (PR #5).
185
+
186
+ ## PerryLink DSH Plugin Family
187
+
188
+ This project is one of the [DeepSeek Harness plugins](https://github.com/PerryLink) maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
189
+
190
+ | Plugin | One-liner |
191
+ |---|---|
192
+ | [dsh-mask](https://github.com/PerryLink/dsh-mask) | PII masking middleware: anonymize at the model boundary, restore at the display layer |
193
+ | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors |
194
+ | [dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck) | Engineering-discipline guard: requirements grill, test gates, adversary review |
195
+ | [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | Durable background child agents with a Web UI sidebar, messaging and interrupt |
196
+ | [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | LSP diagnostics, formatting, completion, code actions and rename over language servers |
197
+ | [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | Claude Code outputStyles-equivalent runtime style switching |
198
+ | [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore |
199
+ | [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | Claude Code-style declarative allow/deny/ask permission rules with audit |
200
+ | [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | Second-model auto-review on the approval chain, fail-closed by default |
201
+ | [dsh-memento](https://github.com/PerryLink/dsh-memento) | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool |
202
+ | [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | Security-audit skill pack: secret scan, dependency and supply-chain review |
203
+ | [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | Pin sessions in the Web sidebar with durable ordering |
204
+ | [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Terminal-style input history for the web composer: arrows, Ctrl+R search |
205
+ | [dsh-github](https://github.com/PerryLink/dsh-github) | GitHub PR/issues integration for DSH, every write gated by approval |
206
+ | [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | Plugin-development knowledge base as an on-demand agent skill |
207
+ | [dsh-claude-move](https://github.com/PerryLink/dsh-claude-move) | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH |
149
208
 
150
209
  ## License
151
210
 
152
- Apache-2.0 — see [LICENSE](LICENSE).
211
+ [Apache License 2.0](LICENSE) © 2026 dsh-mcp-panel contributors
package/README.pt.md CHANGED
@@ -1,80 +1,211 @@
1
+ <div align="center">
2
+
1
3
  # dsh-mcp-panel
2
4
 
3
- **Console de gerenciamento MCP para o cliente MCP oficial do DeepSeek Harness: adicione, edite, remova e teste servidores MCP numa página de configurações, com status honesto, diagnósticos de saúde e gravações de perfil seguras e reversíveis.**
5
+ **O console de gerenciamento MCP para o cliente MCP oficial do DeepSeek Harness: adicione, edite, remova e teste servidores MCP numa página de configurações, com status honesto, diagnósticos de saúde e gravações de perfil seguras e reversíveis.**
4
6
 
5
- [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
7
+ *Cliente oficial = ponte, este plugin = console: leia o status pelo seam `mcp/status`, escreva apenas patches de perfil somente-anexar e com aprovação.*
6
8
 
7
9
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
8
- [![npm](https://img.shields.io/npm/v/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
9
- [![CI](https://github.com/PerryLink/dsh-mcp-panel/actions/workflows/ci.yml/badge.svg)](https://github.com/PerryLink/dsh-mcp-panel/actions/workflows/ci.yml)
10
- [![dsh-plugin](https://img.shields.io/badge/ecosystem-dsh--plugin-8b5cf6)](https://github.com/topics/dsh-plugin)
10
+ [![DSH plugin](https://img.shields.io/badge/dsh-plugin-✅-green)](https://github.com/topics/dsh-plugin)
11
+ [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
12
+ [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-mcp-panel/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-mcp-panel/actions)
13
+ [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-mcp-panel?label=version)](https://github.com/PerryLink/dsh-mcp-panel/releases)
14
+ [![npm version](https://img.shields.io/npm/v/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
15
+ [![npm downloads](https://img.shields.io/npm/dm/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
11
16
 
12
- ## Arquitetura: o cliente oficial é a ponte; este plugin é o console
13
-
14
- [`@deepseek-ai/dsh-mcp-client`](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/mcp/mcp-client) é a **única ponte**: uma instância por servidor MCP, configurada como linha escrita à mão no `cordis.yml`, que conecta o transporte, sincroniza ferramentas e registra os nomes `mcp__<servidor>__<ferramenta>`. Este plugin nunca a substitui: é a **camada de experiência** por cima:
17
+ [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
15
18
 
16
- ```
17
- profile/composição dsh-mcp-client (ponte) dsh-mcp-panel (console)
18
- - id: mcp-github • transporte • comando /mcp
19
- name: '@deepseek-ai/…' • sincronização de tools • Configurações → Plugins →
20
- config: { serverName, … } • ferramentas mcp__* MCP: CRUD, banco de testes,
21
- - id: mcp-panel • seam mcp/status ◄─status─► diagnósticos, sondas
22
- name: dsh-mcp-panel
19
+ </div>
20
+
21
+ ---
22
+
23
+ ## Compatibility
24
+
25
+ | Superfície | Status |
26
+ |---|---|
27
+ | Harness | DeepSeek Harness `0.1.0-rc.8`–`0.2.0` |
28
+ | Node | `^22.19.0 \|\| >=24.0.0` |
29
+ | Plataformas | Web GUI (duas faces: host + navegador) |
30
+ | Modelo | Qualquer (o painel é somente leitura; só a saída de `/mcp` é legível pelo modelo) |
31
+
32
+ ## What you get
33
+
34
+ O `dsh-mcp-panel` é a camada de experiência sobre o cliente MCP oficial: uma visão de runtime somente leitura mais gravações de perfil seguras e reversíveis.
35
+
36
+ - **Comando `/mcp`** — uma linha por servidor: transporte, destino, contagem de ferramentas, status de conexão (do seam upstream; `unknown` quando não observado), último erro, reconexões — legível pelo modelo, reconstruível do log da sessão, cinco idiomas de saída.
37
+ - **`/mcp <servidor> tools`** — nomes e descrições das ferramentas `mcp__*` visíveis para o modelo.
38
+ - **`/mcp <servidor> health`** — sugestões de autorreparo derivadas (ENOENT → dependência ausente, ECONNREFUSED, timeouts, 401/403/404, DNS, rate limit, reconexão esgotada…); código de saída / cauda de stderr rotulados honestamente como *aguardando suporte upstream*.
39
+ - **`/mcp <servidor> call <tool> [json]`** — chamada de teste pelo **pipeline oficial de ferramentas** (`ctx.tools.execute()`); política de permissão pré-execução, aprovação, guards e pós-execução, tudo em vigor.
40
+ - **Configurações → Plugins → MCP** — cartões de status com selos, diagnósticos e sondas, mais o CRUD de servidores e o banco de testes de ferramentas.
41
+ - **CRUD de servidores** — formulários de adicionar/editar/remover → fragmentos `insert`/`set`/`set disabled` → cópia para a área de transferência ou gravação com aprovação e backups automáticos.
42
+ - **Banco de testes de ferramentas** — servidor → ferramenta `mcp__*` → argumentos JSON → resultado JSON canônico + conteúdo renderizado; limitado por `trialMaxResultChars`; somente painel, nunca contexto do modelo.
43
+
44
+ ## Architecture: official client = bridge, this plugin = console
45
+
46
+ O [`@deepseek-ai/dsh-mcp-client`](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/mcp/mcp-client) é a **única ponte**: uma instância por servidor MCP, configurada como linha escrita à mão no `cordis.yml`, que conecta o transporte, sincroniza ferramentas e registra os nomes `mcp__<servidor>__<ferramenta>`. Este plugin nunca a substitui: é a **camada de experiência** por cima:
47
+
48
+ ```text
49
+ ┌────────────────────────────────────────────┐
50
+ profile │ cordis.yml / cordis.patch.yml │
51
+ composição │ - id: mcp-github │
52
+ (uma linha por │ name: '@deepseek-ai/dsh-mcp-client' │
53
+ servidor, à mão) │ config: { serverName, transport, … } │
54
+ │ - id: mcp-panel │
55
+ │ name: dsh-mcp-panel ◄── este plugin │
56
+ └───────────────┬────────────────────────────┘
57
+ │
58
+ ┌───────────────────────────┴───────────────────────────┐
59
+ │ │
60
+ ┌────▼──────────────┐ ┌───────────────────────────┐ │
61
+ │ @deepseek-ai/dsh- │ │ dsh-mcp-panel (console) │ │
62
+ │ mcp-client │ │ │ │
63
+ │ • transporte │ │ • comando /mcp │ │
64
+ │ • sincronização │ │ • Configurações → Plugins │ │
65
+ │ • ferramentas │◄──────►│ → MCP: CRUD, banco de │ │
66
+ │ • seam mcp/status │ status │ • diagnósticos de saúde │ │
67
+ └───────────────────┘ │ • sondas, capacidades │ │
68
+ └───────────────────────────┘ │
23
69
  ```
24
70
 
25
- O console **lê** pelo seam `mcp/status` (evento + serviço `mcpStatus`), pelo registro de ferramentas e pelo loader; **escreve** apenas na camada de patches do perfil: somente anexa, com aprovação e backup automático. Transporte, OAuth e protocolo permanecem intocados.
71
+ O console **lê** o cliente pelo seu seam de observabilidade `mcp/status` (evento + serviço de consulta `mcpStatus`), pelo registro de ferramentas e pelo loader; **escreve** apenas na camada de patches do perfil — somente-anexar, com aprovação e sempre com backup. Transporte, OAuth e protocolo permanecem intocados.
26
72
 
27
- ## Console vs. cordis.yml escrito à mão
73
+ ## Console vs. hand-written cordis.yml
28
74
 
29
75
  | | cordis.yml à mão | Console dsh-mcp-panel |
30
76
  |---|---|---|
31
- | Adicionar servidor | Editar YAML | Formulário → fragmento de patch → **copiar** ou **gravar** (aprovação + backup) |
32
- | Editar servidor | Editar YAML e reiniciar | Formulário pré-preenchido; segredos inalterados preservam o valor no host |
33
- | Remover servidor | Apagar a linha | Operação `set disabled: true` (o vocabulário de patches não tem remove); re-habilitável |
77
+ | Adicionar servidor | Editar YAML, cuidar indentação/aspas | Formulário → fragmento de patch → **copiar** ou **gravar** (aprovação + backup) |
78
+ | Editar servidor | Editar YAML, reiniciar/recarga a quente | Formulário pré-preenchido da linha ao vivo; segredos inalterados preservam o valor no host |
79
+ | Remover servidor | Apagar a linha | Operação `set disabled: true` (o vocabulário de patches não tem remove) — re-habilitável |
34
80
  | Ver status | Ler logs | Selos + reconexões + último erro, ao vivo do `mcp/status` |
35
81
  | Testar uma ferramenta | Pedir ao modelo | Banco de testes → pipeline oficial `ctx.tools.execute()` (permissões e aprovação em vigor) |
36
- | Diagnosticar | grep de logs | `/mcp <servidor> health` com sugestões derivadas |
37
-
38
- ## O que você ganha
82
+ | Diagnosticar falhas | grep de logs | `/mcp <servidor> health` com sugestões derivadas |
83
+ | Erros | Reverter à mão | Cada gravação é somente-anexar e deixa um backup com marca de tempo |
39
84
 
40
- - **`/mcp`**: uma linha por servidor — transporte, destino, contagem de ferramentas, status de conexão (honesto: `unknown` sem dados upstream), último erro, reconexões; legível pelo modelo, reconstruível do log da sessão, cinco idiomas de saída.
41
- - **`/mcp <servidor> tools | health | call <tool> [json] | disable | enable`**: lista de ferramentas; diagnósticos derivados (ENOENT → dependência ausente, ECONNREFUSED, timeouts, 401/403/404, DNS, rate limit, reconexão esgotada); chamada de teste pelo **pipeline oficial** (permissões + aprovação em vigor); sugestões de patch exatas.
42
- - **Configurações → Plugins → MCP**: cartões de status com selos e diagnósticos, **CRUD de servidores** (fragmentos `insert`/`set`/`set disabled`, cópia para a área de transferência ou gravação com aprovação e backup `cordis.patch.yml.bak-<ts>`), **banco de testes de ferramentas** (JSON canônico + conteúdo renderizado, limitado por `trialMaxResultChars`, somente painel) e o **painel de capacidades**: Resources e Prompts marcados como *aguardando suporte upstream* (hoje o cliente oficial só pontua ferramentas).
43
- - **Sondas**: conectividade Streamable HTTP com um clique ou passiva (resultados somente do painel).
85
+ A saída do console É o vocabulário do `cordis.patch.yml` — as mesmas linhas que você escreveria à mão, geradas, pré-visualizadas e aplicadas com segurança.
44
86
 
45
- ## Início rápido
87
+ ## Quick start
46
88
 
47
89
  ```sh
48
- dsh plugin --profile web add github:PerryLink/dsh-mcp-panel#v0.4.0
49
- # ou pelo canal npm:
50
- dsh plugin --profile web add dsh-mcp-panel@0.4.0
90
+ # 1. instale o bundle no seu perfil
91
+ dsh plugin --profile web add "github:PerryLink/dsh-mcp-panel#main"
92
+
93
+ # ou do npm (versões publicadas)
94
+ dsh plugin --profile web add dsh-mcp-panel
95
+
96
+ # 2. reinicie e verifique a linha
97
+ dsh --profile web --dump-config | grep -A3 'id: mcp-panel'
51
98
  ```
52
99
 
53
- Reinicie (ou deixe a superfície web recarregar o `cordis.patch.yml`) e abra **Configurações → Plugins → MCP**, ou execute `/mcp`.
100
+ Depois abra **Configurações → Plugins → MCP**, ou execute:
54
101
 
55
- ## Honesto por contrato
102
+ ```text
103
+ /mcp
104
+ /mcp everything tools
105
+ /mcp everything health
106
+ /mcp everything call echo '{"message": "hi"}'
107
+ ```
108
+
109
+ ## Install & uninstall
56
110
 
57
- - **A ponte continua sendo a ponte**: nenhuma mudança de transporte/OAuth/protocolo.
58
- - **Sem status falso**: `unknown` / `—` com `statusSource: 'derived'` sem dados upstream; códigos de saída e stderr nunca inventados (marcados *aguardando suporte upstream*).
59
- - **Exibição saneada**: credenciais em URLs, userinfo, valores de headers, tokens bearer e JWTs redigidos; os **valores** de env/headers nunca saem do host (o editor vê apenas chaves).
60
- - **Gravações somente-anexar, com aprovação e backup**: o console nunca reescreve o `cordis.patch.yml`; havendo serviço de aprovação e um agente em turno aberto, pergunta ao `ctx.approval` (apenas `allowed-once` prossegue); caso contrário, a confirmação interativa é o canal de aprovação. `writeEnabled: false` é o interruptor de segurança.
61
- - **Sem injeção de prompts**: o console não registra seções de prompt; apenas as descrições de suas duas ferramentas/comandos, no estilo minimalista do cliente oficial.
111
+ - **Canal git** (último `main`): `dsh plugin --profile web add "github:PerryLink/dsh-mcp-panel#main"` — o script `prepare` constrói apenas com dependências de produção.
112
+ - **Canal npm** (versões publicadas): `dsh plugin --profile web add dsh-mcp-panel`.
113
+ - **Canal tarball**: `pnpm pack` neste repo, depois `dsh plugin --profile web add ./dsh-mcp-panel-<version>.tgz`.
114
+ - **Desinstalar**: remova a linha `mcp-panel` do `cordis.patch.yml` (a superfície web a recarrega em quente), apague o pacote do `node_modules` do perfil e verifique com `dsh web --dump-config` que não reste nenhuma linha `mcp-panel`.
62
115
 
63
- ## Config
116
+ ## Configuration
64
117
 
65
- | Chave | Valor | Descrição |
118
+ Todas as opções são campos Schemastery `Config` (modificáveis a partir do cordis.yml). O `cordis.patch.yml` documenta cada chave.
119
+
120
+ | Chave | Padrão | Significado |
121
+ |---|---|---|
122
+ | `probeEnabled` | `true` | Registra a ferramenta `mcp_probe` (resultados somente do painel) |
123
+ | `probeTimeoutMs` | `10000` | Prazo por sonda em ms |
124
+ | `maxProbes` | `10` | Registros de sonda mostrados no painel |
125
+ | `refreshIntervalMs` | `0` | Atualização sugerida do painel em ms; `0` = sob demanda |
126
+ | `outputLanguage` | `en` | Idioma de saída do `/mcp`: `en \| zh \| es \| pt \| hi` |
127
+ | `passiveProbeEnabled` | `false` | Sondear periodicamente servidores streamable-http |
128
+ | `passiveProbeIntervalMs` | `60000` | Intervalo de sonda passiva em ms |
129
+ | `trialEnabled` | `true` | Banco de testes de ferramentas (aba de configurações + `/mcp call`) |
130
+ | `trialTimeoutMs` | `120000` | Prazo do painel por chamada de teste em ms |
131
+ | `trialMaxResultChars` | `60000` | Teto do payload do resultado de teste em caracteres |
132
+ | `writeEnabled` | `true` | Interruptor de segurança: `false` rejeita toda gravação (copiar continua funcionando) |
133
+ | `backupCount` | `5` | Backups de `cordis.patch.yml` retidos por gravação |
134
+
135
+ ## Tools & surfaces
136
+
137
+ | Superfície | Tipo | Notas |
66
138
  |---|---|---|
67
- | `probeEnabled` / `probeTimeoutMs` / `maxProbes` | `true` / `10000` / `10` | ferramenta de sonda, prazo, registros exibidos |
68
- | `refreshIntervalMs` | `0` | atualização sugerida do painel (`0` = sob demanda) |
69
- | `outputLanguage` | `en` | idioma do `/mcp`: `en\|zh\|es\|pt\|hi` |
70
- | `passiveProbeEnabled` / `passiveProbeIntervalMs` | `false` / `60000` | sondas passivas e seu intervalo |
71
- | `trialEnabled` / `trialTimeoutMs` / `trialMaxResultChars` | `true` / `120000` / `60000` | banco de testes e seus limites |
72
- | `writeEnabled` / `backupCount` | `true` / `5` | interruptor de gravações; backups retidos |
139
+ | `/mcp` | command | Linha de status por servidor; legível pelo modelo e reconstruível do log |
140
+ | `/mcp <servidor> tools` | command | Nomes + descrições de `mcp__*` visíveis para o modelo |
141
+ | `/mcp <servidor> health` | command | Sugestões de autorreparo derivadas do texto de erro saneado |
142
+ | `/mcp <servidor> call <tool> [json]` | command | Chamada de teste pelo pipeline oficial de ferramentas |
143
+ | `mcp_probe` | tool | Sonda opcional de conectividade Streamable HTTP (trabalho em segundo plano) |
144
+ | Configurações → Plugins → MCP | Slot de UI | Cartões de status, CRUD de servidores e banco de testes |
145
+ | Remote Typert `mcpPanel` | service | Canal de instantâneas somente leitura (host → cliente) |
146
+
147
+ ## Resources & Prompts
148
+
149
+ O cliente oficial documenta que *"Tools are the only bridged MCP capability"* — Resources e Prompts estão adiados. O console detecta um seam de catálogo proposto e exibirá listas somente leitura no dia em que for enviado; até lá o painel de capacidades marca ambos **aguardando suporte upstream**.
150
+
151
+ ## Permissions & data
152
+
153
+ - **Permissões**: o manifesto `dshWorkshop` declara `network:outbound` e `native-code:none`.
154
+ - **Dados**: o painel é somente leitura; grava apenas fragmentos de `cordis.patch.yml` somente-anexar (com aprovação, backup primeiro). Credenciais em URLs, senhas userinfo, valores de headers, tokens bearer e JWTs são redigidos antes de renderizar; os `headers` configurados nunca entram em nenhuma instantânea, e os **valores** de env/headers nunca saem do host (o editor vê apenas chaves).
155
+
156
+ ## Security boundaries
157
+
158
+ - **A ponte continua sendo a ponte.** Sem mudanças de transporte, OAuth ou protocolo; uma linha mcp-client por servidor, exatamente como à mão.
159
+ - **Sem status falso.** Campos de conexão sem observações upstream leem `unknown` / `—` com `statusSource: 'derived'`; códigos de saída e stderr nunca são inventados.
160
+ - **Gravações somente-anexar, com aprovação e backup.** O console nunca reescreve o `cordis.patch.yml`; anexa operações geradas e conserva os `backupCount` backups mais recentes.
161
+ - **Sem injeção de prompts.** O painel não registra seções de prompt; seu único texto visível ao modelo são as duas descrições de ferramenta/comando.
162
+
163
+ ## Known limitations
164
+
165
+ - **Resources e Prompts** aguardam suporte upstream — o cliente oficial só pontua ferramentas.
166
+ - **Códigos de saída / caudas de stderr** são rotulados *aguardando suporte upstream* até o cliente expô-los.
167
+ - **Painel somente leitura** — o console nunca falsifica um estado de conexão; campos não observáveis leem `unknown` / `-1` / `—`.
168
+
169
+ ## Development
170
+
171
+ ```sh
172
+ pnpm run typecheck && pnpm run typecheck:ci && pnpm test && pnpm run build && pnpm run verify:self-contained && pnpm run verify:artifacts && pnpm pack
173
+ ```
174
+
175
+ O `scripts/verify-headless.mjs` inicia o perfil web real e imprime a saída exata de `/mcp`. Publicação: `node scripts/release.mjs <x.y.z>` executa a porta completa, faz commit e etiqueta `v<x.y.z>` localmente (nunca empurra).
176
+
177
+ ## Topics
178
+
179
+ `dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `mcp`, `mcp-client`, `observability`, `panel`
180
+
181
+ ## Contributors
182
+
183
+ - [@PerryLink](https://github.com/PerryLink) — criador e mantenedor.
184
+ - [@xiaoyuyu6420](https://github.com/xiaoyuyu6420) — diagnosticou as devDependencies de client ausentes por trás das falhas de build em checkouts limpos (PR #5).
185
+
186
+ ## PerryLink DSH Plugin Family
73
187
 
74
- ## Resources e Prompts
188
+ Este projeto é um dos [plugins do DeepSeek Harness](https://github.com/PerryLink) mantidos por [PerryLink](https://github.com/PerryLink). Se este ajudar você, os outros provavelmente também ajudarão:
75
189
 
76
- O cliente oficial documenta "Tools are the only bridged MCP capability": ambos estão adiados. O console detecta um seam de catálogo proposto e exibirá listas somente-leitura quando chegar; até lá o painel marca *aguardando suporte upstream* (adendo em `docs/upstream-proposal.md` do harness).
190
+ | Plugin | Em uma linha |
191
+ |---|---|
192
+ | [dsh-mask](https://github.com/PerryLink/dsh-mask) | Middleware de mascaramento de PII: anonimiza no limite do modelo, restaura na camada de exibição |
193
+ | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | Painel MCP somente leitura: comando /mcp + aba de configurações com status, ferramentas e erros |
194
+ | [dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck) | Guarda de disciplina de engenharia: interrogatório de requisitos, portões de teste, revisão adversária |
195
+ | [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | Agentes filhos em segundo plano com barra lateral web, mensagens e interrupção |
196
+ | [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | Diagnóstico, formatação, autocompletar, ações de código e renomear via LSP |
197
+ | [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | Troca de estilo em runtime equivalente ao outputStyles do Claude Code |
198
+ | [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Equivalente ao /rewind do Claude Code: snapshots, forks de sessão, restauração em um clique |
199
+ | [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | Regras de permissão declarativas allow/deny/ask estilo Claude Code, com auditoria |
200
+ | [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | Revisão automática de segundo modelo na cadeia de aprovação, fail-closed por padrão |
201
+ | [dsh-memento](https://github.com/PerryLink/dsh-memento) | Memória entre sessões com aprovação: seam ctx.memory + SQLite + ferramenta memory |
202
+ | [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | Pacote de skills de auditoria de segurança: varredura de segredos, revisão de dependências e cadeia de suprimentos |
203
+ | [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | Fixa sessões na barra lateral web com ordenação durável |
204
+ | [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Histórico de entrada estilo terminal para o compositor web: setas, busca Ctrl+R |
205
+ | [dsh-github](https://github.com/PerryLink/dsh-github) | Integração de PR/issues do GitHub para DSH, toda escrita com aprovação |
206
+ | [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | Base de conhecimento de desenvolvimento de plugins como skill de agente sob demanda |
207
+ | [dsh-claude-move](https://github.com/PerryLink/dsh-claude-move) | Migra sessões, memória, skills e CLAUDE.md do Claude Code para DSH |
77
208
 
78
- ## Licença
209
+ ## License
79
210
 
80
- Apache-2.0 — veja [LICENSE](LICENSE).
211
+ [Apache License 2.0](LICENSE) © 2026 contribuidores do dsh-mcp-panel