dsh-helm
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dsh-helmlist all nodes and their current health"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dsh-helm
DSH multi-node control plane: extends the single-machine "ChatGPT ↔ DSH" connector into a multi-node control plane. DeepSeek Harness (DSH) instances on multiple machines register with a unified Hub through node agents (node-agent); ChatGPT can route to any node through a single entry point—reading/writing code, managing sessions, checking health—without exposing any node to the public internet.
ChatGPT Web(连接器/插件)
│ OpenAI Secure MCP Tunnel(tunnel-client,TLS)
▼
Hub 控制平面 MCP 127.0.0.1:3471(ChatGPT 入口) mesh <hub-ip>:3470(节点接入)
│ 路由:显式 target → session owner → workspace owner → presence → default
├──────────────┬──────────────┬──────────────┐
▼ ▼ ▼ ▼
node-agent node-agent node-agent node-agent (每台机器:出站 WS + HMAC 握手)
│ │ │ │
▼ ▼ ▼ ▼
daemon 3457 → DSH daemon 3457 → DSH …… (各节点本地 helm daemon,Bearer 鉴权)Each node runs
dsh-helm agent: outbound-only connection to the hub (mesh WS), bridging the local helm daemon's MCP (127.0.0.1:3457/mcp) inward.The hub is the only entry point: ChatGPT calls tools through the hub MCP (3471), and the hub forwards to the correct node according to routing policy; the number of nodes is transparent to ChatGPT.
Single-machine compatibility: with a single node and
node_id == hub defaultNodeId, routing and tool-call behavior is equivalent to the single-machine daemon (summary/guard/steer are upper-layer enhancements and do not affect existing call semantics).
Features
Multi-node registration and heartbeat: node identity
node_id(UUID) + HMAC challenge handshake; 15s heartbeat, 45s lease; newer agent versions automatically reconnect on heartbeat timeout (half-open connection detection and reconnect).Five-level routing:
explicit target_node → session owner → workspace owner → unambiguous presence → defaultNodeId fallback; destructive/write operations with unclear targets are fail-closed rejected (route_confirmation_required), never guessed.Traceable forwarding: every forwarding result carries
_route.node_name(display_name) marking the executing node;route_explainis a dry run that does not execute.MCP tool surface 19+5: the single-machine daemon's 19 tools (
code_*/sessions_*/projects_list/supervisor_health, etc., snake_case parameters unchanged) are preserved as-is, with new additionsnodes_list/node_get/route_explain/presence_claim/presence_release; all routable tools accept an optionaltarget_node.presence: manual declaration (10-minute pin) + automatic macOS foreground-app detection (desktop sidecar); dual-node high confidence within the 15s ambiguity window → judged ambiguous, no automatic selection.
Layered health: control / channel / adapter / datapath / serena / tunnel layers each report independently, never collapsed into a single
status: ok.Cross-node aggregation:
workspaces_list/sessions_list/agents_list/projects_listreturn flattened multi-node results (each entry carriesnode_id).Audit and routing logs: node registration, heartbeats, routing decisions, and presence changes are all persisted (
audit/route_log).Metadata red line: hub storage contains only metadata (nodes/leases/session and workspace directories/audit), and never stores DSH session content.
Related MCP server: Peta Core
Directory structure
dsh-helm/
├── packages/
│ ├── protocol/ # wire 协议:envelope、JSON-RPC、HMAC 握手、常量
│ ├── store/ # SQLite:节点注册表、presence、目录、审计
│ ├── hub/ # 控制面:Router、WS mesh 3470、MCP 3471
│ ├── node-agent/ # 节点代理:出站 WS、重连、本地 DSH 桥
│ ├── presence/ # presence providers(手动/macOS/浏览器)
│ ├── platform/ # 跨平台适配(launchd/systemd/Windows 模板)
│ └── cli/ # dsh-helm CLI(init/agent/hub/status/nodes/…)
├── tests/integration/ # 双 fake node 端到端测试
└── scripts/ # ops 脚本(bash,macOS 优先)Quick start
Prerequisites: Node.js >= 22.5, pnpm, curl; each node machine must have DSH and the helm daemon installed (127.0.0.1:3457/mcp, Bearer token at ~/.agent-chatgpt-helm/token).
# 1. 安装 CLI(构建 + 写 ~/.local/bin/{dsh-helm,dsh-helm-agent,dsh-helm-hub},幂等)
./scripts/install.sh
# 2. 初始化节点身份(生成 ~/.dsh/helm/node.json,权限 0600)
dsh-helm init
# 3. 编辑 ~/.dsh/helm/node.json:设置 hub_url 与 local_mcp_token
# hub_url:内网/Tailscale 用 ws://<hub-ip>:3470,生产用 wss://
# 4. hub 机器:启动控制面(mesh 3470 + MCP 3471;默认只绑 127.0.0.1)
dsh-helm hub
# 多机场景:dsh-helm hub --bind <tailnet-ip> --mcp-bind 127.0.0.1
# 5. 节点机器:启动 agent(先前台验证,再装自启服务)
dsh-helm agent
./scripts/install-service.sh # macOS:launchd 服务(com.dsh-helm.node-agent)
# 6. 自检与状态
./scripts/verify.sh # 0 全绿 / 1 警告 / 2 严重
./scripts/health.sh # 节点状态表(走 hub MCP supervisor_health)
dsh-helm status # 本地配置与连接状态Adding more nodes: after dsh-helm init on a new node machine, hand the node_id and token from node.json to the hub administrator over a secure channel, then run on the hub machine (idempotent: appends/updates the token table, auto-reloads the launchd service):
./scripts/register-node.sh <node_id> <token>Detailed flow in docs/onboarding.md.
Connecting ChatGPT
Two paths, choose by deployment stage:
A. Single-machine direct (starting out): when the local machine already has a helm daemon, the hub treats the local node as a local node, behaving identically to the single-machine connector, no tunnel needed.
B. Multi-node (control plane, recommended): OpenAI Secure MCP Tunnel connects to the hub MCP (3471); ChatGPT manages all nodes through one entry point.
Full OpenAI Platform tutorial (creating tunnel / binding workspace / creating API key / tunnel-client parameters / proxy) in docs/chatgpt-tunnel-setup.md; ChatGPT Web side (developer mode / creating connector / testing) in docs/chatgpt-connector.md.
Trade-off between the two topologies: one tunnel + connector per daemon (multiple entry points, each managing its own), or one hub tunnel + one connector managing N nodes (single entry point, recommended—hub routes via target_node/routing rules, replies carry node_name).
Control-plane HA (dual Control Plane)
Two hubs form a quorum (2/2) control plane; if either fails, the other can still serve read routing and node entry.
Roles and leases: the one with the smaller
--cp-prioritywins as leader (sole writer); the leader renews the lease with the peer every 10s; if the peer is unreachable beyond the lease TTL (--cp-failover-ms, default 45s) → both sides enterread-only-no-quorum, and write operations returnQUORUM_LOST. A follower never unilaterally promotes itself—without quorum it is read-only (CAP prioritizes safety).Recovery: peer reconnects → full registry sync → forced re-election (term+1) → lease confirmed by both sides → writes resume. Both sides remain read-only throughout the recovery window.
agent multi-endpoint:
node.jsonconfigureshub_url+fallback_urls; on reconnect it polls in turn and pins on success; on failure it automatically switches to the second CP.Observability:
GET /cp-statusreturnsrole/phase/writeMode/quorum/term/leaderId/peers/syncOk/leaseEpoch/failoverCount;dsh-helm doctorand the Dashboard "Control Plane HA" card display it directly.ChatGPT entry HA: the OpenAI tunnel-client's
--mcp.server-urlis channel-scoped with no multi-backend failover within one connector. Run a localdsh-helm ha-proxy(default127.0.0.1:3481,--primary http://127.0.0.1:3471 --secondary http://<peer-cp>:3471); the tunnel still points to one connector (3481); it automatically switches to the secondary CP when the primary is unreachable and switches back after recovery. Dual tunnel + dual connector is the alternative topology.Second CP deployment:
dsh-helm hub --cp-peer ws://<peer-cp>:3470 --cp-priority 1 --cp-id <node-id> --cp-token-env DSH_HELM_CP_TOKEN; both sides'DSH_HELM_TOKENmust contain both nodes' token tables (so the other CP can authenticate any agent during failover). Use--mcp-bind <tailnet-ip>when MCP must be reachable across machines (Tailscale ACL fence; keep loopback for single-machine scenarios).
Device pairing (adding a DSH device)
Dashboard "Add DSH Device" → generates a one-time pairing code (valid 10 minutes, single-use, only the hash is stored); the new machine runs dsh-helm join --control-plane ws://<hub>:3470 --code <code> to join the network (generates a long-term node token written to ~/.dsh/helm/node.json; the hub stores only the hash/status). The pairing API is loopback-only + anti-CSRF header; logs record only the hash prefix. See docs/security.md §5.
MCP Context Isolation (large-context stability)
Response slimming and monitoring for long-running, large-context sessions in the ChatGPT ↔ DSH connector (compatibility layer, chain unchanged):
sessions_get default summary: by default returns only a structured summary (
id/title/status/workspace/created_at/updated_at/last_message_summary/last_assistant_summary/current_goal/current_goal_seq/last_user_message/recent_evidence{commits,paths,errors,tests}/history_ref/safety_sanitized/token_estimate/continuation_available, no messages). The summary is generated by the node agent: it requests only the last 20 messages from DSH (SUMMARY_WINDOW),current_goaltakes the most action-oriented user instruction in the window (with source seq),recent_evidenceis extracted by regex heuristics, and suspected credential lines are stripped before entering any summary field (safety_sanitizedflag). Measured baseline: early large-session responses 75KB → 1.2KB; fidelity acceptance fixture (1000 messages) ~107KB → 0.7KB, default response <1KB. Cached at~/.dsh/helm/summaries/<session_id>.json(60s TTL, invalidated after write operations).Full history on demand:
include_messages=true(configurablemax_messages, default 20) returns full messages; thebefore_seqparameter is passed through but DSH 0.1.1 does not implement real pagination (probe-verified: max_messages ≤100 and beforeSeq is ineffective)—history beyond the most recent 100 messages is currently unreachable, andhistory_refexplicitly marks the reachable range (reachable_max_messages:100); legacy calls (without parameters) automatically use the summary, callers need not change parameters, but note the return content changes from full messages to a summary (use explicitinclude_messages=truewhen the original text is needed).Response Size Guard: unified middleware on all hub MCP responses,
MAX_RESPONSE_BYTES=50000; over-limit responses are automatically smart-truncated (still valid JSON, withtruncatedmetadata attached), logged as[mcp-guard] <tool> original=.. returned=.. truncated.Health monitoring: hub adds
GET /metrics(request count/average and max response bytes/truncation and error counts/active connections/perTool breakdown),GET /readyz(HA quorum readiness),GET /version; Dashboard adds an "MCP Control Plane" tab.Correction queue-jumping/immediate intervention:
sessions_promptsupportsmode=queue|steer(default queue preserves queueing semantics);steerbypasses the queue and injects into the running turn via the DSH host API (structured returnsteered/queued/rejected/unavailable), confirmed by the DSH history eventagent/inbox/spliced. Design review and implementation details in docs/priority-queue.md.
Platform support
Platform | hub | node agent | presence | Service auto-start |
macOS | ✅ verified | ✅ verified | ✅ desktop sidecar auto + manual | ✅ launchd ( |
Linux | ✅ partial | ✅ partial | ✅ manual | ✅ systemd template ( |
Windows | ⚠️ needs Node ≥22.5 | ⚠️ scaffold | 🚧 awaiting real-device verification | 🚧 Task Scheduler template |
Core code has zero platform-specific logic (launchd/osascript/PowerShell all isolated in
packages/platformandpackages/presence); macOS dual-machine (Tailscale) verified on real hardware; Linux/Windows awaiting real-device verification.
Documentation
Document | Content |
Architecture, protocol, routing decisions, data model, tool surface | |
OpenAI Platform tunnel creation and tunnel-client configuration | |
ChatGPT Web connector creation and usage | |
Adding a new machine to the control plane | |
Credentials, network boundary, Tailscale ACL, threat model summary | |
Symptom → diagnosis → resolution | |
Full threat model (15 threats) | |
Upstream beforewave helm compatibility baseline |
Security highlights
Credentials:
~/.dsh/helm/node.json(node token) and the daemon token file are both 0600; the hub token table is injected via theDSH_HELM_TOKENenvironment variable (never written to disk); tokens never appear in argv/git/logs; tunnel credentials are injected with theenv:syntax.Binding: the hub binds only
127.0.0.1by default; for cross-machine use, Tailscale +--bind <tailnet-ip>is recommended, with--mcp-bind 127.0.0.1keeping MCP loopback-only. Hub MCP (3471) v1 has no authentication—never expose it directly to the public internet; production mesh useswss://(TLS handled by a reverse proxy/external https server).fail-closed: destructive operations (
sessions_prompt/sessions_resume) are rejected without a clear target; no guessing within the presence ambiguity window.No content storage: the store holds only metadata and audit records, never DSH session content.
Full security model in docs/security.md and docs/threat-model.md.
Status and evidence tiers
Version v0.1.0. Automated verification all green (unit + full-protocol end-to-end integration tests with two fake nodes + fidelity acceptance: 399/399 (48 files), build/lint clean); macOS dual-machine Tailscale real-device smoke test complete. doctor/dashboard/install implemented; CLI online RPC commands (nodes/node/route-explain/presence/rotate-token) still require a live hub connection (currently prompts requires live hub connection, planned for the next milestone); the same capability is available via hub MCP tools (nodes_list, etc.); session handoff v1 honestly returns unsupported.
Capability status is tiered by evidence strength (no conflation):
Tier | Content | Evidence |
Implemented and tested | Five-level routing + fail-closed, HMAC handshake, presence (manual + macOS desktop detection), layered health, HA dual CP (quorum/lease/failover + ha-proxy), device pairing (pair/join), MCP Context Isolation (default summary/Response Guard/steer queue-jumping), CLI 15 subcommands | Unit + integration tests all green; acceptance report in docs/fidelity-acceptance.md and docs/priority-queue.md |
Depends on upstream but verified | DSH 0.1.1 | Real-chain smoke + probe records (docs/priority-queue.md §2/§5) |
Unofficially documented / experimental | Same OpenAI tunnel with two tunnel-client instances semantics (disaster-recovery tier 2, needs testing); Linux/Windows platform support | Zero statements in official OpenAI docs (docs/chatgpt-disaster-recovery.md); platform table above |
Known limitations and unclosed risks | ①History beyond the most recent 100 messages unreachable (DSH 0.1.1 beforeSeq ineffective; fix path = agent history archiving, see fidelity §7); ②hub MCP (3471) v1 has no authentication—never expose publicly; ③CLI online RPC commands not connected to a live hub; ④audit has no tamper-proofing/hash chain, tokens stored statically in plaintext (see threat-model §4/§5) | Acceptance/smoke verified; threat model item by item in docs/threat-model.md |
Explicitly not promised: no production-ready guarantee; HA is self-managed control-plane redundancy with no SLA / zero-downtime promise; no commitment on OpenAI official capability boundaries (tunnel multi-instance HA, automatic key rotation) until obtained. Acceptance verdict is CONDITIONAL PASS (fidelity and security closed loop; completeness limited by DSH 0.1.1 protocol boundaries).
ops scripts
Script | Purpose |
| Install CLI (node check / build / three wrappers), idempotent |
| Uninstall ( |
| Self-check (node / wrappers / node.json 0600 / local daemon / hub port), exit codes 0/1/2 |
| Node status table (hub MCP preferred, local store fallback) |
| Install node agent as a launchd service (macOS), |
| Register/update node token on hub machine (idempotent, auto-reloads launchd) |
| 15s self-healing watchdog (process-level restart, single-instance lock) |
All scripts are bash 3.2 compatible, use the [dsh-helm] output prefix, are idempotent, and only probe—never modify—existing services on production ports (3080/3457/3458).
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables cluster-aware command execution and automatic task routing across distributed nodes based on system load, architecture, and OS requirements. It supports parallel execution, remote node management via SSH, and dynamic load balancing for agentic workflows.4MIT
- AlicenseNot gradedqualityCmaintenanceActs as a proxy/router for multiple downstream MCP servers, exposing only meta-tools to the host to reduce token usage, enabling efficient search and invocation of tools from a fleet of servers.7MIT
- AlicenseNot gradedqualityBmaintenanceEdge-deployed predictive decision engine and circuit-breaker orchestrator for AI agents. Features low-latency telemetry, automated failover routing, and Bitcoin Lightning micro-payments.MIT
Related MCP Connectors
Agent-native collaboration network: orchestrate a team of long-running agents from any MCP client.
Single entry point for the GOSCE portfolio: routes orchestrators to verified agents by capability, w
Agent-to-agent network for teams: dm, who-knows-X routing, shared rooms. Human-in-the-loop.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/lixiaoshuang79/dsh-helm'
If you have feedback or need assistance with the MCP directory API, please join our Discord server