Skip to main content
Glama

souschef

Your agent cooks. Souschef tastes.

In a kitchen, nothing leaves the pass until the sous-chef has tasted it. souschef brings that to coding agents: when your agent finishes a change, a second agent writes the tests, souschef runs them, checks that only test files changed, and hands back a short report. It also catches bugs in your code, not just in the agent's tests.

souschef is an MCP server, packaged as a Claude Code plugin. It hands test writing to a headless coding agent (today the Antigravity CLI, agy) and keeps the noise (test code, terminal logs, the agent's conversation) out of your main agent's context unless it asks for it.

Claude Code                       souschef                                  agy (headless)
delegate_task(objective) ──────▶  snapshot checkout (incl. uncommitted work)
◀── taskId                        isolated git worktree ──────────────────▶ writes tests
wait_for_task ◀── RUNNING         build + test (allow-listed commands)
                                  failing? resume same conversation ──────▶ repairs test code
                                  scope check: only test paths changed?
                                  conflict check, apply tests to checkout
get_task_result ◀── {"status":"COMPLETED","tests":{"passed":12,"failed":0},...}

Install (Claude Code)

/plugin marketplace add https://github.com/eldarjobs/souschef.git
/plugin install souschef@souschef

Use the full HTTPS URL. The eldarjobs/souschef shorthand clones over SSH, which fails with "Host key verification failed" on machines without an SSH key set up for GitHub.

Local checkout:

claude plugin marketplace add /path/to/souschef
claude plugin install souschef@souschef

The server is one self-contained file (plugin/dist/server.cjs), so the plugin needs no npm install. It needs Node 22.13+ (for the built-in SQLite) and git.

Other MCP clients

{ "mcpServers": { "souschef": { "command": "node", "args": ["/path/to/souschef/plugin/dist/server.cjs"] } } }

Related MCP server: worker-bridge

The tester agent

Install the Antigravity CLI, run agy once in a terminal and sign in. souschef finds it on PATH, in the installer's default location, or at SOUSCHEF_AGY. doctor with ping: true proves it works by sending it a one-word prompt.

Use

Ask Claude to test what it just built, or run /souschef:taste [scope]. The bundled delegate-tests skill does the rest.

Tools

Tool

What it does

delegate_task

Starts a task (taskType: "tests") and returns a taskId at once, plus watch: the command that follows it live. continueFrom resumes an earlier task's agent conversation with new feedback. idempotencyKey makes retries safe.

get_task_status

Status, phase, a one-line progress note and recent: the latest steps.

wait_for_task

Blocks until the task finishes or a timeout passes; answers like get_task_status.

get_task_result

The compact report. Logs (testOutput, buildOutput, agentResponse) only via include.

get_task_diff

The patch, size-limited; large ones are listed per file and paged.

cancel_task

Stops the task and only the processes souschef started for it.

doctor

Agent binary, config validity, git state, detected test command.

A task moves through CREATED → QUEUED → RUNNING ⇄ VALIDATING and ends in COMPLETED, NEEDS_REVIEW, FAILED, CANCELLED or TIMED_OUT. The agent exiting cleanly is never enough on its own: build, tests and the scope check decide.

Watch it live

souschef runs agy with --output-format stream-json, so every step lands as it happens in ~/.souschef/events/<taskId>.ndjson. Follow a task from any terminal:

node <plugin>/dist/server.cjs watch <taskId>     # or: watch --latest

An excerpt from a real run of npm run smoke (the planted isEven bug):

11:39:38  [agent_writing] antigravity is writing tests
11:39:52  read   src\math.js
11:40:01  run    git status
11:40:02         -> exit 0 · modified:   src/math.js (0.3s)
11:40:57  write  test\math.test.js
11:41:00  run    npm test
11:41:30  [checking_scope] Checking which files the agent changed
11:41:30  [testing] Running npm test --silent
11:41:32  == NEEDS_REVIEW: Tests point to a bug in the production code (3 passed, 2 failed); nothing applied.

delegate_task returns this exact command as watch, and the bundled skill opens it in a terminal tab beside the chat when the client can. wait_for_task carries the same lines in recent, so the chat follows along too. Watching is read-only: Ctrl+C stops the view, never the task.

Report example:

{
  "taskId": "task_mvj6arlr5377a5",
  "status": "COMPLETED",
  "execution": "PASSED",
  "build": "SKIPPED",
  "tests": { "command": "npm test --silent", "created": 6, "passed": 6, "failed": 0, "exitCode": 0 },
  "security": { "status": "PASSED", "outOfScopeChanges": 0 },
  "apply": { "applied": true },
  "changedFiles": ["test/math.test.js"],
  "agent": { "name": "antigravity", "attempts": 1, "usage": { "totalTokens": 48211 } },
  "summary": "Created 6 tests; tests passed (6 passed, 0 failed). Applied 1 file(s) to the checkout."
}

Tasks and results live in SQLite (~/.souschef/souschef.db), so they survive a server restart.

Project config (optional)

.souschef.json at the project root:

{
  "test": { "executable": "dotnet", "args": ["test", "MySolution.sln", "--filter", "Category!=Integration"], "cwd": "." },
  "build": { "executable": "dotnet", "args": ["build", "MySolution.sln"], "cwd": "." },
  "writeGlobs": ["tests/**"],
  "rules": ["Use xUnit and Moq", "No tests that need a real database"],
  "maxRepairAttempts": 2,
  "autoApply": true,
  "agent": { "model": "...", "effort": "high", "permissionMode": "skip-permissions" }
}

Without it, souschef looks for the manifest nearest to the target files: .NET (*.sln, test projects), Node (package.json test script; npm, pnpm, yarn, bun from the lockfile), Python (pytest; uv, poetry or a local .venv), Go and Rust. If that is ambiguous (two solutions, targets in two modules, no test script), it says so instead of guessing. In a monorepo, pass module or list modules in the config. v1 keys (test_command, write_globs, timeout_minutes) are still read.

Speed

  • Only the new tests run (testScope: "changed", the default). For dotnet test, souschef runs the test project that owns the changed test files, filtered to those classes, keeping your other arguments and filter. Set "testScope": "full" to always run the configured command.

  • Warm builds (reuseWorkspace: true, the default). Each repository gets one reusable worktree (pool-<hash> in the workspace folder). Between tasks it is reset to HEAD and stripped of untracked files, but ignored build output (bin, obj, artifacts) stays, and unchanged sources keep their timestamps, so the first task builds cold and later ones build incrementally. If the pool is busy, a task falls back to a fresh worktree.

  • On Windows, excluding the workspace folder (%TEMP%\souschef) from antivirus scanning speeds up git and builds noticeably.

Safety

  • Isolation. The agent works in a separate git worktree (or a copy, for non-git projects). Your uncommitted changes are copied in, so the agent tests what you have now. Your checkout is not touched while it runs. node_modules / .venv are linked in, not copied.

  • Scope check. Every changed path is checked against writeGlobs and a protected list (manifests, lockfiles, CI, .env, keys), plus path traversal and symlinks. Any violation means NEEDS_REVIEW and nothing is applied. Deleting tests is not allowed by default; edited existing tests are listed in modifiedExistingTests.

  • Apply. Only verified, test-only changes are copied back, only if the same files have not changed in your checkout meanwhile, and only once. Nothing of yours is ever rolled back.

  • Commands. Test commands run without a shell from an executable allow-list, with timeouts and output limits. Repository git hooks are disabled for souschef's own git calls.

  • Processes. Cancel and timeouts kill only process trees souschef started, by PID.

  • Secrets. API keys, tokens and secret-looking env values are redacted from stored logs.

The agent runs with --dangerously-skip-permissions by default, because print mode has nobody to approve tool calls. A worktree is not an OS sandbox: use permissionMode: "skip-permissions-sandboxed" for agy's terminal sandbox, and run souschef only on projects where an agent executing code is acceptable.

Develop

npm install
npm run typecheck
npm test           # unit + integration tests (a fake agent drives real git repos)
npm run build      # bundles src/ into plugin/dist/server.cjs
npm run smoke      # real end-to-end run against agy on a throwaway project (a few minutes)

Adding a backend means implementing AgentAdapter (src/adapters/agent-adapter.ts): find the binary, run one headless turn, return status, structured output, usage and a conversation id.

License

MIT

Available Tools

7 tools
cancel_taskCancel a taskA

Stops a queued or running task and the processes SousChef started for it. Nothing is applied.

NameRequiredDescriptionDefault
taskIdYes

TDQS

A3.5/5.0
Behavior4/5

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

Only destructiveHint=false is annotated, so the description carries most of the burden and adds real value: it discloses that child processes started by SousChef are killed and that 'Nothing is applied', i.e. cancelling produces no side effects on the target. It stops short of saying whether cancellation is reversible or what is returned.

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, zero filler, and the core action plus the side-effect clarification are front-loaded.

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-param mutation there is no output schema, and the description doesn't say what the caller receives back or the outcome for an already-completed task. Adequate for a minimal cancel tool, but a couple of gaps remain.

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

Parameters2/5

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

Schema description coverage is 0% for the single required taskId, and the description never mentions the parameter at all — no format, no hint about where to obtain the ID (e.g. from delegate_task/get_task_status). With low coverage the description should compensate, and it does not.

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 ('cancel_task' → 'Stops a queued or running task') and adds scope: it also terminates spawned processes. No sibling (wait_for_task, get_task_result, get_task_status, delegate_task) overlaps, so it is distinguishable, but the description never explicitly contrasts with them.

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?

'queued or running task' implies the valid precondition, but there is no explicit statement of when to call this versus polling with get_task_status or waiting with wait_for_task, and no guidance on what happens if the task is already finished.

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

delegate_taskDelegate a task to the tester agentA

Starts a task (currently taskType "tests") in an isolated workspace and returns a taskId immediately. SousChef detects the test command, lets the agent write tests, runs build/tests, checks that only test files changed, and applies verified test files to the checkout. Follow with wait_for_task, then get_task_result. The answer carries watch: a command that follows the agent live in a terminal; open it beside the chat if you can.

NameRequiredDescriptionDefault
moduleNoModule root (relative) in a monorepo.
taskTypeYesOnly "tests" runs today.
objectiveYesWhat to test and why, with concrete expected behaviour.
projectRootNoAbsolute project root. Defaults to the server working directory.
targetPathsNoProduction files under test, relative to projectRoot.
continueFromNotaskId of a finished task: continue its agent conversation with this objective as feedback.
idempotencyKeyNoSame key returns the same task instead of starting a new one.
timeoutMinutesNo
maxRepairAttemptsNo

TDQS

A4.1/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 does well: it discloses the internal pipeline (detect test command, write tests, run build/tests, verify only test files changed, apply verified files to the checkout), which tells the agent this mutates the checkout and is gated by verification. It also surfaces the `watch` field in the response that no schema documents. Failure semantics, repair attempts, and timeout behavior are not covered.

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-loads what it does and the taskId return, then the pipeline, then the follow-on calls. The final sentence about `watch` and opening a terminal is somewhat chatty but does convey actionable response information, so it earns most of its space.

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?

A 9-parameter mutation tool with no annotations and no output schema; the description covers purpose, sequencing, the side-effect envelope, and the undocumented `watch` return field. Gaps remain around failure/repair behavior, idempotency and timeout semantics, which an agent needs to call it robustly.

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 78%, so the baseline is 3. The description only reinforces taskType (already fully documented in the schema as "Only \"tests\" runs today") and adds no meaning for continueFrom, idempotencyKey, maxRepairAttempts or timeoutMinutes.

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 (starts), resource (a task in an isolated workspace) and immediate return value (taskId), plus the only currently supported taskType. This clearly distinguishes it from wait_for_task, get_task_result, cancel_task and the other siblings.

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?

Explicitly routes the agent through the follow-on sequence: "Follow with wait_for_task, then get_task_result." It does not state when *not* to use the tool (e.g. when to use continueFrom vs. a fresh task, or when cancel_task is appropriate), so it falls short of a full 5.

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

doctorCheck setupB
Read-only

Checks the agent binary, the project config and the detected test command. ping=true also sends the agent a one-word prompt.

NameRequiredDescriptionDefault
pingNo
projectRootNo

TDQS

B3/5.0
Behavior3/5

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

The readOnlyHint annotation already establishes that this is a safe read-style check, so the description does not need to prove that. It adds useful behavior by naming the checked components and disclosing that ping=true sends the agent a one-word prompt, but it omits return behavior and error/failure semantics.

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 two tight sentences with no filler. The core diagnostic purpose is front-loaded, and the optional ping behavior is clearly appended.

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

Completeness2/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 should explain what a successful or failed check returns. It also leaves projectRoot undocumented, making the definition incomplete for correct invocation despite its concise clarity.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for both parameters. It partially explains ping=true, but never defines ping=false/default behavior or the purpose of projectRoot.

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?

The description states a specific action and concrete resources: checking the agent binary, project config, and detected test command. It clearly is not a task-management operation like the sibling tools, though it does not explicitly contrast itself with them.

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?

The description explains what is checked but gives no explicit when-to-use guidance, prerequisites, or alternatives. An agent can infer it is a setup diagnostic, but the description does not say when to call it instead of task-status or delegation tools.

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

get_task_diffTask diffA
Read-only

Unified diff of the files the task changed (including out-of-scope ones). Large diffs return a file list first; then request one path at a time and page with offset.

NameRequiredDescriptionDefault
pathNo
offsetNo
taskIdYes
maxCharsNo

TDQS

A3.9/5.0
Behavior4/5

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

readOnlyHint=true is consistent with a diff read. Beyond annotations, the description discloses two important behaviors an agent cannot infer: out-of-scope files are included, and large diffs degrade into a file-list response requiring per-path, paged follow-ups. It does not explain how to distinguish a file-list response from an actual diff response.

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, no filler, and the primary output description is front-loaded ahead of the large-diff fallback behavior. Every clause carries information.

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?

No output schema exists and four parameters have 0% schema coverage, so the description is the only source of truth. It covers the big-diff path but leaves maxChars undocumented and does not say how to recognize that the returned payload is a file list rather than a diff, which is the main practical ambiguity.

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 0%, so the description must carry the load. It gives semantics for path (one at a time) and offset (paging), and taskId is implied by context, but maxChars is never mentioned or constrained anywhere. Partial compensation for a total coverage gap.

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: a unified diff of the files a task changed, with the notable scope caveat that out-of-scope files are included. This is clearly distinguishable from siblings like get_task_result or get_task_status. It stops short of naming an alternative, but the resource 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?

Gives a concrete escalation workflow: for large diffs you get a file list first, then you must request one path at a time and page with offset. That is real conditional usage guidance. It does not say when to prefer this over get_task_result, so it is not a full 5.

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

get_task_resultTask resultC
Read-only

Compact JSON report (status, build, test counts, security check, applied files, summary). Logs are included only when asked for via include.

NameRequiredDescriptionDefault
taskIdYes
includeNo
maxCharsNoPer included log; the tail is kept.

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. Beyond that, the description usefully discloses that output is a compact JSON report with named sections and that logs are opt-in via 'include' — valuable since there is no output schema — but says nothing about behavior when the task is missing, still running, or failed.

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?

Two compact sentences, front-loaded with the return payload and ending with the key opt-in rule. No wasted clauses, though a leading purpose clause would improve it.

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 read-only getter with three params, no output schema, and a 33% schema coverage, the description should carry the return-value burden. It names the report sections and the log gating but omits taskId semantics and any failure/empty-result behavior.

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 33%; only maxChars is documented in the schema. The description adds real meaning to 'include' by tying it to log inclusion, but leaves the required taskId and the relationship between include entries and the report's log sections unexplained.

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

Purpose3/5

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

The description describes the shape of what is returned (status, build, test counts, security check, applied files, summary) rather than stating the action, so the verb 'get' comes only from the name. It does not distinguish this from siblings like get_task_status or wait_for_task, which also return task state.

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 guidance on when to call this versus get_task_status, wait_for_task, or get_task_diff. The one usage rule given ('logs are included only when asked for via include') concerns output payload, not tool selection.

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

get_task_statusTask statusB
Read-only

Current status, phase and one-line progress of a task, plus its latest steps in recent.

NameRequiredDescriptionDefault
taskIdYes

TDQS

B3.2/5.0
Behavior3/5

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

readOnlyHint=true already tells the agent this is a safe read, so the bar is lower. The description adds value by disclosing what the response contains (status, phase, progress, recent steps), but says nothing about freshness, whether status is terminal, or that `recent` is a truncated step list.

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 sentence that leads with the primary payload (status, phase, progress) and then the secondary one (recent steps). Nothing is wasted, though the back-referenced `recent` field is slightly awkward without the output schema present.

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?

With no output schema, the description usefully sketches the return shape, which is what the agent most needs here. It stops short of covering terminal-state semantics or how recent steps are limited, which matters for a polling-style status tool.

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 parameter (taskId), and schema description coverage is 0%, so the description should compensate — but it never mentions the parameter. The name taskId is largely self-explanatory, which keeps this from scoring lower, but no format or sourcing guidance is added.

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?

The description names a concrete verb (get) and resource (task status) and enumerates what comes back: status, phase, one-line progress, and latest steps in `recent`. It does not, however, distinguish this tool from siblings like get_task_result or wait_for_task, which are close enough that an agent must guess.

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 statement of when to call this versus wait_for_task (blocking) or get_task_result (final output). Since all three concern a task identified by taskId, the absence of routing guidance is a real gap, leaving the agent to infer usage from names alone.

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

wait_for_taskWait for a taskA
Read-only

Blocks until the task finishes or timeoutSeconds passes, then returns its status and recent: the latest steps (files the agent wrote, commands it ran, what it said). Call again while it is still running.

NameRequiredDescriptionDefault
taskIdYes
timeoutSecondsNo

TDQS

A4.4/5.0
Behavior4/5

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

Discloses the key behavior annotations can't: the call blocks until completion or the timeout elapses, and then returns status plus recent activity. That is consistent with readOnlyHint=true. It omits details like the 600s ceiling on blocking time and whether a timeout result differs from a completion result.

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, no waste. The blocking semantics and return contents come first, followed by the retry instruction — exactly the front-loading 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?

With no output schema, the description carries the return-value burden and does so by naming the status and `recent` contents. Combined with the retry guidance, an agent can call this correctly. Only the timeout edge case (what a timed-out return looks like vs. a completed one) is left unstated.

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 coverage is 0%, so the description must compensate; it explains that timeoutSeconds bounds the blocking wait, which is the parameter whose meaning matters most. taskId's role is left implicit (though obvious from context), and the default/limits are only in the schema.

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 (blocks/waits), resource (task), and the exact return payload (status plus `recent` steps). The blocking-vs-polling framing lets an agent distinguish it from siblings like get_task_status and get_task_result without opening their schemas.

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 an explicit usage loop — 'Call again while it is still running' — which tells the agent exactly how to keep waiting after the timeout fires. It does not explicitly contrast with get_task_status/get_task_result or say when non-blocking polling is preferable, so it stops short of 5.

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. 7 tool updatesv0.3.1
    • First observedcancel_task
    • First observeddelegate_task
    • First observeddoctor
    • First observedget_task_diff
    • First observedget_task_result
    • First observedget_task_status
    • First observedwait_for_task

TDQS

A3.6/5.0

Scored across 7 tools

Disambiguation4/5

The tools have distinct primary roles: delegate_task starts a task, wait_for_task blocks, get_task_status gives a snapshot, get_task_result returns a final report, get_task_diff shows changes, cancel_task stops, and doctor checks setup. However, wait_for_task, get_task_status, and get_task_result all surface status or progress details, so an agent could occasionally choose the wrong one when checking on a task.

Naming Consistency4/5

Most names follow a clear verb_noun snake_case pattern (delegate_task, get_task_result, etc.), but 'doctor' breaks the pattern as a bare noun with no verb. Still readable and mostly consistent.

Tool Count5/5

Seven tools is well within the sweet spot for a task orchestrator; each covers a distinct lifecycle operation (start, monitor, result, diff, cancel, environment check) without bloat.

Completeness4/5

The surface covers the core lifecycle: delegation, blocking wait, status polling, result retrieval, diff inspection, cancellation, and environment diagnosis. Minor gaps exist—e.g., no tool to list tasks or retrieve a task by anything other than ID—but agents can work around these by tracking task IDs.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers