Skip to main content
Glama

AgentNave

A thin local bridge from Agent Managers to CLI subagents.

AgentNave lets an Agent Manager launch Antigravity CLI, Claude Code, CodeBuddy Code, Codex CLI, Grok CLI, or Pi Coding Agent as subagents, one at a time or as a group answering in parallel or serial rounds. Each provider keeps its native authentication, configuration, permissions, and session model; AgentNave supplies the adapter and process supervision around it.

The boundary is intentional. AgentNave does not plan tasks, assign roles, build DAGs, choose parallelism, review results, synthesize answers, retry work, or manage worktrees. Those decisions belong to the calling Agent Manager, where the full task context already exists.

AgentNave has no human-facing CLI. The agentnave-mcp command is only the STDIO entry point used by a compatible MCP host.

What AgentNave owns

AgentNave

Calling Agent Manager

Provider command adapters

Planning and task decomposition

In-memory invocation lifecycle

Provider and model selection

POSIX process groups / Windows Job Objects

Parallelism, review, and synthesis

Normalized terminal results

Retries, permissions, and worktrees

In-memory parallel and serial group rounds

Who answers, in what order, and acceptance

Related MCP server: Claude Code Manager WAN

Requirements

  • Windows, macOS, or Linux

  • uv and Git (for installation from a release tag)

  • At least one authenticated provider CLI

uv installs AgentNave in an isolated Python 3.12 environment. A separately managed system Python is not required.

AgentNave uses dedicated POSIX process-group supervisors on macOS/Linux and kill-on-close Windows Job Objects on Windows. Windows providers are created suspended, assigned to the Job Object, and only then resumed so descendants cannot start outside the owned process tree.

Install

Install the MCP runtime and companion agentnave-manager Skill as a pair. The runtime exposes the tools; the Skill teaches the calling Agent how to use other CLIs. Planning, scheduling, review, retry decisions, and synthesis remain with the calling Agent.

Follow the installation guide to:

  1. Check the existing runtime's source, version and launcher; reuse it when suitable, or install the missing runtime with uv tool.

  2. Inspect the target host's effective MCP registration; reuse matching settings and add only a missing entry, with the host's provider exclusions.

  3. Reuse the matching Skill or install its complete directory, including references/, from the same release. Existing shared sources need only a discovery entry for the new host.

  4. Verify both MCP tools and Skill discovery; restart connections or sessions after changes.

Hosts under the same OS user and uv tool directories share installation files, but each MCP connection runs its own STDIO service process. Adding a host does not require reinstalling the runtime or authorize upgrading it for other hosts. The guide covers differences and shared updates.

The guide covers host registration, provider paths, Skill installation, paired upgrades, rollback, and removal. Provider CLIs must be installed and authenticated separately. uv manages only the runtime; it does not install the Skill or modify provider permissions and configuration.

The paired release is v0.17.0. Install the runtime and complete Skill directory from that tag. uv tool installs only the runtime; Skill discovery is a separate step. Hosts without Skill support can still use MCP alone. The older v0.5.0 tag contains only the runtime. v0.10.0 is the first paired release with native Windows support.

The agentnave package saves nothing: it creates no data directory, listens on no port and writes nothing to the caller's working directory. Provider authentication, configuration and native sessions remain owned by their respective CLIs.

Group rounds

open_group registers 2–6 seats in memory. A seat is an ordinary subagent: native tools and permissions, the group or its own cwd, and explicit provider options. run_round asks an ordered list of seats to answer one shared task once:

  • parallel: all start together and cannot see each other's answers in this round;

  • serial: one after another, each seeing the earlier answers.

Seats share only final answers. Each round's task, answers and absences (failed, blocked or cancelled seats) become entries; every seat receives the entries it has not yet seen and resumes its own native session, and an optional private instruction goes to one seat only. Independent answers, several independent rounds, turn-taking discussion or "answer first, then discuss" are combinations of lists and orders, not modes. wait_round and cancel_round mirror wait_agent and cancel_agent; cancel_agent on one seat records it absent and lets a serial round continue. Groups last only for the server process. Seats sharing one repository can interfere; give writing seats their own worktree through the seat cwd.

Later rounds receive earlier committed answers, even when every round is parallel. Switching from discussion to parallel does not restore blind answers; use new groups and native sessions when independence from earlier discussion matters. Serial order intentionally gives later seats more information; a final parallel round lets everyone respond to all earlier objections.

wait_round(include_output=false) omits answer bodies and running reply tails while keeping statuses, activity, errors and session IDs. The default remains true; answers can be read again with true, including Studio answers awaiting review. Finished round elapsed time is fixed. Round finished means orchestration ended, not that every seat succeeded. Unexpected driver or state-write failures return round status failed and an error; active seats are settled before another round starts.

AgentNave Studio

For multi-CLI shows that a person watches, register the agentnave-studio-mcp launcher instead; the same agentnave package installs it. It includes every core tool and adds saved history under ~/.agentnave/ (or AGENTNAVE_DATA_DIR), optional review of answers before other seats see them, host messages, isolated seats with restricted tools, and a local read-only dashboard that starts automatically after a saved task or show is created or continued. See the studio guide.

The MCP surface

This section describes v0.15.0, which retains native Windows process-tree supervision and the fixed five-minute wait contract introduced in v0.9.0. Start, wait and cancel use flat lifecycle responses; callers upgrading from v0.6.0 must also update their response handling and paired Skill. Restart the MCP connection after updating the runtime to refresh its schemas.

AgentNave exposes ten tools: six for single tasks and four for group rounds. The initial tool metadata contains a compact provider directory; provider-specific options are returned only when requested. Model defaults live in the Skill's per-CLI reference files, loaded only for the selected CLI.

describe_provider

Call with the selected provider before its first use in the current context. Returns that provider's permitted status and supported options. Reuse the result for later calls with the same provider. This tool neither launches a CLI nor checks installation or authentication; it does not consume provider quota or change the tool list.

For example: describe_provider({"provider": "grok"}) → start_agent(...) → wait_agent(...).

start_agent

Starts one provider invocation and immediately returns an in-memory invocation_id. It requires provider, prompt, and an absolute existing cwd; session_id and explicit provider_options are optional.

The startup reply also includes provider, model, and effort, without repeating the prompt. Model and effort reflect explicit request options, not verified effective CLI settings; omitted options are displayed as 继承原生设置 (inherit native settings).

Supported providers are antigravity, claude, codebuddy, codex, grok, and pi. The Skill provides model and effort defaults for the Manager to pass explicitly through allowlisted options. User choices override that guidance; omitted options still inherit native settings. Exclusions are configured per host process, independently of the model it uses. For Codex calls outside a Git repository, the Manager must pass {"skip_git_repo_check": true} in provider_options.

Pi Coding Agent uses pi --print --mode json, with prompts on stdin and native session IDs for continuation. Install it with npm install -g --ignore-scripts @earendil-works/pi-coding-agent, then run pi and /login. Omitted model and effort options use Pi's native settings; explicit effort maps to --thinking. Pi runs with the permissions of its launching process.

Choosing a model and reasoning effort

For Codex, explicitly pass {"dangerously_bypass_approvals_and_sandbox": true} in provider_options to enable native YOLO (--dangerously-bypass-approvals-and-sandbox). This skips approval prompts and disables sandboxing for that invocation, including when resuming a session. Only enable it when the user authorizes both effects. Passing false or omitting the option adds no flag and inherits native settings; it does not force a sandbox or approvals back on. The CLI's saved configuration is unchanged.

For Antigravity, explicitly pass {"dangerously_skip_permissions": true} in provider_options to enable native YOLO (--dangerously-skip-permissions) for one invocation. This auto-approves all native tool permission requests for that invocation without changing the CLI's saved configuration. Omit the option to inherit native settings, or pass false to explicitly disable the flag. Only enable it when the user authorizes permission bypass; mode and sandbox are separate options and do not imply YOLO.

On macOS, AgentNave prefers the executable CLI bundled with the ChatGPT desktop app, then the Codex desktop app, checking /Applications before ~/Applications for each. This follows desktop app updates instead of selecting an independently installed CLI by PATH. If no executable bundle is found, or on other platforms, AgentNave uses codex from PATH. AgentNave does not install or upgrade Codex, compare version numbers, or change its model settings.

To override the defaults for one task, tell your calling Agent the provider, model ID, and reasoning effort. For example: “Use Codex CLI with model gpt-6-astra and effort medium.” The Agent passes {"model": "gpt-6-astra", "effort": "medium"} in provider_options. Only specified fields override the Skill guidance. To keep your choices across tasks, put the same preference in your calling Agent's personal instructions. To use the CLI's native settings, explicitly ask the Agent to omit the corresponding options.

When a new model becomes available, use its exact ID from that provider's model list; updating AgentNave is not required to pass a new model ID. If you maintain a source installation and want to change the bundled defaults, edit the selected CLI file in skills/agentnave-manager/references/, then reload the Skill in a fresh context. An unavailable model should be reported rather than silently replaced.

wait_agent

Each request has a fixed five-minute (300-second) wait window; wait_agent accepts only invocation_id. Completion or a recognized execution blocker returns early. Expiry leaves the invocation running; call again with the same ID to continue. If a host yields a background call handle, resume that call using the host's wait mechanism before issuing another request.

Start, wait and cancel use one flat response: invocation_id, status, reason, elapsed_ms, plus applicable activity, error, output, output_age_ms and session_id fields. Reasons are started, wait_elapsed, execution_blocked and finished. Running replies include the latest public reply tail (at most 1,000 Unicode characters), retained across tool events, and its age. No new public reply means the same tail can recur; unavailable fields are omitted. There is no cursor, pagination or separate output-reading tool. Final replies are not subject to the tail limit. Provider usage/cost, native event names, tool call IDs, tool payloads and thinking are not returned. Public replies may still contain task data; this is not a redaction service.

execution_blocked leaves status=running: the Manager decides whether to keep waiting or cancel. Each recognized blocker category wakes once per invocation, avoiding repeated immediate returns from the same retry loop. Ordinary tool failures, transient retries and silence do not imply a blocker; unrecognized errors may only become visible in output or the final result. There is no unsolicited completion/error push without a pending wait request.

Wait expiry never terminates the invocation. AgentNave has no total runtime deadline and start_agent has no runtime-limit parameter. Keep waiting for the result or use cancel_agent to stop work explicitly. Provider-native limits still apply.

wait_any

Waits on several distinct, known invocation_ids with the same fixed five-minute window; an empty, repeated, unknown or expired ID rejects the whole call before waiting. It returns {"reason": "ready" | "wait_elapsed", "updates": [...]}, where each update has the wait_agent shape. ready lists every invocation that has finished or has an unread blocker at that moment; the others keep running and are omitted. Only blockers placed in the reply are consumed. Finished invocations stay ready on every call, so drop them from the next list. wait_elapsed returns a running snapshot of each invocation and consumes nothing.

cancel_agent

Stops an invocation and returns its terminal result. Use it only when the Manager intends to end active provider work; wait_agent observes without cancelling.

list_invocations

Read-only list of this server's active invocations and finished ones within the seven-day retention, oldest first: invocation_id, provider, cwd, status, elapsed_ms (fixed once finished) and events_seen (whether any structured provider event arrived), plus phase while active and a non-empty native session_id once finished. Prompts, replies and tool data are not returned; read results with wait_agent or wait_any.

All tools publish input and output JSON Schemas. Agent-correctable request errors are MCP Tool errors with retry guidance; provider launch and execution outcomes remain structured Invocation Results.

Output size

Each invocation retains at most 1 MiB of stdout (including required protocol data) and 64 KiB of stderr. Exceeding either limit fails the invocation with output_limit_exceeded and stops its process tree. Filtered providers retain the existing 8 MiB per-event parsing bound so large discarded tool/image events do not consume the reply budget. These are byte limits, not token or reply-length budgets. The Manager should request concise replies and account for all seats together. For large reports or attachments, a CLI with file tools can write an explicitly requested file and return a summary plus its absolute path; AgentNave does not transfer attachments or automatically save oversized replies. Isolated shows cannot rely on file tools.

Lifecycle and security

Invocation handles live only in the current MCP server process. When the server stops, AgentNave makes a best-effort attempt to terminate processes that remain in the provider process tree. A restart cannot recover old handles, but a retained provider session_id can be supplied to a new start_agent call.

Finished invocation records are automatically removed from memory seven days after completion, including unread results. Reads do not extend retention, and active invocations are never expired. Keep the final answer and native session_id before expiry; waiting or cancelling an expired handle returns a Tool error. Cleanup does not delete provider-native sessions, group answers, or Studio's saved history.

Running responses help inspect health and direction using a bounded public reply and native activity. They do not show every active operation or guarantee progress. Raw streams remain bounded in process memory; no output log/database is added. A 1,000-character reply tail is kept per invocation for waiting responses. Final results remain available for this server process.

Use the companion Skill's working-directory and target-path guidance to select cwd and describe the task in the prompt. Project rules load through the CLI's native mechanism. Antigravity can choose a different terminal Cwd: state the absolute project directory in the handoff, require that terminal directory explicitly, and verify it with pwd before project operations. This is a behavioral instruction, not enforced directory isolation. provider_options.project selects a native project ID or name; it is not a working-directory override. The companion Skill guides task handoffs and keeps intermediate files in OS temporary storage without imposing Markdown or a result-file format. AgentNave itself uses stdin/in-memory output except for Grok's temporary prompt file, which is removed after use. Provider-owned history and caches remain under provider control.

AgentNave is not a sandbox. On POSIX, a same-user provider with command permission can deliberately daemonize, kill its supervisor, or otherwise escape ordinary process-group cleanup. Windows Job Objects provide tree ownership but do not isolate the provider from the user account or the rest of the machine. Provider-native permissions remain the security boundary; use OS-level isolation when adversarial containment is required.

Verify

These checks are for a development checkout, not the uv tool installation above. See CONTRIBUTING.md for the complete contributor workflow.

uv sync --locked --all-groups
uv run ruff format --check .
uv run ruff check .
uv run pyright
uv run pytest

Contributing and security

Contributions are welcome through GitHub Issues and pull requests. See CONTRIBUTING.md for the development workflow and validation requirements.

Do not report security vulnerabilities in a public Issue. Follow SECURITY.md to use the repository's private vulnerability reporting channel.

License

AgentNave is licensed under the MIT License.

Available Tools

10 tools
cancel_agentCancel a subagent invocationA
DestructiveIdempotent

Stop a task by invocation_id; use wait_agent to observe without stopping.

Returns the cancelled or already-finished result. Does not undo prior CLI side effects. Finished invocation handles expire seven days after completion.

ParametersJSON Schema
NameRequiredDescriptionDefault
invocation_idYesInvocation ID returned by start_agent.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
modelNo
effortNo
outputNo
reasonYes
statusYes
activityNo
providerNo
elapsed_msYes
session_idNo
invocation_idYes
output_age_msNo

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that a cancellation of an already-finished task still returns a result (reinforcing idempotentHint), that prior CLI side effects are NOT undone (clarifying the destructiveHint), and that finished invocation handles expire after seven days. These are exactly the behavioral facts an agent cannot infer from the structured fields.

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

Conciseness5/5

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

Three short sentences plus a lifecycle note; the routing hint to wait_agent comes first and nothing is padded or repeated.

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?

Covers purpose, the sibling alternative, the mutation's limits, and the handle lifecycle, while an output schema already documents return structure. Nothing an agent needs to invoke this correctly is missing.

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% and the single parameter's description already points back to start_agent, so the schema does the heavy lifting. The description only restates that the task is keyed by invocation_id, adding no new format or constraint detail.

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 ('Stop a task') plus the keying parameter (invocation_id), and immediately contrasts with the sibling wait_agent. An agent can distinguish it from wait_agent and cancel_round 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 Guidelines5/5

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

Explicitly names the alternative ('use wait_agent to observe without stopping') and the condition that selects it, so the stop-vs-observe choice is fully resolved in the description.

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

cancel_roundCancel a group roundA
DestructiveIdempotent

Stop a round: running seats are cancelled and recorded absent, unstarted serial seats skip.

Answers that already succeeded are kept and committed. Does not undo CLI side effects.

ParametersJSON Schema
NameRequiredDescriptionDefault
round_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
orderYes
roundYes
seatsYes
reasonYes
statusYes
group_idYes
round_idYes
elapsed_msYes

TDQS

A3.8/5.0
Behavior5/5

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

Annotations declare destructive=true, idempotent=true, readOnly=false, but the description adds substantially more: running seats are cancelled and recorded absent, unstarted serial seats are skipped, already-succeeded answers are kept and committed, and CLI side effects are not undone. That is exactly the 'what gets destroyed and what survives' detail an agent needs before invoking a destructive 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?

Three short sentences, front-loaded with the core action and outcome, then the retention rule, then the caveat about CLI side effects. Nothing is redundant and each sentence carries distinct 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?

An output schema exists, so return values need not be explained, and the annotations plus description jointly cover the safety profile and per-seat cancellation semantics. The only real gap is usage guidance relative to wait_round and cancel_agent.

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% and the single round_id parameter is never mentioned in the description, so there is no format, source, or lookup guidance to compensate. The parameter name is largely self-explanatory given the tool name, which keeps this from being a 1.

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 precise verb+resource ('Stop a round') and immediately scopes what stopping means at seat level, which clearly separates it from run_round and wait_round. It never names a sibling or the alternative action, so it lands at 4 rather than 5.

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

Usage Guidelines3/5

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

The description implies the usage context (you cancel a round that is running) and even sketches what happens to different seat states, but it never states when to prefer this over waiting for a round or cancelling at the agent level. Guidance is implied rather than explicit.

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

describe_providerRead one CLI's permitted status and optionsA
Read-onlyIdempotent

Read one provider's permitted status and supported options.

Does not launch a CLI or check installation/login. permitted applies to start_agent; open_group accepts every provider.

ParametersJSON Schema
NameRequiredDescriptionDefault
providerYesProvider whose permitted status and options to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription
providerYes
permittedYes
supported_optionsYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/non-open-world, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: it explicitly denies side effects (no CLI launch, no install/login check), which prevents an agent from over-interpreting the call as a liveness probe.

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

Conciseness5/5

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

Three short sentences with zero filler, and the core purpose is front-loaded before the caveats. Nothing is repeated from the schema or annotations.

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 an output schema present, return-value detail is unnecessary, and annotations cover safety. The description supplies the scope caveats and sibling relationship an agent needs. It stops just short of stating the intended call order (describe_provider before start_agent), a minor residual gap.

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

Parameters3/5

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

There is a single parameter with 100% schema description coverage ('Provider whose permitted status and options to return'), so the schema already carries the meaning. The description adds no syntax, format, or defaulting detail beyond that, leaving this at the baseline-for-full-coverage score.

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 (read one provider's permitted status and supported options) with no tautology. It also pins the tool's scope relative to siblings, noting that the 'permitted' result is only relevant to start_agent and that open_group accepts every provider, so an agent can separate it from the start/run/wait family 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?

It gives clear exclusions ('does not launch a CLI or check installation/login') and ties its output to a concrete downstream decision ('permitted applies to start_agent'). The positive trigger — call this first to decide whether start_agent will succeed — is strongly implied but never stated as an explicit 'use when' rule.

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

list_invocationsList subagent invocationsA
Read-onlyIdempotent

List this server's active invocations and finished ones not yet expired, oldest first.

Metadata only: no prompt, reply or tool data. events_seen tells whether the CLI has emitted any structured event. Active entries include phase; finished ones keep a fixed elapsed_ms and include a non-empty native session_id. Use wait_agent or wait_any to read results.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
invocationsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already carry the safe-read profile (readOnly, idempotent, non-destructive, closed-world), but the description adds real behavioral context beyond them: metadata-only with no prompt/reply/tool data, oldest-first ordering, expiry of finished entries, and lifecycle semantics (active entries carry phase; finished ones hold a fixed elapsed_ms and a non-empty session_id). Field-by-field notes partially overlap with the output schema, keeping this short of a 5.

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

Conciseness5/5

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

Three tight sentences plus a routing clause; scope and ordering are front-loaded, and every sentence adds information (scope, data exclusions, field semantics, alternative routing) with no filler.

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

Completeness5/5

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

With an output schema present, the description need not explain return values, yet it still supplies the scope, ordering, expiry behavior, and data-exclusion guarantees an agent needs to call and interpret this correctly. Nothing material 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?

The tool takes zero parameters, so the schema imposes no semantic burden and the baseline is 4. The description correctly spends no words on parameters.

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

Purpose5/5

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

Specific verb (List) plus resource (this server's invocations) with a precise scope: active entries plus finished ones not yet expired, ordered oldest first. It is clearly separable from wait_agent/wait_any, which are for reading results rather than enumerating invocations.

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 final sentence explicitly routes the agent: 'Use wait_agent or wait_any to read results,' which implies list_invocations is for metadata enumeration only. It gives the alternative and the condition that selects it, but never states a positive when-to-use case or any exclusion for this tool itself.

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

open_groupOpen a group of CLI seatsA

Create an in-memory group of 2–6 CLI seats for collaborative rounds. Nothing is saved.

Seats are ordinary subagents: native tools and permissions, the given cwd, explicit options. Each seat keeps its own native session across rounds. Host exclusions do not apply to seats.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdYesAbsolute existing directory seats run in by default.
seatsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
seatsYes
group_idYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations only declare it is non-readonly, non-destructive, non-idempotent and closed-world. The description goes well beyond that by disclosing the in-memory lifecycle ('Nothing is saved'), that each seat retains its own native session across rounds, and that host exclusions do not apply to seats — all behavior an agent could not derive from structured fields. It stops short of covering failure modes or cleanup semantics, so not a 5.

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?

Three short sentences, front-loaded with the core action and scope, then the persistence caveat, then seat behavior. No filler. Minor density issue in 'native tools and permissions, the given cwd, explicit options', which is terse to the point of ambiguity.

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?

An output schema exists, so return values (presumably a group handle) need no explanation here. Given the tool's moderate complexity, the description covers the essential mental model — ephemeral grouping, seat count, per-seat session persistence. It omits what happens if a seat id collides or how a group is closed, which a mutation-style tool could reasonably state.

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 only 50%, so the description has to compensate. It does partially: 'the given cwd' and 'explicit options' map to the cwd/provider_options fields, and '2–6 CLI seats' restates the array bounds. But the seat 'id' pattern and provider enumeration get no added meaning, leaving the low-coverage half only loosely covered.

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

Purpose4/5

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

States a specific verb and resource with scope baked in: 'Create an in-memory group of 2–6 CLI seats for collaborative rounds.' An agent can tell this is a grouped-seat primitive distinct from a single-agent start. It does not, however, name any sibling (e.g. start_agent or run_round) to anchor the contrast, so it falls short of the top tier.

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?

'For collaborative rounds' implies the use case, and 'Nothing is saved' signals a session-style tool rather than a persisted one. But there is no explicit when-to-use rule, no when-not condition, and no pointer to alternatives such as start_agent for a single seat. Usage is left to inference.

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

run_roundRun one round of a groupA
Destructive

Start one round without waiting; use wait_round with the returned round_id.

Seats share only final answers. Each seat receives the entries it has not yet seen: earlier tasks, other seats' answers and absences. Parallel answers are committed together once every seat ends; serial answers are committed one by one. Failed, blocked or cancelled seats are recorded as absent and a serial round continues. No retries or per-seat deadlines.

ParametersJSON Schema
NameRequiredDescriptionDefault
orderYesparallel: all start together and cannot see each other's answer this round. serial: one by one in list order; later seats see earlier answers.
seatsYesOrdered seat ids that each answer once this round.
promptYesShared task for this round, visible to all seats.
group_idYes
instructionsNoOptional private instruction per seat id; never sent to other seats.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
orderYes
roundYes
seatsYes
reasonYes
statusYes
group_idYes
round_idYes
elapsed_msYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only say destructive/non-idempotent/open-world; the description goes well beyond them by disclosing what seats see, that parallel answers commit together while serial ones commit one-by-one, that failed/blocked/cancelled seats are recorded as absent with serial rounds continuing, and that there are no retries or per-seat deadlines.

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 the action and the wait_round handoff before any behavioral detail, which is the right ordering. It is dense but every sentence carries behavioral content; the later sentences are long and run together, slightly taxing to parse.

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?

Covers execution semantics, failure handling, and the round_id return path, and an output schema exists so return values need no elaboration. It omits prerequisites such as whether the group must be opened first and how this interacts with cancel_round, the one gap for a 5-parameter mutating orchestration 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 coverage is 80%, so the baseline is 3, but the description adds interpretive meaning to the `order` parameter by explaining the commit timing consequences of parallel vs serial that the schema only sketches. It does not clarify group_id or the privacy semantics of `instructions` beyond what the schema states.

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 ('Start one round') and immediately distinguishes itself from the sibling wait_round by naming it and the round_id handoff. An agent can select it against open_group/wait_round/cancel_round 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?

Gives explicit sequencing guidance: run non-blocking, then call wait_round with the returned round_id. It does not cover when-not-to-use or the relationship to cancel_round/open_group, so it stops short of full routing.

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

start_agentRun a task with a local AI CLIA
Destructive

Start one CLI invocation and return its invocation_id; use wait_agent for the result.

The reply includes the CLI and requested model/effort; omitted options show native inheritance. These are requested settings, not confirmation of the CLI's effective settings. AgentNave imposes no runtime deadline; use cancel_agent to stop work explicitly. Provider-native limits still apply. Active invocations do not accept messages. To continue a finished conversation, pass its returned native session_id with a new prompt to a new start_agent call.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdYesAbsolute existing directory where the subagent runs.
promptYesComplete task, context, constraints, and expected output; the CLI does not inherit this conversation.
providerYesCLI requested by the user, not a model ID. Providers permitted by this host configuration: antigravity, claude, codebuddy, codex, grok, pi. Excluded providers: none. start_agent rejects excluded providers; groups may seat any provider.
session_idNoTo continue a conversation, use the session_id returned by a finished invocation of the same provider; omit for a new conversation. Never use an invocation_id here.
provider_optionsNoExplicit options for the selected CLI. Call describe_provider(provider) for supported keys. Omitted options inherit native CLI settings.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
modelNo
effortNo
outputNo
reasonYes
statusYes
activityNo
providerNo
elapsed_msYes
session_idNo
invocation_idYes
output_age_msNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare destructiveHint=true and openWorldHint=true; the description adds real value beyond them by disclosing there is no runtime deadline, that provider-native limits still apply, that returned settings are requests rather than confirmed effective settings, and that active invocations reject messages. It notably never addresses the destructive risk implied by the annotations (the CLI runs against a real cwd), which is the one behavioral 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.

Conciseness4/5

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

The output contract (invocation_id) is front-loaded in the first clause, followed by lifecycle routing, then caveats. Six short sentences, each carrying a distinct point; only 'Provider-native limits still apply' feels like filler.

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 an output schema, full param coverage, and safety annotations already present, the description covers the lifecycle and the settings-inheritance semantics an agent needs. It stops short of describing failure modes or the practical consequence of running a destructive CLI in cwd.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents cwd, prompt, provider, session_id, and provider_options thoroughly. The description's parameter-related content (requested vs. effective settings, session continuation) largely restates what the schema already says, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Start one CLI invocation') and immediately names its return value (invocation_id), which distinguishes it from siblings like wait_agent. An agent can tell this is the entry point of the agent lifecycle without opening any schema.

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

Usage Guidelines5/5

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

Explicitly routes to alternatives: 'use wait_agent for the result' and 'use cancel_agent to stop work explicitly.' It also states the continuation rule (pass a finished invocation's native session_id to a new start_agent call), covering both when to use this tool and how it relates to the rest of the lifecycle.

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

wait_agentWait for a subagent invocationA
Read-onlyIdempotent

Wait for a fixed window of five minutes; completion or an explicit CLI execution blocker returns early.

Running responses include the latest public reply tail (at most 1000 characters) and its age. execution_blocked leaves the CLI running: continue waiting or cancel with the same ID. Each blocker category wakes once per invocation. Ordinary tool failures, transient retries, and silence are not proof the task cannot proceed. Finished responses contain the final reply. Wait expiry leaves the invocation running. Call again with the same ID to continue. This is request/response waiting, not a background notification subscription. Finished invocation handles expire seven days after completion, even if not yet read.

ParametersJSON Schema
NameRequiredDescriptionDefault
invocation_idYesInvocation ID returned by start_agent.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
modelNo
effortNo
outputNo
reasonYes
statusYes
activityNo
providerNo
elapsed_msYes
session_idNo
invocation_idYes
output_age_msNo

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, yet the description adds substantial behavior beyond them: a fixed five-minute window with early return, the shape of a running response (reply tail capped at 1000 chars plus its age), execution_blocked semantics and per-invocation blocker waking, one-shot blocker categories, the warning that failures/retries/silence are not proof of a stall, and seven-day handle expiry. That is exactly the kind of context annotations cannot carry.

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 wait window and early-return conditions, then layered with edge cases. It is dense and a few clauses (e.g. final-reply wording, the 7-day expiry line) could be tightened, but nearly every sentence carries distinct behavioral information rather than restating the schema.

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 an output schema present, the description need not define return values, yet it usefully characterizes running vs finished vs execution_blocked states. Coverage of continuation, expiry, and blocker behavior is strong; it is only slightly short on what happens for an unknown/expired/foreign invocation ID.

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% and the schema already says invocation_id comes from start_agent, so the baseline is 3. The description still adds meaning by stressing that the same ID is reused across successive waits and cancel calls, clarifying that it is a persistent handle rather than a one-shot token.

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 (wait on a subagent invocation) and immediately scopes it. It is distinguishable from siblings: start_agent produces the ID, cancel_agent is the alternative exit path, and the last line explicitly rules out that this is a background notification subscription.

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 operational context: call repeatedly with the same ID to continue after expiry, and cancel with the same ID if desired. It also draws an explicit boundary ('request/response waiting, not a background notification subscription'), though it never enumerates a when-not-to-use case against a named sibling beyond the implicit cancel path.

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

wait_anyWait for any of several subagent invocationsA
Read-onlyIdempotent

Wait up to five minutes for the first of several invocations to finish or report a blocker.

reason=ready returns every listed invocation that is finished or has an unread blocker, in wait_agent's shape; the others keep running and are not in updates. Only the blockers returned are consumed; a later wait still returns the rest. Finished invocations stay ready on every call, so drop them from the next list. reason=wait_elapsed returns a running snapshot of each and consumes nothing. Empty, repeated, unknown or expired IDs reject the whole call before waiting.

ParametersJSON Schema
NameRequiredDescriptionDefault
invocation_idsYesDistinct invocation IDs returned by start_agent; all must be known.

Output Schema

ParametersJSON Schema
NameRequiredDescription
reasonYes
updatesYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds genuinely useful behavior beyond them: the five-minute ceiling, that finished invocations remain ready on every call, that only returned blockers are consumed while the rest survive, and that the call fails fast on empty/repeated/unknown/expired IDs. Minor tension with readOnlyHint exists in the 'consumes' semantics, but consumption is scoped to unread blocker markers rather than the invocations themselves.

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 each subsequent clause carries a distinct, actionable fact (timeout, consumption, retry behavior, error handling) with no filler. It is dense and slightly run-on, but nothing reads as redundant padding.

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 an output schema present the description need not detail return fields, yet it still points to wait_agent's shape and explains the ready vs wait_elapsed snapshots. Combined with the annotated safety profile and fully documented single parameter, the definition is sufficient; only the missing 'reason' selector keeps it short of complete.

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% for the single parameter, so the baseline is 3. The description adds real meaning over the schema: the all-or-nothing validation rule ('reject the whole call before waiting') and the constraint that IDs must be known/distinct. It does reference a 'reason=ready'/'reason=wait_elapsed' selector that does not appear in the input schema, which slightly muddies the parameter story.

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 opening sentence names a specific verb and resource and pins the scope precisely: 'Wait up to five minutes for the first of several invocations to finish or report a blocker.' The 'several'/'first' framing implicitly separates it from the single-invocation wait_agent sibling, but no sibling is named as an alternative, so differentiation is left to inference.

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

Usage Guidelines3/5

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

Usage is implied by the semantics ('reason=ready returns every listed invocation that is finished...; reason=wait_elapsed returns a running snapshot'), so an agent can infer which mode yields which behavior. However, there is no explicit when-to-use/when-not guidance and no routing against wait_agent, wait_round, or list_invocations, all of which overlap.

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

wait_roundWait for a group roundA
Read-onlyIdempotent

Wait up to five minutes; returns early when the round finishes or a seat reports a blocker.

Running seats include activity and their latest reply tail. A blocker leaves that seat running: keep waiting, or cancel_agent its invocation_id to record it absent. Finished rounds can be read again. Set include_output=false to omit answer bodies and reply tails; later calls with include_output=true still return the full captured answers.

ParametersJSON Schema
NameRequiredDescriptionDefault
round_idYes
include_outputNoInclude answer bodies and running reply tails; false returns status only.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
orderYes
roundYes
seatsYes
reasonYes
statusYes
group_idYes
round_idYes
elapsed_msYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish the safe, idempotent, non-destructive read profile, and the description adds real behavior beyond that: the five-minute ceiling, early return on completion or blocker, the fact that a blocked seat stays running, and that include_output=false loses nothing because later calls with true return full answers. It does not cover auth requirements, rate limits, or concurrency behavior.

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 timeout and return condition, then the blocker workflow, then the output toggle. Dense and useful, though the reply-tail concept is restated in two sentences where one would suffice.

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?

An output schema exists, so return shape need not be explained; the description covers the asynchronous waiting semantics, blocker handling, and the include_output tradeoff well. The remaining hole is round_id semantics and the relationship to wait_agent, which an agent must guess.

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 50%: include_output is documented in the schema, while round_id has no description anywhere. The description adds useful semantics for include_output (data is not lost, later true calls return full answers) but contributes nothing about round_id's format or provenance, so it only partially compensates for the 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?

The description names a specific verb ('Wait'), the resource ('round'), and the bounded scope ('up to five minutes') with the early-return conditions. It implicitly separates itself from wait_agent by operating on a round rather than a single agent, but it never explicitly contrasts the two sibling wait tools, so the differentiation is left partly to inference.

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

Usage Guidelines4/5

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

It gives clear operational context: call it while a round is running, keep waiting or use cancel_agent when a blocker appears, and set include_output=false when only status is wanted. It stops short of stating when to prefer wait_round over wait_agent or when not to call it at all.

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.17.0
    • Addedlist_invocations
    • Addedwait_any
  2. 8 tool updatesv0.16.1
    • Changedcancel_agent3 fields changed
      • addedOutput schema / properties / effort
        Added value: +{
        +  "title": "Effort",
        +  "type": "string"
        +}
      • addedOutput schema / properties / model
        Added value: +{
        +  "title": "Model",
        +  "type": "string"
        +}
      • addedOutput schema / properties / provider
        Added value: +{
        +  "title": "Provider",
        +  "type": "string"
        +}
    • Addedcancel_round
    • Changeddescribe_provider2 fields changed
      • changedInput schema / $defs / ProviderName / enum
        Previous value: -[
        -  "antigravity",
        -  "claude",
        -  "codebuddy",
        -  "codex",
        -  "grok"
        -]New value: +[
        +  "antigravity",
        +  "claude",
        +  "codebuddy",
        +  "codex",
        +  "grok",
        +  "pi"
        +]
      • changedOutput schema / $defs / ProviderName / enum
        Previous value: -[
        -  "antigravity",
        -  "claude",
        -  "codebuddy",
        -  "codex",
        -  "grok"
        -]New value: +[
        +  "antigravity",
        +  "claude",
        +  "codebuddy",
        +  "codex",
        +  "grok",
        +  "pi"
        +]
    • Addedopen_group
    • Addedrun_round
    • Changedstart_agent5 fields changed
      • changedInput schema / $defs / ProviderName / enum
        Previous value: -[
        -  "antigravity",
        -  "claude",
        -  "codebuddy",
        -  "codex",
        -  "grok"
        -]New value: +[
        +  "antigravity",
        +  "claude",
        +  "codebuddy",
        +  "codex",
        +  "grok",
        +  "pi"
        +]
      • changedInput schema / properties / provider / description
        Previous value: -"CLI requested by the user, not a model ID. Providers permitted by this host configuration: antigravity, claude, codebuddy, codex, grok. Excluded providers: none. Excluded providers are rejected before launch."New value: +"CLI requested by the user, not a model ID. Providers permitted by this host configuration: antigravity, claude, codebuddy, codex, grok, pi. Excluded providers: none. start_agent rejects excluded providers; groups may seat any provider."
      • addedOutput schema / properties / effort
        Added value: +{
        +  "title": "Effort",
        +  "type": "string"
        +}
      • addedOutput schema / properties / model
        Added value: +{
        +  "title": "Model",
        +  "type": "string"
        +}
      • addedOutput schema / properties / provider
        Added value: +{
        +  "title": "Provider",
        +  "type": "string"
        +}
    • Changedwait_agent3 fields changed
      • addedOutput schema / properties / effort
        Added value: +{
        +  "title": "Effort",
        +  "type": "string"
        +}
      • addedOutput schema / properties / model
        Added value: +{
        +  "title": "Model",
        +  "type": "string"
        +}
      • addedOutput schema / properties / provider
        Added value: +{
        +  "title": "Provider",
        +  "type": "string"
        +}
    • Addedwait_round
  3. 3 tool updatesv0.9.0
    • Changedcancel_agent1 field changed
      • changedOutput schema / properties / status / enum
        Previous value: -[
        -  "running",
        -  "succeeded",
        -  "failed",
        -  "blocked",
        -  "cancelled",
        -  "timed_out"
        -]New value: +[
        +  "running",
        +  "succeeded",
        +  "failed",
        +  "blocked",
        +  "cancelled"
        +]
    • Changedstart_agent2 fields changed
      • removedInput schema / properties / timeout_seconds
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "exclusiveMinimum": 0,
        -      "maximum": 86400,
        -      "type": "number"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Optional total runtime limit in seconds; expiry stops the invocation. Omit or null for no AgentNave deadline; native CLI limits still apply.",
        -  "title": "Timeout Seconds"
        -}
      • changedOutput schema / properties / status / enum
        Previous value: -[
        -  "running",
        -  "succeeded",
        -  "failed",
        -  "blocked",
        -  "cancelled",
        -  "timed_out"
        -]New value: +[
        +  "running",
        +  "succeeded",
        +  "failed",
        +  "blocked",
        +  "cancelled"
        +]
    • Changedwait_agent2 fields changed
      • removedInput schema / properties / wait_timeout_seconds
        Removed value: -{
        -  "default": 600,
        -  "description": "Seconds to wait for this response; expiry leaves the invocation running.",
        -  "exclusiveMinimum": 0,
        -  "maximum": 600,
        -  "title": "Wait Timeout Seconds",
        -  "type": "number"
        -}
      • changedOutput schema / properties / status / enum
        Previous value: -[
        -  "running",
        -  "succeeded",
        -  "failed",
        -  "blocked",
        -  "cancelled",
        -  "timed_out"
        -]New value: +[
        +  "running",
        +  "succeeded",
        +  "failed",
        +  "blocked",
        +  "cancelled"
        +]
  4. 4 tool updatesv0.7.0
    • Changedcancel_agent19 fields changed
      • addedOutput schema / $defs / ActivityPayload
        Added value: +{
        +  "properties": {
        +    "age_ms": {
        +      "title": "Age Ms",
        +      "type": "integer"
        +    },
        +    "kind": {
        +      "title": "Kind",
        +      "type": "string"
        +    },
        +    "state": {
        +      "title": "State",
        +      "type": "string"
        +    },
        +    "tool_name": {
        +      "title": "Tool Name",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "title": "ActivityPayload",
        +  "type": "object"
        +}
      • removedOutput schema / $defs / InvocationErrorPayload / properties / details
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "title": "Details"
        -}
      • changedOutput schema / $defs / InvocationErrorPayload / required
        Previous value: -[
        -  "code",
        -  "message",
        -  "details"
        -]New value: +[
        +  "code",
        +  "message"
        +]
      • removedOutput schema / $defs / InvocationResultPayload
        Removed value: -{
        -  "properties": {
        -    "duration_ms": {
        -      "title": "Duration Ms",
        -      "type": "integer"
        -    },
        -    "error": {
        -      "anyOf": [
        -        {
        -          "$ref": "#/$defs/InvocationErrorPayload"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ]
        -    },
        -    "output": {
        -      "title": "Output",
        -      "type": "string"
        -    },
        -    "provider": {
        -      "$ref": "#/$defs/ProviderName"
        -    },
        -    "provider_usage": {
        -      "$ref": "#/$defs/ProviderUsagePayload"
        -    },
        -    "session_id": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Session Id"
        -    },
        -    "status": {
        -      "$ref": "#/$defs/InvocationStatusName"
        -    }
        -  },
        -  "required": [
        -    "status",
        -    "provider",
        -    "output",
        -    "session_id",
        -    "provider_usage",
        -    "duration_ms",
        -    "error"
        -  ],
        -  "title": "InvocationResultPayload",
        -  "type": "object"
        -}
      • removedOutput schema / $defs / InvocationStatusName
        Removed value: -{
        -  "enum": [
        -    "succeeded",
        -    "failed",
        -    "blocked",
        -    "cancelled",
        -    "timed_out"
        -  ],
        -  "type": "string"
        -}
      • removedOutput schema / $defs / ProviderName
        Removed value: -{
        -  "enum": [
        -    "antigravity",
        -    "claude",
        -    "codebuddy",
        -    "codex",
        -    "grok"
        -  ],
        -  "type": "string"
        -}
      • removedOutput schema / $defs / ProviderUsagePayload
        Removed value: -{
        -  "properties": {
        -    "num_turns": {
        -      "title": "Num Turns",
        -      "type": "integer"
        -    },
        -    "total_cost_usd": {
        -      "title": "Total Cost Usd",
        -      "type": "number"
        -    }
        -  },
        -  "title": "ProviderUsagePayload",
        -  "type": "object"
        -}
      • addedOutput schema / properties / activity
        Added value: +{
        +  "$ref": "#/$defs/ActivityPayload"
        +}
      • addedOutput schema / properties / elapsed_ms
        Added value: +{
        +  "title": "Elapsed Ms",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "$ref": "#/$defs/InvocationErrorPayload"
        +}
      • addedOutput schema / properties / output
        Added value: +{
        +  "title": "Output",
        +  "type": "string"
        +}
      • addedOutput schema / properties / output_age_ms
        Added value: +{
        +  "title": "Output Age Ms",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / reason
        Added value: +{
        +  "enum": [
        +    "started",
        +    "wait_elapsed",
        +    "execution_blocked",
        +    "finished"
        +  ],
        +  "title": "Reason",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "$ref": "#/$defs/InvocationResultPayload"
        -}
      • addedOutput schema / properties / session_id
        Added value: +{
        +  "title": "Session Id",
        +  "type": "string"
        +}
      • removedOutput schema / properties / state
        Removed value: -{
        -  "const": "finished",
        -  "title": "State",
        -  "type": "string"
        -}
      • addedOutput schema / properties / status
        Added value: +{
        +  "enum": [
        +    "running",
        +    "succeeded",
        +    "failed",
        +    "blocked",
        +    "cancelled",
        +    "timed_out"
        +  ],
        +  "title": "Status",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "invocation_id",
        -  "state",
        -  "result"
        -]New value: +[
        +  "invocation_id",
        +  "status",
        +  "reason",
        +  "elapsed_ms"
        +]
      • changedOutput schema / title
        Previous value: -"CancelAgentPayload"New value: +"InvocationPayload"
    • Changeddescribe_provider4 fields changed
      • changedInput schema / properties / provider / description
        Previous value: -"Provider to describe before using start_agent."New value: +"Provider whose permitted status and options to return."
      • removedOutput schema / properties / defaults
        Removed value: -{
        -  "additionalProperties": {
        -    "type": "string"
        -  },
        -  "title": "Defaults",
        -  "type": "object"
        -}
      • removedOutput schema / properties / guidance
        Removed value: -{
        -  "title": "Guidance",
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "provider",
        -  "permitted",
        -  "defaults",
        -  "supported_options",
        -  "guidance"
        -]New value: +[
        +  "provider",
        +  "permitted",
        +  "supported_options"
        +]
    • Changedstart_agent20 fields changed
      • changedInput schema / properties / provider / description
        Previous value: -"CLI requested by the user, not a model ID. Providers permitted by this host configuration: antigravity, claude, codebuddy, codex, grok. Excluded providers: none. Exclusions are enforced before an invocation is created. Choose an installed, authenticated permitted CLI; if none is available, report the blocker instead of falling back to an excluded provider."New value: +"CLI requested by the user, not a model ID. Providers permitted by this host configuration: antigravity, claude, codebuddy, codex, grok. Excluded providers: none. Excluded providers are rejected before launch."
      • changedInput schema / properties / provider_options / description
        Previous value: -"Explicit options for the selected CLI. Call describe_provider(provider) for supported keys and model/effort defaults; user choices override those defaults."New value: +"Explicit options for the selected CLI. Call describe_provider(provider) for supported keys. Omitted options inherit native CLI settings."
      • addedInput schema / properties / timeout_seconds / anyOf
        Added value: +[
        +  {
        +    "exclusiveMinimum": 0,
        +    "maximum": 86400,
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / timeout_seconds / default
        Previous value: -1800New value: +null
      • changedInput schema / properties / timeout_seconds / description
        Previous value: -"Total runtime limit in seconds; expiry stops the invocation."New value: +"Optional total runtime limit in seconds; expiry stops the invocation. Omit or null for no AgentNave deadline; native CLI limits still apply."
      • removedInput schema / properties / timeout_seconds / exclusiveMinimum
        Removed value: -0
      • removedInput schema / properties / timeout_seconds / maximum
        Removed value: -86400
      • removedInput schema / properties / timeout_seconds / type
        Removed value: -"number"
      • addedOutput schema / $defs
        Added value: +{
        +  "ActivityPayload": {
        +    "properties": {
        +      "age_ms": {
        +        "title": "Age Ms",
        +        "type": "integer"
        +      },
        +      "kind": {
        +        "title": "Kind",
        +        "type": "string"
        +      },
        +      "state": {
        +        "title": "State",
        +        "type": "string"
        +      },
        +      "tool_name": {
        +        "title": "Tool Name",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind"
        +    ],
        +    "title": "ActivityPayload",
        +    "type": "object"
        +  },
        +  "InvocationErrorPayload": {
        +    "properties": {
        +      "code": {
        +        "title": "Code",
        +        "type": "string"
        +      },
        +      "message": {
        +        "title": "Message",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "code",
        +      "message"
        +    ],
        +    "title": "InvocationErrorPayload",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties / activity
        Added value: +{
        +  "$ref": "#/$defs/ActivityPayload"
        +}
      • addedOutput schema / properties / elapsed_ms
        Added value: +{
        +  "title": "Elapsed Ms",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "$ref": "#/$defs/InvocationErrorPayload"
        +}
      • addedOutput schema / properties / output
        Added value: +{
        +  "title": "Output",
        +  "type": "string"
        +}
      • addedOutput schema / properties / output_age_ms
        Added value: +{
        +  "title": "Output Age Ms",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / reason
        Added value: +{
        +  "enum": [
        +    "started",
        +    "wait_elapsed",
        +    "execution_blocked",
        +    "finished"
        +  ],
        +  "title": "Reason",
        +  "type": "string"
        +}
      • addedOutput schema / properties / session_id
        Added value: +{
        +  "title": "Session Id",
        +  "type": "string"
        +}
      • removedOutput schema / properties / state
        Removed value: -{
        -  "const": "running",
        -  "title": "State",
        -  "type": "string"
        -}
      • addedOutput schema / properties / status
        Added value: +{
        +  "enum": [
        +    "running",
        +    "succeeded",
        +    "failed",
        +    "blocked",
        +    "cancelled",
        +    "timed_out"
        +  ],
        +  "title": "Status",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "invocation_id",
        -  "state"
        -]New value: +[
        +  "invocation_id",
        +  "status",
        +  "reason",
        +  "elapsed_ms"
        +]
      • changedOutput schema / title
        Previous value: -"StartAgentPayload"New value: +"InvocationPayload"
    • Changedwait_agent24 fields changed
      • changedInput schema / properties / wait_timeout_seconds / default
        Previous value: -30New value: +600
      • changedInput schema / properties / wait_timeout_seconds / maximum
        Previous value: -300New value: +600
      • addedOutput schema / $defs / ActivityPayload
        Added value: +{
        +  "properties": {
        +    "age_ms": {
        +      "title": "Age Ms",
        +      "type": "integer"
        +    },
        +    "kind": {
        +      "title": "Kind",
        +      "type": "string"
        +    },
        +    "state": {
        +      "title": "State",
        +      "type": "string"
        +    },
        +    "tool_name": {
        +      "title": "Tool Name",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "title": "ActivityPayload",
        +  "type": "object"
        +}
      • removedOutput schema / $defs / InvocationErrorPayload / properties / details
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "title": "Details"
        -}
      • changedOutput schema / $defs / InvocationErrorPayload / required
        Previous value: -[
        -  "code",
        -  "message",
        -  "details"
        -]New value: +[
        +  "code",
        +  "message"
        +]
      • removedOutput schema / $defs / InvocationPhaseName
        Removed value: -{
        -  "enum": [
        -    "preparing",
        -    "running",
        -    "stopping"
        -  ],
        -  "type": "string"
        -}
      • removedOutput schema / $defs / InvocationResultPayload
        Removed value: -{
        -  "properties": {
        -    "duration_ms": {
        -      "title": "Duration Ms",
        -      "type": "integer"
        -    },
        -    "error": {
        -      "anyOf": [
        -        {
        -          "$ref": "#/$defs/InvocationErrorPayload"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ]
        -    },
        -    "output": {
        -      "title": "Output",
        -      "type": "string"
        -    },
        -    "provider": {
        -      "$ref": "#/$defs/ProviderName"
        -    },
        -    "provider_usage": {
        -      "$ref": "#/$defs/ProviderUsagePayload"
        -    },
        -    "session_id": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Session Id"
        -    },
        -    "status": {
        -      "$ref": "#/$defs/InvocationStatusName"
        -    }
        -  },
        -  "required": [
        -    "status",
        -    "provider",
        -    "output",
        -    "session_id",
        -    "provider_usage",
        -    "duration_ms",
        -    "error"
        -  ],
        -  "title": "InvocationResultPayload",
        -  "type": "object"
        -}
      • removedOutput schema / $defs / InvocationSnapshotPayload
        Removed value: -{
        -  "properties": {
        -    "elapsed_ms": {
        -      "title": "Elapsed Ms",
        -      "type": "integer"
        -    },
        -    "last_event_age_ms": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "title": "Last Event Age Ms"
        -    },
        -    "phase": {
        -      "$ref": "#/$defs/InvocationPhaseName"
        -    }
        -  },
        -  "required": [
        -    "phase",
        -    "elapsed_ms",
        -    "last_event_age_ms"
        -  ],
        -  "title": "InvocationSnapshotPayload",
        -  "type": "object"
        -}
      • removedOutput schema / $defs / InvocationStatusName
        Removed value: -{
        -  "enum": [
        -    "succeeded",
        -    "failed",
        -    "blocked",
        -    "cancelled",
        -    "timed_out"
        -  ],
        -  "type": "string"
        -}
      • removedOutput schema / $defs / ProviderName
        Removed value: -{
        -  "enum": [
        -    "antigravity",
        -    "claude",
        -    "codebuddy",
        -    "codex",
        -    "grok"
        -  ],
        -  "type": "string"
        -}
      • removedOutput schema / $defs / ProviderUsagePayload
        Removed value: -{
        -  "properties": {
        -    "num_turns": {
        -      "title": "Num Turns",
        -      "type": "integer"
        -    },
        -    "total_cost_usd": {
        -      "title": "Total Cost Usd",
        -      "type": "number"
        -    }
        -  },
        -  "title": "ProviderUsagePayload",
        -  "type": "object"
        -}
      • addedOutput schema / properties / activity
        Added value: +{
        +  "$ref": "#/$defs/ActivityPayload"
        +}
      • addedOutput schema / properties / elapsed_ms
        Added value: +{
        +  "title": "Elapsed Ms",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "$ref": "#/$defs/InvocationErrorPayload"
        +}
      • addedOutput schema / properties / output
        Added value: +{
        +  "title": "Output",
        +  "type": "string"
        +}
      • addedOutput schema / properties / output_age_ms
        Added value: +{
        +  "title": "Output Age Ms",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / reason
        Added value: +{
        +  "enum": [
        +    "started",
        +    "wait_elapsed",
        +    "execution_blocked",
        +    "finished"
        +  ],
        +  "title": "Reason",
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "$ref": "#/$defs/InvocationResultPayload"
        -}
      • addedOutput schema / properties / session_id
        Added value: +{
        +  "title": "Session Id",
        +  "type": "string"
        +}
      • removedOutput schema / properties / snapshot
        Removed value: -{
        -  "$ref": "#/$defs/InvocationSnapshotPayload"
        -}
      • removedOutput schema / properties / state
        Removed value: -{
        -  "enum": [
        -    "running",
        -    "finished"
        -  ],
        -  "title": "State",
        -  "type": "string"
        -}
      • addedOutput schema / properties / status
        Added value: +{
        +  "enum": [
        +    "running",
        +    "succeeded",
        +    "failed",
        +    "blocked",
        +    "cancelled",
        +    "timed_out"
        +  ],
        +  "title": "Status",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "invocation_id",
        -  "state"
        -]New value: +[
        +  "invocation_id",
        +  "status",
        +  "reason",
        +  "elapsed_ms"
        +]
      • changedOutput schema / title
        Previous value: -"WaitAgentPayload"New value: +"InvocationPayload"
  5. 3 tool updatesv0.5.0
    • Addeddescribe_provider
    • Changedstart_agent5 fields changed
      • changedInput schema / properties / prompt / description
        Previous value: -"Complete, self-contained task for the subagent."New value: +"Complete task, context, constraints, and expected output; the CLI does not inherit this conversation."
      • changedInput schema / properties / provider / description
        Previous value: -"Local subagent provider to launch."New value: +"CLI requested by the user, not a model ID. Providers permitted by this host configuration: antigravity, claude, codebuddy, codex, grok. Excluded providers: none. Exclusions are enforced before an invocation is created. Choose an installed, authenticated permitted CLI; if none is available, report the blocker instead of falling back to an excluded provider."
      • changedInput schema / properties / provider_options / description
        Previous value: -"Explicit provider-native options. Omit to inherit the provider's own settings; supported keys depend on the selected provider."New value: +"Explicit options for the selected CLI. Call describe_provider(provider) for supported keys and model/effort defaults; user choices override those defaults."
      • changedInput schema / properties / session_id / description
        Previous value: -"Provider session ID returned by an earlier finished invocation."New value: +"To continue a conversation, use the session_id returned by a finished invocation of the same provider; omit for a new conversation. Never use an invocation_id here."
      • changedInput schema / properties / timeout_seconds / description
        Previous value: -"Maximum provider runtime in seconds."New value: +"Total runtime limit in seconds; expiry stops the invocation."
    • Changedwait_agent1 field changed
      • changedInput schema / properties / wait_timeout_seconds / description
        Previous value: -"Maximum time to wait during this call, in seconds."New value: +"Seconds to wait for this response; expiry leaves the invocation running."
  6. 3 tool updatesv0.3.0
    • Changedcancel_agent1 field changed
      • changedOutput schema / $defs / ProviderName / enum
        Previous value: -[
        -  "antigravity",
        -  "claude",
        -  "codebuddy",
        -  "grok"
        -]New value: +[
        +  "antigravity",
        +  "claude",
        +  "codebuddy",
        +  "codex",
        +  "grok"
        +]
    • Changedstart_agent1 field changed
      • changedInput schema / $defs / ProviderName / enum
        Previous value: -[
        -  "antigravity",
        -  "claude",
        -  "codebuddy",
        -  "grok"
        -]New value: +[
        +  "antigravity",
        +  "claude",
        +  "codebuddy",
        +  "codex",
        +  "grok"
        +]
    • Changedwait_agent1 field changed
      • changedOutput schema / $defs / ProviderName / enum
        Previous value: -[
        -  "antigravity",
        -  "claude",
        -  "codebuddy",
        -  "grok"
        -]New value: +[
        +  "antigravity",
        +  "claude",
        +  "codebuddy",
        +  "codex",
        +  "grok"
        +]
  7. 3 tool updatesv0.2.0
    • First observedcancel_agent
    • First observedstart_agent
    • First observedwait_agent

TDQS

A4.1/5.0

Scored across 10 tools

Disambiguation4/5

Tools are largely distinct: start_agent (launch), wait_agent (wait), cancel_agent (stop) form a clear per-invocation set, while wait_any, run_round, wait_round, cancel_round, open_group cover multi-seat rounds. The overlap between wait_agent/wait_any and wait_round is mostly clarified by descriptions, but agents still need care to pick the right wait/cancel pairing.

Naming Consistency5/5

Strong, predictable verb_noun/verb_object pattern throughout: start_agent, wait_agent, cancel_agent, list_invocations, describe_provider, open_group, run_round, wait_round, cancel_round, wait_any. All snake_case with action-first verbs; the one non-verb-noun form (wait_any) is a natural scoped variant.

Tool Count5/5

Ten tools is well within a healthy range and each maps to a distinct lifecycle stage: provider inspection, invocation start/wait/cancel/list, and group/round creation, execution, waiting, cancellation. No redundant or trivial entries.

Completeness4/5

Lifecycle coverage is strong: providers can be described, single invocations started/waited/cancelled/listed, and collaborative rounds opened/run/waited/cancelled. Minor gaps exist around round introspection (no list_rounds or get_round metadata) and group cleanup, but core workflows are covered.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables MCP clients to spawn and control Codex CLI and Claude Code sessions on the host machine, with session management and filesystem access.
    4
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables ISLI agents and MCP clients to dispatch natural-language coding and terminal tasks to a locally-installed Claude Code CLI, supporting both one-shot execution and persistent sessions with workspace and security controls.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables any MCP client to launch and manage subagent sessions in installed coding agents like Codex, Claude Code, Grok, and OpenCode, using your existing logins and chosen models.
    179 npm
    MIT