nexus-mcp
Nexus 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_promptfans out tasks withasyncio.gatherand 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 ignoreModel tier classification — heuristic-based model classification into quick/standard/thorough tiers; clients can override with sampling or live benchmarks. The
nexus://runnersresource includes tier data per modelTool 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 inRunnerFactory
Agent | Status |
Gemini CLI | Supported |
Codex | Supported |
Claude Code | Supported |
OpenCode | Supported |
Installation
Run with uvx (recommended)
uvx nexus-mcpuvx installs the package in an ephemeral virtual environment and runs it — no cloning required.
To check the installed version:
uvx nexus-mcp --versionTo update to the latest version:
uvx --reinstall nexus-mcpClaude 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-mcpGeneric 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-cliCodex — check with
codex --versionClaude Code — check with
claude --versionOpenCode — 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_mcpRun 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:
Copy
.env.exampleto.envand setPROJECT_DIRto your project path:cp .env.example .env # Edit .env: set PROJECT_DIR=/path/to/your/projectStart the server:
docker compose up -dAuthenticate with your provider:
docker exec -it opencode-server opencode auth loginVerify 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 |
| Yes | Fan out prompts to multiple runners in parallel; returns |
| Yes | Single-runner convenience wrapper; routes to |
| No | Set or selectively clear persistent defaults for execution mode, model, retries, timeouts, elicitation, and trigger suppression |
| No | Retrieve current preferences |
| No | Reset all preferences |
| No | Save model tier classifications (client sends sampling/benchmark results; server persists) |
| No | Retrieve saved model tier classifications |
batch_prompt
Parameter | Required | Default | Description |
| Yes | — | List of task objects (see below) |
| No |
| Max parallel agent invocations |
| No | pref or | Enable/disable interactive elicitation for this call |
Task object fields:
Field | Required | Default | Description |
| No | — | Runner name (e.g. |
| Yes | — | Prompt text |
| No | auto | Display label for results |
| No |
| Optional context metadata dict |
| No | pref or |
|
| No | pref or CLI default | Model name override |
| No | pref or env default | Max retry attempts for transient errors |
| No | pref or env default | Max output bytes |
| No | pref or env default | Subprocess timeout in seconds |
| No | pref or env default | Base delay for exponential backoff |
| No | pref or env default | Max delay cap for backoff |
Note:
elicitis 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 |
| No | — |
|
| No | — | Model name (e.g. |
| No | — | Max total attempts (≥1; 1 = no retries) |
| No | — | Max output bytes (≥1) |
| No | — | Subprocess timeout seconds (≥1) |
| No | — | Backoff base delay seconds (≥0) |
| No | — | Backoff max delay seconds (≥0) |
| No |
| Enable/disable elicitation |
| No |
| Prompt before YOLO mode (auto-suppressed after first accept) |
| No |
| Prompt on very short prompts |
| No |
| Prompt when max_retries > 5 |
| No |
| Prompt when batch > 5 tasks |
| No |
| Clear any field individually (e.g. |
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 |
| Yes | — | Dict mapping model names to tiers ( |
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 |
| Persists across sessions |
Read values |
|
|
Clear all |
| Does not clear model tiers |
Clear one field |
| Others preserved |
Suppress elicitation |
| YOLO/batch/retry auto-suppress after accept |
Re-enable prompt |
| Resets to default |
Save/read 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 |
| analysis |
| Structured code review with findings by severity |
| analysis |
| Systematic diagnosis: reproduce, isolate, root cause, fix |
| analysis |
| Fast assessment: what's wrong, severity, next step |
| analysis |
| Structured research with source citations |
| analysis |
| Independent review of another AI's output |
| generation |
| Feature implementation with quality checklist |
| generation |
| Behavior-preserving restructuring |
| generation |
| Expand template across variable sets |
| testing |
| Test generation with configurable coverage approach |
| comparison |
| 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 |
| All registered CLI runners with models (enriched with tier data), modes, availability |
| Single runner details by name (URI template) |
| Resolved operational config defaults (timeouts, retries, output limits) |
| 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 |
|
| Max output size in bytes before temp-file spillover |
|
| Subprocess timeout in seconds (10 minutes) |
|
| Tool-level timeout in seconds (15 minutes); set to |
|
| Max attempts including the first (set to 1 to disable retries) |
|
| Base seconds for exponential backoff |
|
| Maximum seconds to wait between retries |
|
| Timeout in seconds for CLI binary version detection at startup |
|
| Global execution mode ( |
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 |
|
| Default model for this runner |
|
| Comma-separated model list (surfaced in server instructions) |
|
| Subprocess timeout override |
|
| Output limit override |
|
| Max retry attempts override |
|
| Backoff base delay override |
|
| Backoff max delay override |
|
| 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.pyTest 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-filesAdding Dependencies
uv add <package> # Production dependency
uv add --dev <package> # Development dependency
uv sync # Sync environment after changesTool 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.asyncioneeded —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
typekeyword for type aliases:type AgentName = strUnion syntax:
str | None(notOptional[str])matchstatements for complex conditionalsNO
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 configurationLicense
MIT
Available Tools
1 toolpromptPromptBDestructive
Run one turn with a coding agent and return its final answer.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | Yes | Absolute path of the project directory. | |
| fork | No | Branch session_id into a new conversation instead of continuing it. | |
| model | No | Model id or alias; the provider default when omitted. | |
| prompt | Yes | Task for the agent. | |
| backend | Yes | Agent to run. | |
| profile | No | Permission profile for the agent. | read_only |
| timeout | No | Seconds before the turn is cancelled. | |
| session_id | No | Continue this conversation (from a previous result). |
Output Schema
| Name | Required | Description |
|---|---|---|
| usage | No | |
| output | Yes | |
| backend | Yes | |
| session_id | Yes |
TDQS
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.
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.
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.
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.
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.
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 tool update
v2.1.0- Changed
prompt1 field changed- changed
Input schema / properties / backend / enumPrevious value: -[ - "claude", - "codex" -]New value: +[ + "claude", + "codex", + "antigravity" +]
20 tool updates
v2.0.1- Removed
agent_backends - Removed
agent_cancel - Removed
agent_continue - Removed
agent_diagnose - Removed
agent_fork - Removed
agent_list - Removed
agent_respond - Removed
agent_result - Removed
agent_review - Removed
agent_start - Removed
agent_status - Removed
batch_prompt - Removed
clear_preferences - Removed
opencode_investigate - Removed
opencode_session_review - Removed
opencode_set_provider_auth - Removed
opencode_update_config - Changed
prompt30 fields changed- added
Input schema / properties / backendAdded value: +{ + "description": "Agent to run.", + "enum": [ + "claude", + "codex" + ], + "type": "string" +} - removed
Input schema / properties / cliRemoved 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" - ] -} - removed
Input schema / properties / contextRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional context metadata" -} - added
Input schema / properties / cwdAdded value: +{ + "description": "Absolute path of the project directory.", + "type": "string" +} - removed
Input schema / properties / elicitRemoved value: -{ - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null -} - removed
Input schema / properties / execution_modeRemoved value: -{ - "anyOf": [ - { - "enum": [ - "default", - "yolo" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "'default' (safe) or 'yolo'. None inherits session preference." -} - added
Input schema / properties / forkAdded value: +{ + "default": false, + "description": "Branch session_id into a new conversation instead of continuing it.", + "type": "boolean" +} - removed
Input schema / properties / max_retriesRemoved value: -{ - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Max retry attempts for transient errors (None inherits session preference)." -} - changed
Input schema / properties / model / descriptionPrevious value: -"Model name. None triggers interactive selection or uses CLI default."New value: +"Model id or alias; the provider default when omitted." - removed
Input schema / properties / output_limitRemoved value: -{ - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Max output bytes (None inherits session preference or uses env default)." -} - added
Input schema / properties / profileAdded value: +{ + "default": "read_only", + "description": "Permission profile for the agent.", + "enum": [ + "read_only", + "workspace_write", + "full_access" + ], + "type": "string" +} - changed
Input schema / properties / prompt / descriptionPrevious value: -"Prompt text to send to the runner"New value: +"Task for the agent." - added
Input schema / properties / prompt / minLengthAdded value: +1 - removed
Input schema / properties / retry_base_delayRemoved value: -{ - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Base delay seconds for exponential backoff (None inherits session/config)." -} - removed
Input schema / properties / retry_max_delayRemoved value: -{ - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Backoff ceiling in seconds (None inherits session preference or config)." -} - added
Input schema / properties / session_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Continue this conversation (from a previous result)." +} - removed
Input schema / properties / timeout / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - changed
Input schema / properties / timeout / defaultPrevious value: -nullNew value: +600 - changed
Input schema / properties / timeout / descriptionPrevious value: -"Subprocess timeout seconds (None inherits session preference or uses env default)."New value: +"Seconds before the turn is cancelled." - added
Input schema / properties / timeout / minimumAdded value: +1 - added
Input schema / properties / timeout / typeAdded value: +"integer" - changed
Input schema / requiredPrevious value: -[ - "prompt" -]New value: +[ + "backend", + "prompt", + "cwd" +] - added
Output schema / descriptionAdded value: +"Final answer of one agent turn." - added
Output schema / properties / backendAdded value: +{ + "type": "string" +} - added
Output schema / properties / outputAdded value: +{ + "type": "string" +} - removed
Output schema / properties / resultRemoved value: -{ - "type": "string" -} - added
Output schema / properties / session_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / usageAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "backend", + "session_id", + "output" +] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Removed
set_model_tiers - Removed
set_preferences
16 tool updates
v1.1.0- Added
agent_backends - Added
agent_cancel - Added
agent_continue - Added
agent_diagnose - Added
agent_fork - Added
agent_list - Added
agent_respond - Added
agent_result - Added
agent_review - Added
agent_start - Added
agent_status - Changed
batch_prompt1 field changed- changed
Input schema / properties / max_concurrency / descriptionPrevious 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."
- Added
opencode_investigate - Added
opencode_session_review - Added
opencode_set_provider_auth - Added
opencode_update_config
5 tool updates
v1.0.0- Changed
batch_prompt9 fields changed- added
Input schema / properties / elicitAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / max_concurrency / descriptionAdded value: +"Max parallel runner invocations (default: 3)." - added
Input schema / properties / tasks / descriptionAdded value: +"List of AgentTask objects, each with cli, prompt, and optional fields." - added
Input schema / properties / tasks / items / properties / cli / anyOfAdded value: +[ + { + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / tasks / items / properties / cli / defaultAdded value: +null - changed
Input schema / properties / tasks / items / properties / cli / enumPrevious value: -[ - "claude", - "codex", - "gemini", - "opencode" -]New value: +[ + "claude", + "codex", + "opencode", + "opencode_server" +] - removed
Input schema / properties / tasks / items / properties / cli / minLengthRemoved value: -1 - removed
Input schema / properties / tasks / items / properties / cli / typeRemoved value: -"string" - changed
Input schema / properties / tasks / items / requiredPrevious value: -[ - "cli", - "prompt" -]New value: +[ + "prompt" +]
- Removed
get_preferences - Changed
prompt16 fields changed- added
Input schema / properties / cli / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / cli / defaultAdded value: +null - added
Input schema / properties / cli / descriptionAdded value: +"CLI runner name (e.g., \"codex\"). None triggers interactive selection." - changed
Input schema / properties / cli / enumPrevious value: -[ - "claude", - "codex", - "gemini", - "opencode" -]New value: +[ + "claude", + "codex", + "opencode", + "opencode_server" +] - removed
Input schema / properties / cli / typeRemoved value: -"string" - added
Input schema / properties / context / descriptionAdded value: +"Optional context metadata" - added
Input schema / properties / elicitAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / execution_mode / descriptionAdded value: +"'default' (safe) or 'yolo'. None inherits session preference." - added
Input schema / properties / max_retries / descriptionAdded value: +"Max retry attempts for transient errors (None inherits session preference)." - added
Input schema / properties / model / descriptionAdded value: +"Model name. None triggers interactive selection or uses CLI default." - added
Input schema / properties / output_limit / descriptionAdded value: +"Max output bytes (None inherits session preference or uses env default)." - added
Input schema / properties / prompt / descriptionAdded value: +"Prompt text to send to the runner" - added
Input schema / properties / retry_base_delay / descriptionAdded value: +"Base delay seconds for exponential backoff (None inherits session/config)." - added
Input schema / properties / retry_max_delay / descriptionAdded value: +"Backoff ceiling in seconds (None inherits session preference or config)." - added
Input schema / properties / timeout / descriptionAdded value: +"Subprocess timeout seconds (None inherits session preference or uses env default)." - changed
Input schema / requiredPrevious value: -[ - "cli", - "prompt" -]New value: +[ + "prompt" +]
- Added
set_model_tiers - Changed
set_preferences24 fields changed- added
Input schema / properties / clear_confirm_high_retriesAdded value: +{ + "default": false, + "type": "boolean" +} - added
Input schema / properties / clear_confirm_large_batchAdded value: +{ + "default": false, + "type": "boolean" +} - added
Input schema / properties / clear_confirm_vague_promptAdded value: +{ + "default": false, + "type": "boolean" +} - added
Input schema / properties / clear_confirm_yoloAdded value: +{ + "default": false, + "type": "boolean" +} - added
Input schema / properties / clear_elicitAdded value: +{ + "default": false, + "type": "boolean" +} - added
Input schema / properties / clear_execution_mode / descriptionAdded value: +"If True, resets execution_mode to None regardless of the\nexecution_mode argument." - added
Input schema / properties / clear_max_retries / descriptionAdded value: +"If True, resets max_retries to None regardless of the argument." - added
Input schema / properties / clear_model / descriptionAdded value: +"If True, resets model to None regardless of the model argument." - added
Input schema / properties / clear_output_limit / descriptionAdded value: +"If True, resets output_limit to None regardless of the argument." - added
Input schema / properties / clear_retry_base_delay / descriptionAdded value: +"If True, resets retry_base_delay to None." - added
Input schema / properties / clear_retry_max_delay / descriptionAdded value: +"If True, resets retry_max_delay to None." - added
Input schema / properties / clear_timeout / descriptionAdded value: +"If True, resets timeout to None regardless of the argument." - added
Input schema / properties / confirm_high_retriesAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / confirm_large_batchAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / confirm_vague_promptAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / confirm_yoloAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / elicitAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / execution_mode / descriptionAdded value: +"Default execution mode ('default' or 'yolo').\nNone retains the current value (use clear_execution_mode=True to reset)." - added
Input schema / properties / max_retries / descriptionAdded value: +"Default max retry attempts for transient errors.\nNone retains the current value (use clear_max_retries=True to reset)." - added
Input schema / properties / model / descriptionAdded value: +"Default model name (e.g. 'gpt-5.2').\nNone retains the current value (use clear_model=True to reset)." - added
Input schema / properties / output_limit / descriptionAdded value: +"Default max output bytes per response.\nNone retains the current value (use clear_output_limit=True to reset)." - added
Input schema / properties / retry_base_delay / descriptionAdded value: +"Default base delay seconds for exponential backoff.\nNone retains the current value (use clear_retry_base_delay=True to reset)." - added
Input schema / properties / retry_max_delay / descriptionAdded value: +"Default max delay cap seconds for exponential backoff.\nNone retains the current value (use clear_retry_max_delay=True to reset)." - added
Input schema / properties / timeout / descriptionAdded value: +"Default subprocess timeout in seconds.\nNone retains the current value (use clear_timeout=True to reset)."
5 tool updates
v0.8.1- First observed
batch_prompt - First observed
clear_preferences - First observed
get_preferences - First observed
prompt - First observed
set_preferences
TDQS
Scored across 1 tool
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.
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.
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.
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
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
One MCP endpoint for Claude, GPT & Gemini: 100+ tools + no-code connectors + agent workers.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
MCP server for building and testing AI agents with multi-model experimentation and insights.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceTurns 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-
- AlicenseNot gradedqualityDmaintenanceAn MCP server that publishes CLI tools on your machine for discoverability by LLMs7 npm1MIT
- AlicenseAqualityDmaintenanceMCP server orchestrating local CLI agents (Claude Code, OpenAI Codex, Google Gemini) for cross-validation, second opinions, and persona-driven prompting.18MIT
- AlicenseNot gradedqualityCmaintenanceUniversal MCP server that wraps any CLI tool, enabling AI assistants to run commands via natural language.1MIT