Skip to main content
Glama

Nexus MCP

PyPI Python 3.13+ License: MIT Ruff type-checked: mypy pre-commit MCP

An MCP server that enables AI models to invoke AI CLI agents (Codex, Claude Code, OpenCode) as tools. Provides durable workspace-scoped jobs, parallel execution, automatic retries with exponential backoff, JSON-first response parsing, discoverable prompt templates, model tier classification, and persistent preferences through MCP tools, resources, and prompts.

Use Cases

Nexus MCP is useful whenever a task benefits from querying multiple AI agents in parallel rather than sequentially:

  • Research & summarization — fan out a topic to multiple agents, then synthesize their responses into a single summary with diverse perspectives

  • Code review — send different files or review angles (security, correctness, style) to separate agents simultaneously

  • Multi-model comparison — prompt the same question to different models and compare outputs side-by-side for quality or consistency

  • Bulk content generation — generate multiple test cases, translations, or documentation pages concurrently instead of one at a time

  • Second-opinion workflows — get independent answers from separate agents before making a decision, reducing single-model bias

Related MCP server: mcp-cli-catalog

Features

  • Parallel executionbatch_prompt fans out tasks with asyncio.gather and a configurable semaphore (default concurrency: 3)

  • Durable jobs — start, observe, cancel, and resume normalized agent work through stable job and session identities backed by a private per-user SQLite database

  • Automatic retries — exponential backoff with full jitter for transient errors (HTTP 429/503)

  • Output handling — JSON-first parsing, brace-depth fallback for noisy stdout, temp-file spillover for outputs exceeding 50 KB

  • Execution modesdefault (safe, no auto-approve), yolo (full auto-approve)

  • CLI detection — auto-detects binary path, version, and JSON output capability at startup

  • Persistent preferences — set defaults for execution mode, model, retries, output limit, and timeout; preferences persist across MCP sessions for the lifetime of the server process

  • Prompt templates — 10 discoverable workflow scaffolds (code review, debug, research, implement feature, etc.) via list_prompts/get_prompt; each returns structured messages with expert framing the client can use or ignore

  • Model tier classification — heuristic-based model classification into quick/standard/thorough tiers; clients can override with sampling or live benchmarks. The nexus://runners resource includes tier data per model

  • Tool timeouts — configurable safety timeout (default 15 min) cancels long-running tool calls to prevent the server from blocking indefinitely

  • Client-visible logging — runner events (retries, output truncation, error recovery) are sent to MCP clients via protocol notifications, not just server stderr

  • Elicitation — interactive parameter resolution via MCP elicitation; disambiguates missing CLI, offers model selection, confirms YOLO mode, and prompts for elaboration on vague prompts. Auto-detects client support and skips gracefully when unavailable. Suppression flags prevent repeat prompts within a session

  • Benchmark data sources — server instructions include URLs for Artificial Analysis, OpenRouter, Chatbot Arena, and LLM Stats so clients can fetch live model benchmarks without API keys

  • Extensible — implement build_command + parse_output, register in RunnerFactory

Agent

Status

Codex

Supported

Claude Code

Supported

OpenCode

Supported

Installation

uvx nexus-mcp

uvx installs the package in an ephemeral virtual environment and runs it — no cloning required.

To check the installed version:

uvx nexus-mcp --version

To update to the latest version:

uvx --reinstall nexus-mcp

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "nexus-mcp": {
      "command": "uvx",
      "args": ["nexus-mcp"],
      "env": {
        "NEXUS_CODEX_MODEL": "gpt-5.2",
        "NEXUS_CODEX_MODELS": "gpt-5.4,gpt-5.4-mini,gpt-5.3-codex,gpt-5.2-codex,gpt-5.2,gpt-5.1-codex-max,gpt-5.1-codex-mini",
        "NEXUS_CLAUDE_MODEL": "claude-sonnet-4-6",
        "NEXUS_CLAUDE_MODELS": "claude-sonnet-4-6,claude-haiku-4-5-20251001",
        "NEXUS_OPENCODE_MODEL": "ollama-cloud/kimi-k2.5",
        "NEXUS_OPENCODE_MODELS": "ollama-cloud/glm-5,ollama-cloud/kimi-k2.5,ollama-cloud/qwen3-coder-next,ollama-cloud/minimax-m2.5,ollama/gemini-3-flash-preview"
      }
    }
  }
}

Cursor (.cursor/mcp.json in your project or ~/.cursor/mcp.json globally):

{
  "mcpServers": {
    "nexus-mcp": {
      "command": "uvx",
      "args": ["nexus-mcp"],
      "env": {
        "NEXUS_CODEX_MODEL": "gpt-5.2",
        "NEXUS_CODEX_MODELS": "gpt-5.4,gpt-5.4-mini,gpt-5.3-codex,gpt-5.2-codex,gpt-5.2,gpt-5.1-codex-max,gpt-5.1-codex-mini",
        "NEXUS_CLAUDE_MODEL": "claude-sonnet-4-6",
        "NEXUS_CLAUDE_MODELS": "claude-sonnet-4-6,claude-haiku-4-5-20251001",
        "NEXUS_OPENCODE_MODEL": "ollama-cloud/kimi-k2.5",
        "NEXUS_OPENCODE_MODELS": "ollama-cloud/glm-5,ollama-cloud/kimi-k2.5,ollama-cloud/qwen3-coder-next,ollama-cloud/minimax-m2.5,ollama/gemini-3-flash-preview"
      }
    }
  }
}

Claude Code (CLI):

claude mcp add nexus-mcp \
  -e NEXUS_CODEX_MODEL=gpt-5.2 \
  -e NEXUS_CODEX_MODELS=gpt-5.4,gpt-5.4-mini,gpt-5.3-codex,gpt-5.2-codex,gpt-5.2,gpt-5.1-codex-max,gpt-5.1-codex-mini \
  -e NEXUS_CLAUDE_MODEL=claude-sonnet-4-6 \
  -e NEXUS_CLAUDE_MODELS=claude-sonnet-4-6,claude-haiku-4-5-20251001 \
  -e NEXUS_OPENCODE_MODEL=ollama-cloud/kimi-k2.5 \
  -e NEXUS_OPENCODE_MODELS=ollama-cloud/glm-5,ollama-cloud/kimi-k2.5,ollama-cloud/qwen3-coder-next,ollama-cloud/minimax-m2.5,ollama/gemini-3-flash-preview \
  -- uvx nexus-mcp

Generic stdio config (any MCP-compatible client):

{
  "command": "uvx",
  "args": ["nexus-mcp"],
  "transport": "stdio",
  "env": {
    "NEXUS_CODEX_MODEL": "gpt-5.2",
    "NEXUS_CLAUDE_MODEL": "claude-sonnet-4-6",
    "NEXUS_OPENCODE_MODEL": "ollama-cloud/kimi-k2.5"
  }
}

All env keys are optional — see Configuration for the full list.

Prerequisites:

  • Python 3.12+ (download)

  • uv dependency manager (install guide)

    curl -LsSf https://astral.sh/uv/install.sh | sh

Optional (for integration tests):

  • Codex — check with codex --version

  • Claude Code — check with claude --version

  • OpenCode — check with opencode --version

Claude Code note: Nexus invokes Claude Code non-interactively via claude -p. Anthropic says claude -p and Agent SDK usage draw from separate monthly Agent SDK credits starting 2026-06-15, while interactive Claude Code usage remains on plan usage limits: https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan

Note: Integration tests are optional. Unit tests run without CLI dependencies via subprocess mocking.

# 1. Clone the repository
git clone <repository-url>
cd nexus-mcp

# 2. Install dependencies
uv sync

# 3. Install pre-commit hooks (runs linting/formatting on commit)
uv run pre-commit install

# 4. Verify installation
uv run pytest                    # Run tests
uv run mypy src/nexus_mcp        # Type checking
uv run ruff check .              # Linting

# 5. Run the MCP server
uv run python -m nexus_mcp

⚠️ Experimental — This integration has not been validated end-to-end by the maintainer. Expect rough edges in setup and auth. Feedback and bug reports are welcome.

Run an isolated OpenCode server for HTTP-based agent execution alongside the CLI runner. Nexus always lists its OpenCode tools and resources; calls return an explicit configuration error until the server password is set, and request errors while the server is unavailable.

Quick start:

  1. Copy .env.example to .env and set PROJECT_DIR to your project path:

    cp .env.example .env
    # Edit .env: set PROJECT_DIR=/path/to/your/project
  2. Start the server:

    docker compose up -d
  3. Authenticate with your provider:

    docker exec -it opencode-server opencode auth login
  4. Verify the server is healthy:

    curl -u opencode:nexus http://localhost:4096/global/health

The server binds to 127.0.0.1 (localhost only) by default for security. See docs/opencode-server-setup.md for the full guide including remote access, multi-project setup, and network security.

Usage

