Preface

DeepSeek Harness (referred to as dsh for short) has integrated “everything is a plugin” into its runtime: models, tools, sessions, sandboxes, and interfaces all run on the Cordis kernel. You can change capabilities by modifying configurations without altering the core source code. The Model Context Protocol (MCP) follows the same pattern: the official package @deepseek-ai/dsh-mcp-client is responsible for connecting to external MCP servers and registering tools as mcp__server-name__tool-name that models can directly invoke.

This bridge works well, but its configuration relies heavily on “handwritten YAML”: each server requires a line in cordis.yml / cordis.patch.yml, with transport methods, commands, URLs, and environment variables all written into the configuration. When connections fail, the common workaround is to check logs, guess reconnection attempts, and have the model retry the tool call. As the number of servers grows, statuses, tool lists, and recent errors become scattered across different places, and secrets can be accidentally printed in full during troubleshooting.

This article introduces the community plugin dsh-mcp-panel. It does not replace the official MCP client, but instead acts as a management console built on top of it: use the /mcp command and the MCP tab in the settings page to view statuses, tools, errors, and reconnection counts. When you need to modify a server, you can generate a previewable patch snippet, which will be appended and written after approval, with automatic backups. This article cross-references information from the community plugin directory, GitHub repository README, package.json, CHANGELOG, npm page, and official @deepseek-ai/dsh-mcp-client documentation. The current repository version is 0.4.0. The community plugin directory is an independent site and has no official affiliation with DeepSeek / FunPlus. Do not treat it as an official app store.

What is this

dsh-mcp-panel is a UI enhancement plugin maintained by PerryLink, licensed under Apache-2.0, and primarily written in TypeScript. The GitHub repository currently shows 9 stars (the community directory page shows 4 stars at the time of inclusion; star counts should be referenced from the repository page). The npm package is published under the name dsh-mcp-panel, matching the GitHub repository name.

It is designed for the DeepSeek Harness official MCP client, and its positioning can be divided into two layers:
1. Read-only runtime view: Through the mcp/status observable interface, tool registry, and loader provided by the official client, it lists the transport, target, number of tools, connection status, recent errors, and reconnection counts for each server. Fields that cannot be observed are displayed as unknown / without fabricating connection statuses.
2. Controlled profile writing: Use the form on the settings page to add, delete, and modify servers. The output uses the same insert / set / set disabled operations as those in cordis.patch.yml. You can either copy just the snippet and paste it manually, or append it after going through approval; backups are made before writing, with a default retention of the last 5 copies. It does not modify the transport, OAuth, or MCP protocol itself.

The official client remains the sole bridging layer: each MCP server corresponds to a line of @deepseek-ai/dsh-mcp-client, responsible for connecting, synchronizing tools, and registering mcp__* names. The panel is only an experience layer. The README summarizes it in one sentence: the official client is the bridge, and this plugin is the console.

The compatibility range is subject to the repository documentation: DeepSeek Harness 0.1.0-rc.50.1.0-rc.6, Node.js ^22.19.0 || >=24.0.0, and the platform is the Web GUI (both Host and browser sides). The panel itself is read-only to the model, and only the output of the /mcp command is visible to the model.

What the official client does

Looking at how the official client is configured first will make it clearer what gap the panel fills. The README for @deepseek-ai/dsh-mcp-client states that each MCP server is a plugin instance, written in cordis.yml. Below is an example from the official documentation:

- id: mcp-github
  name: '@deepseek-ai/dsh-mcp-client'
  config:
    serverName: github
    transport: stdio
    command: npx
    args: ['-y', '@modelcontextprotocol/server-github']
    env:
      GITHUB_TOKEN: !!js process.env.GITHUB_TOKEN

- id: mcp-web
  name: '@deepseek-ai/dsh-mcp-client'
  config:
    serverName: web
    transport: streamable-http
    url: http://localhost:3000/mcp
    headers:
      Authorization: !!js '`Bearer ${process.env.MCP_TOKEN}`'

What the model sees are namespaced names like mcp__github__create_issue and mcp__web__search. Transports support stdio and streamable-http. The official documentation also notes a boundary: currently only Tools are bridged, Resources and Prompts have no harness-side consumers and are in a delayed state.

The panel does not change the semantics of these lines. It reads the status exposed by the client and writes to the profile’s patch layer. After installing the panel, an additional line similar to the following will appear in the configuration:

- id: mcp-panel
  name: dsh-mcp-panel
  config:
    probeEnabled: true

Core Features

The repository README and CHANGELOG 0.4.0 divide capabilities into command-line and settings page sections, as explained below based on verified content.

/mcp command family

You can enter commands directly in the session, and the output is visible to the model and can also be reconstructed from the session logs.
1. /mcp: One line per server, including transport, target, number of tools, connection status, recent errors, and reconnection count. The connection status comes from the upstream mcp/status seam; it displays unknown when no observations are available. The output language is controlled by the configuration item outputLanguage, with options en, zh, es, pt, hi.
2. /mcp tools: Lists the mcp__* tool names and descriptions visible to the model.
3. /mcp health: Provides derived suggestions based on anonymized error text, such as ENOENT corresponding to missing dependencies, ECONNREFUSED, timeouts, 401/403/404, DNS issues, rate limiting, exhausted reconnection attempts, etc. If the official client has not exposed subprocess exit codes and stderr tails, it will mark “to be officially supported” and will not pretend to have data.
4. /mcp call [json]: Uses the official tool pipeline ctx.tools.execute() for trial calls. Pre-execute permission policies, approval, guards, and post-execute all take effect, and the panel does not open a separate bypass.
5. /mcp disable / /mcp enable: Provides precise set patch lines to disable or re-enable a server.

A quick example from the README (assuming a demo server named everything has been configured):

/mcp
/mcp everything tools
/mcp everything health
/mcp everything call echo '{"message": "hi"}'

Settings page: MCP tab

Open Settings → Plugins → MCP, and the same snapshot will be displayed as status cards: badges, diagnostics, detection results, and the three consoles below.
1. Server CRUD: Form to add, modify, and delete servers. “Delete” does not use the remove operation in patch vocabulary; it actually appends set disabled: true, so it can be re-enabled later. The form will pre-fill the current row; unchanged secrets retain their original values on the Host side, and the editor only sees the keys. The generated snippet can be copied or approved for writing.
2. Tool trial console: Select a server → select a registered mcp__* tool → fill in JSON parameters → call. The result provides both standardized JSON and rendered content, truncated according to trialMaxResultChars (default 60000 characters). The trial result only stays in the panel and does not enter the model context.
3. Detection and capability overview: One-click or passive connectivity detection can be performed for Streamable HTTP servers, and the results are only visible in the panel. Resources / Prompts use feature detection to determine if the upstream catalog is ready; currently both are marked “to be officially supported”.

There is also an optional tool mcp_probe that uses background tasks for one-time Streamable HTTP detection, with results only visible to the panel.

Anonymization and writing boundaries

Troubleshooting panels often accidentally print tokens to the interface. The repository enforces this security boundary:
- URL query credentials, userinfo passwords, header values, Bearer tokens, and JWTs are masked before rendering.
- headers in the configuration do not enter any snapshots; the values of env / headers stay on the Host side, and the editor only sees the keys.
- Writing only appends, requires approval, and backs up first. If an approval service exists and the current session’s agent is in an open round, writing uses ctx.approval (only allowed-once approval); otherwise, explicit confirmation on the interface is used. writeEnabled: false is a hard switch that disables all profile writing, while copying snippets remains available.
- The plugin does not register any prompt paragraphs; text visible to the model is mainly command/tool descriptions.

In terms of permissions, the dshWorkshop manifest declares network:outbound and native-code:none.

Installation and Activation

The installation command provided by the community directory page can be run in the DeepSeek Harness terminal:

dsh plugin add github:PerryLink/dsh-mcp-panel

The repository README provides more specific instructions for Web profiles, and offers git and npm channels. The git channel runs the prepare script in the package for building; the npm channel uses the published tarball without requiring additional build approval:

# Git channel, follow the latest main
dsh plugin --profile web add "github:PerryLink/dsh-mcp-panel#main"

# Pin to the released 0.4.0 tag (reproducible installation)
dsh plugin --profile web add github:PerryLink/dsh-mcp-panel#v0.4.0

# npm channel
dsh plugin --profile web add dsh-mcp-panel

# Pin npm version
dsh plugin --profile web add dsh-mcp-panel@0.4.0

The directory page also reminds users that for reproducible installations, you can write dsh plugin add github:PerryLink/dsh-mcp-panel#commit, replacing commit with the specific commit hash.

After installation, restart or have the Web panel hot-reload cordis.patch.yml, then use the following command to confirm that the mcp-panel line appears:

dsh --profile web --dump-config | grep -A3 'id: mcp-panel'

Then open Settings → Plugins → MCP, or execute /mcp in the session.

To uninstall, follow the README: remove the mcp-panel line from cordis.patch.yml (hot-reload for the Web side), delete the package from the profile’s node_modules, and use dsh web --dump-config to confirm there are no remaining lines.

Both the directory page and the repository warn: The plugin runs with the permissions of the current dsh process, and may execute code during installation. Please check the source code repository and license before installing.

Configuration Items

Adjustable items are all Schemastery Config fields and can be overridden in cordis.yml / cordis.patch.yml. The keys listed in the repository documentation are as follows (default values come from the README):

Key Default Value Meaning
probeEnabled true Whether to register the mcp_probe background task tool
probeTimeoutMs 10000 Single detection timeout (in milliseconds)
maxProbes 10 Number of detection records displayed in the panel
refreshIntervalMs 0 Recommended panel refresh interval; 0 means on-demand
outputLanguage en /mcp output language: en / zh / es / pt / hi
passiveProbeEnabled false Whether to periodically probe streamable-http servers
passiveProbeIntervalMs 60000 Passive detection interval (in milliseconds)
trialEnabled true Whether to enable the tool trial console and /mcp call
trialTimeoutMs 120000 Panel-side deadline for each trial call
trialMaxResultChars 60000 Maximum length of trial result payload (in characters)
writeEnabled true Master write switch; false still allows copying snippets
backupCount 5 Number of cordis.patch.yml backups retained per write

If you only want to view statuses and do not want the panel to modify configurations, set writeEnabled to false. For a Chinese interface, change outputLanguage to zh.

Applicable Scenarios and Notes

It is suitable for the following use cases:
1. You have already added several @deepseek-ai/dsh-mcp-client lines to your profile and want to quickly see which servers are connected, which are reconnecting, and what their most recent error was.
2. You do not want to manually edit YAML indentation and quotes to add a stdio or HTTP MCP server, and prefer to use a form to generate a patch, which can be applied after copying or approval.
3. Before calling the model, test the mcp__* tool in the trial console using the official pipeline to confirm parameters and permission policies.
4. You need the panel to mask tokens, headers, and JWTs before sharing screenshots or logs externally.

There are several boundaries you should be aware of in advance:
- It is not another MCP client. It does not establish its own transport, perform OAuth, or modify the protocol. Without the official client line, the panel has no bridge to connect to.
- The platform is currently Web GUI. The repository compatibility table notes both Host and browser sides, not all dsh runtime surfaces have this settings page.
- Harness version must match. It declares compatibility with 0.1.0-rc.5 and 0.1.0-rc.6. dsh is still in developer preview, and core plugins and APIs will change. You should recheck the plugin version after upgrading Harness.
- Resources / Prompts, exit codes / stderr tails will be marked “to be officially supported” until the official client completes support. Do not interpret these empty fields as “the server does not have this capability enabled”.
- “Delete” actually means disable. There is no remove operation in patches, the line remains after disabling, and it can be enabled again later.
- Plugin permissions equal those of the current dsh process. You should read the source code and Apache-2.0 license before installing community plugins; for production environments, it is recommended to pin to a commit or npm version instead of always following main.

Summary

dsh-mcp-panel solves the problem of the official MCP client being “functional but unattractive and difficult to modify”: statuses are read from mcp/status, configuration changes are applied as previewable, approvable, and rollbackable patches, and tool trials use the same ctx.tools.execute() pipeline. It separates the console and the bridging layer: the official client continues to handle transport and tool registration, while the panel handles observation and controlled modifications.

Community Plugin Directory: https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-mcp-panel/

GitHub: https://github.com/PerryLink/dsh-mcp-panel

npm: https://www.npmjs.com/package/dsh-mcp-panel