Skip to main content
Glama
gaztrabisme

deepseek-subagent-mcp

by gaztrabisme

deepseek-subagent-mcp

Permite que Claude Code, Codex o cualquier otro cliente MCP disponga de un agente DeepSeek Harness al que pueda delegar trabajo, de la misma forma que delegaría a uno de sus propios subagentes.

MCP (Model Context Protocol) es el estándar mediante el cual un agente de codificación carga herramientas externas. DeepSeek Harness es el runtime de agente de código abierto de DeepSeek — un modelo en bucle con herramientas de archivo y shell, publicado en agosto de 2026 bajo licencia MIT. Este servidor actúa como intermediario: ejecuta un agente Harness en un proceso separado y expone seis herramientas para iniciarlo, supervisarlo, continuarlo y detenerlo.

El agente hijo tiene su propia ventana de contexto. Ese es el objetivo: le asignas una tarea autocontenida, consume sus propios tokens trabajando con los archivos, y recibes un resultado en lugar de una transcripción.

Requisitos

  • Python 3.11 o superior

  • Una clave de API de DeepSeek de platform.deepseek.com

  • macOS 14+ en Apple Silicon, o Linux en x86-64 o arm64

No se necesita instalación de Node.js: el runtime Harness se distribuye como un ejecutable autocontenido dentro de la rueda deepseek-harness-sdk. Esa rueda también es el límite de plataforma — publica macosx_14_0_arm64, manylinux_2_28_x86_64 y manylinux_2_28_aarch64 y nada más, por lo que Windows, Mac con Intel y macOS 13 no pueden instalarlo en absoluto.

Related MCP server: dsh-crew

Instalación

uvx --from git+https://github.com/gaztrabisme/deepseek-subagent-mcp deepseek-subagent-mcp

Claude Code

Añade a .mcp.json en tu proyecto, o a ~/.claude.json para todos los proyectos:

