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 (Gemini CLI, Codex, Claude Code, OpenCode) as tools. Provides parallel execution, automatic retries with exponential backoff, JSON-first response parsing, 10 discoverable prompt templates, model tier classification, and persistent preferences through seven MCP tools, four MCP resources, and ten MCP 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 execution — batch_prompt fans out tasks with asyncio.gather and a configurable semaphore (default concurrency: 3)

  • 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 modes — default (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 via the backing store (MemoryStore default, FileTreeStore/RedisStore for restart persistence)

  • 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

Gemini CLI

Supported

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_GEMINI_MODEL": "gemini-3-flash-preview",
        "NEXUS_GEMINI_MODELS": "gemini-3.1-pro-preview,gemini-3-flash-preview,gemini-2.5-pro,gemini-2.5-flash,gemini-2.5-flash-lite",
        "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_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_GEMINI_MODEL": "gemini-3-flash-preview",
        "NEXUS_GEMINI_MODELS": "gemini-3.1-pro-preview,gemini-3-flash-preview,gemini-2.5-pro,gemini-2.5-flash,gemini-2.5-flash-lite",
        "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_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_GEMINI_MODEL=gemini-3-flash-preview \
  -e NEXUS_GEMINI_MODELS=gemini-3.1-pro-preview,gemini-3-flash-preview,gemini-2.5-pro,gemini-2.5-flash,gemini-2.5-flash-lite \
  -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_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_GEMINI_MODEL": "gemini-3-flash-preview",
    "NEXUS_CODEX_MODEL": "gpt-5.2",
    "NEXUS_OPENCODE_MODEL": "ollama-cloud/kimi-k2.5"
  }
}

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

Prerequisites:

  • Python 3.13+ (download)

  • uv dependency manager (install guide)

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

Optional (for integration tests):

  • Gemini CLI v0.6.0+ — npm install -g @google/gemini-cli

  • Codex — check with codex --version

  • Claude Code — check with claude --version

  • OpenCode — check with opencode --version

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

Run an isolated OpenCode server for HTTP-based agent execution alongside the CLI runner. Provides session management, file search, permissions, and 38 additional MCP tools when the server is healthy.

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. Gemini, 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 Gemini, Codex, and OpenCode on transformer architectures."

{
  "tasks": [
    { "cli": "gemini", "prompt": "Summarize the key findings of the Attention Is All You Need paper", "label": "gemini-summary" },
    { "cli": "codex", "prompt": "What are the main limitations of transformer architectures?", "label": "codex-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 Gemini, Codex, and OpenCode each review this diff in parallel."

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

Single-agent prompt

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

{ "cli": "gemini", "prompt": "Explain the difference between TCP and UDP in simple terms", "model": "gemini-3-flash-preview" }

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 Gemini Flash from now on."

{ "execution_mode": "yolo", "model": "gemini-3-flash-preview", "max_retries": 5 }

Subsequent calls inherit these settings. Preferences persist across MCP sessions until explicitly cleared.

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

MCP Tools

All prompt tools run as background tasks — they return a task ID immediately so the client can poll for results, preventing MCP timeouts for long operations (e.g. YOLO mode: 2–5 minutes).

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

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. "gemini"); 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. "gemini-3-flash-preview")

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

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": "gemini-2.5-flash", "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": "gemini-3.1-pro-preview", "tier": "thorough"},
    {"name": "gemini-2.5-flash", "tier": "quick"},
    {"name": "gemini-2.5-flash-lite", "tier": "quick"}
  ],
  "unclassified_models": ["gemini-3.1-pro-preview", "gemini-2.5-flash", "gemini-2.5-flash-lite"]
}

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

{
  "models": [
    {"name": "gemini-3.1-pro-preview", "tier": "thorough"},
    {"name": "gemini-2.5-flash", "tier": "quick"},
    {"name": "gemini-2.5-flash-lite", "tier": "quick"}
  ],
  "unclassified_models": []
}

Global Environment Variables

Variable

Default

Description

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, GEMINI, OPENCODE

Variable pattern

Example

Description

NEXUS_{AGENT}_MODEL

NEXUS_GEMINI_MODEL=gemini-3-flash-preview

Default model for this runner

