deepseek-subagent-mcp
deepseek-subagent-mcp
Gibt Claude Code, Codex oder einem anderen MCP-Client einen DeepSeek Harness-Agenten, an den es Aufgaben delegieren kann – so, wie es an einen seiner eigenen Subagenten delegieren würde.
MCP (Model Context Protocol) ist der Standard, mit dem ein Coding-Agent externe Werkzeuge lädt. DeepSeek Harness ist DeepSeeks quelloffene Agenten-Laufzeitumgebung – ein Modell in einer Schleife mit Datei- und Shell-Werkzeugen, veröffentlicht im August 2026 unter MIT. Dieser Server sitzt dazwischen: Er führt einen Harness-Agenten in einem separaten Prozess aus und stellt sechs Werkzeuge zum Starten, Beobachten, Fortsetzen und Stoppen bereit.
Der untergeordnete Agent hat seinen eigenen Kontextbereich. Das ist der Sinn – du übergibst ihm eine in sich abgeschlossene Aufgabe, er verbraucht seine eigenen Tokens, während er sich durch die Dateien arbeitet, und du erhältst ein Ergebnis statt eines Transkripts.
Voraussetzungen
Python 3.11 oder neuer
Ein DeepSeek-API-Schlüssel von platform.deepseek.com
macOS 14+ auf Apple Silicon, oder Linux auf x86-64 oder arm64
Keine Node.js-Installation nötig: Die Harness-Laufzeitumgebung wird als eigenständige ausführbare Datei im deepseek-harness-sdk-Wheel mitgeliefert. Dieses Wheel ist auch die Plattformbegrenzung – es veröffentlicht macosx_14_0_arm64, manylinux_2_28_x86_64 und manylinux_2_28_aarch64 und sonst nichts. Windows, Intel-Macs und macOS 13 können dies daher gar nicht installieren.
Related MCP server: dsh-crew
Installation
uvx --from git+https://github.com/gaztrabisme/deepseek-subagent-mcp deepseek-subagent-mcpClaude Code
Füge in .mcp.json in deinem Projekt oder in ~/.claude.json für alle Projekte hinzu:
{
"mcpServers": {
"deepseek-subagent": {
"command": "uvx",
"args": [
"--from", "git+https://github.com/gaztrabisme/deepseek-subagent-mcp",
"deepseek-subagent-mcp"
],
"env": {
"DEEPSEEK_API_KEY": "sk-...",
"DSA_WORKSPACE": "/path/to/your/project"
}
}
}
}Codex
Füge in ~/.codex/config.toml hinzu:
[mcp_servers.deepseek-subagent]
command = "uvx"
args = ["--from", "git+https://github.com/gaztrabisme/deepseek-subagent-mcp", "deepseek-subagent-mcp"]
env = { DEEPSEEK_API_KEY = "sk-...", DSA_WORKSPACE = "/path/to/your/project" }Werkzeuge
Werkzeug | Was es tut |
| Startet einen neuen Subagenten für eine Aufgabe. Gibt sofort eine |
| Blockiert, bis ein Durchlauf beendet ist; gibt das Ergebnis zurück. |
| Sendet Folgearbeiten an einen bestehenden Agenten in seiner ursprünglichen Sitzung. |
| Alle Agenten, die dieser Server besitzt, mit Status, Kosten und Verlauf. |
| Stoppt einen Agenten und gibt seinen Prozess frei. |
| Was ein Agent tatsächlich getan hat – Werkzeugaufrufe, Nachrichten, Rundenenden und die rohe Antwort. |
Durchläufe sind standardmäßig asynchron, weil eine Codieraufgabe viele Minuten dauern kann und MCP-Clients einzelne Werkzeugaufrufe mit einem Timeout belegen. dsh_delegate kehrt zurück, sobald die Arbeit in die Warteschlange gestellt ist; dsh_await übernimmt das Warten und meldet dabei Fortschritte. Für kurze Aufgaben übergib wait_seconds an dsh_delegate und überspringe den zweiten Aufruf.
Jeder dsh_delegate-Aufruf erzeugt einen Agenten, der einen Laufzeitprozess und eine persistierte Sitzung hält. dsh_continue tritt wieder in diese Sitzung ein, sodass der untergeordnete Agent seine früheren Runden noch im Kontext hat.
Jede Delegation legt fest, wie sie geprüft wird
dsh_delegate erfordert ein verification-Argument: den Befehl, der beweist, dass die Aufgabe erledigt ist.
dsh_delegate(task="Fix the failing date parser", verification="pytest -q tests/test_dates.py")Der Server führt diesen Befehl selbst aus, im Arbeitsbereich des Agenten, nachdem der untergeordnete Agent fertig ist. Ein untergeordneter Agent, der seine eigenen Testergebnisse meldet, ist eine Behauptung; ein Exit-Code ist eine Tatsache, und Agenten, die vorzeitig den Sieg erklären, sind ein gut dokumentiertes Fehlermuster.
Ergebnis | Status |
Befehl beendet mit 0 |
|
Befehl schlägt fehl, hat Timeout oder wurde nie angegeben |
|
Der Befehl wird durch dieselbe Richtlinie klassifiziert, die auch die eigenen Aufrufe des untergeordneten Agenten vor der Ausführung regelt – der Aufrufer ist ein anderer Agent und kann durch Prompt-Injection manipuliert sein, daher ist "der Aufrufer hat danach gefragt" keine Autorisierung. Übergib verification="true", wenn es wirklich nichts zu prüfen gibt; eine explizite Lüge ist besser als eine stille Voreinstellung.
Was zurückkommt
Ein Subagent, der sein vollständiges Transkript zurückgibt, hat seinen eigenen Zweck verfehlt. Wenn die Antwort des untergeordneten Agenten größer ist als DSA_SUMMARY_TOKENS, wird er – in derselben Sitzung, als eine weitere Runde – gebeten, sie durch eine Übergabezusammenfassung in sieben Abschnitten zu ersetzen: Ziel, Einschränkungen & Präferenzen, Fortschritt, Wichtige Entscheidungen, Nächste Schritte, Relevante Dateien, Kritischer Kontext. Das ist es, was die MCP-Grenze überschreitet.
Eine Antwort, die bereits unter dem Limit liegt, wird wörtlich zurückgegeben und kostet keine zusätzliche Runde. Die rohe Antwort wird immer aufbewahrt: dsh_transcript(run_id, raw=True).
Überwachte Ausführung
Die Werkzeugaufrufe des untergeordneten Agenten werden vor ihrer Ausführung kontrolliert. Ein PreToolUse-Hook in der Laufzeitumgebung übergibt jeden vorgeschlagenen Aufruf an diesen Server, der mit Erlauben oder Verweigern antwortet; ein abgelehnter Aufruf kommt als blockiertes Werkzeugergebnis mit dem Grund zurück zum Modell, und das Modell passt sich an.
Ein deterministischer Klassifizierer entscheidet zuerst, und er entscheidet die meisten Aufrufe. Lesen von Dateien, ls, grep, Versionskontroll-Lesevorgänge, Ausführen des eigenen Codes und der Tests des Arbeitsbereichs sind ohne Modelleinbindung erlaubt. Privilegierte Befehle, Löschungen außerhalb des Arbeitsbereichs, Fetch-Piped-in-eine-Shell und alles, was SSH-Schlüssel oder .env-Dateien betrifft, werden grundsätzlich abgelehnt – auch durch ein harmlos aussehendes Verb, weil cat ~/.ssh/id_rsa ein schreibgeschütztes Werkzeug ist, das auf ein Geheimnis angewendet wird. Nur was der Klassifizierer nicht klassifizieren kann, eskaliert.
Die Eskalation läuft auf der besten Stufe, die der Client unterstützt, ermittelt beim Start und gemeldet von dsh_list:
Stufe | Wer entscheidet | Erfordert |
| ein von dir konfigurierter Prüfprozess |
|
| das Modell des MCP-Clients | Client bewirbt |
| du, in deinem Client | Client bewirbt |
| niemand – Eskalation lehnt ab | immer verfügbar |
Unbeaufsichtigt laufen lassen. Claude Code bewirbt elicitation und nicht sampling, daher unterbricht jede Eskalation standardmäßig eine Person – falsch für einen Agenten, der arbeiten soll, während du etwas anderes tust. DSA_SUPERVISOR=agent setzt stattdessen einen lokalen Prüfer auf diesen Platz:
DSA_SUPERVISOR=agent # nothing prompts a human
DSA_SUPERVISOR_CMD="claude -p --model sonnet" # any CLI reading a prompt on stdinDer Prüfer erhält dieselben strukturierten Fakten und antwortet mit ALLOW oder DENY in seiner ersten Zeile. Alles andere wird als DENY gewertet. Das kostet einen Unterprozess und etwa acht Sekunden pro Eskalation und verbraucht Tokens von dem Konto, mit dem das CLI angemeldet ist.
Ein Prüfer ist ein Urteil, keine Grenze. Bei cp note.txt $TMPDIR/copy.txt, wobei die Fakten korrekt melden, dass das Ziel nicht aufgelöst werden kann, argumentierte ein Claude-Prüfer, dass $TMPDIR "derselbe OS-temporäre Stamm ist, unter dem der Arbeitsbereich liegt", und erlaubte es. Der Schreibvorgang landete außerhalb des Arbeitsbereichs. Diese Art von Aufruf wird jetzt per Regel abgelehnt, bevor ein Prüfer ihn sieht – das ist die richtige Arbeitsteilung: Regeln halten die Grenze, der Prüfer behandelt den Graubereich innerhalb dieser Grenze.
Jede Stufe fällt geschlossen aus. Ein unerreichbarer Supervisor, ein Timeout, eine fehlerhafte Anfrage oder ein Client, der keine der beiden Fähigkeiten unterstützt, erzeugen eine Ablehnung, niemals eine Zustimmung.
Die Leiter wird durchlaufen, nicht einmal ausgewählt: Eine Stufe, die fehlschlägt, fällt zur nächsten durch, sodass ein Client, der Sampling fallen lässt – in der Spezifikationsrevision vom 28.07.2026 als veraltet markiert, funktioniert heute noch – zu dir zurückfällt, anstatt alles zu verweigern. Eine Stufe, die timeoutet, fällt nicht durch; eine unbeantwortete Frage ist ein Nein, und eine erneute Frage auf einem anderen Kanal würde nur die Wartezeit verdoppeln.
Setze DSA_SUPERVISOR=off, um die Kontrolle vollständig zu deaktivieren.
Was dem Supervisor angezeigt wird, sind strukturierte Fakten, niemals die Prosa des untergeordneten Agenten: das Werkzeug, die Programme in jedem Pipeline-Segment und jeder Pfad, den der Befehl benennt, mit einem Flag für innerhalb oder außerhalb des Arbeitsbereichs. Der untergeordnete Agent schreibt sowohl den Befehl als auch etwaige Begründungen dafür, und ein untergeordneter Agent, der seinen eigenen Fall argumentieren kann, wird das tun. Ein Pfad, der nicht statisch aufgelöst werden kann – $TMPDIR/out.txt – wird als unaufgelöst gemeldet, nicht geraten, und gilt als außerhalb.
examples/claude_supervisor.py führt das ganze Muster gegen einen echten Claude aus, für Clients, die selbst kein sampling anbieten:
DEEPSEEK_API_KEY=sk-... uv run python examples/claude_supervisor.pyObergrenzen und Kosten
Ein delegierter Agent gibt dein Geld in einer Schleife aus, daher begrenzen ihn vier unabhängige Obergrenzen, und jeder Durchlauf meldet, was er verbraucht hat.
Obergrenze | Einstellung | Durchgesetzt von |
Echtzeit pro Durchlauf |
| Töten der Laufzeit |
Gesamte Tokens pro Durchlauf |
| Töten der Laufzeit |
Modellaufrufe pro Durchlauf |
| Töten der Laufzeit |
Identische wiederholte Werkzeugaufrufe |
| Töten der Laufzeit |
Es gibt keinen Abbruch mitten in einer Runde über die Leitung, daher ist jeder Stopp ein Prozesskill. Ein Kill wegen einer Obergrenze hat immer Vorrang vor dem, was der Durchlauf selbst gemeldet hat: Die Ausgabe eines getöteten Prozesses wird niemals als Erfolg gelesen.
dsh_delegate, dsh_await und dsh_list melden alle die Token-Nutzung – Input, Output, Cache-Reads und -Writes sowie die Anzahl der Schritte – summiert aus dem, was der Anbieter gemeldet hat. Pro-Schritt-Input wird bewusst summiert: Jede Anfrage berechnet das gesamte erneut gesendete Präfix, daher ist die Summe das, was die Delegation tatsächlich gekostet hat.
Spuren und was damit zu tun ist
Jede Delegation hinterlässt zwei Aufzeichnungen.
Die Laufzeit des untergeordneten Agenten schreibt ihr eigenes dauerhaftes Log – jeden Werkzeugaufruf mit Argumenten, jeden Hook-Aufruf mit Exit-Code, Dauer und Urteilstext, Token-Nutzung pro Schritt – unter <session root>/<workspace>/<session>/session.jsonl.zstd.
Dieser Server fügt seine eigene Seite zu <session root>/trace.jsonl hinzu: jedes Urteil mit Stufe, Latenz und den Fakten, die dem Supervisor gezeigt wurden, jeder abgeschlossene Durchlauf mit seinem Verifikationsergebnis und seiner Nutzung, und das Verhältnis von Zeichen zu Token, das jede Verdichtungsrunde tatsächlich erzeugt hat. Längen, niemals der Text – die Spur dient dem Messen, nicht dem Aufbewahren einer Kopie deines Quellcodes. Setze DSA_TRACE, um sie zu verschieben, oder DSA_TRACE=off, um sie zu deaktivieren.
uv run python scripts/trace_report.py # reads .dsh-sessions/trace.jsonlDer Bericht beantwortet die Fragen, bei denen die Standardwerte geschätzt wurden: Wie oft der Klassifizierer eskaliert und bei welchen Aufrufen, ob DSA_CHARS_PER_TOKEN mit der Beobachtung übereinstimmt und wo DSA_MAX_STEPS und DSA_TURN_TOKEN_BUDGET im Vergleich zur tatsächlichen Nutzung liegen. Sein erster Durchlauf in diesem Projekt fand heraus, dass pwd && ls an ein Modell eskaliert wurde – elf Sekunden und ein Modellaufruf, um zu erfahren, was die schreibgeschützte Liste bereits wusste – was jetzt durch eine Richtlinie in einer Drittelmillisekunde geregelt ist.
Konfiguration
Jede Einstellung ist eine Umgebungsvariable auf dem Serverprozess.
Variable | Default | Bedeutung |
| — | Erforderlich. Wird an die untergeordnete Laufzeitumgebung weitergegeben. |
| Öffentliche API von DeepSeek | Auf einen Proxy oder einen selbst gehosteten Endpunkt verweisen. |
|
| Modell-ID für delegierte Arbeit. |
| Arbeitsverzeichnis des Servers | Verzeichnis, das das Kind liest und schreibt. |
|
| Gleichzeitig erlaubte Live-Agents. Jeder hält einen Prozess. |
|
| Wo Sitzungsprotokolle geschrieben werden. |
| Standard des Anbieters | Obergrenze für die Ausgabe pro Anfrage für das Kind. |
| nicht gesetzt | Gesamtzahl der Tokens, die ein Durchlauf verbrauchen darf, bevor er abgebrochen wird. |
|
| Maximale Anzahl von Modellaufrufen pro Durchlauf, bevor er beendet wird. |
|
| Identische Tool-Aufrufe, bevor der Durchlauf als außer Kontrolle beendet wird. |
|
| Sekunden, bevor ein Durchlauf beendet und als fehlgeschlagen gemeldet wird. |
|
| Sekunden, bevor ein inaktiver Agent freigegeben und entfernt wird. |
|
| Abgeschlossene Durchläufe bleiben lesbar, nachdem ihr Agent freigegeben wurde. |
|
| Ergebnisgröße, ab der das Kind gebeten wird, eine Zusammenfassung zu erstellen. |
|
| Umrechnung für diese Obergrenze. Gemessen bei 3.54 für diese Arbeitslast. |
|
| Sekunden, die der Verifizierungsbefehl laufen darf, begrenzt durch die verbleibende Frist des Durchlaufs. |
|
|
|
|
| Prüfer für |
|
| Sekunden, die auf ein Urteil gewartet wird, bevor eine Ablehnung erfolgt. |
|
|
|
|
|
|
|
| Das Arbeitsbudget für die Kompaktierung wird daran gemessen. |
|
| Begrenzung auf Ausführungsebene für einen einzelnen Bash-Aufruf. |
| keine | Sekunden, die auf eine Laufzeitanfrage gewartet werden. |
|
| Anzahl der Aktivitätszeilen, die pro Durchlauf aufbewahrt werden. |
|
| Server-Protokollebene. Schreibt nur nach stderr. |
|
| Entscheidungs- und Durchlaufverfolgung. |
| die gebündelte Komposition | Ein Pfad oder |
|
| Vom Kompositionssystem registrierte Anbieterroute. |
Grenzen, die Sie vor der Nutzung kennen sollten
Diese ergeben sich aus dem Drahtprotokoll des Harness SDK, nicht aus Entscheidungen, die hier getroffen wurden.
Die Dateisystem-Sandbox deckt Bash nicht ab.
dsh-fs-sandboxschränkt diewrite/edit-Tools des Modells auf den Arbeitsbereich ein, aberdsh-bash-sandboxist nicht in der gebündelten Laufzeit ausführbar, sodass Bash selbst nicht eingeschränkt ist. Der Supervisor deckt dies ab – er bewacht jedes Tool, einschließlich Bash, vor der Ausführung. MitDSA_SUPERVISOR=offgibt es für Bash überhaupt keine Grenze; richten Sie es auf einen Zweig oder ein temporäres Verzeichnis.Die Sandbox beschränkt nur Dateieffekte – nicht Netzwerk, Prozesse oder Systemaufrufe. Und
workspace-writeerlaubt sowohl/tmpals auch das Arbeitsverzeichnis.Cancel tötet den Prozess. Es gibt keinen Abbruch innerhalb einer Runde über das Drahtprotokoll, daher beendet
dsh_canceldie Laufzeit. Bereits geschriebene Änderungen bleiben auf der Festplatte, und die Sitzung kann danach nicht fortgesetzt werden.Die Sitzung eines freigegebenen Agents ist weg, aber seine Ergebnisse sind es nicht. Nach
DSA_IDLE_TIMEOUTwird der Prozess freigegeben;dsh_awaitunddsh_transcriptfunktionieren weiterhin für seine abgeschlossenen Durchläufe,dsh_continuejedoch nicht.Sitzungen leben so lange wie der Prozess. Es gibt kein Schließen pro Sitzung, daher wächst der Speicher mit der Historie eines Agents. Brechen Sie Agents ab, mit denen Sie fertig sind.
Upstream ist eine Entwicklervorschau.
deepseek-harness-sdkist auf==0.1.0rc7festgelegt; innerhalb einer Woche wurden zwei Release Candidates veröffentlicht. Erwarten Sie, dass sich das Drahtprotokoll ändert.
Entwicklung
uv sync
uv run pytest # 153 tests, no API key, no network
uv run ruff check .
uv run deepseek-subagent-mcp # starts on stdio; a client drives itLive-Tests benötigen einen echten Schlüssel und verbrauchen Tokens; sie werden nicht von pytest erfasst:
DEEPSEEK_API_KEY=sk-... uv run python tests/smoke_task.py # the product works
DEEPSEEK_API_KEY=sk-... uv run python tests/smoke_result.py # distillation and the archive
DEEPSEEK_API_KEY=sk-... uv run python tests/smoke_supervisor.py # the gate works
DEEPSEEK_API_KEY=sk-... uv run python tests/smoke_escalation.py # both escalation tiers
DEEPSEEK_API_KEY=sk-... uv run python tests/smoke_limits.py # reaper and deadline
DEEPSEEK_API_KEY=sk-... uv run python tests/smoke_mcp.py # all six toolsCLAUDE.md enthält die Architektur und die Upstream-Einschränkungen; wiki/ enthält das Entscheidungsprotokoll und die gemessenen Daten.
Lizenz
MIT.
Available Tools
6 toolsdsh_awaitA
Wait for a run to finish and return its result.
Safe to call repeatedly. If the run is still going when wait_seconds elapses, this returns the current state rather than an error. Runs whose agent has since been reaped are still readable — their results are archived.
Args: run_id: The run to wait on, from dsh_delegate or dsh_continue. wait_seconds: Maximum time to block. Use a longer value for big tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | ||
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the transparency burden and does well by disclosing that repeated calls are safe, that timeout returns current state rather than error, and that archived results from reaped agents remain readable. These are non-obvious runtime behaviors that help the agent decide when and how to call the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly structured: one purpose sentence, then behavioral notes, then parameter explanations. Every sentence adds meaningful information without repetition or fluff. The format uses clear separation and remains easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the most important contextual aspects: repeatability, timeout behavior, run provenance, and archived result accessibility. Since an output schema is present, the description does not need to explain return values in depth. Minor gaps like error cases for unknown run_id are not critical for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description is the only source of parameter meaning. It adds useful semantics: run_id is tied to dsh_delegate/dsh_continue, and wait_seconds is 'Maximum time to block' with tuning guidance for large tasks. This largely compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific action: 'Wait for a run to finish and return its result.' It identifies the tool's resource (a delegated/continued run) and distinguishes it from siblings like dsh_list, dsh_cancel, and dsh_transcript by directly stating what this wait operation does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool, such as waiting on a run identified from dsh_delegate or dsh_continue, and gives practical guidance to use a longer wait_seconds for big tasks. It does not explicitly mention exclusions or alternatives, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dsh_cancelA
Stop a subagent and release its runtime process.
The harness protocol has no mid-turn cancel, so this kills the child process. Any in-flight run is reported as cancelled, and file edits it already made stay on disk. Cancelling ends the session: its context cannot be resumed, so start a new agent rather than continuing this one.
Args: agent_id: Agent to stop.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it excels. It discloses the side effects: 'kills the child process,' 'in-flight run is reported as cancelled,' 'file edits it already made stay on disk,' and the session becomes non-resumable. This level of detail about runtime and session consequences is exemplary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-organized, leading with the core action, followed by necessary behavioral caveats. Every sentence contributes meaningful information without redundancy. The Args section is minimal and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a single parameter, no nested objects, and an existing output schema, the description covers all essential aspects: what it does, side effects, and parameter purpose. It could optionally mention expected return behavior or error handling, but those are likely captured by the output schema and are not critical for this simple cancellation operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides zero description for 'agent_id' (coverage 0%), so the description must compensate. It does offer 'agent_id: Agent to stop,' which accurately identifies the parameter's purpose. However, it adds minimal detail beyond the parameter name and does not mention expected format, validation rules, or how to obtain a valid agent_id. It is functional but not enriching.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Stop a subagent and release its runtime process.' It clearly differentiates from sibling tools like dsh_list, dsh_await, or dsh_continue by focusing on termination and process cleanup. The scope is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the critical usage constraint: 'The harness protocol has no mid-turn cancel, so this kills the child process' and warns that 'Cancelling ends the session: its context cannot be resumed.' This provides clear context for when to use the tool, though it does not explicitly name alternative tools or state when not to use it beyond the session-ending implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dsh_continueA
Send follow-up work to an existing subagent, in its original session.
The child keeps the full context of its earlier turns, so refer to prior work directly ("the migration you just wrote"). Work is queued: if the agent is mid-run, this message runs after it.
Args: agent_id: Agent to continue, from dsh_delegate or dsh_list. message: The follow-up instruction. verification: Command proving this follow-up is done. Omit to skip verification for this turn; the run then reports completed_unverified. wait_seconds: Block up to this long for the run to finish. 0 returns at once.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| agent_id | Yes | ||
| verification | No | ||
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the burden of behavioral disclosure. It explains queuing behavior, the preservation of context, the optional verification parameter with its consequence (completed_unverified), and the wait_seconds blocking behavior. This adequately covers the tool's operational nuances, though it does not mention potential error conditions or authorization requirements, which are not critical for a follow-up tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient and well-structured. It opens with a one-sentence purpose, follows with a brief contextual note about queuing and context preservation, and then presents a clean, labeled Args list. Every sentence adds value; there is no fluff or repetition. The front-loaded purpose ensures agents quickly identify applicability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (4 parameters, optional verification, wait semantics), the description is complete. It covers the intended use case, operational behavior, and parameter meanings. Since an output schema exists, the description does not need to explain return values. It also implicitly addresses prerequisites by referencing dsh_delegate/dsh_list for obtaining agent IDs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite a schema description coverage of 0% (i.e., the schema provides no textual descriptions), the description includes an 'Args' section that explains each of the four parameters: agent_id (identifies the target agent), message (the follow-up instruction), verification (optional command to prove completion), and wait_seconds (blocking duration). This adds rich meaning beyond the schema's bare types and defaults, fully compensating for the schema's lack of documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a clear, specific verb-resource combination: 'Send follow-up work to an existing subagent, in its original session.' This explicitly distinguishes it from sibling tools like dsh_delegate (which presumably creates a new agent) and dsh_await (which waits on runs). The phrasing is precise and immediately conveys the tool's core function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context by explaining that work is queued if the agent is mid-run and that the agent retains full context, enabling direct references to prior work. It also directs users to obtain agent IDs from dsh_delegate or dsh_list, indicating alternatives. However, it does not explicitly state when not to use this tool, such as when a fresh context is needed, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dsh_delegateA
Start a new DeepSeek Harness subagent on a task.
Returns immediately with an agent_id and run_id unless wait_seconds is set. Each call creates a fresh agent with its own runtime process and session; use dsh_continue to give more work to an agent that already exists.
Args: task: What to do, with a clear definition of done. The child cannot ask you clarifying questions, so state the acceptance criteria. verification: The shell command that proves the task is done, run by this server in the workspace after the child finishes — e.g. "pytest -q" or "npm test && npm run lint". Its exit code decides whether the run is reported completed or completed_unverified. Pass "true" if there is genuinely nothing to check. workspace: Directory the child reads and writes. Relative paths resolve against the server's configured workspace. Defaults to that workspace. instructions: Optional standing guidance prepended to the task, e.g. coding conventions or files to leave alone. model: DeepSeek model id. Defaults to the server's configured model. name: Human label for this agent, shown in dsh_list. wait_seconds: Block up to this long for the run to finish. 0 returns at once.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| task | Yes | ||
| model | No | ||
| workspace | No | ||
| instructions | No | ||
| verification | Yes | ||
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully discloses behavior: creates a fresh agent per call, returns immediately unless wait_seconds, child cannot ask clarifying questions (must include acceptance criteria), verification exit code decides unverified vs completed, workspace resolution, and defaults. This is thorough behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a lead paragraph stating purpose and key behavior (fresh process, immediate return), then a clean Args section with one line per parameter. Each sentence adds value; no fluff. Front-loads the most important behavioral facts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers every parameter with meaning, explains control flow (wait_seconds), explains the verification command's role in determining completion status, and mentions the sibling tool dsh_continue. It is complete enough for an agent to correctly invoke this tool without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has no descriptions (0% coverage). The description compensates fully: it explains task (with acceptance criteria and inability to clarify), verification (shell command, exit code semantics), workspace (relative paths, default), instructions (prepended standing guidance), model (default), name (human label), and wait_seconds (blocking behavior). Every parameter is given meaningful semantics beyond the schema's type-only definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (start) and resource (a new DeepSeek Harness subagent), explains the immediate-return behavior, and explicitly distinguishes this from 'dsh_continue' for giving more work to existing agents. This effectively differentiates it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: states when to use dsh_continue for existing agents, explains the wait_seconds behavior, and describes the verification command's role in determining run status. This clearly orients the agent on when to invoke this vs. alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dsh_listA
List every subagent this server owns, with its state, cost, and run history.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not explicitly state whether the operation is read-only, what side effects it might have, or any access requirements. It only lists what it returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that efficiently conveys the tool's purpose and output without any fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description mentions the output attributes (state, cost, run history) and scope ('this server owns'), but does not discuss pagination, ordering, or other response details. Given an output schema is present, this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, and the description correctly omits any parameter details. With zero parameters, this is a baseline score of 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (List) and the resource (subagents) with specific attributes (state, cost, run history), making it distinct from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It is implied that this tool is for listing subagents, but there is no explicit guidance on when to use it versus alternatives like dsh_transcript or others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dsh_transcriptA
Show what a subagent actually did during a run.
Returns the tail of its activity log — tool calls, assistant messages, turn endings. Use this to check progress on a long run, or to understand a failure. Returns live data while the run is still going.
Args: run_id: The run to inspect. limit: How many of the most recent activity lines to return. raw: Also return the child's full uncapped response. dsh_delegate returns a distilled version when the answer is large; this is where the original text lives.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| limit | No | ||
| run_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the transparency burden. It explains that it returns the tail of the activity log, live data, and the effect of the 'raw' parameter. It implies read-only behavior by saying 'Show' and 'Returns', but doesn't explicitly state it has no side effects. This is adequate given the tool's nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear overview and parameter explanations. It is slightly verbose but each sentence adds value. It is not overly long relative to the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, typical use cases, return behavior, and parameter semantics. It doesn't explain output schema (not required), but it provides enough context for an agent to decide when and how to use it. The mention of dsh_delegate relationship adds completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explains each parameter beyond the schema: run_id (which run), limit (how many recent lines), and raw (full uncapped response). It also connects raw to dsh_delegate, adding context. Since schema coverage is 100%, the baseline is 3, but the extra semantic detail raises it to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Show what a subagent did during a run.' It specifies the content returned (tool calls, assistant messages, turn endings) and distinguishes it as a transcript tool for inspecting activity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage scenarios: 'Use this to check progress on a long run, or to understand a failure.' It also mentions live data during a run, but does not explicitly contrast with sibling tools like dsh_list or dsh_delegate, which would make the guidance stronger.
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.
6 tool updates
v0.2.0- First observed
dsh_await - First observed
dsh_cancel - First observed
dsh_continue - First observed
dsh_delegate - First observed
dsh_list - First observed
dsh_transcript
TDQS
Scored across 6 tools
Each tool targets a distinct lifecycle operation: list, delegate, await, continue, cancel, and transcript. There is no overlap in purpose, and the descriptions clearly delineate when to use each.
All tools use the 'dsh_' prefix with clear verb names (list, delegate, await, continue, cancel, transcript). The pattern is consistent, though 'dsh_transcript' is a noun rather than a verb, which is a minor deviation.
Six tools cover the full lifecycle of subagent management without redundancy. This is well-scoped for the server's purpose.
The surface covers the complete lifecycle: create (delegate), monitor (await, transcript), extend (continue), and terminate (cancel), plus listing. No obvious gaps exist for managing subagents.
Maintenance
Related MCP Connectors
AI-powered spec-to-task decomposition and execution orchestration for coding agents.
Hand tasks, bugs and finished work to AI coding agents, and get back a write-up with evidence.
- ParleyOAuthdev.weldra
Coordination hub for AI coding agents: message teammates, ask humans, audit every event.
Shared control plane for AI coding agents — tasks, memory, decisions, file locks. 12 tools.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables Claude Code to delegate tasks to OpenCode subagents asynchronously, with tools for starting tasks, polling status, and fetching results.775 npm3MIT
- AlicenseNot gradedqualityAmaintenanceEnables dispatching work to DeepSeek Harness agents from Claude Code/Codex, with native progress UI, tier policy, and vision/image generation through MCP tools.699 npm158MIT
- AlicenseAqualityBmaintenanceEnables Codex to delegate routine repository exploration, implementation, refactors, tests, and fixes to DeepSeek Harness in isolated Git worktrees, returning compact results and patches for review while keeping the main workspace protected.511 npmMIT
- AlicenseAqualityBmaintenanceEnables Codex and Claude Code to delegate implementation, research, debugging, and long-log work to DeepSeek Harness, then observe, continue, or cancel those sessions without leaving the primary workflow.151MIT