Skip to main content
Glama

throng-mcp

skills.sh

An MCP server that lets your agent hand work to another one. Any MCP client can call it, and the task goes to any supported harness.

  • Another model's view. A review by another vendor's model, a design critique, a cheaper model for a mechanical pass.

  • Second opinions. Hand one agent's result to another: Codex reviews, Claude fixes, Codex checks again, each in its own long-lived session.

  • Real sessions, not one-shots. The nested agent keeps running; a follow-up goes to the same agent with everything it already knows.

  • Background work. Several agents run at once while you carry on.

  • Answers by schema. Pass a JSON Schema and the result comes back as data that fits it, not prose to parse: a list of findings, a verdict, a plan, ready to feed into the next step.

Supported harnesses: Claude Code, Codex, OpenCode (and every model it can reach), Gemini CLI, Cursor CLI, GitHub Copilot CLI. Setup for each is under Install.

Any other ACP agent can be described in the config as a custom harness: its command, and the mode or options that make it auto-approve or ask. throng installs nothing for it and guesses nothing; see Custom harnesses.

Example

You're in Claude Code and have just changed the payment flow.

Ask Codex to find a way this payment flow could charge someone twice. Don't change any files.

Claude calls run_thronglet with agent: "codex/gpt-6-sol:high", a self-contained prompt, the repository path and a schema, so the findings come back as data: file, line, steps to reproduce.

Give the findings to Opus. Have it fix each one, add a test for it and run the tests.

A second run_thronglet, with agent: "claude/opus". Codex's findings go into its prompt; Opus edits the code and runs the tests.

Now show the same Codex session what changed. Can it still make a customer pay twice?

That is send_message into the first session: Codex still has its findings in context and checks the fixes against them instead of starting over.

Any of these calls takes background: true: it returns at once and wait_thronglet collects the result later, which is how several agents work while you carry on.

Related MCP server: Claude Code MCP

Install

Three parts, in order: the server, the agents it may run, and the client it is called from. The skill at the end is optional.

The plugin covers parts 1, 3 and 4; the agents from part 2 you still install yourself.

claude plugin marketplace add agent-runbooks/throng-mcp
claude plugin install throng@throng-mcp

1. The server

The npm package throng-mcp. Needs node ^22.13 || >=24. Tested with node 24.11.1, claude 2.1.282, codex 0.156.1, opencode 1.18.30.

Two ways to run it:

  • npx -y throng-mcp straight in the client config, below. Nothing to install: npx fetches the package on the first start and caches it. The package has no dependencies, so that is one tarball and nothing else.

  • A global install, then the command is throng-mcp. Starts faster than going through npx.

    npm i -g throng-mcp

2. The agents to run

Each agent needs its own CLI installed and logged in. throng talks to agents over ACP (Agent Client Protocol); Claude Code and Codex need an ACP adapter, and throng ships none. Install only the agents you want to delegate to.

npm i -g @agentclientprotocol/claude-agent-acp
claude auth status

throng passes the path of the claude it finds on PATH to the adapter (CLAUDE_CODE_EXECUTABLE), so the nested agent runs your installed, logged-in CLI. If claude auth status says not logged in, put CLAUDE_CODE_OAUTH_TOKEN into the config, see docs/configuration.md.

npm i -g @agentclientprotocol/codex-acp
codex login

The adapter gets the path of your codex the same way (CODEX_PATH).

OpenCode speaks ACP itself (opencode acp), so there is no adapter. Install it per https://opencode.ai/docs, then:

opencode auth login

Custom providers live in your ~/.config/opencode/opencode.json; throng doesn't touch it.

Gemini CLI speaks ACP itself (gemini --acp), so there is no adapter.

npm i -g @google/gemini-cli
gemini

Gemini CLI needs a Gemini API key (Google AI Studio) or Vertex: run gemini once, choose "Use Gemini API Key" and paste the key, or set GEMINI_API_KEY. The nested agent uses that key. Signing in with a personal Google account no longer works for Gemini CLI. Its limits under throng: docs/harnesses.md.

Cursor CLI speaks ACP itself (cursor-agent acp), so there is no adapter.

curl https://cursor.com/install -fsS | bash
agent login

throng finds cursor-agent on PATH and authenticates with the login agent login saved; without that login every run fails with harness_unavailable and Cursor's message asking to run agent login. Its limits under throng: docs/harnesses.md.

Copilot CLI speaks ACP itself (copilot --acp), so there is no adapter.

npm i -g @github/copilot
copilot login

throng finds copilot on PATH; the nested agent uses the login copilot login saved, or the GitHub CLI's. With a login from the GitHub CLI only, Copilot offers no model choice and every run fails with model_rejected; run copilot login. Its limits under throng: docs/harnesses.md.

3. The MCP client

The client is the session that calls throng. It may be the same program as one of the agents above, or a different one. The server speaks stdio and the command is npx -y throng-mcp, or throng-mcp after a global install.

claude mcp add --scope user throng -- npx -y throng-mcp

--scope user registers it for every project; without it, for the current project only. claude mcp list shows the result.

codex mcp add throng -- npx -y throng-mcp

In ~/.config/opencode/opencode.json:

{
  "mcp": {
    "throng": {
      "type": "local",
      "command": ["npx", "-y", "throng-mcp"],
      "enabled": true
    }
  }
}

Any other MCP client: register a stdio server with that command.

4. The skill, optional

skills/throng tells the calling agent how to use the server: when to delegate, how to write the prompt, background runs, follow-ups, structured output, what a refused permission means. It is a file for the agent and does not install the server.

npx skills add agent-runbooks/throng-mcp --skill throng -g -a claude-code -y

-g installs into the agent's user directory, for every project; without it, into the current project. -a codex or -a opencode for the other agents. npx skills update pulls later changes.

Copy skills/throng into your agent's skills directory: ~/.claude/skills, ~/.codex/skills, ~/.config/opencode/skills. A global install also leaves it under the installed package, $(npm root -g)/throng-mcp/skills/throng.

Agents pick skills up at session start, so open a new session after installing.

Check

In a new session, ask the agent to call list_harnesses. It starts each installed adapter without a prompt (seconds, no tokens) and lists the installed harnesses with their models and effort levels; unavailable holds the ones that are configured or installed but broken, with the reason. A built-in harness you haven't installed is not listed, and run_thronglet on it says what to install. If a run then fails during the handshake, the usual cause is auth: claude auth status, codex login, opencode auth login, gemini (set the API key once), agent login (Cursor), copilot login (Copilot). More in troubleshooting.

Before the first run, two things to know. The agent edits the directory you name, with your user's rights; throng adds no isolation and rolls nothing back. Give it only trees you would let an agent edit unattended, and give parallel writers a worktree each.

Using throng

agent names harness, model and effort in one string, <harness>/<model>[:<effort>]:

claude/opus:max
codex/gpt-6-sol:xhigh
opencode/openrouter/z-ai/glm-5.3-flash
gemini/gemini-2.5-pro
cursor/gpt-5.4-nano
copilot/auto

The model is one of the harness's own values; list_harnesses has the current list. Effort is low | medium | high | xhigh | max; omitted means the harness default.

A call:

{
  "agent": "codex/gpt-6-sol:high",
  "prompt": "In this repository, add a --verbose flag to the CLI in src/cli.ts and a test for it. Run pnpm test. Leave the changes uncommitted and end with the list of files you changed.",
  "cwd": "/work/my-app",
  "description": "add --verbose flag"
}

The prompt is self-contained: the nested session sees nothing of the calling conversation. The call returns the agent's final message, a session_id for follow-ups, and why the turn stopped.

tool

what it does

run_thronglet

starts a session and runs the first turn

send_message

runs the next turn in an existing session; steer: true interrupts the running turn instead of waiting for it

wait_thronglet

collects the result of a turn started with background: true

list_thronglets

the sessions and what each is doing

cancel_thronglet

stops a session's running turn

list_harnesses

the installed harnesses, their models and effort levels