{
  "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

Añade a ~/.codex/config.toml:

[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" }

Herramientas

Herramienta

Qué hace

dsh_delegate

Inicia un nuevo subagente para una tarea. Devuelve un agent_id y un run_id inmediatamente.

dsh_await

Bloquea hasta que una ejecución finalice; devuelve el resultado.

dsh_continue

Envía trabajo adicional a un agente existente, en su sesión original.

dsh_list

Todos los agentes que posee este servidor, con estado, costo e historial de ejecuciones.

dsh_cancel

Detiene un agente y libera su proceso.

dsh_transcript

Lo que realmente hizo un agente: llamadas a herramientas, mensajes, finales de turno y la respuesta sin procesar.

Las ejecuciones son asíncronas por defecto porque una tarea de codificación puede llevar muchos minutos y los clientes MCP agotan el tiempo de espera de las llamadas individuales a herramientas. dsh_delegate devuelve el resultado tan pronto como el trabajo está en cola; dsh_await realiza la espera e informa del progreso mientras lo hace. Para tareas cortas, pasa wait_seconds a dsh_delegate y omite la segunda llamada.

Cada dsh_delegate crea un agente, que mantiene un proceso de runtime y una sesión persistente. dsh_continue reingresa en esa sesión, por lo que el hijo aún tiene sus turnos anteriores en contexto.

Cada delegación indica cómo se verificará

dsh_delegate requiere un argumento verification: el comando que demuestra que la tarea está completa.

dsh_delegate(task="Fix the failing date parser", verification="pytest -q tests/test_dates.py")

El servidor ejecuta ese comando por sí mismo, en el espacio de trabajo del agente, después de que el hijo finalice. Que un hijo informe sus propios resultados de prueba es una afirmación; un código de salida es un hecho, y que los agentes declaren victoria prematuramente es un modo de fallo bien documentado.

Resultado

Estado

El comando sale con 0

completed

El comando falla, agota el tiempo o nunca se proporcionó

completed_unverified, con la salida

El comando se clasifica mediante la misma política que controla las llamadas del hijo antes de ejecutarse — el llamante es otro agente y puede ser objeto de inyección de instrucciones, por lo que "el llamante lo pidió" no es autorización. Pasa verification="true" cuando realmente no hay nada que verificar; una mentira explícita es mejor que un valor predeterminado silencioso.

Qué se devuelve

Un subagente que devuelve su transcripción completa ha frustrado su propio propósito. Cuando la respuesta del hijo es mayor que DSA_SUMMARY_TOKENS, se le pide — en la misma sesión, como un turno adicional — que la reemplace con un resumen de traspaso en siete secciones: Objetivo, Restricciones y Preferencias, Progreso, Decisiones Clave, Próximos Pasos, Archivos Relevantes, Contexto Crítico. Eso es lo que cruza el límite de MCP.

Una respuesta que ya está por debajo del límite se devuelve textualmente y no cuesta un turno adicional. La respuesta sin procesar siempre se conserva: dsh_transcript(run_id, raw=True).

Ejecución supervisada

Las llamadas a herramientas del hijo se controlan antes de ejecutarse. Un hook PreToolUse dentro del runtime entrega cada llamada propuesta a este servidor, que responde permitir o denegar; una llamada denegada vuelve al modelo como un resultado de herramienta bloqueado que incluye el motivo, y el modelo se adapta.

Un clasificador determinista decide primero, y decide la mayoría de las llamadas. Leer archivos, ls, grep, lecturas de control de versiones, ejecutar el código y las pruebas del propio espacio de trabajo están permitidos sin intervención del modelo. Los comandos privilegiados, las eliminaciones fuera del espacio de trabajo, fetch canalizado a un shell, y cualquier cosa que toque claves SSH o .env se deniegan directamente — incluso a través de un verbo de apariencia inofensiva, porque cat ~/.ssh/id_rsa es una herramienta de solo lectura aplicada a un secreto. Solo lo que el clasificador no puede clasificar escala.

La escalada se ejecuta en el mejor nivel que admite el cliente, resuelto al inicio e informado por dsh_list:

Nivel

Quién decide

Requiere

agent

un proceso revisor que configures

DSA_SUPERVISOR=agent

sampling

el modelo del cliente MCP

el cliente anuncia sampling

elicitation

tú, en tu cliente

el cliente anuncia elicitation

deterministic

nadie — la escalada deniega

siempre disponible

Ejecución desatendida. Claude Code anuncia elicitation y no sampling, por lo que de serie cada escalada interrumpe a una persona — incorrecto para un agente diseñado para trabajar mientras haces otra cosa. DSA_SUPERVISOR=agent coloca un revisor local en ese lugar:

DSA_SUPERVISOR=agent                        # nothing prompts a human
DSA_SUPERVISOR_CMD="claude -p --model sonnet"   # any CLI reading a prompt on stdin

El revisor recibe los mismos hechos estructurados y responde ALLOW o DENY en su primera línea. Cualquier otra cosa deniega. Cuesta un subproceso y aproximadamente ocho segundos por escalada, y gasta tokens en la cuenta en la que esa CLI haya iniciado sesión.

Un revisor es un juicio, no un límite. Dado cp note.txt $TMPDIR/copy.txt, con los hechos informando correctamente que el destino no se puede resolver, un revisor Claude razonó que $TMPDIR "es la misma raíz temporal del SO bajo la que se encuentra el espacio de trabajo" y lo permitió. La escritura cayó fuera del espacio de trabajo. Ese tipo de llamada ahora se rechaza por regla antes de que cualquier revisor la vea — que es la división correcta del trabajo: las reglas mantienen el límite, el revisor maneja la zona gris dentro de él.

Cada nivel falla de forma segura. Un supervisor inalcanzable, un tiempo de espera, una solicitud mal formada o un cliente que no admite ninguna de las capacidades producen una denegación, nunca una aprobación.

La escalera se recorre en lugar de elegirse una vez: un nivel que da error cae al siguiente, por lo que un cliente que pierde el muestreo — obsoleto en la revisión de la especificación del 28 de julio de 2026, pero aún funcional hoy — degrada a preguntarte en lugar de denegarlo todo. Un nivel que agota el tiempo no cae; una pregunta sin respuesta es un no, y volver a preguntar en otro canal solo duplicaría la espera.

Establece DSA_SUPERVISOR=off para deshabilitar la puerta por completo.

Lo que se muestra al supervisor son hechos estructurados, nunca la prosa del hijo: la herramienta, los programas en cada segmento de la tubería, y cada ruta que el comando nombra con una bandera de dentro o fuera del espacio de trabajo. El hijo escribe tanto el comando como cualquier justificación para él, y un hijo que puede defender su propio caso lo hará. Una ruta que no se puede resolver estáticamente — $TMPDIR/out.txt — se informa como no resuelta en lugar de adivinarse, y cuenta como fuera.

examples/claude_supervisor.py ejecuta todo el patrón contra un Claude real, para clientes que no anuncian sampling por sí mismos:

DEEPSEEK_API_KEY=sk-... uv run python examples/claude_supervisor.py

Límites y coste

Un agente delegado gasta tu dinero en un bucle, por lo que cuatro límites independientes lo acotan, y cada ejecución informa lo que ha utilizado.

Límite

Parámetro

Aplicado por

Tiempo real por ejecución

DSA_RUN_TIMEOUT

matando el runtime

Tokens totales por ejecución

DSA_TURN_TOKEN_BUDGET

matando el runtime

Llamadas al modelo por ejecución

DSA_MAX_STEPS

matando el runtime

Llamadas a herramientas repetidas idénticas

DSA_LOOP_STRIKES

matando el runtime

No hay cancelación a mitad de turno en el cable, por lo que cada parada es una muerte de proceso. Una muerte por límite siempre prevalece sobre lo que la propia ejecución informó: la salida de un proceso muerto nunca se lee como éxito.

dsh_delegate, dsh_await y dsh_list informan todos del uso de tokens — entrada, salida, lecturas y escrituras de caché, y número de pasos — sumado a partir de lo que informó el proveedor. La entrada por paso se suma deliberadamente: cada solicitud factura todo el prefijo reenviado, por lo que el total es lo que realmente costó la delegación.

Trazas, y qué hacer con ellas

Cada delegación deja dos registros.

El runtime del hijo escribe su propio registro duradero — cada llamada a herramienta con argumentos, cada invocación de hook con su código de salida, duración y el texto del veredicto, uso de tokens por paso — en <session root>/<workspace>/<session>/session.jsonl.zstd.

Este servidor añade su propio lado a <session root>/trace.jsonl: cada veredicto con su nivel, latencia y los hechos que se mostraron al supervisor, cada ejecución finalizada con su resultado de verificación y uso, y la relación caracteres-por-token que cada turno de destilación produjo realmente. Longitudes, nunca el texto — la traza es para medir, no para conservar una copia de tu código fuente. Establece DSA_TRACE para moverla, o DSA_TRACE=off para deshabilitarla.

uv run python scripts/trace_report.py            # reads .dsh-sessions/trace.jsonl

El informe responde a las preguntas para las que se adivinaron los valores predeterminados: con qué frecuencia el clasificador escala y sobre qué, si DSA_CHARS_PER_TOKEN coincide con la observación, y dónde se sitúan DSA_MAX_STEPS y DSA_TURN_TOKEN_BUDGET en relación con el uso real. Su primera ejecución en este proyecto encontró que pwd && ls se escalaba a un modelo — once segundos y una llamada al modelo para que se le dijera lo que la lista de solo lectura ya sabía — que ahora se resuelve mediante política en un tercio de milisegundo.

Configuración

Cada ajuste es una variable de entorno en el proceso del servidor.

Variable

Default

Significado

DEEPSEEK_API_KEY

—

Obligatorio. Se pasa al runtime hijo.

DEEPSEEK_BASE_URL

API pública de DeepSeek

Apunta a un proxy o a un endpoint autoalojado.

DSA_MODEL

deepseek-v4-pro

ID del modelo para trabajo delegado. deepseek-v4-flash es más barato.

DSA_WORKSPACE

directorio de trabajo del servidor

Directorio que el hijo lee y escribe.

DSA_MAX_AGENTS

4

Agentes activos permitidos a la vez. Cada uno mantiene un proceso.

DSA_SESSION_ROOT

<workspace>/.dsh-sessions

Donde se escriben los registros de la sesión.

DSA_MAX_TOKENS

valor por defecto del proveedor

Límite de salida por solicitud para el hijo.

DSA_TURN_TOKEN_BUDGET

sin definir

Total de tokens que una ejecución puede gastar antes de ser eliminada.

DSA_MAX_STEPS

40

Número de llamadas al modelo que una ejecución puede hacer antes de ser eliminada.

DSA_LOOP_STRIKES

3

Llamadas idénticas a herramientas antes de que la ejecución sea eliminada como desbocada.

DSA_RUN_TIMEOUT

1800

Segundos antes de que una ejecución sea eliminada y reportada como fallida.

DSA_IDLE_TIMEOUT

900

Segundos antes de que un agente inactivo sea recolectado y desalojado.

DSA_RUN_ARCHIVE

200

Ejecuciones finalizadas que se mantienen legibles tras recolectar al agente.

DSA_SUMMARY_TOKENS

2000

Tamaño del resultado por encima del cual se pide al hijo que destile.

DSA_CHARS_PER_TOKEN

3.5

Conversión utilizada para ese límite. Medido en 3.54 para esta carga de trabajo.

DSA_VERIFY_TIMEOUT

300

Segundos que puede ejecutarse el comando de verificación, limitado por el plazo restante de la ejecución.

DSA_SUPERVISOR

auto

auto / agent / sampling / elicitation / allow-escalations / off.

DSA_SUPERVISOR_CMD

claude -p --model sonnet

Revisor para DSA_SUPERVISOR=agent. Lee el prompt de stdin.

DSA_SUPERVISOR_TIMEOUT

120

Segundos para esperar un veredicto antes de denegar.

DSA_SANDBOX_MODE

workspace-write

read-only, workspace-write o danger-full-access.

DSA_REASONING_EFFORT

low

off / low / high / max. Afecta mucho al coste.

DSA_CONTEXT_WINDOW

200000

El presupuesto de trabajo se compacta midiendo contra esto.

DSA_BASH_TIMEOUT_MS

60000

Límite a nivel de ejecutor para una llamada a bash.

DSA_REQUEST_TIMEOUT

ninguno

Segundos para esperar una solicitud al runtime.

DSA_TRANSCRIPT_LIMIT

400

Líneas de actividad retenidas por ejecución.

DSA_LOG_LEVEL

info

Nivel de registro del servidor. Solo escribe en stderr.

DSA_TRACE

<session root>/trace.jsonl

Traza de decisiones y ejecuciones. off lo desactiva.

DSA_CORDIS

la composición empaquetada

Una ruta, o bundled para la configuración mínima del upstream.

DSA_PROVIDER

deepseek-official

Ruta del proveedor registrada por la composición.

Límites que debes conocer antes de confiar en esto

Provienen del protocolo de red del SDK Harness, no de decisiones tomadas aquí.

  • El sandbox del sistema de archivos no cubre bash. dsh-fs-sandbox limita las herramientas write/edit del modelo al espacio de trabajo, pero dsh-bash-sandbox no está en el ejecutable del runtime empaquetado, por lo que bash no está confinado. El supervisor cubre esto: controla todas las herramientas, incluido bash, antes de la ejecución. Con DSA_SUPERVISOR=off no hay ningún límite en bash; apúntalo a una rama o a un directorio temporal.

  • El sandbox solo restringe los efectos en archivos — no la red, procesos ni llamadas al sistema. Y workspace-write permite /tmp además de la raíz del espacio de trabajo.

  • Cancelar mata el proceso. No hay cancelación en mitad de un turno en el protocolo, por lo que dsh_cancel termina el runtime. Las ediciones ya escritas permanecen en disco y la sesión no se puede reanudar después.

  • La sesión de un agente recolectado desaparece, pero sus resultados no. Tras DSA_IDLE_TIMEOUT, el proceso se libera; dsh_await y dsh_transcript siguen funcionando en sus ejecuciones finalizadas, dsh_continue no.

  • Las sesiones viven mientras dure el proceso. No hay cierre por sesión, por lo que la memoria crece con el historial del agente. Cancela los agentes que hayas terminado de usar.

  • El upstream es una vista previa para desarrolladores. deepseek-harness-sdk está fijado en ==0.1.0rc7; dos candidatos de lanzamiento se publicaron en una semana. Espera cambios en el protocolo.

Desarrollo

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 it

Las pruebas en vivo necesitan una clave real y consumen tokens; no son recogidas por pytest:

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 tools

CLAUDE.md contiene la arquitectura y las restricciones del upstream; wiki/ contiene el registro de decisiones y lo que se midió.

Licencia

MIT.

Available Tools

6 tools
dsh_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYes
wait_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
agent_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYes
agent_idYes
verificationNo
wait_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
taskYes
modelNo
workspaceNo
instructionsNo
verificationYes
wait_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
limitNo
run_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 6 tool updatesv0.2.0
    • First observeddsh_await
    • First observeddsh_cancel
    • First observeddsh_continue
    • First observeddsh_delegate
    • First observeddsh_list
    • First observeddsh_transcript

TDQS

A4.4/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

Six tools cover the full lifecycle of subagent management without redundancy. This is well-scoped for the server's purpose.

Completeness5/5

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

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers