dsh-baton — Claude Code MCP server for DeepSeek Harness tasks
Hands a task from Claude or Claude to a local DeepSeek Harness and brings the answer back once the run ends. Useful when a second agent should take the heavy part.
claude mcp add dsh-baton -- npx -y dsh-baton-mcpWhat dsh-baton does
The server speaks stdio to the client. Tool calls travel over an owner-only local socket into the dsh-baton-host plugin inside Harness, and that plugin drives the session in the desktop UI. You watch the work happen there, each message tagged with whoever sent it — Claude or Claude. A headless dsh path stays available as the fallback when the plugin is off.
Tools cover three areas. Workspaces: list, create, rename. Sessions: list, read, activity, rename. Runs: send, status, wait, cancel, list. dsh_send returns a run_id right away. If the session is mid-turn, followup queues your message for later and steer drops it into the current turn. Claude can block inside dsh_wait for up to 270 s per call; other clients get 50 s. An unfinished wait answers timed_out with the state alone, so call again.
You need DeepSeek Harness at 0.2.1-rc.2 or newer, signed in, and either Claude or Claude on the calling side. Node.js is not part of the picture. Should Harness report a failed registration, npx -y dsh-baton-mcp setup repeats it — that route does need Node.js ≥ 22.15. Claude asks for approval on MCP tool calls, and the dsh-baton tools stay blocked until you grant it; unattended codex exec runs want --approve-for-me.
What it helps with
- move a long task from Claude into DeepSeek Harness without leaving the chat
- watch a run unfold in the Harness UI and see which client sent each message
- queue a second message while the agent is still working on the current turn
- block until the job finishes and pull the final reply back
- answer the questions a run raises partway through
Example prompts for the agent
- Call
dsh_list_workspacesand show me what I have - Send this log-cleanup job to my session and wait for it with
dsh_wait - Push a clarification into the busy session with
steerso the agent picks it up mid-turn
How to install dsh-baton
Platform CLI
claude mcp add dsh-baton -- npx -y dsh-baton-mcpPlatform CLI
codex mcp add dsh-baton -- npx -y dsh-baton-mcpConfig file
{
"mcpServers": {
"dsh-baton": {
"command": "npx",
"args": [
"-y",
"dsh-baton-mcp"
]
}
}
}Config file
{
"servers": {
"dsh-baton": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"dsh-baton-mcp"
]
}
}
}Platform CLI
gemini mcp add dsh-baton npx -y dsh-baton-mcpStep by step, with commands for each platform: How to add an MCP server to Claude Code, Codex, Cursor, VS Code, Gemini CLI and more
Questions about dsh-baton
How do I install dsh-baton in Claude Code?
Run claude mcp add dsh-baton -- npx -y dsh-baton-mcp. For Claude, the same call goes through codex mcp add.
What does dsh-baton do?
It passes a task from an MCP client into DeepSeek Harness and returns the result when the run ends. Along the way you get status, waiting, cancellation and answers to the run's questions.
What has to be in place before it works?
DeepSeek Harness 0.2.1-rc.2 or newer, signed in, with Claude or Claude on the other end.