background: true on run_thronglet or send_message returns as soon as the turn is running; wait_thronglet collects the result later, which is how several agents run at once. schema asks for structured output: the agent ends with a JSON value matching the JSON Schema, and the result comes back as structured instead of text.

A failure is an MCP tool error with code, message and, when the session exists, session_id and the partial text. Every field, error code and stop reason of every tool is in DESIGN §3.

Permissions and safety

What a nested agent may do comes from the config file, never from a tool parameter, so the calling model cannot grant itself more than you allowed. Optional ~/.config/throng/config.yaml:

harness_mode: auto        # auto | ask
permission_answers: deny  # auto | allow | deny | elicit
  • harness_mode is the mode the harness runs in: auto (the default) is its own auto-approve mode (Claude auto, Codex agent, OpenCode as configured, Gemini yolo, Cursor --force, Copilot allow_all), ask its asking mode.

  • permission_answers is how throng answers what the harness still asks: deny (the default) refuses, allow allows once, elicit shows you a dialog in the MCP client (needs elicitation support; Claude Code has it), auto shows the dialog when the client can and refuses otherwise.

  • harness_mode: auto with permission_answers: allow is effectively bypass.

  • Both settings govern what a harness asks about. Some harnesses act without asking: Cursor CLI applies file edits on its own in either mode (docs/harnesses.md).

  • The older permissions: auto | allow_all | deny_all | elicit still works as a shorthand for a pair (auto + deny, ask + allow, ask + deny, ask + elicit).

throng never answers "always allow", so no rule gets written into the agent's project settings. Per-harness overrides, extra env for an adapter, timeouts and the nesting limit are in docs/configuration.md.

Documentation

  • docs/configuration.md: the config file, environment variables, permissions in detail, auth, troubleshooting.

  • docs/harnesses.md: how each harness behaves under throng, its limits and quirks.

  • DESIGN §3: the exact inputs, results, error codes and stop reasons of every tool.

  • skills/throng/SKILL.md: working patterns for the calling agent.

  • docs/development.md: for maintainers; tests, smoke runs against real harnesses, files on disk.

  • Agent Runbooks: multi-step procedures a session runs through subagents. Any step of a runbook can go to any harness through throng.

License

MIT, see LICENSE.

Available Tools

6 tools
cancel_throngletA

Cancels the session's running turn (session/cancel) and drops its queued messages; a pending wait_thronglet returns the cancelled error. The session is idle afterwards and accepts a new send_message. No-op on an idle session.

NameRequiredDescriptionDefault
session_idYessession_id from run_thronglet

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does well: it discloses that queued messages are dropped, that a pending wait_thronglet surfaces a cancelled error, and that the session is idle afterward and accepts new messages. It does not mention authorization or permissions, leaving one gap for a mutation 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?

Two dense sentences, front-loaded with the primary effect and back-loaded with post-conditions and the no-op case. No filler or restatement of the name.

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

Completeness4/5

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

For a one-parameter mutation with no annotations and no output schema, the description covers the key effects, side effects on queued messages and waiting callers, and the resulting state. Only the permission/authorization angle is unaddressed.

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

Parameters3/5

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