NEXUS_{AGENT}_MODELS

NEXUS_GEMINI_MODELS=gemini-3-flash-preview,gemini-2.5-pro

Comma-separated model list (surfaced in server instructions)

NEXUS_{AGENT}_TIMEOUT

NEXUS_GEMINI_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_GEMINI_RETRY_BASE_DELAY=1.0

Backoff base delay override

NEXUS_{AGENT}_RETRY_MAX_DELAY

NEXUS_GEMINI_RETRY_MAX_DELAY=30.0

Backoff max delay override

NEXUS_{AGENT}_EXECUTION_MODE

NEXUS_GEMINI_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_gemini.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.13+ 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
│   ├── server.py           # FastMCP server + tools + prompt registration
│   ├── types.py            # Pydantic models
│   ├── exceptions.py       # Exception hierarchy
│   ├── config.py           # Environment variable config
│   ├── store.py            # Persistent backing store access (preferences + tiers)
│   ├── tiers.py            # Heuristic model tier classification
│   ├── elicitation.py      # ElicitationGuard — interactive parameter resolution
│   ├── resources.py        # MCP resources (runners, config, preferences)
│   ├── process.py          # Subprocess wrapper
│   ├── parser.py           # JSON→text fallback parsing
│   ├── cli_detector.py     # CLI binary detection + version checks
│   ├── prompts/
│   │   ├── __init__.py     # register_prompts(mcp) entry point
│   │   ├── analysis.py     # code_review, debug, quick_triage, research, second_opinion
│   │   ├── generation.py   # implement_feature, refactor, bulk_generate
│   │   ├── testing.py      # write_tests
│   │   └── comparison.py   # compare_models
│   └── runners/
│       ├── base.py         # Protocol + ABC
│       ├── factory.py      # RunnerFactory
│       ├── claude.py       # ClaudeRunner
│       ├── codex.py        # CodexRunner
│       ├── gemini.py       # GeminiRunner
│       └── opencode.py     # OpenCodeRunner
├── 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

License

MIT

Available Tools

1 tool
promptPromptB
Destructive

Run one turn with a coding agent and return its final answer.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdYesAbsolute path of the project directory.
forkNoBranch session_id into a new conversation instead of continuing it.
modelNoModel id or alias; the provider default when omitted.
promptYesTask for the agent.
backendYesAgent to run.
profileNoPermission profile for the agent.read_only
timeoutNoSeconds before the turn is cancelled.
session_idNoContinue this conversation (from a previous result).

Output Schema

ParametersJSON Schema
NameRequiredDescription
usageNo
outputYes
backendYes
session_idYes

TDQS