Once nexus-mcp is configured in your MCP client, your AI assistant automatically sees its tools. The reliable trigger is explicitly asking for output from an external AI agent (e.g. Codex, Claude Code, OpenCode). Generic "do this in parallel" prompts may be handled by the host AI's own capabilities instead. The cli parameter is optional — if omitted and the client supports MCP elicitation, the server will ask which runner to use. The server provides runner metadata (names, models, availability, execution modes) in its connection instructions — no discovery call needed. The cli parameter includes a JSON schema enum listing valid runner names.

Fan out a research question (batch_prompt)

You say: "Get perspectives from Codex, Claude Code, and OpenCode on transformer architectures."

{
  "tasks": [
    { "cli": "codex", "prompt": "Summarize the key findings of the Attention Is All You Need paper", "label": "codex-summary" },
    { "cli": "claude", "prompt": "What are the main limitations of transformer architectures?", "label": "claude-limitations" },
    { "cli": "opencode", "prompt": "List 3 real-world applications of transformers beyond NLP", "label": "opencode-applications" }
  ]
}

Code review from multiple angles (batch_prompt)

You say: "Have Codex, Claude Code, and OpenCode each review this diff in parallel."

{
  "tasks": [
    { "cli": "codex", "prompt": "Review this diff for security vulnerabilities:\n\n<paste diff>", "label": "codex-security-review" },
    { "cli": "claude", "prompt": "Review this diff for correctness and edge cases:\n\n<paste diff>", "label": "claude-correctness-review" },
    { "cli": "opencode", "prompt": "Review this diff for style and maintainability:\n\n<paste diff>", "label": "opencode-review" }
  ]
}

Single-agent prompt

You say: "Ask Codex to explain the difference between TCP and UDP."

{ "cli": "codex", "prompt": "Explain the difference between TCP and UDP in simple terms", "model": "gpt-5.2" }

Elicitation (server picks the runner)

You say: "Explain the CAP theorem using one of the available agents."

{ "prompt": "Explain the CAP theorem in simple terms" }

If the client supports MCP elicitation, the server asks which runner to use. Pass "elicit": false to skip.

Persistent preferences

You say: "Use YOLO mode with Codex from now on."

{ "execution_mode": "yolo", "model": "gpt-5.2", "max_retries": 5 }

Subsequent calls inherit these settings. Preferences persist across MCP sessions for the lifetime of the server process, until explicitly cleared.

Fallback chain: explicit parameter → saved preference → per-runner env → global env → hardcoded default.

MCP Tools

Nexus exposes a durable agent_* surface and the original compatibility prompt surface. Every durable tool requires an explicit workspace selector containing exactly one of an existing workspace_id or a filesystem path; Nexus never infers a durable workspace from the server's current directory. A path is resolved to one canonical workspace identity before admission.

Execution-starting durable tools return a JobHandle immediately. Clients use the observation and control tools to follow the normalized job independently of an MCP request lifetime.

Tool

Description

agent_start

Create a durable session and queue its first turn

agent_continue

Queue another turn on an existing session

agent_fork

Create a child session when the backend supports forking

agent_review

Queue a typed review operation on an existing session

agent_diagnose

Queue a sessionless backend diagnostic job

agent_status

Read the current normalized status of one job

agent_result

Read the pending or terminal typed result of one job

agent_list

Page through authorized jobs in one workspace

agent_backends

List backend capabilities and current availability for one workspace

agent_cancel

Request idempotent cancellation of a queued or active job

agent_respond

Resolve a pending approval, permission, question, or form input

The compatibility prompt and batch_prompt tools retain their background-task behavior. They return FastMCP task IDs so clients can poll without holding a long-running MCP request open. Per-call concurrency defaults to 3. The shared process runtime starts with 3 workers and grows to a high-water maximum of 8; one call whose effective demand exceeds 8 is rejected explicitly, while concurrent calls share the process ceiling and may queue.

Tool

Task?

Description

batch_prompt

Yes

Fan out prompts to multiple runners in parallel; returns MultiPromptResponse

prompt

Yes

Single-runner convenience wrapper; routes to batch_prompt

set_preferences

No

Set or selectively clear persistent defaults for execution mode, model, retries, timeouts, elicitation, and trigger suppression

get_preferences

No

Retrieve current preferences

clear_preferences

No

Reset all preferences

set_model_tiers

No

Save model tier classifications (client sends sampling/benchmark results; server persists)

get_model_tiers

No

Retrieve saved model tier classifications

batch_prompt

Parameter

Required

Default

Description

tasks

Yes

List of task objects (see below)

max_concurrency

No

3

Max parallel agent invocations for this call; effective demand above the process worker maximum of 8 is rejected

elicit

No

pref or true

Enable/disable interactive elicitation for this call

Task object fields:

Field

Required

Default

Description

cli

No

Runner name (e.g. "codex"); if omitted, elicitation asks which runner to use

prompt

Yes

Prompt text

label

No

auto

Display label for results

context

No

{}

Optional context metadata dict

execution_mode

No

pref or "default"

"default" or "yolo"

model

No

pref or CLI default

Model name override

max_retries

No

pref or env default

Max retry attempts for transient errors

output_limit

No

pref or env default

Max output bytes

timeout

No

pref or env default

Subprocess timeout in seconds

retry_base_delay

No

pref or env default

Base delay for exponential backoff

retry_max_delay

No

pref or env default

Max delay cap for backoff

Note: elicit is a batch-level parameter. When enabled, the server runs a single upfront elicitation pass across all tasks rather than prompting per-task.

prompt

Same parameters as a single task object in batch_prompt, plus elicit (batch-level in batch_prompt, per-call here).

set_preferences

Parameter

Required

Default

Description

execution_mode

No

"default" or "yolo"

model

No

Model name (e.g. "gpt-5.2")

max_retries

No

Max total attempts (≥1; 1 = no retries)

output_limit

No

Max output bytes (≥1)

timeout

No

Subprocess timeout seconds (≥1)

retry_base_delay

No

Backoff base delay seconds (≥0)

retry_max_delay

No

Backoff max delay seconds (≥0)

elicit

No

true

Enable/disable elicitation

confirm_yolo

No

true

Prompt before YOLO mode (auto-suppressed after first accept)

confirm_vague_prompt

No

true

Prompt on very short prompts

confirm_high_retries

No

true

Prompt when max_retries > 5

confirm_large_batch

No

true

Prompt when batch > 5 tasks

clear_*

No

false

Clear any field individually (e.g. clear_model: true)

get_preferences / clear_preferences

get_preferences — no parameters, returns all fields (null when unset). clear_preferences — no parameters, resets all to null. Does not clear model tiers.

set_model_tiers

Parameter

Required

Default

Description

tiers

Yes

Dict mapping model names to tiers ("quick", "standard", "thorough")

Persists tier classifications. Clients typically call once via sampling or benchmark fetch.

get_model_tiers

No parameters. Returns saved tiers as dict[str, str], or {} if none saved.

Managing Preferences

Operation

Tool

Notes

Set fields

set_preferences

Persists across sessions

Read values

get_preferences

null for unset fields

Clear all

clear_preferences

Does not clear model tiers

Clear one field

set_preferences with clear_*: true

Others preserved

Suppress elicitation

set_preferences with confirm_*: false

YOLO/batch/retry auto-suppress after accept

Re-enable prompt

set_preferences with clear_confirm_*: true

Resets to default

Save/read tiers

set_model_tiers / get_model_tiers

Persists across sessions

Durable Job Architecture

The framework-independent core separates normalized domain contracts from concrete backends, storage, and the MCP transport. A job is one admitted operation and owns its retry attempts, events, controls, and terminal result. A session is a durable conversation identity bound to one workspace and backend; agent_start creates it, agent_continue reuses it, and agent_fork creates a child when supported. Diagnostic jobs may be sessionless. A session and a job are not MCP client sessions or FastMCP background-task IDs.

Jobs and sessions use private | workspace access policies:

  • private (the default) is visible only to the owning principal.

  • workspace is visible to the owner and to callers explicitly authorized for that same workspace. It never grants cross-workspace access. For the local MCP adapter, the operating-system user is the principal and the private database permissions form the trust boundary.

The SQLite database contains sensitive prompts, normalized events, provider references, and results. Set NEXUS_DB_PATH to override its location. Otherwise Nexus uses these per-user paths:

  • macOS: ~/Library/Application Support/nexus-mcp/nexus.sqlite3

  • Windows: %LOCALAPPDATA%\nexus-mcp\nexus.sqlite3 (falling back to ~/AppData/Local/nexus-mcp/nexus.sqlite3)

  • Linux and other Unix platforms: ${XDG_DATA_HOME:-~/.local/share}/nexus-mcp/nexus.sqlite3

On POSIX systems Nexus removes group and other access from the database directory and SQLite files. Normalized job, session, event, and result records are retained indefinitely by default; Nexus does not schedule automatic pruning. Applying retention cutoffs is an explicit store operation, and no public MCP pruning tool is currently exposed.

Codex, Claude Code, and OpenCode execution currently passes through the temporary LegacyRunnerBackend bridge while native backends are developed. The bridge supports normalized turns only: it does not provide backend cancellation, graceful interruption, session forking, or safe reconciliation after an interrupted attempt. These are legacy-backend limitations, not core job-model promises; clients should inspect agent_backends capabilities before selecting an operation.

MCP Prompts

Nexus MCP provides 10 discoverable prompt templates that clients can browse via list_prompts() and render via get_prompt(name, args). Each prompt returns structured messages with expert framing — the client decides how (or whether) to use them.

Design principle: Server informs, client decides. Prompts provide the scaffold (role, structure, methodology); the client decides runner, model, depth, and orchestration. Prompts are completely optional — existing prompt/batch_prompt tools work exactly as before.

Prompt

Tags

Parameters

Purpose

code_review

analysis

file, instructions

Structured code review with findings by severity

debug

analysis

error, context, file

Systematic diagnosis: reproduce, isolate, root cause, fix

quick_triage

analysis

description, file

Fast assessment: what's wrong, severity, next step

research

analysis

topic, scope

Structured research with source citations

second_opinion

analysis

original_output, question

Independent review of another AI's output

implement_feature

generation

description, language, constraints

Feature implementation with quality checklist

refactor

generation

file, goal, constraints

Behavior-preserving restructuring

bulk_generate

generation

template, variables

Expand template across variable sets

write_tests

testing

file, framework, coverage_goal

Test generation with configurable coverage approach

compare_models

comparison

prompt, criteria

Multi-runner comparison framework

# 1. Client discovers available prompts
list_prompts() → sees "code_review", "debug", "compare_models", etc.

# 2. Client renders a prompt with arguments
get_prompt("code_review", {file: "src/auth.py", instructions: "security vulnerabilities"})

# 3. Server returns structured messages
→ PromptResult(
    messages=[
      Message("You are a senior code reviewer...", role="assistant"),
      Message("Review the file `src/auth.py`...\nFocus: security vulnerabilities\n...", role="user"),
    ],
    description="Code review of src/auth.py"
  )

# 4. Client feeds messages into prompt/batch_prompt with chosen runner+model
prompt(cli="claude", prompt=<rendered messages>)

MCP Resources

Read-only data endpoints that clients query for runner metadata, configuration, and preferences.

Resource URI

Description

nexus://runners

All registered CLI runners with models (enriched with tier data), modes, availability

nexus://runners/{cli}

Single runner details by name (URI template)

nexus://config

Resolved operational config defaults (timeouts, retries, output limits)

nexus://preferences

Current preferences with config fallback

Models in nexus://runners include tier data: {"name": "gpt-5.4-mini", "tier": "quick"}. Tiers are quick (fast/cheap), standard (balanced), or thorough (max quality). Models with only heuristic tiers appear in unclassified_models — calling set_model_tiers moves them out.

Before set_model_tiers — all tiers are heuristic guesses, all models are unclassified:

{
  "models": [
    {"name": "gpt-5.1-codex-max", "tier": "thorough"},
    {"name": "gpt-5.4-mini", "tier": "quick"},
    {"name": "claude-sonnet-4-6", "tier": "standard"}
  ],
  "unclassified_models": ["gpt-5.1-codex-max", "gpt-5.4-mini", "claude-sonnet-4-6"]
}

After set_model_tiers — saved tiers replace heuristics, classified models leave the list:

{
  "models": [
    {"name": "gpt-5.1-codex-max", "tier": "thorough"},
    {"name": "gpt-5.4-mini", "tier": "quick"},
    {"name": "claude-sonnet-4-6", "tier": "standard"}
  ],
  "unclassified_models": []
}

Global Environment Variables

Variable

Default

Description

NEXUS_DB_PATH

Platform per-user data directory

Durable SQLite job database; contains sensitive prompts and results

NEXUS_OUTPUT_LIMIT_BYTES

50000

Max output size in bytes before temp-file spillover

NEXUS_TIMEOUT_SECONDS

600

Subprocess timeout in seconds (10 minutes)

NEXUS_TOOL_TIMEOUT_SECONDS

900

Tool-level timeout in seconds (15 minutes); set to 0 to disable

NEXUS_RETRY_MAX_ATTEMPTS

3

Max attempts including the first (set to 1 to disable retries)

NEXUS_RETRY_BASE_DELAY

2.0

Base seconds for exponential backoff

NEXUS_RETRY_MAX_DELAY

60.0

Maximum seconds to wait between retries

NEXUS_CLI_DETECTION_TIMEOUT

30

Timeout in seconds for CLI binary version detection at startup

NEXUS_EXECUTION_MODE

default

Global execution mode (default or yolo)

Per-Runner Environment Variables

Pattern: NEXUS_{AGENT}_{KEY} (agent name uppercased). Per-runner values override global values.

Valid {AGENT} values: CLAUDE, CODEX, OPENCODE, OPENCODE_SERVER

Variable pattern

Example

Description

NEXUS_{AGENT}_MODEL

NEXUS_CODEX_MODEL=gpt-5.2

Default model for this runner

NEXUS_{AGENT}_MODELS

NEXUS_CODEX_MODELS=gpt-5.2,gpt-5.4-mini

Comma-separated model list (surfaced in server instructions)

NEXUS_{AGENT}_TIMEOUT

NEXUS_CODEX_TIMEOUT=900

Subprocess timeout override

NEXUS_{AGENT}_OUTPUT_LIMIT

NEXUS_CODEX_OUTPUT_LIMIT=100000

Output limit override

NEXUS_{AGENT}_MAX_RETRIES

NEXUS_CLAUDE_MAX_RETRIES=5

Max retry attempts override

NEXUS_{AGENT}_RETRY_BASE_DELAY

NEXUS_CLAUDE_RETRY_BASE_DELAY=1.0

Backoff base delay override

NEXUS_{AGENT}_RETRY_MAX_DELAY

NEXUS_OPENCODE_RETRY_MAX_DELAY=30.0

Backoff max delay override

NEXUS_{AGENT}_EXECUTION_MODE

NEXUS_CODEX_EXECUTION_MODE=yolo

Execution mode override

Invalid per-runner values are silently ignored (the global or hardcoded default is used instead).

Testing

This project follows Test-Driven Development (TDD) with strict Red→Green→Refactor cycles.

# Run all tests
uv run pytest

# Run with coverage report
uv run pytest --cov=nexus_mcp --cov-report=term-missing

# Run specific test types
uv run pytest -m integration           # Integration tests (requires CLIs)
uv run pytest -m "not integration"     # Unit tests only
uv run pytest -m "not slow"            # Skip slow tests

# Run specific test file
uv run pytest tests/unit/runners/test_codex.py

Test markers:

  • @pytest.mark.integration — requires real CLI installations

  • @pytest.mark.slow — tests taking >1 second

Code Quality

All quality checks run automatically via pre-commit hooks. Run manually:

# Lint and format
uv run ruff check .              # Check for issues
uv run ruff check --fix .        # Auto-fix issues
uv run ruff format .             # Format code

# Type checking (strict mode)
uv run mypy src/nexus_mcp

# Run all pre-commit hooks manually
uv run pre-commit run --all-files

Adding Dependencies

uv add <package>              # Production dependency
uv add --dev <package>        # Development dependency
uv sync                       # Sync environment after changes

Tool Configuration

  • Ruff: line length 100, 17 rule sets (E/F/I/W + UP/FA/B/C4/SIM/RET/ICN/TID/TC/ISC/PTH/TD/NPY) — pyproject.toml → [tool.ruff]

  • Mypy: strict mode, all type annotations required — pyproject.toml → [tool.mypy]

  • Pytest: asyncio_mode = "auto", no @pytest.mark.asyncio needed — pyproject.toml → [tool.pytest.ini_options]

  • Pre-commit: ruff-check, ruff-format, mypy, trailing-whitespace, end-of-file-fixer — .pre-commit-config.yaml

Python 3.12+ Syntax

  • type keyword for type aliases: type AgentName = str

  • Union syntax: str | None (not Optional[str])

  • match statements for complex conditionals

  • NO from __future__ import annotations

Project Structure

nexus-mcp/
├── src/nexus_mcp/
│   ├── __main__.py          # Entry point
│   ├── core/                # Framework- and provider-independent domain contracts
│   ├── backends/            # Typed backend protocols and runtime registry
│   ├── jobs/                # Job service, worker, SQLite store, and migrations
│   ├── legacy/              # Temporary adapter over existing CLI runners
│   ├── mcp/                 # FastMCP transport adapter
│   │   ├── server.py        # Server, compatibility tools, and registration
│   │   ├── job_tools.py     # Typed durable agent_* tools
│   │   ├── runtime.py       # MCP lifespan ownership for job runtime services
│   │   └── prompts/         # Discoverable prompt templates
│   ├── server.py            # Compatibility re-export for the MCP server
│   ├── types.py             # Compatibility request and response models
│   ├── exceptions.py        # Exception hierarchy
│   ├── config.py            # Legacy environment configuration
│   ├── process.py           # Legacy subprocess wrapper
│   ├── parser.py            # Legacy JSON-to-text output parsing
│   ├── cli_detector.py      # CLI binary detection and version checks
│   └── runners/
│       ├── base.py          # Legacy runner protocol and template method
│       ├── factory.py       # RunnerFactory
│       ├── claude.py        # ClaudeRunner
│       ├── codex.py         # CodexRunner
│       ├── opencode.py      # OpenCodeRunner
│       └── opencode_server.py # OpenCode server runner
├── tests/
│   ├── unit/               # Fast, mocked tests
│   │   └── prompts/        # Prompt template tests
│   ├── e2e/                # End-to-end MCP protocol tests
│   ├── integration/        # Real CLI tests
│   └── fixtures.py         # Shared test utilities
├── .github/
│   └── workflows/          # CI, security, dependabot
├── pyproject.toml          # Dependencies + tool config
└── .pre-commit-config.yaml # Git hooks configuration

Releases

Stable releases are cut by running the Tag Release workflow from the Actions tab and choosing a bump (auto infers it from Conventional Commits since the last tag). Pre-releases are tagged manually. See RELEASE.md for the full maintainer workflow, recovery steps, and notes on server.json placeholder fields.

License

MIT

Available Tools

20 tools
agent_backendsList Agent BackendsB
Read-onlyIdempotent

Return deterministic descriptors with fresh availability for a workspace.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceYesReference to exactly one durable workspace identity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNo

TDQS

B3.4/5.0
Behavior3/5

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

The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety and repeatability profile is covered. The description's 'deterministic descriptors' echoes idempotence, while 'fresh availability' adds some behavioral context about current state, but it does not disclose edge cases or workspace identity requirements.

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?

A single, front-loaded sentence with no filler; every word contributes meaning. The description is appropriately short for a simple read-only listing tool with rich structured metadata.

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 one required parameter, complete annotations, and an output schema available, the description covers the essential operational context. The main gap is the absence of usage guidance, but the structured metadata compensates enough to make the tool invocable and understandable.

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 workspace parameter is documented as 'Reference to exactly one durable workspace identity.' The description adds no parameter-level detail, so the baseline score of 3 applies.

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 title clearly names the resource ('Agent Backends') and the description provides a verb ('Return') and scope ('for a workspace'), so the core action is knowable. However, 'deterministic descriptors' is abstract and the description does not explicitly distinguish this from conceptually related siblings like agent_status or agent_list.

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

Usage Guidelines2/5

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

There is no guidance about when to choose this tool over alternatives, no exclusions, and no mention of sibling tools. 'For a workspace' provides minimal context but not a decision rule or boundary for appropriate use.

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

agent_cancelCancel Agent JobA
DestructiveIdempotent

Request idempotent cancellation of one authorized durable job.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes
workspaceYesReference to exactly one durable workspace identity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
stateYes
job_idYes
event_committedYes
cancel_requestedYes
completed_immediatelyYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already mark the operation as destructive and idempotent, and the description echoes 'idempotent' while adding the 'authorized' qualifier. It does not describe what cancellation actually does to the job or what state changes occur, so added transparency beyond annotations is limited.

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

Conciseness5/5

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

The description is one concise sentence with no filler or repetition. It front-loads the key action and object, making it quickly scannable for an agent.

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

Completeness3/5

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

For a destructive, idempotent operation with two required parameters including a nested workspace object, the one-sentence description is minimal. The output schema and annotations help, but the description still leaves gaps around authorization, failure behavior, and what cancellation implies for the job's lifecycle.

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 only 50%; workspace has a description but job_id does not. The tool description does not explain either parameter in detail, nor does it connect 'one ... durable job' to job_id or workspace meaning, so it fails to compensate for the low coverage.

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 states a specific action ('Request idempotent cancellation') and a clear resource ('one authorized durable job'). The verb 'cancel' distinguishes this tool from sibling agent_* tools such as agent_start, agent_status, and agent_continue.

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 intended use is implied: cancel a durable job. However, the description does not explicitly say when to use this tool versus alternatives like agent_fork or agent_continue, and it does not mention prerequisites or conditions for cancellation.

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

agent_continueContinue Agent SessionB
Destructive

Queue a durable turn against an existing authorized session.

ParametersJSON Schema
NameRequiredDescriptionDefault
configNo
promptYes
contextNo
file_refsNo
workspaceYesReference to exactly one durable workspace identity.
session_idYes
idempotency_keyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
stateNo
job_idYes
operationYes
session_idNo

TDQS

B3.4/5.0
Behavior4/5

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

Beyond the annotations, the description adds useful behavioral context: the turn is 'queued' (asynchronous/non-blocking) and 'durable' (persistent), and the session must be 'authorized' beforehand. It does not elaborate on the destructive behavior implied by destructiveHint=true, but the annotation already covers that signal, so the description adds meaningful context without contradicting the annotations.

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

Conciseness5/5

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

The description is a single front-loaded sentence with no filler or repetition. Every word contributes meaning: the action is 'Queue,' the target is a 'durable turn,' and the precondition is an 'existing authorized session.'

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

Completeness2/5

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

Given the tool has 7 parameters, nested objects, an output schema, and several closely related siblings, this one-sentence description is not complete enough for reliable invocation. It omits guidance on configuration, file references, idempotency, and context, and does not clarify how this differs from agent_respond or batch_prompt.

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 only 14%, so the description needed to compensate by explaining key parameters, but it only hints at session_id via 'existing authorized session.' It says nothing about workspace, prompt, config, context, file_refs, or idempotency_key, leaving the agent to infer their roles from the bare schema.

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 ('Queue') and resource ('a durable turn against an existing authorized session'), which clearly communicates that this tool continues an already-running agent session rather than starting a new one. It distinguishes from siblings like agent_start and agent_fork, though it does not name them and 'durable turn' is somewhat jargon-heavy.

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 phrase 'existing authorized session' implies the tool should be used when a session already exists and is authorized, which provides some usage context. However, it gives no explicit guidance about when to prefer this over agent_respond, agent_fork, batch_prompt, or prompt, and lists no alternatives or exclusions.

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

agent_diagnoseDiagnose Agent BackendD
Destructive

Queue backend diagnostics without conditionally hiding the tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
configNo
backendYes
workspaceYesReference to exactly one durable workspace identity.
idempotency_keyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
stateNo
job_idYes
operationYes
session_idNo

TDQS

D1.8/5.0
Behavior2/5

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

Annotations state destructiveHint=true, readOnlyHint=false, and idempotentHint=false, indicating a mutating, non-idempotent operation. The description adds the word 'Queue', implying the diagnostic is submitted asynchronously, but it does not disclose what side effects the diagnostics have (e.g., does it modify backend state, send telemetry, or run commands?). It also does not clarify the meaning of 'without conditionally hiding the tool' in behavioral terms. No contradiction with annotations, but the description adds minimal behavioral context beyond what annotations already cover.

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

Conciseness2/5

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

The description is a single short sentence with no filler, so it is structurally concise. However, it is under-specified to the point of being unhelpful. The phrase 'without conditionally hiding the tool' appears to be an instruction about tool visibility rather than functionality, wasting space. A useful description would need more detail to meet the minimum viable standard.

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

Completeness1/5

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

Given the tool's complex schema (nested config with 7 subfields, workspace object, idempotency_key) and its destructive, asynchronous nature, the description is far from complete. It does not explain what 'backend diagnostics' are, what the tool returns (output schema exists but is not referenced), or any required setup. Sibling tools like agent_status and agent_backends likely have overlapping functions, and without context the agent cannot reliably choose this tool. The description leaves too many unknowns.

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

Parameters1/5

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

The description provides zero information about the parameters (backend, workspace, config, idempotency_key). While the schema includes descriptions for some fields (config and workspace), schema description coverage is only 25%, meaning most parameters lack explanation. The description does not compensate for this gap, leaving agents to guess the purpose and format of the config object and idempotency key.

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

Purpose3/5

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

The description mentions 'Queue backend diagnostics', which gives a verb and a resource, indicating the tool queues diagnostics for the backend. However, it does not elaborate on what 'diagnostics' entails, whether it runs tests, collects logs, or checks health. It also does not distinguish it from sibling tools like agent_status or agent_review, which might also involve diagnostic checks. The phrase 'without conditionally hiding the tool' is confusing and does not clarify the tool's purpose.

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

Usage Guidelines1/5

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

No guidance is given on when to use this tool versus alternatives. The description does not mention any prerequisites, conditions, or scenarios that call for diagnosing a backend. There is no mention of alternatives or exclusions, leaving the agent without direction on selection.

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

agent_forkFork Agent SessionB
Destructive

Fork an existing session when its backend advertises that capability.

ParametersJSON Schema
NameRequiredDescriptionDefault
configNo
promptNo
contextNo
file_refsNo
workspaceYesReference to exactly one durable workspace identity.
session_idYes
idempotency_keyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
stateNo
job_idYes
operationYes
session_idNo

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already mark the operation as destructive and not idempotent; the description adds the backend-capability prerequisite, which is genuine behavioral context. It does not go deeper into what forking does to the original session, whether config is copied, or what makes it destructive, but the annotation coverage lowers the burden somewhat.

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

Conciseness4/5

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

The description is a single front-loaded sentence with no wasted words, and the key scoping detail ('existing session', 'backend advertises that capability') comes early. It could carry a bit more operational context, but as a concise statement it is effective.

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

Completeness2/5

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

The tool has seven parameters, a nested config object, destructive annotations, and no usage guidance in the description. An output schema exists, which covers return shape, but the description leaves important gaps around when to fork versus start/continue, parameter roles, and behavioral consequences.

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 only 14%, and the tool description adds no parameter-level meaning. Most parameters like prompt, context, file_refs, session_id, and idempotency_key are left for the agent to infer from names alone, and the nested config object is only explained inside the schema, not in the tool description.

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 clearly identifies the action ('Fork') and the resource ('an existing session'), and adds a meaningful condition ('when its backend advertises that capability'). This distinguishes it from agent_start and agent_continue, though it does not explicitly name those siblings, so it stops short of a top score.

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 phrase 'when its backend advertises that capability' gives a condition for using the tool, which is useful context. However, there is no explicit guidance on when not to use it or which sibling tool should be used instead, so usage routing is left mostly to inference.

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

agent_listList Agent JobsA
Read-onlyIdempotent

List one authorized page of durable jobs for an explicit workspace.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
cursorNo
statesNo
workspaceYesReference to exactly one durable workspace identity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNo
next_cursorNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare the operation read-only, idempotent, and non-destructive. The description adds useful behavioral context beyond those annotations by noting that only one page is returned and that jobs are durable. There is no contradiction between the description and the annotations.

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

Conciseness5/5

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

The description is a single front-loaded sentence beginning with the verb 'List', and each phrase adds either scope, resource type, or a pagination constraint. It is concise and easily parsable, with no redundant filler.

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

Completeness3/5

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

Given four parameters, a nested workspace object, and many sibling agent_* tools, the definition is only minimally complete. It conveys pagination only through the word 'page', leaves the states filter to be inferred from the schema enum, and does not differentiate usage from agent_status or agent_result. The presence of an output schema reduces the need to describe return values, but key guidance is still missing.

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 only 25%, with only the workspace object receiving a description. The tool description alludes to pagination ('one page') and workspace scoping, but does not explain limit, cursor, or states, and therefore does not compensate for the low schema coverage.

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 pair ('List ... durable jobs') and adds a mandatory scope ('for an explicit workspace'), making the operation distinct from sibling tools such as agent_start, agent_status, and agent_result. The phrase 'authorized page' is slightly opaque, but the core purpose 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?

The description implies when to use the tool: to enumerate durable jobs for an explicit workspace, with only one page returned at a time. It does not name alternatives or provide exclusions, so an agent must infer when agent_status or agent_result would be more appropriate.

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

agent_respondRespond to Agent InputA
Idempotent

Resolve one pending typed provider interaction for a durable job.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes
input_idYes
responseYes
workspaceYesReference to exactly one durable workspace identity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
job_idYes
statusNo
input_idYes
replayedNo

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already provide idempotentHint=true and readOnlyHint=false, so the description does not need to restate mutation safety. It adds some scoping context with 'pending' and 'durable job', but it does not explain side effects, lifecycle changes, or what happens after resolution. No contradiction with annotations.

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

Conciseness5/5

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

The description is a single sentence with no filler or redundant restatement of field names. It front-loads the core action and scope, making it easy to scan. Every word contributes to the meaning.

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

Completeness2/5

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

The tool is complex: four required parameters, a nested oneOf response schema, and a workspace object. The description offers almost no lifecycle context, such as how to discover the pending input_id or what 'provider interaction' means in practice. While an output schema exists, the description still lacks enough context for confident invocation.

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 only 25%, and the description does not compensate. It never explains job_id, input_id, workspace, or how to construct the response field. The schema's oneOf block documents acceptable response shapes, but job_id and input_id remain opaque, and 'typed provider interaction' is too indirect to substitute for real parameter guidance.

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 ('Resolve') and clearly defines the resource as 'one pending typed provider interaction for a durable job.' The title 'Respond to Agent Input' reinforces the purpose. This is specific enough to distinguish the tool from siblings like agent_start or agent_continue.

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

Usage Guidelines4/5

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

The description gives clear context for when to use the tool: when a pending typed provider interaction for a durable job needs to be resolved. It does not explicitly name alternatives or state when not to use it, so it stops short of a 5, but the intended usage is unambiguous.

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

agent_resultGet Agent Job ResultB
Read-onlyIdempotent

Return the pending, succeeded, failed, or cancelled durable result variant.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes
workspaceYesReference to exactly one durable workspace identity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds genuine behavioral context beyond those annotations by disclosing that the call can return a 'pending' variant — signaling the job may not be finished yet — as well as terminal states. It does not cover error or not-found behavior, but with the annotation bar lowered, the added variant context earns a 4.

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

Conciseness5/5

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

The description is a single 12-word sentence with no filler, front-loading the verb and resource immediately. Every word earns its place; brevity here is achieved without redundancy, even though it sacrifices some contextual richness that other dimensions capture.

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

Completeness3/5

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

An output schema exists (covering return values) and annotations fully cover the safety profile, so the description need not repeat those. However, it leaves the relationship to agent_status unexplained, uses the undefined term 'durable result variant', and gives no hint about how to obtain job_id or handle a pending result — clear gaps for a tool with a required nested workspace object.

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 only 50%: workspace has a schema description, but job_id has none, and the tool description adds nothing about either parameter. job_id is a required, unformatted string whose provenance (e.g., from agent_start) is never explained, and the description does not compensate for this gap. The workspace object is at least partially covered by the schema, but the critical job_id parameter remains semantically undocumented.

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

Purpose4/5

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

The description states a specific verb ('Return') and resource (the durable result variant of an agent job) and enumerates the four possible variants (pending, succeeded, failed, cancelled), which helps distinguish it from siblings like agent_status. However, the phrase 'durable result variant' is internal jargon and the description never explicitly says it is fetching the outcome/payload of a job started by agent_start, so it stops short of a 5.

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

Usage Guidelines2/5

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

There is no guidance on when to call this tool versus its natural alternatives among the siblings, particularly agent_status (which presumably reports job state) and agent_list. The description neither states when polling is appropriate, how the 'pending' state should be handled, nor when another tool should be chosen instead. Usage is only weakly implied by the name and title.

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

agent_reviewReview With AgentB
Destructive

Queue a typed review when the session backend supports its target and delivery.

ParametersJSON Schema
NameRequiredDescriptionDefault
configNo
targetYesA bounded, provider-neutral target for a code review.
contextNo
deliveryNoinline
file_refsNo
workspaceYesReference to exactly one durable workspace identity.
session_idYes
instructionsNo
idempotency_keyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
stateNo
job_idYes
operationYes
session_idNo

TDQS

B3.1/5.0
Behavior3/5

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

The description adds a small behavioral note about queueing and a support condition, but does not elaborate on side effects (e.g., destructive behavior) or delivery mechanics. Annotations already declare destructiveHint: true and readOnlyHint: false, so the description contributes limited extra context beyond what is already structured.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no fluff. It clearly states the action and a condition, achieving excellent conciseness and structure.

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

Completeness1/5

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

For a tool with nine parameters, nested objects, and an output schema, this one-line description is severely under-specified. It provides no guidance on constructing the workspace, configuring the review, or interpreting the output, making correct invocation highly unlikely.

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?

The description does not explain any of the nine parameters. It alludes to 'target and delivery' but provides no semantics for them. With schema description coverage at only 22%, this is a significant gap that the description fails to compensate for.

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

Purpose4/5

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

The description states a specific action ('Queue a typed review') and a condition ('when the session backend supports its target and delivery'), clearly identifying the tool's core purpose without being a tautology. However, it does not explicitly differentiate from sibling tools like agent_session_review, so it falls short of a 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?

It gives a conditional prerequisite regarding session backend support, which hints at when the tool is appropriate. But it does not name alternatives or specify when to use this tool instead of batch_prompt or agent_session_review, leaving usage guidance only partially developed.

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

agent_startStart Agent JobB
Destructive

Start a durable session turn in an explicitly selected workspace.

ParametersJSON Schema
NameRequiredDescriptionDefault
configNo
promptYes
backendYes
contextNo
file_refsNo
workspaceYesReference to exactly one durable workspace identity.
access_policyNoprivate
idempotency_keyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
stateNo
job_idYes
operationYes
session_idNo

TDQS

B3.2/5.0
Behavior3/5

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

The annotations already signal destructiveHint=true, idempotentHint=false, openWorldHint=true, and readOnlHint=false. The description adds that the session is 'durable' and requires an explicit workspace, which is useful context, but it does not explain what resources are created, what side effects may occur, or what 'durable session' entails.

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

Conciseness5/5

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

The description is a single focused sentence with no filler. It front-loads the action and the most important constraint, making it easy to parse quickly.

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

Completeness2/5

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

This is a complex tool with 8 parameters, 3 required, and destructive/open-world annotations, yet the description provides almost no workflow context, no explanation of what a 'durable session turn' means, and no guidance relative to sibling tools. The output schema and annotations help, but they do not make up for the missing high-level usage semantics.

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?

With schema description coverage at only 13% and eight parameters, the description needed to compensate by explaining key parameters like backend and prompt. It only reinforces the workspace concept and leaves required fields and config, context, file_refs, access_policy, and idempotency_key unexplained.

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 action ('Start'), a specific resource ('a durable session turn'), and a scope ('in an explicitly selected workspace'). It clearly distinguishes this from continuation tools like agent_continue and one-shot prompt tools, though it does not name any sibling explicitly.

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 phrase 'Start a durable session turn in an explicitly selected workspace' implies this tool is for beginning a new persistent agent run in a chosen workspace, contrasting with continuing or responding to an existing session. However, it gives no explicit when-to-use or when-not-to-use guidance and does not name alternative tools.

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

agent_statusGet Agent Job StatusB
Read-onlyIdempotent

Return one authorized durable job status projection.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes
workspaceYesReference to exactly one durable workspace identity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
phaseNo
stateYes
job_idYes
operationYes
backend_idYes
created_atYes
session_idNo
updated_atYes
completed_atNo
workspace_idYes
pending_inputsNo
resolved_configNo
cancel_requestedNo
latest_event_sequenceNo

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds modest context with 'authorized' and 'durable', implying access requirements and persistence, but does not explain behavioral details like consistency, blocking, or failure modes.

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

Conciseness4/5

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

The description is a single concise sentence with no filler and it front-loads the action. It loses a point for the jargon-heavy phrase 'status projection', which could be clearer.

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

Completeness3/5

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

With an output schema, strong safety annotations, and only two required parameters, the tool is reasonably simple. However, the description provides no rationale for selecting this tool over status/result siblings and only vaguely hints at authorization, leaving the context minimally complete.

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 only 50%; job_id is undocumented and the description does not explain either parameter. The workspace object has a schema-level description, but the description text adds no parameter semantics, so it does not compensate for the coverage gap.

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

Purpose4/5

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

The description uses a specific verb ('Return') and identifies a singular resource ('one authorized durable job status projection'), making the core function clear. It also distinguishes from sibling tools by emphasizing 'one' status versus agent_list or agent_result, though the term 'projection' is somewhat vague.

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

Usage Guidelines2/5

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

No guidance is given about when to choose this tool over sibling tools such as agent_list, agent_result, or agent_cancel. The description only states what it returns and leaves all usage-context decisions to the agent.

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

batch_promptBatch Prompt CLI AgentsA
Destructive

Send multiple prompts to CLI runners in parallel (primary tool).

Fans out tasks server-side with asyncio.gather and a semaphore, enabling true parallel runner execution within a single MCP call. Single-task usage is perfectly valid — use prompt for convenience when sending one task.

ParametersJSON Schema
NameRequiredDescriptionDefault
tasksYesList of AgentTask objects, each with cli, prompt, and optional fields.
elicitNo
max_concurrencyNoMax parallel runner invocations for this call (default: 3). The process worker maximum is 8; one call whose effective demand exceeds 8 is rejected.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
failedYes
resultsYes
succeededYes

TDQS

A4.4/5.0
Behavior4/5

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

Beyond the annotations (destructiveHint=true), the description adds meaningful behavioral context: it discloses server-side fan-out with asyncio.gather and a semaphore, explaining true parallel execution within a single MCP call. It also notes that single-task usage is valid, which is a non-obvious trait. This adds transparency without contradicting the annotations.

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

Conciseness5/5

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

The description is compact and well-structured. The first sentence states the primary purpose, the second provides behavioral context, and the third gives routing guidance. Every sentence contributes essential information with no redundancy.

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?

Given the tool's complexity (parallel fan-out, concurrency limits, multiple options), the description covers the core behavior and usage distinction. An output schema exists, so return values are handled. It could mention potential failure modes or concurrency limits, but the max_concurrency parameter description already covers that. Overall, it is sufficiently complete for an agent to call it correctly.

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

Parameters3/5

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

The schema already covers 67% of parameters (tasks and max_concurrency have descriptions). The tool description adds little parameter-level detail; it references parallelism and concurrency but does not elaborate on individual fields. With high schema coverage, the baseline of 3 applies, and the description does not meaningfully raise it.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Send multiple prompts to CLI runners in parallel.' It explicitly labels itself as the 'primary tool' and distinguishes it from the sibling 'prompt' for single-task convenience, making the tool's role immediately clear.

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

Usage Guidelines5/5

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

The description gives explicit usage guidance: it states when to use this tool (multiple prompts, parallel execution) and when to use the alternative (single task: 'use prompt for convenience'). This directly routes the agent to the correct sibling without ambiguity.

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

clear_preferencesClear Session PreferencesA
DestructiveIdempotent

Clear all persistent preferences, reverting to per-call defaults.

Returns: Confirmation string.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds behavioral context by explaining that it reverts to per-call defaults and returns a confirmation string, clarifying the meaning of 'destructive'.

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

Conciseness5/5

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

The description is extremely concise (two sentences), front-loaded with the purpose, and includes the return type. Every word is necessary.

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

Completeness5/5

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

Given the tool has 0 parameters and annotations cover safety traits, the description is complete: it states what it clears, the effect, and the return value. No gaps for invoking correctly.

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?

With 0 parameters and 100% schema coverage (vacuously), the description adds no parameter information beyond the schema. Baseline for 0 params 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 'Clear' and resource 'persistent preferences', and distinguishes it from siblings like 'set_preferences' by stating it reverts to per-call defaults.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like 'set_preferences'. It lacks context about prerequisites or appropriate scenarios.

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

opencode_investigateOpencode InvestigateA

Search project files and return the matching results.

Chains GET /find → GET /file/content for up to max_files results.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
max_filesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description takes on the burden of revealing behavior. It explicitly discloses the GET /find and GET /file/content call chain and the max_files limit, indicating a read-only operation. It does not discuss rate limits or edge cases, but the core behavior is transparent for a simple search tool.

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

Conciseness5/5

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

The description is two short sentences with no wasted words. The main purpose is front-loaded, and the endpoint chain is presented succinctly in the second sentence.

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

Completeness4/5

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

The tool is simple with only two parameters and an output schema, so the description does not need to explain return values. It covers the core operation, the endpoint chain, and the max_files behavior adequately, though examples or query format hints would make it 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 description coverage is 0%, so the description is expected to explain parameters. It does clarify that max_files limits the number of results, but query is only implied by the phrase 'Search project files' and not given explicit semantics such as search syntax or scope. This is partial compensation for the low schema coverage.

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 clearly states that the tool searches project files and returns matching results, which is a specific verb and resource. It does not explicitly differentiate from sibling tools, but the focus on file search is distinct from the agent and configuration siblings listed.

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

Usage Guidelines4/5

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

The description gives clear context for when to use the tool: whenever you need to search project files and retrieve matching file contents. It does not mention exclusions or alternatives, but none of the sibling tools appear to perform a similar file-search function.

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

opencode_session_reviewOpencode Session ReviewA

Review a session's messages and file changes.

Chains GET /session/{id} → GET /session/{id}/message → GET /session/{id}/diff → GET /session/{id}/todo.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 burden, and it provides strong transparency by spelling out the ordered chain of GET endpoints: session, message, diff, and todo. This makes the read-only, multi-call nature clear, though auth requirements and failure behavior are not disclosed.

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

Conciseness5/5

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

Two sentences with no wasted words. The purpose is front-loaded, and the endpoint chain is compactly listed in one line, making the behavioral flow immediately readable.

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

Completeness4/5

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

The description captures the full endpoint flow and the single required input, and an output schema exists so return-value documentation is not needed. It could add guidance on when to prefer this over agent_review or agent_diagnose, but as a standalone review action it is reasonably 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 description coverage is 0%, so the description must compensate. The path template 'GET /session/{id}' embeds the single parameter and conveys that session_id is the session path identifier, which is enough despite not specifying format or length.

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 names a concrete operation—'Review a session's messages and file changes'—with a clear resource and outcome. The GET /session/{id} chain reinforces the exact scope, and the session-scoped phrasing distinguishes it from sibling agent_* review/diagnose tools.

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

Usage Guidelines2/5

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

No explicit when-to-use guidance, exclusions, or alternatives are provided. The description only implies this is for reviewing a session, which does not help an agent choose between this and similarly named tools like agent_review or agent_diagnose.

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

opencode_set_provider_authOpenCode ConfigurationC
Idempotent

Set authentication credentials for a provider.

ParametersJSON Schema
NameRequiredDescriptionDefault
credentialsYes
provider_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already indicate this is a non-read-only, non-destructive, idempotent operation. The description adds no behavioral detail beyond the act of setting credentials, such as whether existing credentials are overwritten, how credentials are stored, or whether any validation occurs.

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

Conciseness4/5

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

The description is a single, front-loaded sentence with no filler. It is efficient, though it is so brief that it leaves useful operational guidance unstated.

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

Completeness2/5

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

For an auth-setting tool with minimal schema parameter documentation, the description is too thin. It lacks usage boundaries, side-effect disclosure, and parameter detail, leaving an agent without enough context to confidently invoke it correctly among related configuration tools.

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?

The schema has 0% parameter description coverage, so the description must compensate. It relates provider_id and credentials to the overall purpose, but does not explain acceptable credential shapes, required fields, or how provider_id should be specified.

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 uses a specific verb and target: 'Set authentication credentials for a provider.' This clearly communicates the tool's core purpose and distinguishes it from generic configuration operations. Some ambiguity remains with opencode_update_config, but the credential-specific focus is strong enough.

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

Usage Guidelines2/5

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

No guidance is given about when to use this tool versus siblings like opencode_update_config, set_preferences, or clear_preferences. There are no preconditions, exclusions, or alternative tool mentions, so an agent must infer usage context from the name alone.

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

opencode_update_configOpenCode ConfigurationC
Idempotent

Update OpenCode server configuration.

ParametersJSON Schema
NameRequiredDescriptionDefault
configYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already indicate the operation is not read-only, is idempotent, and is non-destructive, so the description adds no extra behavioral context. It does not explain whether the update merges or replaces the existing configuration, whether a restart is needed, or what side effects may occur.

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

Conciseness5/5

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

The description is a single short sentence with no fluff. It front-loads the verb and resource, making it easy to parse quickly.

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

Completeness2/5

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

The tool is complex because its only input is an open-ended config object, yet the description provides no detail about what fields or settings can be included. Although an output schema exists and annotations are present, the description still leaves a significant gap for the agent to understand how to construct a valid config and what the tool's effective scope is.

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?

The only parameter, 'config', is an arbitrary object with no property descriptions in the schema and a schema description coverage of 0%. The description merely says 'configuration', which adds minimal semantic value beyond the parameter name. It provides no examples, keys, format, or constraints.

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 clearly names the action ('Update') and the resource ('OpenCode server configuration'). It is a meaningful statement rather than a tautology, and 'server configuration' hints at a broader scope than sibling tools like set_model_tiers or set_preferences. However, it doesn't explicitly differentiate itself from those siblings.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus alternatives such as opencode_set_provider_auth, set_model_tiers, or set_preferences. An agent reading this alone cannot determine whether to use this tool or a more specific one.

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

promptPrompt CLI AgentA
Destructive

Send a prompt to a CLI runner as a background task.

Returns immediately with a task ID. Client polls for results. This prevents timeouts for long operations (YOLO mode: 2-5 minutes).

ParametersJSON Schema
NameRequiredDescriptionDefault
cliNoCLI runner name (e.g., "codex"). None triggers interactive selection.
modelNoModel name. None triggers interactive selection or uses CLI default.
elicitNo
promptYesPrompt text to send to the runner
contextNoOptional context metadata
timeoutNoSubprocess timeout seconds (None inherits session preference or uses env default).
max_retriesNoMax retry attempts for transient errors (None inherits session preference).
output_limitNoMax output bytes (None inherits session preference or uses env default).
execution_modeNo'default' (safe) or 'yolo'. None inherits session preference.
retry_max_delayNoBackoff ceiling in seconds (None inherits session preference or config).
retry_base_delayNoBase delay seconds for exponential backoff (None inherits session/config).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true, but the description adds valuable behavioral details: returns immediately with task ID, client polls, prevents timeouts, and specifies YOLO mode duration. This exceeds annotation-only info.

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 sentences with no wasted words. Front-loaded with core action, followed by async behavior and benefit. Highly concise and structured.

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?

Given the tool's complexity (11 parameters, async, destructive), the description covers the key workflow (async polling, timeout). Output schema exists, so return format is covered elsewhere. Missing minor details like polling mechanism, but sufficient.

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?

With 91% schema coverage, the description adds minimal parameter detail beyond the schema. It mentions YOLO mode and timeout but does not explain individual parameters further. 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?

The description clearly states it sends a prompt to a CLI runner as a background task, returns immediately with a task ID, and prevents timeouts. This distinguishes it from siblings like batch_prompt (batch) and preference tools.

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

Usage Guidelines4/5

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

The description explains the async nature and timeout prevention, providing clear context for use. However, it does not explicitly contrast with sibling tools like batch_prompt or state when not to use.

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

set_model_tiersSet Model TiersA
Idempotent

Save model tier classifications.

Client sends sampling/benchmark results; server persists to backing store. Overwrites any previously saved tiers entirely.

ParametersJSON Schema
NameRequiredDescriptionDefault
tiersYesMapping of model name to tier ('quick', 'standard', 'thorough').

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

The description explicitly states it overwrites previously saved tiers entirely, adding behavioral context beyond annotations. Annotations already indicate idempotence, but the description clarifies the overwriting behavior. No contradiction with annotations.

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 efficient sentences: first states purpose, second explains process, third details effect. No wasted words, and critical information is front-loaded.

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

Completeness4/5

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

The tool is simple with one parameter, full schema coverage, and an output schema. The description covers the key behavior (overwrite) and is complete for this complexity level, though it omits error handling details.

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% and the schema already describes the tiers parameter as a mapping to allowed tier values. The description adds no further meaning, so baseline score 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?

The description clearly states the tool saves model tier classifications, using a specific verb (Save) and resource (model tier classifications). It distinguishes from sibling tools like prompt and set_preferences, which deal with prompts and preferences.

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?

No explicit guidance on when to use vs. alternatives. The context implies it is for persisting model tiers after sampling/benchmarks, but lacks explicit when-not-to-use or comparison with siblings.

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

set_preferencesSet Session PreferencesA
Idempotent

Set persistent preferences that apply to subsequent prompt/batch_prompt calls.

Preferences persist across MCP sessions. Call again to update, or use clear_preferences to reset all fields at once.

To clear a single field while keeping others, pass the corresponding clear_* flag: set_preferences(clear_model=True) # clears model, keeps execution_mode

ParametersJSON Schema
NameRequiredDescriptionDefault
modelNoDefault model name (e.g. 'gpt-5.2'). None retains the current value (use clear_model=True to reset).
elicitNo
timeoutNoDefault subprocess timeout in seconds. None retains the current value (use clear_timeout=True to reset).
clear_modelNoIf True, resets model to None regardless of the model argument.
max_retriesNoDefault max retry attempts for transient errors. None retains the current value (use clear_max_retries=True to reset).
clear_elicitNo
confirm_yoloNo
output_limitNoDefault max output bytes per response. None retains the current value (use clear_output_limit=True to reset).
clear_timeoutNoIf True, resets timeout to None regardless of the argument.
execution_modeNoDefault execution mode ('default' or 'yolo'). None retains the current value (use clear_execution_mode=True to reset).
retry_max_delayNoDefault max delay cap seconds for exponential backoff. None retains the current value (use clear_retry_max_delay=True to reset).
retry_base_delayNoDefault base delay seconds for exponential backoff. None retains the current value (use clear_retry_base_delay=True to reset).
clear_max_retriesNoIf True, resets max_retries to None regardless of the argument.
clear_confirm_yoloNo
clear_output_limitNoIf True, resets output_limit to None regardless of the argument.
confirm_large_batchNo
clear_execution_modeNoIf True, resets execution_mode to None regardless of the execution_mode argument.
confirm_high_retriesNo
confirm_vague_promptNo
clear_retry_max_delayNoIf True, resets retry_max_delay to None.
clear_retry_base_delayNoIf True, resets retry_base_delay to None.
clear_confirm_large_batchNo
clear_confirm_high_retriesNo
clear_confirm_vague_promptNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate idempotency ('idempotentHint': true) and non-destructiveness. The description adds value by explaining persistence across sessions and the update semantics. No contradictions found.

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?