Schema description coverage is 100% for the single session_id parameter, and the schema already ties it to run_thronglet. The description adds no syntax or format detail beyond that, so the baseline 3 is appropriate.

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 (cancels) and resource (the session's running turn) and even names the underlying operation (session/cancel). It also references siblings wait_thronglet and send_message, so an agent can distinguish this tool's role from theirs without opening a schema.

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 clear context for when the tool matters and explicitly notes the no-op case on an idle session, which prevents pointless calls. It stops short of naming an alternative tool or exclusion for other cancel-like scenarios, so it is not a full when/when-not routing statement.

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

list_harnessesA

Lists valid agent values for run_thronglet: installed harnesses with their models and effort levels, installed or configured ones that cannot run with the reason, and the server limits. Built-in harnesses that are not installed are not listed.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/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 so well: it discloses what is included (runnable harnesses, non-runnable ones with reasons, server limits) and a meaningful exclusion rule (built-in harnesses that are not installed are omitted). It does not state that it is a read-only/safe operation, which leaves a small gap.

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

Conciseness4/5

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

The purpose is front-loaded and every clause carries distinct information (content types, failure reasons, server limits, exclusion rule). The first sentence is dense and slightly run-on, but nothing is wasted.

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

Completeness5/5

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

With no output schema and no annotations, the description compensates by enumerating the shape of the returned content and the exclusion criteria. An agent has enough to decide when to call it and what to expect back.

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

Parameters4/5

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

The tool takes zero parameters, so the schema has nothing to document and the description correctly adds no parameter information. Baseline for a zero-param tool is 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 uses a specific verb+resource ('List valid agent values ... installed harnesses with their models and effort levels') and explicitly ties itself to run_thronglet, which distinguishes it from list_thronglets and the other siblings. An agent can tell exactly what this tool returns without opening any schema.

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

Usage Guidelines4/5

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

By stating it lists 'valid agent values for run_thronglet,' the description makes the intended call context clear: consult this before invoking run_thronglet. It does not spell out explicit when-not-to-use conditions or non-obvious prerequisites, so it falls short of a 5.

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

list_throngletsA

Lists thronglet sessions on this machine: description, agent, cwd, state (running | queued | idle | failed), queue length, accepts_messages (false: send_message to it fails), timestamps and the last error. Live state is this server's; a session run by another throng instance shows what its record says.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/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 a good job: it defines the state enum, explains that accepts_messages=false means send_message will fail, and discloses the important caveat that live state belongs to this server while sessions from other throng instances may be stale records. It stops short of stating read-only/non-mutating nature explicitly.

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?

Dense but front-loaded: the verb and scope come first, followed by the returned fields and the freshness caveat. The long field enumeration is justified because there is no output schema to carry it, though it reads as a run-on list.

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?

No output schema exists, so the description must document return values itself, and it does so field by field, including the error field and cross-instance freshness semantics. An agent has everything needed to call and interpret this zero-param 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?

The tool takes zero parameters, so there is nothing for the schema to describe and the baseline is 4. No parameter-level ambiguity exists for the agent to resolve.

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 (lists) and resource (thronglet sessions) with a clear scope qualifier ('on this machine'), and enumerates the returned fields. It does not explicitly name the sibling tools it is distinct from, but 'list' versus run/cancel/send/wait 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 Guidelines3/5

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

Usage is implied rather than stated: the agent can infer this is the discovery/inspection call before acting on a session. There is no explicit when-to-use, when-not-to-use, or pointer to an alternative sibling, so guidance is only adequate.

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

run_throngletA

Runs an agent of an installed harness (see list_harnesses) on a task in cwd and returns its final message as JSON {session_id, text, stop_reason, usage, duration_s, warnings?}; with schema, structured replaces text. description names the thronglet for listings. With background: true the call returns {session_id, state, queued} as soon as the turn runs; collect the result with wait_thronglet.

NameRequiredDescriptionDefault
cwdYesAbsolute path; the agent works in this tree
agentYes<harness>/<model>[:<effort>], e.g. claude/opus:max, codex/gpt-6-sol:xhigh; valid values: list_harnesses
promptYesTask for the agent
schemaNoJSON Schema (draft-07 or 2020-12) for structured output: the agent ends with a matching JSON value as its final message, returned as `structured` instead of `text`
timeout_sNoWall-clock limit for the run in seconds; default from config (21600)
backgroundNoReturn as soon as the turn is running (or queued behind the session's current turn); collect the result with wait_thronglet
descriptionYesWhat this thronglet is for, in a few words; shown in session listings

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the burden and largely does: it discloses the exact success payload shape, the structured-vs-text substitution under schema, and the different return shape under background: true. It omits failure/timeout behavior, cancellation interaction, and whether a returned session_id can be reused for send_message.

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

Conciseness4/5

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

Front-loaded with the core action and return contract, then the schema and background variants, with no filler sentences. It is dense to the point of being run-on, but each clause conveys distinct operational information.

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 7-parameter, nested-object tool with no output schema, the description correctly takes on the burden of documenting the return envelope and the background variant. It leaves gaps around error handling and session reuse (send_message), which a caller of a long-running agent runner would plausibly need.

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 100%, so the baseline is 3, but the description adds real meaning on top: it explains that `description` surfaces in session listings and that `schema` swaps `structured` for `text`, and it clarifies the background flag's semantics beyond the schema wording.

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+resource: runs an agent of an installed harness on a task in cwd, and returns its final message. It also distinguishes itself from siblings by pointing at list_harnesses for valid agent values and wait_thronglet for result collection, so an agent can place it in the family without opening 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 clear routing: use list_harnesses to resolve the agent string, use background: true plus wait_thronglet when you don't want to block. It does not address when to prefer this over send_message (new run vs. continuing an existing session), which is the most likely sibling confusion.

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

send_messageA

Sends the next message into an earlier session (session_id from run_thronglet) and returns the same JSON as run_thronglet. A message to a session whose turn is still running waits for that turn to end: turns on one session never overlap. With background: true the call returns {session_id, state, queued} as soon as the turn runs; collect the result with wait_thronglet. steer: true interrupts the running turn and delivers this message next; queued messages follow it. A session its harness cannot continue (resume or load) takes no further message, steer included: list_thronglets shows it as accepts_messages: false.

NameRequiredDescriptionDefault
steerNoInterrupt the running turn (session/cancel) and run this message as the very next turn, ahead of queued messages. The in-flight tool call is aborted; a half-applied edit may remain.
promptYesNext message for the agent
schemaNoJSON Schema (draft-07 or 2020-12) for structured output: the agent ends with a matching JSON value as its final message, returned as `structured` instead of `text`
timeout_sNoWall-clock limit for the run in seconds; default from config (21600)
backgroundNoReturn as soon as the turn is running (or queued behind the session's current turn); collect the result with wait_thronglet
session_idYessession_id from run_thronglet

TDQS

A4.6/5.0
Behavior5/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 so well: turns never overlap, a message waits for the running turn, background returns {session_id, state, queued}, steer aborts the in-flight tool call and may leave a half-applied edit, and sessions whose harness cannot resume/load accept no messages at all. These are exactly the non-obvious behaviors an agent needs.

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 purpose and return shape are front-loaded in the first sentence, and no sentence is filler. However, several sentences pack multiple clauses (waiting semantics, steer ordering, harness failure) and require re-reading, which costs some clarity.

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

Completeness5/5

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

There is no output schema, but the description supplies the return shapes itself (same JSON as run_thronglet, or {session_id, state, queued} in background mode) and covers the failure case for non-resumable sessions. Nothing an agent needs to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so per-parameter meaning is already documented and a baseline of 3 applies. The description goes beyond the schema by explaining cross-parameter behavior: queued messages follow a steer, and the result of a background call must be collected with wait_thronglet.

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 first sentence states a specific verb+resource+scope: it sends the next message into an earlier session identified by a session_id from run_thronglet, and it returns the same JSON as run_thronglet. This clearly separates it from run_thronglet (which creates the session) and from 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?

It gives clear context for use: message an existing session, use background:true to return early and collect via wait_thronglet, use steer:true to interrupt a running turn. It implies but never explicitly states the alternative (start a new session with run_thronglet), so routing guidance is strong but not fully spelled out.

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

wait_throngletA

Waits until a session has no running or queued turn and returns the last turn's result: the same JSON as run_thronglet, or its error. With timeout_s elapsed returns {session_id, state, queued} instead. Idempotent: the result is stored with the session.

NameRequiredDescriptionDefault
timeout_sNoHow long to wait in seconds; default from config (21600). Elapsed → the session state, not an error
session_idYessession_id from run_thronglet

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the timeout behavior (returns {session_id, state, queued} instead of an error), idempotency, and that results are persisted with the session. It stops short of auth requirements or rate limits, but the core behavioral traits are covered.

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

Conciseness5/5

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

Three dense sentences with zero waste; the primary behavior is front-loaded and the timeout and idempotency caveats follow logically. Every sentence earns its place.

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 must explain return values, and it does: both the success path (run_thronglet JSON or its error) and the timeout path ({session_id, state, queued}). It leaves the possible 'state' values undefined, but for a wait primitive this is largely complete.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are already documented in the schema, and the description's timeout detail (state returned instead of error) mirrors the schema description rather than adding new meaning. Baseline 3 is appropriate when the schema does the heavy lifting.

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 (waits) and resource (session turn), and explicitly distinguishes itself from run_thronglet by noting it returns 'the same JSON as run_thronglet, or its error'. An agent can tell what this does and how it relates to the sibling without opening the schema.

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

Usage Guidelines3/5

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

The tie to run_thronglet ('session_id from run_thronglet', 'same JSON as run_thronglet') implies this is used to await a previously started run, but there is no explicit when-to-use or when-not guidance, nor a named alternative (e.g., polling run_thronglet). Usage is inferable but not stated.

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. 2 tool updatesv0.1.4
    • Changedrun_thronglet1 field changed
      • changedInput schema / properties / schema / description
        Previous value: -"JSON Schema (draft-07 or 2020-12) for structured output: the agent submits a matching result, returned as `structured` instead of `text`"New value: +"JSON Schema (draft-07 or 2020-12) for structured output: the agent ends with a matching JSON value as its final message, returned as `structured` instead of `text`"
    • Changedsend_message1 field changed
      • changedInput schema / properties / schema / description
        Previous value: -"JSON Schema (draft-07 or 2020-12) for structured output: the agent submits a matching result, returned as `structured` instead of `text`"New value: +"JSON Schema (draft-07 or 2020-12) for structured output: the agent ends with a matching JSON value as its final message, returned as `structured` instead of `text`"
  2. 1 tool updatev0.1.1
    • Changedrun_thronglet1 field changed
      • changedInput schema / properties / agent / description
        Previous value: -"<harness>/<model>[:<effort>], e.g. claude/opus[1m]:max, codex/gpt-6-sol:xhigh; valid values: list_harnesses"New value: +"<harness>/<model>[:<effort>], e.g. claude/opus:max, codex/gpt-6-sol:xhigh; valid values: list_harnesses"
  3. 6 tool updatesv0.1.0
    • First observedcancel_thronglet
    • First observedlist_harnesses
    • First observedlist_thronglets
    • First observedrun_thronglet
    • First observedsend_message
    • First observedwait_thronglet

TDQS

A4.3/5.0

Scored across 6 tools

Disambiguation5/5

Each tool maps to a clear, distinct operation: running a new agent, waiting on a session, sending a message to an existing session, cancelling, and two distinct listing tools (harnesses vs sessions). The run/send/wait/cancel lifecycle boundaries are well delineated.

Naming Consistency4/5

Five of six tools follow a consistent verb_noun pattern (run_thronglet, wait_thronglet, cancel_thronglet, list_harnesses, list_thronglets). send_message breaks the suffix convention but is still clear and consistent in its verb-first style.

Tool Count5/5

Six tools tightly cover the agent-session lifecycle (run, wait, message, cancel) plus discovery (list harnesses, list sessions). No bloat, no thin spots.

Completeness5/5

The full session lifecycle is covered: launch, observe, continue/steer, cancel, and both discovery surfaces. Background collection via wait_thronglet rounds out async workflows, leaving no obvious dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Wraps Claude Code as tools for MCP clients, enabling autonomous coding tasks via a 4-tool lifecycle with session management, async polling, and permission controls.
    4
    34 npm
    20
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to interact programmatically with Claude Code CLI, managing sessions, streaming outputs, and handling permission requests.
    7
    6 npm
    1
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables launching and supervising local Codex and Claude Code agent sessions and one-shot tasks, exposing run, list, stop, and output operations over MCP with session-scoped permissions and sandbox controls.
    2
    3,029 npm
    1
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables MCP clients to delegate prompts to locally configured Codex, Antigravity, OpenCode, and Claude Code agents, fetch live model catalogs and quotas, and maintain stateful multi-turn sessions with selectable tool policies.
    19
    41 PyPI
    MIT