Skip to main content
Glama

Claude Code and Codex each hand a task to DeepSeek Harness, and its subagents build this rainy-night street in 1 h 41 min (40 s, sound on):

https://github.com/user-attachments/assets/72e2fdff-275e-48bc-8e5a-39ffb025a0a8

See it run

One Codex chat starts a task, queues a follow-up, steers the running turn, and waits for all three:

Codex and Claude take turns in the same Harness session, and every message is labelled with who sent it:

Related MCP server: dsh

Quick start

Requires DeepSeek Harness ≥ 0.2.1-rc.2 (signed in) and Claude Code or Codex. Nothing else: no Node.js, no terminal. The steps are the same on macOS and Windows.

1. Add the plugin in Harness: Plugins (插件) → Add plugin (添加插件) → type dsh-baton-host → Install (安装) → Enable now (立即启用).

Switched on, the plugin registers dsh-baton for Claude Code and Codex, for every folder, and Harness says so.

2. Codex only, once: Codex Settings → Hooks → Trust dsh-baton: waiting for the Harness run. Codex is then woken when a run ends instead of checking every 270 s. You trust it once: updates and Harness restarts do not ask again. Skip it and Codex waits with dsh_wait as before; the first hand-over reminds you.

3. Check: in a new Claude Code or Codex conversation, ask it to call dsh_list_workspaces. It lists your Harness workspaces.

That is all. If Harness says it could not register, run npx -y dsh-baton-mcp setup in a terminal (this needs Node.js ≥ 22.15); it does the same registration. Updating, removing and Windows details are further down.

How it works

How each client waits (nothing to configure):

  • Claude Code waits for a run in the background (the wait_command that dsh_send returns) and is woken once, when the run ends.

  • Codex with the dsh-baton Stop hook trusted (from 0.6.1): after dsh_send it ends its turn; the hook waits for the run outside the model and, when the run ends or asks something, continues the same conversation with the result. One model request per run instead of one every 270 s.

  • Codex without the hook waits inside dsh_wait, up to 270 s per call, just under its 300 s tool timeout. An unfinished wait returns only the state, so Codex calls again without summarising. Codex gets no wait_command: its terminal cannot wake it, so it would poll.

  • Codex asks you to approve MCP tool calls: approve the dsh-baton tools. For unattended codex exec runs, add --approve-for-me.

Pick a model (from 0.6.1): just say which one, for example "hand it to DeepSeek, V4 Pro". dsh_send passes it as model (and reasoning_effort), matched against the models Harness lists, so a model Harness adds later works as soon as it shows up. It applies to that session only; Harness's default model stays as it was. dsh_list_models shows what is available.

How a hand-over is checked (from 0.6.0)

You don't have to take DeepSeek's word for it. Before the run, dsh-baton notes what is in the folder. When the run ends it shows exactly which files were created, changed or deleted, and runs your project's own tests itself (npm test, or whatever the client passes as checks). A second, read-only DeepSeek agent then goes through the request point by point and ends with a table: requirement, met or not, and where (file:line). Claude or GPT reads just that, sends anything missing back in one message, and opens code only where a row says "not met". Unless cwd names another folder, the new Harness session starts in the folder you're already working in.

Token usage

In short: hand over the big, long jobs. A feature that spans many files, a large refactor, a whole small app: that is where it saves the most. Claude Code's own bill drops by 65–81%, and Codex gets 2 to 5 times as many tasks out of a ChatGPT Plus 5-hour window (5 times on a medium task with GPT-6 Astra).

The honest part: for small tasks, Codex on GPT-6.1 Sol is cheap enough that doing it alone costs less in total than handing it over, and at medium size it comes out about even. The hand-over pays off when you want Claude or GPT to plan and review, a cheaper model to do the typing, and you'd rather not keep hitting the 5-hour limit.

Who this is for: most of us pay for Claude or ChatGPT with a plan (Plus, Pro, Max 5x…), while DeepSeek is pay-as-you-go from a balance you top up, so every hand-over is money spent outside your plan. If your plan's limits already cover how you work, you don't need this: keep it simple and keep the money. If you're like me and keep running long, messy jobs with round after round of changes, and keep hitting the limit, a little DeepSeek spend gets you a lot more out of the plan you already pay for.

Cost per task at list price, DeepSeek V4.1 Flash 1017 at its peak price:

Client · model

Task

Alone

Handed over, client only

Handed over, with DeepSeek

Claude Code · Opus 5.5 high

Small

$1.07

$0.37 (−65%)

$0.55 (−49%)

Claude Code · Opus 5.5 high

Medium

$2.13

$0.41 (−81%)

$0.70 (−67%)

Codex · GPT-6.1 Sol high

Small

$0.17

$0.09 (−49%)

$0.29 (+73%)

Codex · GPT-6.1 Sol high