Well-structured with three concise paragraphs: purpose, persistence, and example usage. No unnecessary words, every sentence adds value.

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?

For a tool with 24 parameters (none required) and an output schema, the description covers the key behavioral aspects: persistence, update, clearing, and relation to sibling tools. The output schema handles return values, so no further detail needed.

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 58% with descriptions for most fields. The description explains the overall pattern of using 'None' to retain values and 'clear_*' flags to reset, which adds context beyond individual parameter descriptions but does not detail every parameter.

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

Purpose5/5

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

The description clearly states the verb ('Set'), resource ('persistent preferences'), and scope ('apply to subsequent prompt/batch_prompt calls'). It effectively distinguishes from sibling tool 'clear_preferences' by mentioning its specific function.

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?

Provides explicit guidance on when to use (set preferences for future calls), persistence across sessions, update behavior, and how to clear fields individually using 'clear_*' flags. Also names 'clear_preferences' as alternative for resetting all fields.

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. 16 tool updatesv1.1.0
    • Addedagent_backends
    • Addedagent_cancel
    • Addedagent_continue
    • Addedagent_diagnose
    • Addedagent_fork
    • Addedagent_list
    • Addedagent_respond
    • Addedagent_result
    • Addedagent_review
    • Addedagent_start
    • Addedagent_status
    • Changedbatch_prompt1 field changed
      • changedInput schema / properties / max_concurrency / description
        Previous value: -"Max parallel runner invocations (default: 3)."New value: +"Max parallel runner invocations for this call (default: 3). The\nprocess worker maximum is 8; one call whose effective demand exceeds 8 is rejected."
    • Addedopencode_investigate
    • Addedopencode_session_review
    • Addedopencode_set_provider_auth
    • Addedopencode_update_config
  2. 5 tool updatesv1.0.0
    • Changedbatch_prompt9 fields changed
      • addedInput schema / properties / elicit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / max_concurrency / description
        Added value: +"Max parallel runner invocations (default: 3)."
      • addedInput schema / properties / tasks / description
        Added value: +"List of AgentTask objects, each with cli, prompt, and optional fields."
      • addedInput schema / properties / tasks / items / properties / cli / anyOf
        Added value: +[
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / tasks / items / properties / cli / default
        Added value: +null
      • changedInput schema / properties / tasks / items / properties / cli / enum
        Previous value: -[
        -  "claude",
        -  "codex",
        -  "gemini",
        -  "opencode"
        -]New value: +[
        +  "claude",
        +  "codex",
        +  "opencode",
        +  "opencode_server"
        +]
      • removedInput schema / properties / tasks / items / properties / cli / minLength
        Removed value: -1
      • removedInput schema / properties / tasks / items / properties / cli / type
        Removed value: -"string"
      • changedInput schema / properties / tasks / items / required
        Previous value: -[
        -  "cli",
        -  "prompt"
        -]New value: +[
        +  "prompt"
        +]
    • Removedget_preferences
    • Changedprompt16 fields changed
      • addedInput schema / properties / cli / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / cli / default
        Added value: +null
      • addedInput schema / properties / cli / description
        Added value: +"CLI runner name (e.g., \"codex\"). None triggers interactive selection."
      • changedInput schema / properties / cli / enum
        Previous value: -[
        -  "claude",
        -  "codex",
        -  "gemini",
        -  "opencode"
        -]New value: +[
        +  "claude",
        +  "codex",
        +  "opencode",
        +  "opencode_server"
        +]
      • removedInput schema / properties / cli / type
        Removed value: -"string"
      • addedInput schema / properties / context / description
        Added value: +"Optional context metadata"
      • addedInput schema / properties / elicit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / execution_mode / description
        Added value: +"'default' (safe) or 'yolo'. None inherits session preference."
      • addedInput schema / properties / max_retries / description
        Added value: +"Max retry attempts for transient errors (None inherits session preference)."
      • addedInput schema / properties / model / description
        Added value: +"Model name. None triggers interactive selection or uses CLI default."
      • addedInput schema / properties / output_limit / description
        Added value: +"Max output bytes (None inherits session preference or uses env default)."
      • addedInput schema / properties / prompt / description
        Added value: +"Prompt text to send to the runner"
      • addedInput schema / properties / retry_base_delay / description
        Added value: +"Base delay seconds for exponential backoff (None inherits session/config)."
      • addedInput schema / properties / retry_max_delay / description
        Added value: +"Backoff ceiling in seconds (None inherits session preference or config)."
      • addedInput schema / properties / timeout / description
        Added value: +"Subprocess timeout seconds (None inherits session preference or uses env default)."
      • changedInput schema / required
        Previous value: -[
        -  "cli",
        -  "prompt"
        -]New value: +[
        +  "prompt"
        +]
    • Addedset_model_tiers
    • Changedset_preferences24 fields changed
      • addedInput schema / properties / clear_confirm_high_retries
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / clear_confirm_large_batch
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / clear_confirm_vague_prompt
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / clear_confirm_yolo
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / clear_elicit
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / clear_execution_mode / description
        Added value: +"If True, resets execution_mode to None regardless of the\nexecution_mode argument."
      • addedInput schema / properties / clear_max_retries / description
        Added value: +"If True, resets max_retries to None regardless of the argument."
      • addedInput schema / properties / clear_model / description
        Added value: +"If True, resets model to None regardless of the model argument."
      • addedInput schema / properties / clear_output_limit / description
        Added value: +"If True, resets output_limit to None regardless of the argument."
      • addedInput schema / properties / clear_retry_base_delay / description
        Added value: +"If True, resets retry_base_delay to None."
      • addedInput schema / properties / clear_retry_max_delay / description
        Added value: +"If True, resets retry_max_delay to None."
      • addedInput schema / properties / clear_timeout / description
        Added value: +"If True, resets timeout to None regardless of the argument."
      • addedInput schema / properties / confirm_high_retries
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / confirm_large_batch
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / confirm_vague_prompt
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / confirm_yolo
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / elicit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • addedInput schema / properties / execution_mode / description
        Added value: +"Default execution mode ('default' or 'yolo').\nNone retains the current value (use clear_execution_mode=True to reset)."
      • addedInput schema / properties / max_retries / description
        Added value: +"Default max retry attempts for transient errors.\nNone retains the current value (use clear_max_retries=True to reset)."
      • addedInput schema / properties / model / description
        Added value: +"Default model name (e.g. 'gpt-5.2').\nNone retains the current value (use clear_model=True to reset)."
      • addedInput schema / properties / output_limit / description
        Added value: +"Default max output bytes per response.\nNone retains the current value (use clear_output_limit=True to reset)."
      • addedInput schema / properties / retry_base_delay / description
        Added value: +"Default base delay seconds for exponential backoff.\nNone retains the current value (use clear_retry_base_delay=True to reset)."
      • addedInput schema / properties / retry_max_delay / description
        Added value: +"Default max delay cap seconds for exponential backoff.\nNone retains the current value (use clear_retry_max_delay=True to reset)."
      • addedInput schema / properties / timeout / description
        Added value: +"Default subprocess timeout in seconds.\nNone retains the current value (use clear_timeout=True to reset)."
  3. 5 tool updatesv0.8.1
    • First observedbatch_prompt
    • First observedclear_preferences
    • First observedget_preferences
    • First observedprompt
    • First observedset_preferences

TDQS

B3/5.0

Scored across 20 tools

Disambiguation4/5

Most agent_* tools are clearly distinct lifecycle actions, and the opencode_* tools cover different concerns. The main ambiguity is between agent_status and agent_result, which both appear to return a single durable job's state, and prompt/batch_prompt have overlapping purposes despite the description trying to differentiate them.

Naming Consistency3/5

All names use snake_case and are grouped by prefixes like agent_ and opencode_, which helps readability. However, there is no consistent verb_noun pattern: prompt and batch_prompt are noun-style, agent_status/agent_result are noun phrases, while agent_start/agent_cancel are verb phrases, and opencode_investigate is a bare verb.

Tool Count3/5

At 20 tools, the server sits in the borderline-heavy range, and the count is somewhat inflated by overlapping pairs like prompt/batch_prompt and agent_status/agent_result. The durable session lifecycle justifies many tools, but the set feels cluttered rather than tightly scoped.

Completeness4/5

The durable job lifecycle is well covered with start, continue, fork, review, diagnose, cancel, respond, status, result, list, and backends. Minor gaps exist, such as no explicit way to read current preferences or model tiers after setting them, but agents can work around these with the update/clear tools.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Turns any shell command into an MCP server by defining command-line tools in simple YAML files. Enables AI agents to execute system commands, security scanners, DevOps tools, and CLI utilities directly from chat interfaces.
    4
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that publishes CLI tools on your machine for discoverability by LLMs
    5 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Universal MCP server that wraps any CLI tool, enabling AI assistants to run commands via natural language.
    MIT