B3.1/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, openWorldHint=true, and destructiveHint=true. The description adds only that it runs 'one turn' and returns a 'final answer,' which is minimal behavioral context. It does not disclose side effects, permission implications, or session handling details beyond what the schema and annotations provide.

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, efficient sentence that is front-loaded and contains no redundant or filler language. Every word contributes to the core purpose.

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, so return values need not be explained. Annotations cover the safety profile. However, for a tool with 8 parameters and a destructive, open-world operation, the description lacks usage context and behavioral details that would help an agent invoke it correctly. It is minimally viable given the structured data.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents all 8 parameters. The description adds no additional semantic meaning for any parameter. Baseline 3 is appropriate when the schema carries the full descriptive burden.

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 provides a specific verb and resource: 'Run one turn with a coding agent and return its final answer.' It clearly states what the tool does. However, there are no sibling tools to differentiate from, and the description does not elaborate on scope or distinctions.

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 use this tool versus alternatives, nor any preconditions or exclusions. The single sentence simply states the action without context for selection.

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. 1 tool updatev2.1.0
    • Changedprompt1 field changed
      • changedInput schema / properties / backend / enum
        Previous value: -[
        -  "claude",
        -  "codex"
        -]New value: +[
        +  "claude",
        +  "codex",
        +  "antigravity"
        +]
  2. 20 tool updatesv2.0.1
    • Removedagent_backends
    • Removedagent_cancel
    • Removedagent_continue
    • Removedagent_diagnose
    • Removedagent_fork
    • Removedagent_list
    • Removedagent_respond
    • Removedagent_result
    • Removedagent_review
    • Removedagent_start
    • Removedagent_status
    • Removedbatch_prompt
    • Removedclear_preferences
    • Removedopencode_investigate
    • Removedopencode_session_review
    • Removedopencode_set_provider_auth
    • Removedopencode_update_config
    • Changedprompt30 fields changed
      • addedInput schema / properties / backend
        Added value: +{
        +  "description": "Agent to run.",
        +  "enum": [
        +    "claude",
        +    "codex"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / cli
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "CLI runner name (e.g., \"codex\"). None triggers interactive selection.",
        -  "enum": [
        -    "claude",
        -    "codex",
        -    "opencode",
        -    "opencode_server"
        -  ]
        -}
      • removedInput schema / properties / context
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Optional context metadata"
        -}
      • addedInput schema / properties / cwd
        Added value: +{
        +  "description": "Absolute path of the project directory.",
        +  "type": "string"
        +}
      • removedInput schema / properties / elicit
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "boolean"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • removedInput schema / properties / execution_mode
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "enum": [
        -        "default",
        -        "yolo"
        -      ],
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "'default' (safe) or 'yolo'. None inherits session preference."
        -}
      • addedInput schema / properties / fork
        Added value: +{
        +  "default": false,
        +  "description": "Branch session_id into a new conversation instead of continuing it.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / max_retries
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "integer"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Max retry attempts for transient errors (None inherits session preference)."
        -}
      • changedInput schema / properties / model / description
        Previous value: -"Model name. None triggers interactive selection or uses CLI default."New value: +"Model id or alias; the provider default when omitted."
      • removedInput schema / properties / output_limit
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "integer"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Max output bytes (None inherits session preference or uses env default)."
        -}
      • addedInput schema / properties / profile
        Added value: +{
        +  "default": "read_only",
        +  "description": "Permission profile for the agent.",
        +  "enum": [
        +    "read_only",
        +    "workspace_write",
        +    "full_access"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / prompt / description
        Previous value: -"Prompt text to send to the runner"New value: +"Task for the agent."
      • addedInput schema / properties / prompt / minLength
        Added value: +1
      • removedInput schema / properties / retry_base_delay
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "number"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Base delay seconds for exponential backoff (None inherits session/config)."
        -}
      • removedInput schema / properties / retry_max_delay
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "number"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Backoff ceiling in seconds (None inherits session preference or config)."
        -}
      • addedInput schema / properties / session_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Continue this conversation (from a previous result)."
        +}
      • removedInput schema / properties / timeout / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / timeout / default
        Previous value: -nullNew value: +600
      • changedInput schema / properties / timeout / description
        Previous value: -"Subprocess timeout seconds (None inherits session preference or uses env default)."New value: +"Seconds before the turn is cancelled."
      • addedInput schema / properties / timeout / minimum
        Added value: +1
      • addedInput schema / properties / timeout / type
        Added value: +"integer"
      • changedInput schema / required
        Previous value: -[
        -  "prompt"
        -]New value: +[
        +  "backend",
        +  "prompt",
        +  "cwd"
        +]
      • addedOutput schema / description
        Added value: +"Final answer of one agent turn."
      • addedOutput schema / properties / backend
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / output
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / session_id
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / usage
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "backend",
        +  "session_id",
        +  "output"
        +]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Removedset_model_tiers
    • Removedset_preferences
  3. 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
  4. 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)."
  5. 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 1 tool

Disambiguation4/5

With only a single tool, there is no possibility of confusing it with another, so misselection is impossible. However, there is no sibling tool to distinguish it from, making the dimension trivially satisfied rather than well-designed.

Naming Consistency3/5

There is only one tool named 'prompt', a bare noun rather than a verb_noun pattern. With a single name there is nothing to be inconsistent with, but the naming itself is vague about what the tool does.

Tool Count2/5

A single tool is far too thin for a server that wraps a coding agent. Core capabilities like starting a session, sending follow-ups, or checking status are absent, leaving the surface severely under-scoped.

Completeness2/5

Only one fire-and-forget turn is exposed, with no session lifecycle, multi-turn conversation, cancellation, or status operations. This leaves significant gaps for any realistic agent-driven coding workflow.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    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
    7 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.
    1
    MIT