Medium

$0.41

$0.10 (−75%)

$0.41 (−2%)

Codex · GPT-6 Astra high

Small

$0.79

$0.56 (−29%)

$0.75 (−6%)

Codex · GPT-6 Astra high

Medium

$2.27

$0.48 (−79%)

$0.78 (−65%)

Share of the ChatGPT Plus 5-hour window per task: Sol small 1.9% → 0.8%, Sol medium 4.3% → 1.0%, Astra small 7% → 3.5%, Astra medium 22% → 4%.

  • Two tasks, asked the way a user would. The small one takes Claude Code or Codex about 7–8 minutes on its own; the medium one is a small app with a server and a page. Long jobs beyond that were not measured. The requests are in Chinese, linked as written:

    • Small: a command-line task manager in Node, no dependencies, split into modules, with tests. Request · acceptance check

    • Medium: a task manager web app, Node server plus page, REST API, stats, tests and a README. Request · acceptance check

  • The only difference in the hand-over runs is one line added at the end: 交给 DeepSeek Harness 去做。 ("Hand it to DeepSeek Harness.")

  • Same model and effort in both arms, three runs per cell (Astra: one run each, two for the small hand-over), and every run judged by the same acceptance check, which the model never sees. All 12 hand-over runs passed it the first time.

  • Prices are list prices. DeepSeek is counted at its peak price, the most conservative case; the real DeepSeek bill came to about 58% of that.

  • Every run, the raw data and the scripts: run log and full report.

Tools

Tool

What it does

dsh_list_workspaces

Workspaces in the Harness sidebar

dsh_create_workspace

Through dsh_call. Register a folder as a workspace (creates the folder if missing); returns the existing one if already registered

dsh_list_sessions

Sessions newest first, with title, folder, running state and model (what its next request uses); filter by folder or text. Archived sessions are left out

dsh_list_models

The models Harness can run (provider, id, name, reasoning efforts) and its default model

dsh_read_session

Recent prompts and replies of one session (with tool names); archived: true for an archived session

dsh_send

Send a message: session_id continues that session; otherwise a new one starts in cwd or workspace_id, or, with neither, in the folder the conversation works in (a cwd that is not a workspace yet is registered first; a cwd outside the conversation's folder is allowed and noted in folder_note). checks: test commands dsh-baton runs itself when the run ends (see How a hand-over is checked). Returns a run_id at once. In Harness the message is marked "Sent by Claude / ChatGPT from another chat". An archived session is refused: unarchive it in Harness, or start a new session. To a busy session, mode followup queues the message after the current turn and steer adds it to the running turn; left out, it does what Harness's own setting says (Settings → sending while busy: queue or steer), and followup when that cannot be read. mode_source says which applied. model only when the user names one ("DeepSeek-V4 Pro", "v4-pro"; reasoning_effort likewise): it is matched against Harness's own model list, ignoring case, spaces, hyphens and a leading DeepSeek, so a model Harness adds later (V4.1 Pro) works as soon as Harness lists it; a name that matches nothing or several fails the send, before anything is created, with the list (provider/model picks one). It is set on that session before the message goes in, and Harness's default model is put back as it was (Harness saves a session's pick as the default too). Left out, a continued session keeps its own model and a new one uses Harness's default. The reply says which in model and model_source

dsh_status

Run progress: state, recent text and tool calls, final reply; waiting_on when the turn is over but sub-agents or jobs still run; human_interjections when someone typed in the Harness UI mid-run; state interrupted for a run cut short by a Harness restart; model the run was sent with

dsh_wait

Codex with the Stop hook trusted does not need it. Wait for the run to end; a finished run carries evidence (files changed, check results) when the message was sent with checks (or until it stops to ask a person, see dsh_answer): up to 270 s per call for Codex, 50 s for other clients. Still going: returns timed_out with just the state; call it again. Clients that can wait in the background use dsh_send's wait_command instead. dsh_status is a one-off look, not a way to wait

dsh_answer

Answer the questions a run stopped to ask (Harness's ask_user_question): per question, an option number or label, free text, or skip; one at a time or all at once. dsh_wait and wait_command return as soon as a run asks, with the questions (needs_input, question; the option Harness's model would pick is in harness_suggested, apart from the labels). The assistant answers by its own judgment only when you told it to decide, and then passes reason and tells you what it chose and why; otherwise it brings you the questions, starting with its own recommendation and reason. You can also answer in the Harness window: whoever answers first wins

dsh_session_activity

Through dsh_call. What a session is doing now: running turn, sub-agents (any depth), background jobs; archived: true for an archived session

dsh_update_queued

Through dsh_call. Change a message still waiting in the queue of a busy session, by its run_id: edit its text, remove it, or steer it into the running turn now. Once it has reached the conversation it can no longer be changed

dsh_cancel

Stop everything a session is doing, by run_id or session_id: turn, sub-agents, jobs. Harness also drops the messages waiting in its queue; their runs end as cancelled

dsh_rename_session

Through dsh_call. Rename a session

dsh_rename_workspace

Through dsh_call. Rename a workspace (sidebar title only; the folder is not moved)

dsh_list_runs

Through dsh_call. Recent runs, optionally of one session

dsh_call

Calls any dsh_* tool by name: the less used tools (create and rename workspace, rename session, session activity, update queued, list runs) are not in the tool list from 0.6.0 on, to keep every request short, and are reached this way; also for a conversation whose tool list predates an update. An unknown name lists the tools

CLI

dsh-baton workspaces
dsh-baton new-workspace ~/code/new-app --title "New App"
dsh-baton sessions --cwd ~/code/new-app
dsh-baton send --cwd ~/code/new-app "Scaffold the project"
dsh-baton send --session session-xxxx "Next: add tests"
dsh-baton send --session session-xxxx --mode steer "Interjection: don't change the API"
dsh-baton wait hrun-xxxx              # blocks, prints the final reply; exit 0 on success
dsh-baton status hrun-xxxx
dsh-baton activity session-xxxx       # running turn, sub-agents, background jobs
dsh-baton cancel --session session-xxxx
dsh-baton rename session-xxxx "New title"
dsh-baton rename-workspace ~/code/new-app "New name"

Configuration

Variable

Default

Meaning

DSH_BATON_BACKEND

auto

auto, host or headless

DSH_BATON_HOME

~/.dsh-baton

Socket and headless run records

DSH_BATON_SOCKET

$DSH_BATON_HOME/host.sock

Plugin socket path (must match on both sides); on Windows mapped to a per-user named pipe

DSH_BATON_WAIT_S

270 for Codex, else 50

How long one dsh_wait call waits; set it only if you raised the client's tool timeout, and keep it below that

DSH_BATON_CODEX_HOOK

1

0 (set for Harness) stops the plugin adding the Codex Stop hook

DSH_BIN

the dsh inside the macOS app, else PATH

Harness CLI for headless mode

DSH_HOME

~/.dsh

Harness data folder (headless session reads)

DSH_BATON_ACCOUNT

1

0 uses the API-key route in headless mode

DSH_BATON_PATCHES

empty

Extra headless --patch overlays, :-separated

When the plugin is unreachable, the MCP server falls back to Harness's dsh headless command. It can only continue sessions it created itself (headless does not load agent presets such as standard), and new sessions do not appear in the desktop sidebar. By default patches/account.patch.yml reuses the desktop app's DeepSeek account sign-in, so no API key is needed.

Install details

What the plugin does when switched on. It copies the MCP server to ~/.dsh-baton/app, a folder that stays put, and writes the MCP entry into ~/.claude.json and ~/.codex/config.toml directly, keeping a *.bak-dsh-baton backup of each. It starts the server with your own Node.js ≥ 22.15 when it finds one on PATH; without one, with Harness's own runtime (the Harness app in Node mode, ELECTRON_RUN_AS_NODE=1), so nothing else has to be installed. Either way it works with only the desktop apps installed, when claude / codex are not on your PATH. It runs again on each Harness start: an entry that is already right, or a working one that starts another copy of dsh-baton, is left alone. In Harness, the source switches to the npm registry ("Official npm registry", 「npm 官方源」) by itself once you type the package name, and no restart is needed. To turn the registration off, set DSH_BATON_AUTO_REGISTER=0 for Harness.

The Codex Stop hook. The plugin adds one [[hooks.Stop]] block, marked # dsh-baton, to ~/.codex/config.toml; Codex shows it as dsh-baton: waiting for the Harness run and runs it only once you trust it (dsh-baton never trusts it for you). The block only names a small script, ~/.dsh-baton/bin/codex-stop-hook (codex-stop-hook.cmd on Windows), and everything that can move, Node.js and the server, lives in that script. So the block itself never changes: updates, same-version refreshes and Harness restarts leave it as it is, and your trust stays. If the block is ever rewritten, dsh-baton drops the old trust record, and Codex asks you to trust it again. Windows uses a .cmd because Codex runs hooks through PowerShell -Command, which cannot start a quoted program path. Not added when the server runs on Harness's own runtime. dsh-baton setup --codex-hook adds it by hand, setup --remove takes it out, DSH_BATON_CODEX_HOOK=0 for Harness stops the plugin adding it.

Updates need no restart. When a newer version lands in ~/.dsh-baton/app (a plugin update, setup, or a copy by hand), or the same version with changed files, conversations already open in Claude Code and Codex use it from their next dsh_* call: the server checks the folder before each call, starts the new version, and says once in that call's result that it was updated. A dsh_wait that is already running finishes on the old version first. If the new version cannot start, the old one keeps working and the result says why. A tool added in the new version shows up in Claude Code at once (the server tells the client its tool list changed); Codex keeps the tool list a conversation started with, so it does not show a new tool until the next conversation; from 0.5.9 on it can still use one at once through dsh_call, which the update note points to, and the tools it already has run the new code right away. This works from the version after 0.5.8 on; a server started from 0.5.8 or earlier needs one last restart (or /mcp reconnect) to pick it up.

npx -y dsh-baton-mcp setup does the same registration from a terminal: for a plugin that could not register, or when you come from an MCP directory. With the plugin already registered it changes nothing, then points you to the plugin if it is missing.

Updating. Harness has an update button only for its official plugins, so: Plugins → dsh-baton-host → Uninstall, then Add plugin → dsh-baton-host. For a while after a release, Harness installs the previous version instead (pnpm's minimumReleaseAge holds back versions published very recently, and the install dialog says so); to get the new one at once, type the version: dsh-baton-host@0.6.1. A pre-release must always be added by its exact version, such as dsh-baton-host@0.6.0-next.0: Harness resolves @next to a broken placeholder. Plain dsh-baton-host gets the latest release. Switched on again, the plugin brings the MCP server to the same version; new conversations use it. If the two are ever out of step, the first tool call that notices it says so, naming the older side and the newer side's exact version to install.

Removing. Harness → Plugins → dsh-baton-host → Uninstall, then npx -y dsh-baton-mcp setup --remove. The plugin cannot tell an uninstall from Harness quitting, so it leaves the MCP entries to that command, which also deletes ~/.dsh-baton/app; run records stay in ~/.dsh-baton until you delete it.

Upgrading from dsh-bridge. In Harness, uninstall dsh-bridge-host, then add dsh-baton-host; switched on, it replaces the old dsh-bridge MCP entries. DSH_BRIDGE_* variables and an existing ~/.dsh-bridge folder keep working for now. Tools get a new prefix (mcp__dsh-baton__…), so update any permission allowlists. A plugin added before 0.4 by pasting ~/.dsh-baton/app/host still works but does not update with npm: uninstall it and add dsh-baton-host by name.

From source (to follow main or change the code): git clone https://github.com/JialaoLiu/dsh-baton.git, then in Harness add the plugin from the clone's host folder (Add plugin → paste the path). Switched on, it registers the clone itself, so changes run before they are published. Update with git pull. node dsh-baton/src/cli.mjs setup registers the clone from a terminal.

Windows. Same steps; WINDOWS.md covers what differs (a named pipe instead of a socket file) and fixes for a Plugins page that cannot install or uninstall.

The plugin and setup write the same entries these commands would (with the absolute path of node, since desktop apps start MCP servers without your shell's PATH):

claude mcp add dsh-baton -s user -- "$(command -v node)" "$PWD/dsh-baton/src/server.mjs"
codex mcp add dsh-baton -- "$(command -v node)" "$PWD/dsh-baton/src/server.mjs"

-s user matters: without it, Claude Code registers the server for the current project folder only.

Claude desktop app (optional): for the chat app's connectors (separate from Claude Code), add this to ~/Library/Application Support/Claude/claude_desktop_config.json and restart the app. It shows as a "Local dev" connector.

{ "mcpServers": { "dsh-baton": { "command": "/absolute/path/to/node", "args": ["/absolute/path/to/dsh-baton/src/server.mjs"] } } }

Security and limits

Any process running as your OS user can drive Harness through the socket, the same as running dsh directly. dsh-baton relies on Harness 0.2.1-series internal service APIs, so a major Harness update may need a follow-up release.

License

MIT

Available Tools

12 tools
dsh_cancelA

Stop everything a session is doing (running turn, sub-agents, background jobs), by run_id or session_id. Messages still waiting in the queue are not removed.

NameRequiredDescriptionDefault
run_idNoRun id
session_idNoSession id (to stop work dsh-baton did not start)

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose meaningful behavior: exactly what is torn down (turn, sub-agents, background jobs) and an important boundary — queued messages are NOT removed. It omits error/idempotency behavior, permissions, and what happens if nothing is running, so it is not fully complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the core action and its scope come first, and the queue caveat follows. Every clause carries information; nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-param, no-output-schema cancel tool with no annotations, the description covers the essential questions: what stops, what survives, and how to target the session. Return/error semantics and whether the call is idempotent are unstated, which is the remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters; baseline is 3. The description only adds that the two keys are alternatives ('by run_id or session_id'), a small increment beyond the schema's field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('Stop everything a session is doing') plus explicit scope enumeration (running turn, sub-agents, background jobs) makes the operation unambiguous. It does not name any sibling tool, but no sibling in the list performs cancellation, so confusion risk is low.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it by naming the two lookup keys ('by run_id or session_id'), and the session_id note hints at the case where dsh-baton did not start the work. There is no explicit when-not guidance or named alternative, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dsh_create_workspaceA

Register a folder as a workspace in the DeepSeek Harness sidebar (creates the folder unless create_dir is false). Idempotent: an already registered folder returns its existing workspace. Needs the dsh-baton-host plugin.

NameRequiredDescriptionDefault
pathYesAbsolute folder path (~ allowed)
titleNoSidebar title; defaults to the folder name
create_dirNoCreate the folder if missing

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full load and does well: it discloses the side effect of creating a folder unless create_dir is false, states idempotent semantics for repeat calls, and flags an external plugin dependency. It omits error/permission behavior, but the important non-obvious traits are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with zero filler. The primary action is front-loaded, followed by the conditional side effect, idempotency, and the dependency requirement in descending order of importance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter registration tool with no output schema and no annotations, the description covers purpose, side effects, idempotency, and prerequisites. Only failure modes (invalid path, missing plugin) are left unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are already documented in the schema (path, title default, create_dir default). The description only restates the create_dir behavior, adding no syntax or format detail beyond structured data, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Register a folder as a workspace') plus the surface it affects (the DeepSeek Harness sidebar), which cleanly separates it from siblings like dsh_rename_workspace and dsh_list_workspaces. It stops short of explicitly naming which sibling to prefer in a given situation, but the action itself is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description supplies real usage context: it is idempotent ('an already registered folder returns its existing workspace'), so an agent knows repeated calls are safe, and it names a precondition ('Needs the dsh-baton-host plugin'). It does not, however, say when to prefer or avoid this tool relative to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dsh_list_runsB

List recent runs handed over through dsh-baton, newest first.

NameRequiredDescriptionDefault
limitNoMax runs

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full disclosure burden. It does add real behavioral traits: results are ordered newest first and are filtered to runs handed over via dsh-baton. It says nothing about pagination, truncation, the default limit's effect, or whether it is a read-only operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with zero filler. Ordering and source filter are front-loaded alongside the verb and resource, so every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter list tool with no output schema, the essentials are present. However, with no annotations and no output schema, an agent still cannot learn what a 'run' record contains or how listing interacts with limits — minor but real gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one optional parameter (limit) and schema description coverage is 100%, so the schema already carries the meaning. The description adds no syntax, bounds, or interaction detail beyond what the schema provides; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (runs) with scope ('recent') and ordering ('newest first'), plus the qualifier that runs came through dsh-baton. This is clear enough to distinguish from dsh_list_sessions and dsh_list_workspaces, though it never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no prerequisites, and no mention of any alternative. An agent cannot tell from the text whether dsh_list_runs or dsh_list_sessions is the right entry point for its question; the dsh-baton qualifier hints at context but is not a selection rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dsh_list_sessionsA

List saved DeepSeek Harness sessions, newest first, with title, workspace folder (cwd) and whether a run is active. Use it to find the session_id to continue. Sessions not in dsh_list_sessions are archived or gone: do not look for them on disk.

NameRequiredDescriptionDefault
cwdNoOnly sessions of this workspace folder
limitNoMax sessions
queryNoFilter by text in title or folder
include_subagentsNoAlso list sub-agent sessions

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose real behavior: result ordering, the composition of each result, and the strong completeness claim that non-listed sessions are archived or gone. It omits pagination/total-count behavior around the limit parameter and any auth or cost notes, so it stops short of full transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, zero filler, and the core purpose plus return shape is front-loaded before the routing and caveat sentences. Every clause carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-param list tool with no output schema and no annotations, the description covers what is returned, in what order, what the list enables, and what its absence means. The only gap is the lack of pagination guidance for the limit parameter, which leaves minor ambiguity when more than 20 sessions exist.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are already documented (cwd, limit, query, include_subagents). The description only lightly reinforces semantics by tying "workspace folder (cwd)" to the returned field, adding no new syntax or filtering nuance beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list saved DeepSeek Harness sessions) plus ordering (newest first) and the fields returned (title, cwd, active-run flag). It is distinguishable from dsh_list_runs, dsh_list_workspaces and dsh_session_activity by resource, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear positive trigger ("Use it to find the session_id to continue") and a useful negative boundary ("Sessions not in dsh_list_sessions are archived or gone: do not look for them on disk"). It does not, however, name the alternative tools an agent should reach for when the intent is workspace or run listing rather than session listing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dsh_list_workspacesA

List the workspaces (project folders) shown in the DeepSeek Harness sidebar. Needs the dsh-baton-host plugin.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden. It does add a real behavioral fact beyond the schema — the plugin dependency — which is valuable, but it omits read-only/mutation status, ordering, and pagination behavior for what is presumably a safe read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and resource, then the dependency. No filler or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list tool with no output schema and no annotations, the description covers what it does and the one non-obvious prerequisite. Return shape and ordering are unspecified, but there is no output schema promising that detail, so the gap is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline is 4. No parameter-related information is missing because the schema is empty.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (workspaces), and disambiguates the term by glossing it as 'project folders shown in the DeepSeek Harness sidebar.' That gloss is enough to separate it from dsh_list_sessions and dsh_list_runs, though those siblings are not named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the verb and the sidebar gloss, and it usefully states the precondition 'Needs the dsh-baton-host plugin.' However, it never says when to prefer this over dsh_list_sessions or what to do if the plugin is absent, so the routing guidance is only implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dsh_read_sessionB

Read the recent visible conversation (user prompts and assistant replies, with tool names) of one session.

NameRequiredDescriptionDefault
lastNoHow many recent messages
session_idYesSession id, e.g. session-…

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It usefully discloses content scope ('visible' conversation, includes tool names) without auth, error, or truncation behavior beyond the word 'recent'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no redundant clauses; the resource and its contents are stated immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-risk read tool with no annotations and no output schema, the description adequately conveys the shape of the return (prompts, replies, tool names) and the recency scoping. Only error/empty-session behavior is left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented. The description's 'recent' aligns with the `last` default but adds no format, ordering, or edge-case semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (read) and resource (recent visible conversation of one session), with the returned content enumerated (user prompts, assistant replies, tool names). It is clearly not the same as dsh_list_sessions or dsh_session_activity, but it never explicitly contrasts itself with those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use statement, no mention of alternatives such as dsh_session_activity or dsh_status, and no preconditions (e.g., must the session exist or be active). The agent must infer the use case from the word 'conversation' alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dsh_rename_sessionC

Rename a DeepSeek Harness session (shown in the sidebar).

NameRequiredDescriptionDefault
titleYesNew title
session_idYesSession id

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden and does not meet it. 'Rename' implies mutation, but nothing is said about required permissions, whether the change is reversible, whether the title must be unique or length-limited, or whether an in-flight session can be renamed. The only added context is that the title appears in the sidebar.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with the verb and resource first and a short clarifying parenthetical. Nothing is wasted, though the sidebar note is the only non-obvious content in an otherwise terse line.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, fully documented rename with no output schema and no annotations, the description is minimally sufficient to call the tool. It stops short of stating the mutation's side effects or constraints, which are the remaining gaps an agent would want covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with two documented parameters ('New title', 'Session id'), so the schema already does the heavy lifting. The description adds no format, length, or constraint detail beyond what the schema states, which lands at the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Rename) and resource (session), and the parenthetical clarifies which session surface is affected. It implicitly distinguishes itself from the sibling dsh_rename_workspace by naming 'session' rather than 'workspace', though it never calls that distinction out explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus alternatives, no prerequisites (does the session need to exist, be idle, be owned by the caller?), and no mention of the sibling dsh_rename_workspace which is the obvious near-miss for an agent choosing a rename tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dsh_rename_workspaceA

Rename a DeepSeek Harness workspace (sidebar title only; the folder is not moved). Identify it by workspace_id or path.

NameRequiredDescriptionDefault
pathNoWorkspace folder
titleYesNew title
workspace_idNoWorkspace id

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose the highest-risk behavioral fact: this changes only the sidebar title and does not move the folder. It omits other traits an agent might want, such as permission requirements, idempotency, or what happens when the identifier does not resolve.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with a clarifying parenthetical; every clause earns its place and nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema is needed for a rename, and the schema fully documents the arguments, so the description covers what is required to call it correctly. The one unresolved point is how the workspace is identified when only 'title' is marked required, which neither the schema nor the description clarifies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The sentence 'Identify it by workspace_id or path' restates the identifier parameters rather than adding format, constraint, or precedence rules (e.g. which wins if both are supplied).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ('Rename a DeepSeek Harness workspace') with an immediate scope qualifier ('sidebar title only; the folder is not moved'). The workspace vs. session distinction is implicit in the name, so an agent can separate it from the sibling dsh_rename_session.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical exclusion ('the folder is not moved') sets a clear expectation boundary, and 'Identify it by workspace_id or path' tells the agent how to target the tool. It does not, however, name an alternative tool or state prerequisites, so it stops short of full when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dsh_sendA

Send a message to DeepSeek Harness. With session_id it continues that existing session (same context, no new session); with cwd or workspace_id it starts a new session there (a cwd that is not a workspace yet is registered in the sidebar first). Returns immediately with a run_id; the turn runs in the background. If the session is already working, mode followup (default) queues the message after the current turn and steer adds it to the running turn; each message gets its own run_id. The message is delivered verbatim as a user message, with no prefix or label added: write it in the language the user works in, self-contained (Harness does not see this conversation), and say who is asking only if it matters. Then wait for the reply with dsh_wait (or the wait_command it returns, where offered).

NameRequiredDescriptionDefault
cwdNoWorkspace folder for a new session
modeNofollowup queues after the current turn (default); steer injects into a running turnfollowup
messageYesThe task or reply to send
session_idNoExisting session to continue
workspace_idNoHarness workspace for a new session (from dsh_list_workspaces)

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and largely succeeds: it discloses the async return (run_id), that the turn runs in the background, the queue-vs-inject semantics, per-message run_ids, and the side effect that a non-workspace cwd is registered in the sidebar first. It omits error/permission behavior (e.g. invalid session_id) and any auth requirements, which is the only gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the session-vs-new distinction are front-loaded, then behavior and the next-step handoff. It is dense and somewhat long, but nearly every clause carries actionable information (verbatim delivery, language guidance, run_id-per-message). Minor tightening possible in the message-authoring advice.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex async dispatch tool with no output schema and no annotations, the description covers what an agent needs: what is returned (run_id), that the turn is backgrounded, how to retrieve the reply (dsh_wait or wait_command), mode selection, and the cwd side effect. Nothing essential to calling it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by explaining the role split between session_id (continue) and cwd/workspace_id (new session), including that cwd auto-registers a workspace. The mode/default semantics are largely duplicated from the schema's own descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Send a message to DeepSeek Harness') and immediately disambiguates the two entry modes: continue an existing session via session_id vs. start a new one via cwd/workspace_id. An agent can distinguish this from siblings like dsh_wait or dsh_list_sessions without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use which parameter (session_id vs cwd/workspace_id), when to use mode followup vs steer based on whether a session is already working, and names the follow-up tool ('wait for the reply with dsh_wait'). Routing to the next step in the workflow is spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dsh_session_activityA

What a session is doing right now: its running turn, sub-agents (any depth), background jobs and reminders, plus runs handed over through dsh-baton. Check this before sending to a session that might be busy.

NameRequiredDescriptionDefault
session_idYesSession id

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden. It discloses the tool's scope (any-depth sub-agents, jobs, reminders, baton runs), which is useful and non-obvious, but says nothing about whether it is read-only, whether it blocks, how it behaves for an idle or unknown session, or what an error looks like. Adequate but incomplete for a tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, and the content enumeration is front-loaded ahead of the usage trigger. Every clause adds a distinct fact about coverage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema and no annotations, so the description is the only source of return-value information — and it does list the categories returned. For a single-parameter read tool that is close to sufficient; only the idle/error case and the read-only guarantee are unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

One parameter with 100% schema description coverage, so the schema already documents session_id. The description adds no format, scope, or id-resolution detail beyond it. Baseline 3 applies when the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (a session) and enumerates exactly what it reports: running turn, sub-agents at any depth, background jobs, reminders, and baton-handover runs. This is far more concrete than a generic 'get session status', though it never explicitly contrasts itself with the nearby siblings dsh_status or dsh_read_session, leaving the boundary to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear trigger condition: 'Check this before sending to a session that might be busy.' That tells the agent when to reach for it. It stops short of naming alternatives (dsh_status, dsh_wait) or stating when this is the wrong tool, so it is context without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dsh_statusA

Progress of a run: state (queued/running/waiting/completed/failed/cancelled, or interrupted when a Harness restart cut it short), session_id, recent events (text, tool calls), final reply, waiting_on when the turn is over but sub-agents or background jobs are still working, and human_interjections when someone typed in the Harness UI during the run (its result then reflects that input too). A one-off look, never a way to wait: to wait for the reply use dsh_wait, and if dsh_wait timed out, call dsh_wait again.

NameRequiredDescriptionDefault
tailNoHow many recent events
run_idYesRun id from dsh_send

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden and largely meets it: it discloses the non-blocking, one-off nature ('never a way to wait'), explains the non-obvious 'interrupted' state (Harness restart cut it short), and clarifies that human_interjections mean the result reflects that typed input. It does not mention permissions, rate limits, or whether the run is mutated in any way, which keeps it out of 5 territory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The tool's purpose is front-loaded in the opening phrase, and the routing advice is placed last where it belongs. However, the middle is one very long run-on sentence with a heavy parenthetical dump of states and fields, which taxes readability even though most clauses carry real information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must describe the return shape itself, and it does so comprehensively: state values, session_id, recent events, final reply, waiting_on, and human_interjections. Combined with the sibling routing, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (run_id, tail) are already documented by the schema, establishing the 3 baseline. The description alludes to 'recent events' without adding format or range guidance for tail, so it adds little beyond the schema here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource and verb-equivalent ('Progress of a run') and then enumerates exactly what a caller receives: state, session_id, events, final reply, waiting_on, human_interjections. It also names the sibling it is not (dsh_wait), so an agent can distinguish it from the other run-related tools without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit when-not ('A one-off look, never a way to wait') and routes to the correct alternative ('to wait for the reply use dsh_wait'), including the retry case ('if dsh_wait timed out, call dsh_wait again'). This is exactly the when/when-not/alternative guidance the dimension asks for.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dsh_waitA

Wait for a run to finish and return its final status and reply. Prefer the background wait_command from dsh_send when your client can run background shell commands and wake you when they exit: it costs no turns while waiting. Each call waits up to 50 s (set by the server to stay under this client's tool timeout); if the run is still going it returns timed_out: true with just the state: then call dsh_wait again with the same run_id, without summarising progress. Sends progress notifications while waiting when the client asks for them.

NameRequiredDescriptionDefault
run_idYesRun id from dsh_send

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden and does so well: it discloses the 50 s server-imposed wait cap and why it exists (to stay under the client's tool timeout), the exact partial-failure shape (timed_out: true with only the state field), the retry contract, the no-progress-summary expectation, and that progress notifications are emitted only when the client requests them. These are operational traits an agent cannot get from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and return value, then layered with the alternative-mechanism advice and the timeout/retry contract; every sentence carries information. It is somewhat dense with parenthetical asides, which slightly costs readability, but there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description covers the return contract itself ('final status and reply', plus the timed_out variant), the timeout and retry behavior, and the interaction with the sibling dsh_send. Nothing an agent needs to call this correctly and interpret the result is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 100% schema description coverage ('Run id from dsh_send'), so the schema already does the heavy lifting. The description adds one useful nuance beyond it: the same run_id is reused across repeated calls in the timed_out retry loop, which tells the agent the id is stable across invocations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Wait for a run to finish') plus the return payload ('final status and reply'), which is exactly what an agent needs to decide between this and siblings like dsh_status or dsh_list_runs. It also explicitly names the competing mechanism (background wait_command in dsh_send), so it is distinguishable without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit preference rule with its precondition: use dsh_send's background wait_command 'when your client can run background shell commands and wake you when they exit', because it costs no turns. It also states the follow-up protocol for the timed_out case (call dsh_wait again with the same run_id, without summarising progress), which is when-to-use guidance for the retry path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv0.5.4
    • First observeddsh_cancel
    • First observeddsh_create_workspace
    • First observeddsh_list_runs
    • First observeddsh_list_sessions
    • First observeddsh_list_workspaces
    • First observeddsh_read_session
    • First observeddsh_rename_session
    • First observeddsh_rename_workspace
    • First observeddsh_send
    • First observeddsh_session_activity
    • First observeddsh_status
    • First observeddsh_wait

TDQS

A3.8/5.0

Scored across 12 tools

Disambiguation4/5

Most tools target clearly distinct resources and actions (list/create/rename workspace vs session, send, cancel). The trio dsh_status, dsh_wait, and dsh_session_activity all report run state and could be confused, but the descriptions explicitly carve out roles (one-off look, blocking wait, pre-send busy check).

Naming Consistency5/5

Every tool uses the uniform dsh_ prefix with snake_case and a predictable verb_noun shape (list_workspaces, create_workspace, rename_session, list_runs). The few bare verbs (send, status, wait, cancel) still fit the same convention.

Tool Count5/5

12 tools is well within the sweet spot for a session/workspace orchestration server. Each tool maps to a distinct operation (list/read/create/rename across sessions and workspaces, plus run lifecycle and control) with no obvious redundancy.

Completeness4/5

The surface covers the core lifecycle: register/rename/list workspaces, list/read/rename sessions, send/status/wait/cancel runs, and run handover listing. The notable gap is deletion/archival for workspaces and sessions, and there is no direct way to fetch a handed-over run's details beyond dsh_status.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Exposes DeepSeek Harness agent capabilities as an MCP server, letting any MCP client drive Harness to execute real coding tasks with structured results, context isolation, and parallel execution.
    62 npm
    13
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Lets any MCP-capable coding harness (Cursor, Claude Code, Codex, Gemini CLI, VS Code/Copilot, opencode, and others) hand a self-contained task to a real, isolated DeepSeek Harness process that works in a chosen workspace with its own context window, model, and toolchain, then returns the final answer. Exposes task submission with time estimates and acceptance criteria, status polling with live progress and process-tree telemetry, graceful cancel and forced kill of whole process trees, and a health probe reporting concurrency, deadlines, and recent jobs.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables any MCP-capable client (Claude Code, Cursor, VS Code, and others) to deliver messages into a local DeepSeek Harness over stdio or Streamable HTTP. It also exposes a pull-based task queue so producers can publish work that clients claim, complete, or list.
    MIT