Smart-AI-Bridge
Smart AI Bridge is an enterprise-grade MCP server that provides multi-AI backend orchestration with intelligent routing across 4 specialized backends (coding, analysis, local unlimited tokens, general purpose), featuring automatic failover and health monitoring. It offers enhanced file operations including atomic multi-file writing, intelligent chunking for large files, and advanced batch editing with rollback capabilities. The server includes smart edit prevention through fuzzy matching using Levenshtein distance to reduce "text not found" errors by 80%, supporting strict/lenient/dry_run validation modes. Additional capabilities include direct AI querying to specific models (local, Gemini, DeepSeek, Qwen), comprehensive code review with security and performance analysis, pre-flight validation for changes, system diagnostics with differentiated health checks, backup/restore management, rate limit monitoring, and cross-platform support with automatic service detection for local AI providers.
Enables AI-powered development operations through Google Gemini models as a configurable general-purpose cloud backend with multi-modal capabilities
Integrates with NVIDIA's cloud API platform to access specialized AI models like Qwen for coding tasks and DeepSeek for analysis through intelligent backend routing
Connects to local Ollama model servers for unlimited token processing and private AI operations without API rate limits or usage restrictions
Provides access to OpenAI's GPT models through configurable cloud backends with specialized routing for coding, analysis, and general-purpose AI tasks
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Smart-AI-Bridgereview this Python function for security vulnerabilities"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Smart AI Bridge v2.15.0
Config-driven multi-AI orchestration for Claude Code. Add any OpenAI-compatible provider, route intelligently, and let multiple AIs collaborate through the council system.
What It Does
Smart AI Bridge is an MCP server that sits between Claude Code and your AI backends. It provides 17 tools for token-saving file operations, multi-AI workflows, code quality checks, and intelligent routing -- all configured through a single JSON file.
Any OpenAI-compatible provider works. Local models (vLLM, LM Studio, Ollama), cloud APIs, or a mix of both. The included presets cover common providers, but adding your own is just a config entry.
Smart routing selects the best backend per task using a 4-tier system: forced selection, learned preferences, rule-based heuristics, and health-based fallback.
Council system queries multiple backends on the same prompt and returns all responses for Claude to synthesize. Configurable strategies (parallel, sequential, debate, fallback) per topic.
Web dashboard for managing backends and council configuration without editing JSON files.
Related MCP server: VegaMCP
How It Works
The core idea: Claude never reads the file
Most of Claude's context on a coding task is spent on file contents. Smart AI Bridge hands that work to another model and returns only the conclusions, so the expensive context stays free for reasoning.
sequenceDiagram
accTitle: How Smart AI Bridge saves tokens
accDescr: Claude Code calls analyze_file. Smart AI Bridge reads the file and sends its contents to a backend model. The backend returns a structured analysis, and only that analysis is returned to Claude. The file contents never enter Claude's context.
participant C as Claude Code
participant S as Smart AI Bridge
participant F as Your files
participant B as Backend<br/>(local or cloud)
C->>S: analyze_file({ filePath, question })
S->>F: read the file
S->>B: file contents + question
B-->>S: structured analysis
S-->>C: { summary, findings[], confidence, tokens_saved }
Note over C,S: The file contents never enter Claude's context.<br/>tokens_saved is measured from the real bytes,<br/>not estimated.modify_file works the same way but returns a diff; explore returns matching file:line
evidence; batch_analyze does it across a glob. Every one of these reports a tokens_saved
figure computed from the actual characters read versus the actual response returned.
Choosing a backend: the 4-tier router
Every call that doesn't name a backend goes through the same decision, in order. The first tier that produces a healthy backend wins.
flowchart TD
accTitle: The four-tier backend routing decision
accDescr: A tool call is routed in four ordered tiers. Tier 1 uses an explicitly named backend. Otherwise Tier 2 uses a learned preference above 0.7 confidence if that backend is healthy. Otherwise Tier 3 applies complexity and task-type rules. Otherwise Tier 4 takes the first healthy backend in the fallback chain.
A[Tool call] --> B{"backend named<br/>and not 'auto'?"}
B -- yes --> T1["<b>Tier 1 · Forced</b><br/>use it as given"]
B -- no --> C{"learned preference<br/>above 0.7 confidence<br/><i>and</i> that backend healthy?"}
C -- yes --> T2["<b>Tier 2 · Learned</b><br/>from past outcomes"]
C -- no --> D{"a rule matches on<br/>complexity / task type?"}
D -- yes --> T3["<b>Tier 3 · Rules</b><br/>heuristic match"]
D -- no --> T4["<b>Tier 4 · Fallback</b><br/>first healthy backend<br/>in the chain"]A learned preference that is confident but points at an unhealthy backend falls through to Tier 3 rather than being used. Health failures open a circuit breaker, so a provider that is down is skipped rather than retried into a timeout.
Asking several models at once: the council
council sends one prompt to multiple backends and returns every response for Claude to
synthesize. It does not vote or pick a winner — disagreement between models is the signal,
so it is preserved rather than averaged away.
flowchart LR
accTitle: Council strategies
accDescr: One prompt is dispatched by a configurable strategy. Parallel queries all backends at once. Sequential runs them in order, each seeing the previous answer. Debate has models respond to each other. Fallback tries the next backend only if the previous failed. Every response is returned to Claude to synthesize.
Q[One prompt] --> R{strategy}
R -->|parallel| P[All backends at once]
R -->|sequential| S[One after another,<br/>each sees the last]
R -->|debate| D[Models respond<br/>to each other]
R -->|fallback| F[Next only if<br/>the previous failed]
P & S & D & F --> A[All responses returned<br/>to Claude to synthesize]Strategy is configurable per topic. See docs/COUNCIL.md.
Quick Start
There is no npm package -- install by cloning. Requires Node.js >= 18.
1. Clone and install
git clone https://github.com/Platano78/smart-ai-bridge.git
cd smart-ai-bridge
npm installConfirm the install is sound before wiring it into anything:
npm test # expect: all tests pass, 0 failures2. Configure at least one backend
The server starts and lists all 17 tools with no API keys at all -- you only need a backend when you actually call one. You need one of:
a local OpenAI-compatible server (llama.cpp, vLLM, LM Studio, Ollama) -- auto-discovered on common ports, no key required; or
one cloud API key from any supported provider.
# Set whichever apply -- one is enough
export NVIDIA_API_KEY="your-key"
export OPENAI_API_KEY="your-key"
export GEMINI_API_KEY="your-key"
export GROQ_API_KEY="your-key"Backend definitions live in src/config/backends.json; see CONFIGURATION.md
for the full reference. A missing key is never an error -- the startup readiness audit reports
such backends as cannot verify, not as broken.
3. Register with your MCP client
Use an absolute path to src/server.js. Relative paths depend on the client honoring cwd,
which not every client does.
Claude Code -- copy .mcp.json.example to .mcp.json in your project,
or add to your MCP settings:
{
"mcpServers": {
"smart-ai-bridge": {
"command": "node",
"args": ["/absolute/path/to/smart-ai-bridge/src/server.js"],
"env": {
"NVIDIA_API_KEY": "your-key"
}
}
}
}Claude Desktop -- same block, merged into claude_desktop_config.json:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Any other MCP client -- it speaks MCP over stdio. Run node /absolute/path/src/server.js and
talk JSON-RPC to it. Diagnostics go to stderr; stdout carries protocol traffic only.
4. Restart the client and verify
All 17 tools appear after a restart. Verify with a call that needs no backend:
@get_analytics({})To check a backend you have actually configured, name it explicitly -- check_backend_health
reports local as critical when no local model is running, which is expected on a cloud-only
setup and does not mean the install failed:
@check_backend_health({ "backend": "auto" })Updating an existing install
cd /path/to/smart-ai-bridge
git pull origin main
npm install # only needed when dependencies changedThen restart your MCP client (in Claude Code, /mcp reconnects without a full restart).
Tools (17)
Token-Saving File Operations
Tool | Description |
| Backend reads and analyzes files, returns structured findings |
| Backend applies natural-language edits, returns diff |
| Analyze multiple files via glob patterns; |
| Apply same instructions across multiple files |
| Generate code from a natural-language spec |
| Answer codebase questions using intelligent search |
All but generate_file return a tokens_saved field measured for that specific call: the
characters of file content the backend read on your behalf, minus the characters of the
response handed back. Both sides are measured from the real data rather than assumed, so
the figure reflects what actually happened on that call -- though the character-to-token
conversion (~4 characters per token) is itself approximate, so treat the result as a good
indicator rather than an exact token count. It varies enormously with file size and
response length: a small file can save nothing at all. We publish no headline percentage
because we have not benchmarked one we could defend.
Multi-AI Workflows
Tool | Description |
| Smart routing with auto or forced backend selection |
| Multi-AI consensus across configurable backends |
| Generate, review, fix loop between two backends |
| TDD workflow with decomposition and quality gates |
| Specialized AI agents (10 roles including TDD) |
Code Quality
Tool | Description |
| Security, performance, and quality review |
| Cross-file refactoring with reference updates |
Infrastructure
Tool | Description |
| Health diagnostics for specific backends |
| Timestamped backup management |
| Atomic multi-file writes with backup |
| Usage analytics and optimization recommendations |
Smart Routing
The router selects backends using a 4-tier priority system:
Forced -- explicit backend selection (
model="my_backend")Learning -- learned preferences from past outcomes (>0.7 confidence)
Rules -- complexity and task-type heuristics
Fallback -- health-based fallback through the priority chain
When a resolved backend fails -- one the router picked, because you passed backend: "auto" or let a routing rule choose -- the request automatically falls to the next healthy backend in the chain.
A backend you named explicitly does not cascade. It gets one attempt, and if that fails you get an error saying so, distinguishing "your lane was tried and failed" from "your lane could not be attempted at all". This is deliberate: the API keys are yours, and silently rerouting a request you pinned to one lane can spend your credit on lanes you never asked for. Pass backend: "auto" when you want the chain.
Circuit breakers protect each backend (5 consecutive failures trigger a 30-second cooldown).
Backend Names
There are two layers of backend naming, and both are intentional:
Friendly names are what you pass to tools (e.g.
backend: "glm"ormodel="groq"). They are stable, provider-neutral aliases.Internal names are the registry/config identifiers used in
src/config/backends.jsonand analytics.
The presets map as follows:
Friendly name | Internal name | Adapter type |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Removed: nvidia_qwen / qwen3. The NVIDIA code-specialist lane once served a Qwen
model. NVIDIA has since retired it, and its catalog now lists no Qwen model of any
kind — so the names were removed outright rather than kept as aliases pointing at a
differently-named lane. nvidia_qwen and qwen3 no longer resolve to anything.
Use nvidia_glm (friendly alias: glm). If you have a saved force_backend: "nvidia_qwen" or a config carrying "type": "nvidia_qwen", change it to nvidia_glm.
This does not affect Qwen models you run locally. The bridge still detects them on your own router and applies Qwen-specific handling (capability inference, FIM tokens, reasoning-suppression) — that has nothing to do with the retired NVIDIA lane.
The OpenAI-compatible backend ships under the internal name openai_chatgpt (adapter
type openai) and is reached through smart routing rather than a friendly alias. For the
ask tool, openai is accepted as a compatibility alias for the configured
OpenAI-compatible backend. Custom backends you add via config use their name field
directly as the internal name.
Backend Drift and Model Retirement
Providers retire models without notice, and the failure is otherwise silent until a request fails. Two things catch that:
A readiness audit at startup. It checks each configured backend's model against the
provider's catalog and prints findings to stderr. It runs only after the MCP handshake
completes and is never awaited, so it cannot delay or abort startup. Disable it with
SAB_DISABLE_READINESS_AUDIT=true.
An on-demand probe that sends every configured backend a real completion:
npm run audit:backends # human-readable table
npm run audit:backends -- --json # machine-readableA real completion is the only trustworthy check — model ids appear in a provider's
/v1/models listing that still return 404 for a given account. Backends are classified
OK, RETIRED, TRANSIENT, ERROR, NO_MODEL, or NO_KEY. It exits non-zero only on
RETIRED, ERROR, or NO_MODEL, so it can gate CI.
A backend with no API key is never reported as broken. You supply your own keys and
most setups configure a single provider, so an unset key reports as
cannot verify — <VAR> not set and does not fail the run. The local backend is
reachability-checked only, never catalog-checked: its configured "model": "dynamic" is
a handle, not a catalog id.
When a model has been retired, the resulting error says so explicitly — naming the backend, the model, the provider's end-of-life text, and live replacement candidates — rather than surfacing as a generic HTTP failure. Retirement is a configuration error, so it opens the circuit breaker immediately instead of being retried; saturation (429/5xx) and auth failures (401) are deliberately not treated as retirement.
Response Reliability (v2.4.0)
All handlers use a unified response pipeline (extractResponseText) that correctly handles every known LLM response shape -- raw strings, OpenAI chat/completion formats, thinking model reasoning_content, array content parts, and Gemini candidates. Repetitive output from local models is automatically collapsed, and analysis findings are deduplicated and capped.
Write Integrity
fs.writeFile resolving does not guarantee the bytes on disk match what was requested -- short or partial writes, ENOSPC, encoding mangling, or a concurrent writer clobbering the file between write and return all leave disk content that diverges from the intended content while the write call itself resolves cleanly.
Every path that writes content you care about reads it back and compares before reporting success:
Path | What is verified |
| modified file, plus the backup it takes first |
| generated file and its generated tests file |
| each written file, plus each backup |
| file grew by exactly the appended length and ends with exactly those bytes |
| each restored file (the backup is only unlinked once the restore is confirmed) |
| modifications (via |
| each generated code file |
| the backup, the pre-restore snapshot, and the restore itself |
A mismatch raises WRITE_VERIFY_MISMATCH -- naming the file, the expected vs actual length, and the first divergent line -- instead of reporting success: true over a corrupted file.
Recovery paths get the same treatment deliberately: a backup that silently failed to land is worse than no backup, because a later rollback would restore corrupt bytes over the original.
Not verified, by design: internal run artifacts and state files that are records rather than deliverables -- parallel_agents' decomposed.json/results.json/quality-*.json/synthesis.json, backup_restore's .meta.json sidecar, the pattern store, and conversation threads.
Council System
The council queries multiple backends on the same prompt and returns all responses for Claude to synthesize. Topics like coding, architecture, and security each map to a set of backends and a strategy (parallel, sequential, debate, or fallback).
See docs/COUNCIL.md for full documentation.
Dashboard
An optional web dashboard provides UI for backend management (enable/disable, priorities, health checks) and council configuration (strategies, topic mapping).
See docs/DASHBOARD.md for setup and API reference.
SmartCrusher (Tool-Result Compression)
Large tool results — long file analyses, council responses, batch outputs — can fill Claude's context window quickly. SmartCrusher trims oversized arrays before serialization using a salience-weighted keep/drop strategy, inserting a sentinel row so Claude knows data was offloaded.
Disabled by default. Enable only after running the fidelity eval against your own local model.
Enable
# One-time env override (no config edit needed)
SAB_COMPRESSION_ENABLED=true node src/server.js
# Or permanently in src/config/backends.json:
# "compression": { "enabled": true }Fidelity Eval (run before enabling)
The eval probes whether crushed responses preserve factual accuracy compared to originals. It requires an OpenAI-compatible local API — use whatever model you normally run:
RUN_CRUSH_EVAL=1 \
CRUSH_EVAL_BASE_URL=http://127.0.0.1:<port>/v1 \
CRUSH_EVAL_MODEL=<your-model-id> \
npx vitest run tests/compression/probeFidelity.test.jsCheck the output for original=N/15 vs crushed=M/15 per dimension. If crushed scores drop more than 2 points on any dimension, leave compression disabled — the model grades differently than the reference setup.
Adding a Backend
Via Dashboard (recommended): Start the server with SAB_DASHBOARD=true, then use the web UI at http://localhost:3456 (override with SAB_DASHBOARD_PORT) to add, remove, enable/disable, and re-prioritize backends without editing JSON. The dashboard also lets you set/clear an API key per backend (stored in the gitignored data/backends-secrets.json, mode 0600 — never written to the tracked src/config/backends.json); a stored key takes effect immediately, no restart required, and beats the backend's process.env fallback.
The dashboard binds to 127.0.0.1 only by default — it has no authentication, so it must not be reachable off-box. Override with SAB_DASHBOARD_HOST if you need it reachable elsewhere; a non-loopback host prints a warning on startup naming the risk.
Via Config File: Any OpenAI-compatible provider can be added as a config entry in src/config/backends.json:
{
"name": "my_provider",
"type": "openai",
"endpoint": "https://api.my-provider.com/v1",
"model": "my-model",
"apiKeyEnvVar": "MY_PROVIDER_API_KEY",
"maxTokens": 8192,
"priority": 7,
"enabled": true
}See EXTENDING.md for details on adding custom adapter types.
Documentation
Document | Description |
Install/run contract for AI agents and agentic harnesses, plus repo rules | |
Version history | |
Full configuration reference | |
Adding backends, handlers, and tools | |
Usage examples | |
Dashboard setup and API | |
Council system details |
Requirements
Node.js >= 18.0.0
At least one backend configured (local model or cloud API key)
Claude Code or Claude Desktop for MCP integration
Testing
npm test # Run the unit + integration suite (Vitest)
npm run test:watch # Watch mode
npm run test:bench # Performance benchmarks (25 benchmarks, 6 categories)
npm run audit:backends # Probe every configured backend with a real completion
# SmartCrusher fidelity eval (opt-in, requires a running local model):
RUN_CRUSH_EVAL=1 \
CRUSH_EVAL_BASE_URL=http://127.0.0.1:<port>/v1 \
CRUSH_EVAL_MODEL=<your-model-id> \
npx vitest run tests/compression/probeFidelity.test.jsSecurity Notes
Never commit API keys to version control. Use environment variables exclusively.
The Claude Code config examples above use placeholder values -- replace them with your actual keys or reference a
.envfile.Rotate any accidentally leaked keys immediately.
Threat Model
Smart AI Bridge is a trusted-local MCP server. It is designed to run as a stdio subprocess of a single client you control (Claude Code or Claude Desktop) on your own machine, and it assumes that client is trusted.
Within that boundary:
The file tools have full filesystem access by design.
write_files_atomic,modify_file,backup_restore, and the read/analyze tools operate on whatever paths the calling client supplies. They are not sandboxed to a project root.safeReadFileresolves paths and rejects null bytes (defense against path-injection tricks), but it does not confine access to a workspace.Argument validation happens at the tool boundary. Tool calls are validated against each tool's JSON Schema (via Ajv) before dispatch; malformed calls are rejected with a structured error. This protects against malformed input, not against a hostile client.
Tool calls run with the privileges of the server process. Run it as your normal user, not as root.
This posture is appropriate for the intended single-user, local-agent use case. It is not suitable for exposing the server to untrusted or multi-tenant callers over a network. If you need that, put an authenticating proxy in front of it and add workspace-root confinement to the file handlers first -- neither is provided here.
License
Apache-2.0
Available Tools
17 toolsanalyze_fileA
Read ONE file and answer a question about it using a local or cloud LLM — Claude never sees the file contents, only the structured findings the LLM returns, plus a measured tokens_saved figure for that call. Use when you have one specific file and a specific question (security check, bug hunt, architectural concern). For the same question across many files (glob patterns), use batch_analyze. For a natural-language search across the codebase with no specific file in mind, use explore. Pure line-range questions like 'show me lines 437–490' short-circuit the LLM entirely and return the requested lines verbatim at zero token cost. Read-only: reads filePath, optionally reads includeContext files, makes one LLM call. Returns: {success, filePath, fileSize, lineCount, language, analysisType, question, summary, findings:[strings], confidence (0-1), suggestedActions:[strings], backend_used, processing_time, tokens_saved}. Verbatim short-circuit returns the same shape with analysisType:'verbatim', backend_used:'direct_extraction', and the requested lines in summary.
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | ||
| filePath | Yes | Path to the file to analyze | |
| question | Yes | Question about the file (e.g., "What are the security vulnerabilities?") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden, and it pays it thoroughly: it states the tool is read-only, discloses that Claude never sees file contents (only structured findings), explains the single LLM call, describes the verbatim short-circuit that returns lines 'at zero token cost', reports a measured tokens_saved, and lists the complete return shape. This exceeds what annotations alone would convey.
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 long, but every section earns its place: purpose, sibling routing, behavioral caveats, and return shape. The core purpose is front-loaded before the alternatives. It is dense rather than padded, though the return-shape enumeration could arguably be trimmed for tightness.
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?
There is no output schema, so the description appropriately takes on the job of documenting the return value, and it does so exhaustively, including the verbatim variant's distinct shape. For a tool with nested options objects and no output schema, nothing an agent needs to call it correctly is missing.
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 67%, and the schema already documents each parameter well (filePath, question, options with analysisType's enum behavior and backend choices). The description adds little parameter-level detail beyond what the schema provides; its extra content (verbatim short-circuit) is behavioral rather than semantic. This matches the baseline for a well-documented schema.
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 opens with a specific verb+resource pair — 'Read ONE file and answer a question about it using a local or cloud LLM' — and immediately establishes its single-file scope. It explicitly contrasts itself with siblings by name (batch_analyze, explore), so an agent can tell them apart without inspecting schemas.
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?
Delivers crisp routing guidance: 'Use when you have one specific file and a specific question', then names the alternatives with the conditions that select them — batch_analyze for glob patterns, explore for natural-language codebase search. It even carves out the verbatim short-circuit case for pure line-range questions. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
askA
Send one prompt to one AI backend and return the response. model:'auto' lets SAB's router pick the best backend by task complexity + current health; passing a specific model name forces that provider. Use this for direct LLM queries that don't fit a more specialized tool. For multi-backend consensus on the same prompt, use council. For agentic multi-step work with a defined role, use spawn_subagent. For LLM-driven file generation or editing, use generate_file / modify_file so the file content stays out of Claude's context window. Read-only: makes one HTTP call to the chosen backend. Returns: {success, model, requested_backend, actual_backend, prompt (truncated preview), response (the LLM output), backend_used, fallback_chain, response_time, cache_status, thinking_enabled, max_tokens, was_truncated, smart_routing_applied, routing, processing_time}.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | AI backend to query: auto (smart routing selects a lane by task complexity + current health), local (your own router — vLLM/llama.cpp/LM Studio — autodiscovered), gemini (Google Gemini lane), nvidia_deepseek (NVIDIA-hosted DeepSeek lane — reasoning-oriented, supports streaming and the `thinking` option), nvidia_glm (NVIDIA-hosted GLM lane — code-oriented), openai (OpenAI lane), groq (Groq lane — low-latency hosted inference). No model id or context size is fixed here: each lane runs whatever `config.model` declares in backends.json, or a model selected from the provider's own catalog when nothing is declared. The friendly aliases `deepseek`, `glm` and `openai` are also accepted (mapped to nvidia_deepseek / nvidia_glm / openai_chatgpt), matching the other tools. | |
| prompt | Yes | Your question or prompt (Unity/complex generations automatically get high token limits) | |
| thinking | No | Enable thinking mode for DeepSeek (shows reasoning) | |
| max_tokens | No | Maximum response length (auto-calculated if not specified: Unity=16K, Complex=8K, Simple=2K) | |
| force_backend | No | Force specific backend (bypasses smart routing) - use backend keys like "local", "gemini", "nvidia_deepseek", "nvidia_glm", "openai_chatgpt", "groq" | |
| model_profile | No | Only for the local backend: request a specific model id from your local router (llama-swap/llama.cpp/LM Studio). Valid values are whatever your own router serves — query its /v1/models endpoint for the list; SAB does not ship a fixed set. The id is passed through as the requested model, so an id your router does not serve fails the call (HTTP 400 model not found) rather than falling back. SAB also tries to load the model first if it is not resident, but that pre-flight step only probes http://localhost:8081 — if your server listens on another port the load is skipped (the request still goes to your configured endpoint). Omit to use whichever model is already loaded. | |
| enable_chunking | No | Enable automatic request chunking for extremely large generations (fallback if truncated) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states 'Read-only: makes one HTTP call to the chosen backend' and details the return object fields, including routing, fallback_chain, and cache_status. This is strong coverage; however, it does not mention rate limits, authentication requirements, or error handling beyond the model_profile note, so a full 5 is not warranted.
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 long but every sentence carries distinct value—core purpose, routing explanation, alternative routing, read-only guarantee, and return structure. It is front-loaded with the main purpose and scoping. Slightly overlong relative to typical descriptions, but no redundancy. A 4 rather than 5 because it could be trimmed around the model-profile paragraph.
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?
For a tool with 7 parameters, 2 required, and no output schema, the description is exceptionally complete. It covers usage, alternatives, parameter details (especially model routing and model_profile), and explicitly lists the return fields, compensating for the absence of an output schema. An agent has everything needed to invoke this tool correctly.
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%, giving a baseline of 3. The description adds substantial meaning beyond the schema: it clarifies the 'auto' routing behavior, explains model aliases (deepseek, glm, openai) and their mappings, details model_profile's behavior with local routers and the fallback caveat, and describes chunking. This elevates it above baseline.
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 opens with a precise verb+resource statement: 'Send one prompt to one AI backend and return the response.' It then explicitly contrasts with sibling tools (council, spawn_subagent, generate_file, modify_file) by naming each alternative and its purpose, making differentiation immediate.
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?
Usage guidance is explicit and actionable: 'Use this for direct LLM queries that don't fit a more specialized tool.' It then enumerates specific sibling tools and the conditions that route elsewhere (multi-backend consensus -> council; agentic multi-step -> spawn_subagent; file generation/editing -> generate_file/modify_file). No ambiguity remains.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
backup_restoreA
Manage the timestamped backup files produced by modify_file and write_files_atomic. Four actions: create (manually snapshot a file before a risky native edit), list (enumerate known backups, optionally filtered to one file), restore (overwrite a file with a specific backup_id), cleanup (delete old backups per the policy in cleanup_options). The cleanup policy applies BOTH thresholds — a backup is deleted only when it exceeds max_age_days OR when its file already has more than max_count_per_file newer backups. Use dry_run to preview before applying. ⚠️ DESTRUCTIVE: restore overwrites the current file (the prior state is auto-snapshotted to <path>.pre_restore_<timestamp>, so the restore itself is reversible); cleanup permanently deletes backup files from disk. create and list are read-only. Returns: { success, action, ...action-specific fields }. create→{backup_id, backup_path, original_path, size}. restore→{backup_id, restored_to, pre_restore_backup}. list→{file_path, backups:[{path, backup_id, size, created, metadata}]}. cleanup→{dry_run, backups_deleted, deleted:[{path, reason:'age'|'count'}]}.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Required. Operation to perform on the backup store. | |
| metadata | No | Optional tags and description attached to a `create` snapshot for later identification via `list`. | |
| backup_id | No | Identifier of the backup to restore (timestamp from `<path>.backup.<timestamp>`). Required for `restore`, ignored for other actions. | |
| file_path | No | For `create`: file to snapshot (required). For `list`: optional filter to one file. Ignored for `restore` (use backup_id) and `cleanup` (operates on the whole store). | |
| cleanup_options | No | Policy controls for the `cleanup` action. Ignored by other actions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and excels: it explicitly warns that restore is destructive but reversible via pre_restore snapshot, cleanup permanently deletes files, and create/list are read-only. It also discloses the cleanup policy's both-thresholds condition and return field details.
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?
Though longer than typical descriptions, every sentence adds value. It is well-structured with action enumeration, a prominent destructive warning, and a return specification section, earning its length without waste.
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?
Given the tool's complexity—four actions, nested options, and no output schema—the description fully covers all aspects: action behavior, parameter roles, destructive outcomes, cleanup thresholds, and return shapes for each action. It is self-contained and complete.
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 coverage is 100%, so baseline is 3, but the description adds substantial meaning beyond schema: it explains action-specific parameter application (e.g., file_path ignored for restore/cleanup, backup_id required for restore), clarifies cleanup_options semantics, and defines the return structure per action. This significantly enhances understanding.
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 clearly states the tool manages timestamped backup files produced by modify_file and write_files_atomic, and enumerates the four specific actions (create, list, restore, cleanup). This distinguishes it from sibling tools that create or modify files, using a specific verb+resource structure.
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?
Usage context is clear: it says create for manual snapshot before risky native edit, list to enumerate backups, restore to overwrite, and cleanup per policy. It also mentions dry_run preview. However, it doesn't explicitly name alternative tools for when not to use this one, though siblings like modify_file are referenced as the source of backups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_analyzeA
Run the SAME question against a glob of files, then aggregate the findings into one cross-file summary. Use for codebase-wide audits ('any SQL injection under src/**/handlers/*.js?'), per-feature reviews, or pre-merge sweeps. For ONE file, use analyze_file (cheaper). For NL search without a known file set, use explore. Set aggregateResults:false to get raw per-file results instead of the aggregated summary. Read-only: by default reads every matched file (capped by maxFiles) and makes one LLM call per file (parallel by default). options.grepFilter (string or string[], plain substrings — never regex, case-insensitive) narrows the file set to files whose content contains ANY term; it widens the scan before applying maxFiles, so filtering never just re-filters an already-truncated glob. options.singlePass (default false) makes exactly ONE LLM call across all matched files instead of one call per file — much cheaper, but perFileResults only reports which files contributed evidence, not a real per-file summary/confidence; evidence per file is grep-matched lines (with context) when grepFilter is set, otherwise the file's head, capped to fit the model's context window (reported via evidence_truncated). Returns: shape depends on aggregateResults/singlePass. aggregateResults:true, singlePass:false (default): {success, status:'completed', filesAnalyzed, patterns, question, aggregatedSummary, aggregatedFindings:[strings], aggregatedActions:[strings], overallConfidence, perFileResults:[{filePath, summary, findingCount, confidence}], processing_time, tokens_saved}. singlePass:true: same shape but perFileResults:[{filePath, contributedEvidence}], plus singlePass:true, evidence_truncated (input side — evidence was trimmed before the call, with evidence_dropped_files/evidence_truncation_hint when true), and was_truncated (output side — the aggregated answer itself hit the token limit, with truncation_hint when true). aggregateResults:false: {success, status:'completed', filesAnalyzed, patterns, question, results:[full per-file analysis objects], processing_time}. When grepFilter is set, responses also include grepFilter:{terms, filesScanned, filesMatched}. Empty pattern match: {success, status:'no_files', message, patterns}.
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | ||
| question | Yes | Question to ask about each file | |
| filePatterns | Yes | Glob patterns or file paths (e.g., ["src/**/*.ts", "lib/*.js"]) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it delivers: it discloses read-only behavior ('Read-only: by default reads every matched file'), describes the default one-LLM-call-per-file and parallel execution, explains how grepFilter widens the scan before maxFiles truncation, details the singlePass behavior and its effect on perFileResults, and enumerates exact return shapes for every combination of aggregateResults and singlePass. It even handles the empty-match case. This is exhaustive and accurate.
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 long but well-structured: it starts with the core purpose and usage, then flows into behavioral details and finally enumerates return shapes per mode. Every sentence carries unique information—no filler or tautology. It is not minimal, but the complexity of the tool justifies the length. It could be trimmed slightly (e.g., splitting return-shape legend into a code block), but overall it is organized and front-loaded with the most critical guidance.
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?
This is a multi-mode tool with no output schema, so the description must fully specify return contracts—and it does. It details shapes for aggregateResults:true/false and singlePass variations, includes evidence_truncated and truncation_hint flags, lists the grepFilter response object, and even covers the no-files-matched outcome. Given the complexity and absence of an output schema, this is complete and actionable.
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 coverage is 67%, but the description adds substantial meaning to all parameters and options. It explains the filePatterns glob syntax, clarifies that grepFilter is plain substrings (never regex, case-insensitive) and how it interacts with maxFiles, details the token-saving trade-offs of singlePass, and specifies what aggregateResults:false returns. This goes far beyond the schema's terse descriptions and compensates fully for the coverage gap.
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 opens with a precise action: 'Run the SAME question against a glob of files, then aggregate the findings into one cross-file summary.' It names the resource (glob of files) and the aggregation behavior, and explicitly contrasts with siblings: 'For ONE file, use `analyze_file` (cheaper). For NL search without a known file set, use `explore`.' This makes the tool's role unmistakable without needing to open any sibling schemas.
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?
It provides concrete use cases ('codebase-wide audits', 'per-feature reviews', 'pre-merge sweeps') and explicit exclusion criteria: 'For ONE file, use analyze_file (cheaper)' and 'For NL search without a known file set, use explore.' It also explains when to toggle aggregateResults for raw per-file output. This leaves no ambiguity about when to pick this tool over its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_modifyA
Apply the SAME natural-language instruction independently to each file in files. Use for sweeping consistent edits — 'add JSDoc to every exported function in lib/', 'replace console.log with logger.info'. transactionMode:'all_or_nothing' (default) rolls every file back if any one fails; 'best_effort' keeps the successful edits and reports failures. This tool does NOT find cross-file references — each file is edited in isolation. For symbol renames that must update callers, use refactor. For one file with custom instructions, use modify_file. ⚠️ DESTRUCTIVE when review:false: writes to every file in the batch (per-file backups at <path>.backup.<timestamp>). The default review:true returns the proposed diffs without writing. Returns: shape depends on review. review:true (default): {success, status:'pending_review', filesProcessed, patterns, instructions, modifications:[{filePath, status:'pending_review'|'error', summary, diff, stats, error?}], successCount, failureCount, approval_instructions, tokens_saved}. review:false (auto-write): {success, status:'completed'|'partial', filesProcessed, modifications:[{filePath, status:'written'|'error', summary, stats, error?}], successCount, failureCount}.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | File paths or glob patterns to modify | |
| options | No | ||
| instructions | Yes | Instructions to apply to each file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the transparency burden. It discloses destructive behavior when `review:false`, the default `review:true` behavior (returns diffs without writing), per-file backups, and the rollback semantics of `all_or_nothing`. It also clearly states the tool does not find cross-file references.
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?
Although long, the description is densely packed and efficiently organized: purpose first, then usage context, then safety warning, then return shapes. Every sentence adds value—no filler or repetition. The careful structure makes it scannable despite its length.
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?
The description covers all critical aspects of a complex batch tool: purpose, usage boundaries, safety, transaction modes, review modes, return formats, and backup behavior. There is no output schema, so the description correctly includes the full return shapes for both `review:true` and `review:false` scenarios, leaving nothing an agent needs to infer.
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?
While the schema provides descriptions for `files`, `instructions`, and nested options, the description adds critical semantics: the meaning of `transactionMode` (rollback vs best-effort), the safety of the default `review:true`, and the exact return shapes for both review modes. This goes well beyond the schema's bare parameter definitions.
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 states a specific verb-resource pair: 'Apply the SAME natural-language instruction independently to each file in `files`.' It clearly distinguishes itself from siblings by naming `refactor` for cross-file edits and `modify_file` for single-file custom edits, leaving no ambiguity about scope.
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?
It provides explicit when-to-use guidance with concrete examples ('add JSDoc to every exported function', 'replace console.log with logger.info') and explicit when-not-to-use exclusions (cross-file references → `refactor`, single file → `modify_file`). It also explains when to choose `best_effort` vs `all_or_nothing`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_backend_healthA
On-demand ping of one specific backend's API endpoint to verify reachability and capture latency. Hits only the named backend, not the whole fleet. Read-only: makes one HTTP request to the backend's health endpoint. Returns: {success, status:'online'|'offline', backend, latency_ms, last_check_iso, error?, total_check_time}.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Bypass cache and force fresh check | |
| backend | Yes | Backend name to check (local, gemini, nvidia_deepseek, nvidia_glm, openai_chatgpt, groq) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden and does disclose read-only behavior, one HTTP request, and the return shape. However, it claims 'makes one HTTP request' while the force parameter says 'Bypass cache and force fresh check,' implying that cached results may be returned by default. This caching behavior is not disclosed in the description, leaving a meaningful ambiguity.
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 compact, front-loaded with the core purpose, and includes the return format in a structured inline block. Every sentence adds useful information, and there is no filler or redundancy.
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?
The description provides essential context, return fields, and read-only status, and the schema covers parameters well. However, it omits the caching behavior implied by force and does not mention timeout, error conditions, or prerequisites. For a simple health-check tool this is adequate but not fully complete.
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%, with both backend and force well described. The description adds context about the output fields and the scope of backend, but does not substantially enrich parameter meaning beyond what the schema already provides. Baseline 3 is appropriate.
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 states a specific verb ('ping'), a specific resource (one backend's API endpoint), and the purpose (verify reachability, capture latency). It further distinguishes itself by explicitly saying it hits only the named backend, not the whole fleet, so it is immediately differentiated from any broader monitoring tool.
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?
The description clearly frames this as an on-demand, single-backend health check and excludes fleet-wide checking with 'Hits only the named backend, not the whole fleet.' It does not name an alternative tool explicitly, but the context and exclusion are clear enough for an agent to decide when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
councilA
Pose one prompt to several AI backends in parallel and return all of their responses for Claude to synthesize. Backend selection is driven by topic, which maps to a declared capability rather than to any lane name: the usable lanes declaring that capability are preferred, and the remaining usable lanes fill the rest of the seats. An operator-configured roster for a topic overrides that entirely. confidence_needed controls how many backends are queried — high (4), medium (3), low (2). Use for architectural trade-offs, controversial calls, or anywhere dissent surfaced cheaply (~1-2s for 2-3 backends) is more useful than a single answer. For a single backend query, use ask. Read-only: makes N parallel HTTP calls; never writes to disk. Returns: {success, topic, strategy, confidence_needed, backends_queried:[names], backends_responded:[names of those that succeeded], responses:[{backend, success, content, response_time, error?}], processing_time_ms, metrics, synthesis_hint (suggestion to Claude on how to synthesize)}.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Topic category — determines which capability the council prefers when picking lanes, never which lane by name: coding → code_specialized, reasoning and architecture → deep_reasoning, security → security_focus, performance and creative → fast_generation, general → no preference (any usable lane). Lanes declaring the wanted capability are seated first; other usable lanes fill the remaining seats, so a council still convenes when only one lane matches. | |
| prompt | Yes | The question or topic for the council to deliberate on | |
| max_tokens | No | Maximum tokens per backend response | |
| num_backends | No | Override number of backends to query (optional - auto-calculated from confidence_needed) | |
| confidence_needed | No | Required confidence level - determines number of backends: high (4 backends), medium (3 backends), low (2 backends) | medium |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and meets it fully: it states 'Read-only: makes N parallel HTTP calls; never writes to disk,' discloses the capability-based selection mechanism and roster override, and documents the exact return envelope. It also notes performance characteristics (~1-2s for 2-3 backends). There is no annotation contradiction.
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 dense and front-loaded with the core action, then flows logically through selection, confidence levels, use cases, safety, and return format. Every sentence earns its place; the only minor deduction is for slight redundancy with schema-provided confidence counts (high/medium/low) and the length, which is still justified by tool complexity.
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?
For a parameter-rich tool with no annotations and no output schema, the description is remarkably complete. It defines the input semantics that matter (topic→capability, confidence→count), states the read-only side effect, names the sibling to avoid, and provides an explicit return structure. Nothing an agent needs to invoke it correctly is missing.
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?
The input schema already covers 100% of parameters, so the baseline is 3. The description adds value beyond the schema by explaining that `topic` maps to a capability rather than a lane name, describing the operator-configured roster override (not present in the schema), and reinforcing the `confidence_needed` → backend count mapping. It doesn't add prose for `max_tokens` or `num_backends`, but those are self-explanatory in the schema.
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 opens with a precise verb+object pair: 'Pose one prompt to several AI backends in parallel and return all of their responses for Claude to synthesize.' It clearly differentiates from the sibling `ask` by framing council as multi-backend and naming `ask` as the single-backend alternative, so an agent can distinguish them without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool: 'Use for architectural trade-offs, controversial calls, or anywhere dissent surfaced cheaply...' It also names the alternative: 'For a single backend query, use `ask`.' This is explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dual_iterateA
Code generation with an internal review loop: a generator backend writes code, a reviewer backend scores it against quality_threshold, the generator fixes flagged issues, and the cycle repeats until the threshold is met or max_iterations runs out. The whole loop runs inside SAB; Claude sees only the final accepted code (~1 turn of output instead of 3-5). Use for complex single-file generation where you would otherwise pay the token cost of reviewing iterations in-chat. For multi-agent TDD with parallelism + tests, use parallel_agents. For one-shot generation without iteration, use generate_file. Read-only: returns the generated code to the caller; does NOT write to disk (pass the result to write_files_atomic to persist). Returns: {success, code (final accepted code as a string), mode (the iteration mode used), iterations (number actually run), execution_time_ms, metadata:{task_preview, code_length, timestamp}, history (full per-iteration log, only when include_history:true), final_review:{status, notes}, self_review_applied}.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | Code generation task description (e.g., "Write a function that validates email addresses") | |
| max_iterations | No | Maximum review iterations before accepting result (default: 3) | |
| include_history | No | Include iteration history in response (useful for debugging) | |
| quality_threshold | No | Minimum reviewer score (0.5–1.0) needed to accept and stop iterating. 0.7 (default) = balanced. 0.85+ = strict (more iterations, better code, may exhaust `max_iterations`). 0.5 = lenient (returns first plausible attempt). The loop also stops at `max_iterations` regardless of threshold. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it excels. It discloses that the tool is 'Read-only: returns the generated code to the caller; does NOT write to disk' and explains the internal loop, the fact that Claude sees only the final accepted code, and the meaning of return fields like `history` and `self_review_applied`. It also details the stopping conditions and the role of `quality_threshold`. This is comprehensive behavioral transparency.
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 long but every sentence earns its place. It is front-loaded with the core mechanism, then covers usage, alternatives, read-only behavior, and return format. Despite the length, it is densely informative and structured logically. No fluff or repetition of schema details; it adds value throughout.
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?
Given the tool's complexity (internal loop, 4 parameters, no output schema), the description is remarkably complete. It explains the full process, the return object structure (including `success`, `code`, `mode`, `iterations`, `execution_time_ms`, `metadata`, `history`, `final_review`, `self_review_applied`), the read-only nature, and how to persist results via `write_files_atomic`. It also addresses the user-facing benefit (reduced token output). Nothing critical is missing.
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 baseline is 3. The description adds meaningful context beyond the schema: it explains the effect of `quality_threshold` with concrete ranges ('0.7 (default) = balanced. 0.85+ = strict... 0.5 = lenient') and clarifies that the loop stops at `max_iterations` regardless of threshold. It also links `include_history` to the return value. This enriches parameter understanding without redundancy, so 4 is appropriate.
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 opens with a specific verb and resource: 'Code generation with an internal review loop,' and clearly explains the iterative process. It distinguishes itself from siblings by naming alternatives: 'For multi-agent TDD with parallelism + tests, use `parallel_agents`. For one-shot generation without iteration, use `generate_file`.' This fully clarifies what the tool does and when it is unique.
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?
Explicit usage guidance is provided: 'Use for complex single-file generation where you would otherwise pay the token cost of reviewing iterations in-chat.' It also states when not to use it by pointing to alternatives: `parallel_agents` for multi-agent TDD and `generate_file` for one-shot generation. This gives clear when/when-not/alternatives, exceeding the minimum.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exploreA
Natural-language search across the codebase: combines grep-style matching with optional LLM summarization to answer 'where is X handled?' or 'what files implement Y?' Returns a summary + the matching file:line list, not raw file contents. Use when you DON'T already know which file to look at. For a deep analysis of ONE known file, use analyze_file. For a structured question across a known set of files (glob patterns), use batch_analyze. depth:'shallow' is fast grep; depth:'deep' adds LLM-generated context per match. Read-only: walks the filesystem and reads matched files but never writes. Returns: {success, summary (LLM- or template-generated answer), files_found:[paths], search_patterns:[strings actually grepped], evidence:[...] (capped at 15), tokens_saved, processing_time_ms, depth, backend_used}. The evidence entry shape depends on depth: shallow returns {file, line, snippet} per matching line; deep returns {file, matches:[{line, context}]}, grouping each file's matches with surrounding context.
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | ||
| question | Yes | Natural language question about the codebase (e.g., "where is user authentication handled?") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the tool is read-only ('never writes'), returns a summary + file:line list instead of raw contents, explains the shallow vs deep depth difference, caps evidence at 15, and lists the full return object. This is thorough and accurate.
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 well-structured paragraph, but it is longer than strictly necessary. However, every sentence contributes value—purpose, usage, behavior, and return format—so it is efficient given the tool's complexity.
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?
The tool is complex (nested options, multiple backends, depth-dependent output), and the description covers all necessary aspects: what it does, when to use it, behavioral guarantees, parameter nuances, and the exact return structure including unusual fields like tokens_saved and processing_time_ms. It even notes the evidence cap.
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?
The schema descriptions cover question and the sub-fields of options (depth, scope, backend, maxFiles), but only at a surface level. The description adds crucial semantics for depth ('fast grep' vs 'adds LLM-generated context per match') and describes the evidence shape per depth. Since schema coverage is 50%, it compensates well, though scope/backend are left to the schema.
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 states a specific verb ('search') and resource ('codebase'), and clarifies what it answers ('where is X handled?' / 'what files implement Y?'). It also explicitly contrasts with siblings (analyze_file, batch_analyze) by naming their use cases, making the purpose unambiguous.
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?
Provides explicit when-to-use ('when you DON'T already know which file to look at') and when-not-to-use, naming alternatives for each: 'analyze_file' for a single known file, 'batch_analyze' for structured questions over known globs. This leaves no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_fileA
Generate a new file from a natural-language spec. The local LLM writes the code; Claude either reviews the proposed content (review:true, default) or it gets written directly to outputPath (review:false). Use for fresh files you can describe by goal — boilerplate, scaffolding, test fixtures, single-file utilities. For editing an EXISTING file, use modify_file. For writing a known content string to disk with no LLM involved, use write_files_atomic. Optionally pass contextFiles to anchor the generated style on existing code. ⚠️ DESTRUCTIVE when review:false: writes (and creates parent directories of) outputPath. If includeTests:true, also writes a sibling test file. The default (review:true) is non-destructive — returns the generated content for Claude to inspect first. Returns: {success, status:'written'|'written_truncated'|'pending_review', outputPath, summary, linesOfCode, language, testPath (when includeTests), backend_used, processing_time, retry_attempts, was_truncated}. In review mode the response also carries the generated content for Claude to apply via write_files_atomic.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes | Natural language specification for the code to generate | |
| options | No | ||
| outputPath | Yes | Where to write the generated file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and meets it. It warns '⚠️ DESTRUCTIVE when review:false' and details that it writes and creates parent directories of outputPath, optionally writes a sibling test file, and that review:true is non-destructive. It also discloses the return shape and the fact that review mode returns content for Claude to apply later. This is thorough and goes well beyond a minimal disclosure.
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 long but packed with necessary information. It front-loads the core purpose and usage, then layers destructive warnings and return details. Every sentence adds value; there is no fluff. It could be slightly tighter by trimming the speculative return enumeration, but overall it is well-structured and no section is redundant.
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?
The tool is complex with two modes, destructive behavior, and a detailed return object. The description covers purpose, usage, alternatives, the review vs. direct-write decision, destructive warning, return schema, and how to apply content in review mode. Since there is no output schema, the explicit mention of the return fields is essential and provided. Nothing an agent needs to call it correctly is missing.
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 coverage is 67% (spec and outputPath have descriptions; the options object itself lacks a description, though its properties are documented). The description adds meaning by explaining the role of each option: review mode's purpose, contextFiles for style anchoring, includeTests for sibling file generation, and the backend parameter's effect. It clarifies that outputPath is where the file is written. This compensates for the missing top-level option description, though not every edge case (e.g., backend choices) is detailed—still a strong addition.
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 opens with a precise statement: 'Generate a new file from a natural-language spec.' It identifies the verb (generate), the resource (file), and the input (natural-language spec). It also explicitly names sibling tools (modify_file, write_files_atomic) and states what they are for, making differentiation immediate. No ambiguity remains about the tool's core function.
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?
Usage guidance is explicit: 'Use for fresh files you can describe by goal' and then directly contrasts with alternatives: 'For editing an EXISTING file, use modify_file. For writing a known content string to disk with no LLM involved, use write_files_atomic.' It also explains the review vs. direct-write decision and the optional contextFiles, covering both when and when-not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_analyticsA
Inspect SAB's internal telemetry: backend invocation counts, success/failure rates, latency distributions, estimated token spend per provider, and recent routing decisions. Read-only — never calls an LLM, never writes to disk. Use to diagnose 'why did SAB pick backend X', tune routing rules, or understand cost trade-offs across providers. Report types are cumulative: full_report includes everything from the other types. Returns: {success, report_type, data} where data depends on report_type — current: {backends:{[name]:{invocations, success_rate, p50_ms, p95_ms}}, session_uptime, timestamp}. historical: {time_range, series:[{timestamp, backend, calls, errors, latency}]}. cost: {by_backend:{[name]:{tokens_in, tokens_out, estimated_usd}}, total_estimated_usd}. recommendations: {recommendations:[{type, suggestion, confidence}]}. full_report: a merged object with all sections. If analytics hasn't initialized, returns {message, basic_stats:{uptime, memory, timestamp}}.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | `json` = machine-readable nested object. `markdown` = human-readable summary with tables. Default: json. | |
| time_range | No | Lookback window for `historical` and `cost` reports. Ignored for `current` and `recommendations`. Default: 7d. | |
| report_type | No | `current` = stats since this server started (invocation counts, success rate, p50/p95 latency per backend). `historical` = time-bucketed series over `time_range`. `cost` = estimated token spend per backend, with cost-per-1K-tokens projections. `recommendations` = SAB heuristics on backend selection (e.g. "switch coding tasks to nvidia_glm — 18% faster on your traces"). `full_report` = all of the above. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explicitly states read-only, never calls an LLM, never writes to disk, and discloses edge-case behavior (returns different structure if analytics not initialized). It also details return types extensively, making behavior fully transparent.
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?
Though long, the description is well-structured: purpose front-loaded, followed by usage, then return format breakdown. Each sentence earns its place, especially given the tool's complexity with multiple report types. No fluff or redundant phrasing.
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?
With no output schema, the description must fully explain return values, which it does with examples for each report type. It also covers the uninitialized fallback. All information an agent needs to correctly call and interpret the tool is present. Complete for a tool of this complexity.
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?
The input schema has 100% description coverage for all 3 parameters, including enums, defaults, and semantics. The description does not add meaningful details beyond what the schema already states (e.g., it mentions report types but does not elaborate on parameters). Baseline 3 is correct since schema handles parameter documentation.
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 clearly states it inspects SAB's internal telemetry, listing specific metrics (invocation counts, success/failure rates, latency, token spend, routing decisions). 'Inspect' is a specific verb, and the resource is unambiguous. It is distinct from siblings like check_backend_health (which likely checks live health) and analyze_file (which inspects code), so no confusion.
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?
The description explicitly provides use cases: diagnosing backend selection, tuning routing rules, and understanding cost trade-offs. It does not name alternative tools or mention when NOT to use it, but the context is clear and actionable. A 4 is appropriate for lacking explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modify_fileA
Edit an existing file by describing the change in natural language. The local LLM reads the file, applies the edit using SEARCH/REPLACE blocks (with a size-ratio safety net that refuses writes <50% of the original), and returns a unified diff for Claude to approve (review:true, default) or writes directly (review:false). Use for non-trivial edits where the AI does the work. For a known string→string replacement Claude can do itself, use native Edit. For writing a fully-specified content string to a file, use write_files_atomic. For the same instruction across MANY files, use batch_modify. For symbol renames + cross-file reference updates, use refactor. ⚠️ DESTRUCTIVE when review:false: writes directly to filePath. A backup at <path>.backup.<timestamp> is created unless backup:false is also passed (a warning is logged in that case). dryRun:true produces the diff without writing. Returns: shape depends on mode. review (default): {success, status:'pending_review'|'pending_review_truncated', filePath, diff, modifiedContent, summary, stats, warnings, was_truncated, approval_options, retry_attempts}. dryRun: {success, status:'dry_run', filePath, diff, summary, stats, warnings, backend_used, processing_time}. auto-write: {success, status:'written', filePath, diff, summary, stats, backupCreated, backend_used, processing_time, tokens_saved}.
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | ||
| filePath | Yes | Path to the file to modify | |
| instructions | Yes | Natural language edit instructions (e.g., "Add rate limiting to the login function") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility. It fully discloses destructive behavior (review:false writes directly, backup unless backup:false), the size-ratio safety net, the dry-run mode, and the exact return shapes for all three modes (review, dryRun, auto-write). Nothing is left to inference and it contradicts no structured data.
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 long but every sentence earns its place: purpose, safety net, usage routing, destructive warning, backup behavior, and return shapes. It leads with the core statement and then layers specifics. While dense, the structure (modes, return shapes) keeps it navigable.
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?
For a tool with 2 required params, 3 modes, a safety net, and no output schema, the description covers every angle: when to use, what it does, how it behaves in each mode, what the response looks like, and the destructive caveats. Nothing an agent needs to call it correctly is missing.
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?
The schema already describes both required parameters and each option. The description adds valuable behavioral context beyond schema – e.g., the <50% size-ratio refusal, the meaning of 'pending_review' statuses, and the backup timestamp naming. It doesn't reinvent parameter docs but enriches them with operational detail.
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 immediately states 'Edit an existing file by describing the change in natural language' – a clear verb+resource. It also names four sibling tools to differentiate (native Edit, write_files_atomic, batch_modify, refactor) with specific conditions for each, making selection unambiguous.
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?
It explicitly says 'Use for non-trivial edits where the AI does the work' and provides a battery of alternatives: native Edit for known string replacements, write_files_atomic for fully-specified content, batch_modify for many files, refactor for symbol renames. This is textbook when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parallel_agentsA
Run a test-first development workflow as a graph of parallel agents: a decomposer splits the task into atomic subtasks, RED-phase agents write failing tests, GREEN-phase agents implement to pass them, then a quality reviewer iterates the cycle until a threshold is met or max_iterations runs out. Use for self-contained features that benefit from test-first discipline and can be parallelized. For a single agent on a single task, use spawn_subagent. For a generate→review→fix loop on one code blob (no test infrastructure), use dual_iterate. ⚠️ DESTRUCTIVE when write_files:true (default): generated tests, implementation, and refactor outputs are written under work_directory in red/, green/, refactor/ subdirectories (defaults to /tmp/parallel-agents-<timestamp>). Returns: {success, task, decomposition (decomposer's plan), execution:{groups_executed, tasks_completed, tasks_failed, max_parallel_used, files_written, write_files_enabled}, router_info:{slots, model, status}, quality:{verdict, score, iterations}, synthesis (combined output), files:[absolute paths written], work_directory, processing_time_ms, metrics}.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | High-level task to decompose and execute via TDD workflow | |
| write_files | No | Write generated code to files in work_directory (default: true). Files are organized by phase (red/green/refactor subdirectories). | |
| max_parallel | No | Maximum parallel agents (matches GPU slots, default: 2) | |
| max_iterations | No | Maximum quality gate iterations (prevents infinite loops) | |
| work_directory | No | Optional directory for generated files (default: /tmp/parallel-agents-{timestamp}) | |
| iterate_until_quality | No | Whether to iterate on failed quality checks |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it warns about destructive behavior when write_files is true, explains that files are written to work_directory subdirectories (red/green/refactor), and describes the iteration loop termination condition. It also includes the full return structure, adding useful context beyond annotations.
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 long but each sentence earns its place: it covers the workflow, use cases, alternatives, destructive warning, and return structure. It is well-organized and front-loaded with the core purpose, making it dense yet scannable. Not overly verbose for the complexity involved.
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?
Given the tool's complexity (6 parameters, no output schema, no annotations), the description is remarkably complete. It explains the process in enough detail to predict behavior, provides safety warnings, states alternatives, and lists the exact return fields. The only minor gap is not elaborating on cleanup or permissions, but the return structure and schema coverage fill most needs.
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?
The input schema already covers 100% of parameters with descriptions, providing a solid baseline of 3. The tool description enriches this by explaining the behavioral impact of write_files (destructive, writes to subdirectories) and mentions max_iterations as the loop limit. This extra context adds value beyond the schema.
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 clearly states the tool runs a test-first development workflow as a graph of parallel agents, detailing the decomposer, RED/GREEN phases, and quality reviewer. It distinguishes itself from siblings by explicitly naming spawn_subagent and dual_iterate as alternatives, making its unique role obvious.
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?
It provides explicit when-to-use guidance: 'Use for self-contained features that benefit from test-first discipline and can be parallelized.' It also gives concrete alternatives: 'For a single agent on a single task, use spawn_subagent' and 'For a generate→review→fix loop on one code blob (no test infrastructure), use dual_iterate.' This is exemplary usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refactorA
Cross-file refactoring with automatic reference tracking. Locates where target is defined and where it's used, then applies the instruction consistently across the matched scope. Use for renames, signature changes, API migrations — any edit where consistency between definition and callers matters. scope bounds how wide the search goes: 'function' / 'class' / 'module' / 'project'. For the same blind edit across files without reference-awareness (cheaper), use batch_modify. For a single-file change, use modify_file. ⚠️ DESTRUCTIVE when review:false: writes to every file touched by the refactor. dryRun:true produces the plan without writing. Returns: shape depends on mode. review:true (default) or dryRun:true: {success, status:'pending_review'|'dry_run', scope, target, instructions, plan:{description, steps:[strings], filesAffected, estimatedChanges}, modifications:[{filePath, status:'pending_review'|'dry_run'|'error', summary, diff, stats, error?}], analysis:{occurrences, references, impact}, backend_used, processing_time, tokens_saved}. Auto-apply (review:false): {success, status:'completed'|'partial', scope, target, instructions, filesModified, filesTotal, modifications:[{filePath, status:'written'|'error', summary, error?}], backend_used, processing_time}.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | Yes | How wide the reference search goes. `function` = the target function and its direct callers in the same module. `class` = the class definition, its methods, and call sites within the same module. `module` = the file containing `target` plus any file that imports from it. `project` = whole-repo search (slowest, most thorough). Pick the narrowest scope that covers your actual change. | |
| target | Yes | Symbol or pattern to refactor (e.g., "UserService", "handleLogin") | |
| options | No | ||
| instructions | Yes | Refactoring instructions (e.g., "Rename to AuthService and update all references") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full burden. It clearly warns 'DESTRUCTIVE when review:false' and explains write behavior, dryRun, review modes, and provides detailed return shapes for both modes. This exceeds what annotations would typically cover.
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 long but every sentence earns its place: purpose, usage, alternatives, destructive warning, and return shapes are all essential. It is front-loaded with the core purpose and alternatives, then details. Slightly verbose in the return shape section, but not wastefully so.
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?
Given the tool's complexity (cross-file, multiple modes, destructive potential), the description is exceptionally complete. It covers return shapes (since no output schema exists), scope semantics, alternates, and safety behaviors. Nothing an agent needs to invoke it correctly is missing.
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 coverage is 75% (three of four params documented). The description adds rich semantics: explains scope meaning per level, describes target, deciphers instructions, and clarifies options like review/dryRun. It compensates fully for any gaps and adds value beyond the schema.
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?
Clearly states it performs cross-file refactoring with automatic reference tracking, defines the resource (target) and scope, and gives concrete use cases (renames, signature changes, API migrations). It distinguishes itself from batch_modify and modify_file, so an agent can select it correctly.
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?
Explicitly lists when to use (consistency between definition and callers), when not to (blind edits -> batch_modify, single-file -> modify_file), and defines scope levels. This routes the agent to the right tool unambiguously.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reviewA
Review a code blob you already have in context and return structured findings + a quality score + improvement suggestions. Pass the code itself in content; this tool does not read any file from disk. Use when Claude already has the code in hand. For a review of a file Claude has NOT seen (so the file content stays out of context and a real tokens_saved figure is returned), use analyze_file with analysisType:'security' instead. For multiple AI perspectives on the same code, use council. Read-only: never writes to disk. Returns: {success, file_path, language, review_type, review (full review text from the LLM, includes findings + severity + suggestions), endpoint_used}.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Code content to review | |
| language | No | Programming language hint | |
| file_path | No | File path for context | |
| review_type | No | comprehensive |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses key behavioral traits: 'this tool does not read any file from disk' and 'Read-only: never writes to disk.' It also outlines the return structure. A small gap is that it doesn't mention potential rate limits or token usage, but the critical safety aspects are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than a single sentence but every clause earns its place: it covers purpose, usage context, alternatives, read-only behavior, and return format. It is well-structured and front-loaded, without redundant filler.
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?
The tool is relatively simple with 4 parameters and no output schema. The description supplies the return shape, emphasizes the content requirement, and names alternatives. It sufficiently equips the agent to select and invoke the tool correctly, though additional details about output size or review depth would push it to a 5.
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?
The input schema already covers 3 of 4 parameters (75% coverage), so the baseline is near-average. The description adds emphasis on passing code in `content` but does not elaborate on language or review_type beyond what the schema's enum provides. It provides only marginal extra semantic value.
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 clearly states the tool's function with a specific verb and resource: 'Review a code blob you already have in context and return structured findings + a quality score + improvement suggestions.' It distinguishes itself from siblings by explicitly naming analyze_file and council as alternatives for different use cases.
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?
The description gives explicit when-to-use guidance ('Use when Claude already has the code in hand'), when-not-to-use (for files not seen, use analyze_file), and when to use an alternative (council for multiple perspectives). It also clarifies what to pass in the content parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_subagentA
Spawn one AI agent with a predefined role + system prompt and run it to completion on a single task. The agent runs once and returns its verdict; there is no memory between calls. Use when the work fits a clear role (security audit on one module, generate tests for one function, write docs for one API). For multi-agent TDD parallelism with quality gates, use parallel_agents. For multi-backend consensus on a question, use council. Pass file paths and acceptance criteria in task — the agent has no other context. ⚠️ DESTRUCTIVE when write_files:true: code blocks the agent emits are saved into work_directory (auto-created if missing, defaults to /tmp/subagent-<role>-<timestamp>). The default write_files:false is non-destructive — code is returned inline in the response. Returns: {success, role, task, backend_used, response (agent's full output), verdict (structured findings, depth controlled by verdict_mode), files_analyzed (paths the agent read), files_written:[paths] (only when write_files), work_directory, suggested_tools:[follow-up tool names], processing_time_ms, metrics}.
| Name | Required | Description | Default |
|---|---|---|---|
| role | Yes | Subagent role: code-reviewer (quality review), security-auditor (vulnerability detection), planner (task breakdown), refactor-specialist (code improvement), test-generator (test creation), documentation-writer (docs generation), tdd-decomposer (break task into TDD subtasks), tdd-test-writer (RED phase), tdd-implementer (GREEN phase), tdd-quality-reviewer (quality gate) | |
| task | Yes | Task description for the subagent to perform | |
| context | No | Additional context object for the subagent | |
| write_files | No | When true, code blocks the agent emits are saved into `work_directory` as separate files. Default false — code is returned inline in the response, which keeps disk state clean but adds tokens. | |
| verdict_mode | No | `summary` returns the agent's key findings + recommended actions only (faster, less for Claude to read). `full` returns the agent's complete structured verdict including reasoning trace. | summary |
| file_patterns | No | Optional glob patterns for files to analyze (e.g., ["src/**/*.js", "*.test.ts"]) | |
| work_directory | No | Destination directory when `write_files:true`. Auto-created if missing. Defaults to `/tmp/subagent-<role>-<timestamp>`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does this thoroughly: no memory between calls, the agent has no other context than the task, side effects of `write_files:true` (saving code blocks into a work_directory that is auto-created), the default non-destructive behavior, and a detailed list of return fields. It even explicitly flags the destructive condition with a warning emoji. This goes well beyond what a typical description provides.
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 dense paragraph with five sentences, each earning its place: the core action, usage guidance, alternatives, a critical side-effect warning, and a complete return specification. It is front-loaded with the primary purpose and never meanders. No word is wasted.
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?
Despite having 7 parameters, nested objects, and no output schema, the description provides a comprehensive picture: use cases, alternatives, side effects, default behavior, and a full enumeration of return fields. This equips the agent to decide when to invoke the tool and understand its consequences, making it contextually complete for the tool's complexity.
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?
The schema has 100% parameter description coverage, so the baseline is 3. The description adds meaningful semantic context that enriches the schema: it explains that `task` should contain file paths and acceptance criteria because the agent has no other context, clarifies the default behavior of `write_files` in terms of resource usage ('adds tokens'), and states the auto-creation/default path for `work_directory`. These additions improve parameter understanding, though not every parameter gets extra treatment, hence a 4.
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 opens with a specific verb ('Spawn') and resource ('one AI agent with a predefined role + system prompt') and clearly states the action ('run it to completion on a single task'). It also distinguishes the tool from siblings by naming `parallel_agents` and `council` as alternatives for different use cases, which removes ambiguity about what this tool is for.
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?
The description explicitly states when to use the tool ('Use when the work fits a clear role...') and provides concrete examples. It also tells the agent when NOT to use it and what to use instead ('For multi-agent TDD parallelism with quality gates, use `parallel_agents`. For multi-backend consensus on a question, use `council`.'). This is exactly the kind of when/when-not guidance the rubric rewards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_files_atomicA
Write a batch of files in a single atomic operation with automatic backup. All files succeed or all roll back on any failure. Use this when several file writes must land together (config changes across modules, multi-file generation output). For natural-language edits to a single file, use modify_file instead. For appending to a log or accumulator file, use the append operation here. Each overwrite produces a <path>.backup.<timestamp> file when create_backup is true (default). ⚠️ DESTRUCTIVE: every operation writes (or appends to) a real file on disk. The rollback path runs only when a LATER operation in the same batch fails — earlier successful writes are reverted from their backups, but if every operation succeeds, the new files stand and the backups remain on disk. Returns: {success, files_written, results:[{path, operation, success, size}], backups_created, backups:[{original, backup}]}. On a mid-batch failure the call throws after restoring earlier files (rollback is not reflected in a success response).
| Name | Required | Description | Default |
|---|---|---|---|
| create_backup | No | When true, each file that would be overwritten is first copied to `<path>.backup.<timestamp>`. Set false only when you know the prior content is recoverable from version control. | |
| file_operations | Yes | Array of write operations to apply atomically. If any operation fails, all previously written files are restored from their backups. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It clearly warns 'DESTRUCTIVE', explains backup file creation, details the rollback mechanism (only on later failures, earlier writes restored), and states that backups remain on success. It also discloses throw behavior on mid-batch failure, offering comprehensive transparency.
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 dense but well-structured. It front-loads the core purpose, then provides usage, alternatives, destructive warning, rollback semantics, and return format. Every sentence adds value without redundancy, and the length is justified by the complexity of the atomic batch behavior.
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?
Given the tool's complexity (atomic batch, rollback, backups, append operations) and the absence of an output schema, the description fully covers the return format, edge cases (mid-batch failure, success with remaining backups), and prerequisite safety info. It is complete enough for an agent to use the tool correctly without further clarification.
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 coverage is 100%, providing a baseline of 3. The description adds extra meaning by explaining the behavior of `create_backup` (backups remain, timestamp format) and contextualizing `file_operations` with practical uses like append for logs. It enriches parameter understanding beyond the schema's own descriptions.
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 clearly states the tool's function: writing a batch of files atomically with automatic backup. It specifies the verb 'Write' and the resource 'batch of files', and distinguishes itself from sibling tools like `modify_file` by highlighting the batch and atomicity aspects.
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?
Explicit usage guidance is provided: 'Use this when several file writes must land together' with concrete examples. It also names alternatives: 'For natural-language edits to a single file, use `modify_file` instead' and mentions the append operation for accumulator files, giving clear when-to and when-not-to guidance.
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. Dates show when Glama detected each change.
3 tool updates
v2.15.0- Changed
ask2 fields changed- changed
Input schema / properties / force_backend / descriptionPrevious value: -"Force specific backend (bypasses smart routing) - use backend keys like \"local\", \"gemini\", \"nvidia_deepseek\", \"nvidia_glm\", \"openai\", \"groq\""New value: +"Force specific backend (bypasses smart routing) - use backend keys like \"local\", \"gemini\", \"nvidia_deepseek\", \"nvidia_glm\", \"openai_chatgpt\", \"groq\"" - changed
Input schema / properties / model / descriptionPrevious value: -"AI backend to query: auto (smart routing selects optimal backend), local (autodiscover vLLM/llama.cpp/LM Studio), gemini (Gemini Enhanced, 32K tokens), nvidia_deepseek (NVIDIA DeepSeek with streaming + reasoning, 8K tokens), nvidia_glm (NVIDIA GLM-5.2 code specialist, 32K tokens), openai (OpenAI GPT-5.2, 128K context, premium reasoning), groq (Llama 3.3 70B, ultra-fast 500+ t/s). The friendly aliases `deepseek` and `glm` are also accepted (mapped to nvidia_deepseek / nvidia_glm), matching the other tools."New value: +"AI backend to query: auto (smart routing selects a lane by task complexity + current health), local (your own router — vLLM/llama.cpp/LM Studio — autodiscovered), gemini (Google Gemini lane), nvidia_deepseek (NVIDIA-hosted DeepSeek lane — reasoning-oriented, supports streaming and the `thinking` option), nvidia_glm (NVIDIA-hosted GLM lane — code-oriented), openai (OpenAI lane), groq (Groq lane — low-latency hosted inference). No model id or context size is fixed here: each lane runs whatever `config.model` declares in backends.json, or a model selected from the provider's own catalog when nothing is declared. The friendly aliases `deepseek`, `glm` and `openai` are also accepted (mapped to nvidia_deepseek / nvidia_glm / openai_chatgpt), matching the other tools."
- Changed
check_backend_health1 field changed- changed
Input schema / properties / backend / descriptionPrevious value: -"Backend name to check (local, gemini, nvidia_deepseek, nvidia_glm, openai, groq)"New value: +"Backend name to check (local, gemini, nvidia_deepseek, nvidia_glm, openai_chatgpt, groq)"
- Changed
council1 field changed- changed
Input schema / properties / topic / descriptionPrevious value: -"Topic category - determines which backends are consulted: coding (nvidia_glm, local), reasoning (nvidia_deepseek), architecture (nvidia_deepseek, nvidia_glm), general (gemini, groq), creative (gemini, nvidia_glm), security (nvidia_deepseek, nvidia_glm), performance (nvidia_deepseek, local)"New value: +"Topic category — determines which capability the council prefers when picking lanes, never which lane by name: coding → code_specialized, reasoning and architecture → deep_reasoning, security → security_focus, performance and creative → fast_generation, general → no preference (any usable lane). Lanes declaring the wanted capability are seated first; other usable lanes fill the remaining seats, so a council still convenes when only one lane matches."
9 tool updates
v2.14.0- Changed
analyze_file1 field changed- changed
Input schema / properties / options / properties / backend / enumPrevious value: -[ - "auto", - "local", - "deepseek", - "glm", - "qwen3", - "gemini", - "groq" -]New value: +[ + "auto", + "local", + "deepseek", + "glm", + "gemini", + "groq" +]
- Changed
ask3 fields changed- changed
Input schema / properties / force_backend / descriptionPrevious value: -"Force specific backend (bypasses smart routing) - use backend keys like \"local\", \"gemini\", \"nvidia_deepseek\", \"nvidia_glm\", \"openai\", \"groq\" (legacy \"nvidia_qwen\"/\"qwen3\" also accepted)"New value: +"Force specific backend (bypasses smart routing) - use backend keys like \"local\", \"gemini\", \"nvidia_deepseek\", \"nvidia_glm\", \"openai\", \"groq\"" - changed
Input schema / properties / model / descriptionPrevious value: -"AI backend to query: auto (smart routing selects optimal backend), local (autodiscover vLLM/llama.cpp/LM Studio), gemini (Gemini Enhanced, 32K tokens), nvidia_deepseek (NVIDIA DeepSeek with streaming + reasoning, 8K tokens), nvidia_glm (NVIDIA GLM-5.2 code specialist, 32K tokens), openai (OpenAI GPT-5.2, 128K context, premium reasoning), groq (Llama 3.3 70B, ultra-fast 500+ t/s). The friendly aliases `deepseek` and `glm` are also accepted (mapped to nvidia_deepseek / nvidia_glm), matching the other tools. `nvidia_qwen` and `qwen3` are legacy aliases still accepted for back-compat (the lane served Qwen3 Coder 480B until NVIDIA retired it on 2026-06-11) — they resolve to nvidia_glm."New value: +"AI backend to query: auto (smart routing selects optimal backend), local (autodiscover vLLM/llama.cpp/LM Studio), gemini (Gemini Enhanced, 32K tokens), nvidia_deepseek (NVIDIA DeepSeek with streaming + reasoning, 8K tokens), nvidia_glm (NVIDIA GLM-5.2 code specialist, 32K tokens), openai (OpenAI GPT-5.2, 128K context, premium reasoning), groq (Llama 3.3 70B, ultra-fast 500+ t/s). The friendly aliases `deepseek` and `glm` are also accepted (mapped to nvidia_deepseek / nvidia_glm), matching the other tools." - changed
Input schema / properties / model / enumPrevious value: -[ - "auto", - "local", - "gemini", - "groq", - "deepseek", - "glm", - "qwen3", - "nvidia_deepseek", - "nvidia_glm", - "nvidia_qwen", - "openai" -]New value: +[ + "auto", + "local", + "gemini", + "groq", + "deepseek", + "glm", + "nvidia_deepseek", + "nvidia_glm", + "openai" +]
- Changed
batch_analyze3 fields changed- changed
Input schema / properties / options / properties / backend / enumPrevious value: -[ - "auto", - "local", - "deepseek", - "glm", - "qwen3", - "gemini", - "groq" -]New value: +[ + "auto", + "local", + "deepseek", + "glm", + "gemini", + "groq" +] - added
Input schema / properties / options / properties / grepFilterAdded value: +{ + "description": "Plain substring(s) to content-filter matched files by before maxFiles is applied (case-insensitive, never regex)", + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] +} - added
Input schema / properties / options / properties / singlePassAdded value: +{ + "default": false, + "description": "Make exactly ONE LLM call across all matched files instead of one call per file (cheaper; perFileResults reports evidence contribution, not real per-file analysis)", + "type": "boolean" +}
- Changed
batch_modify1 field changed- changed
Input schema / properties / options / properties / backend / enumPrevious value: -[ - "auto", - "local", - "deepseek", - "glm", - "qwen3", - "gemini", - "groq" -]New value: +[ + "auto", + "local", + "deepseek", + "glm", + "gemini", + "groq" +]
- Changed
explore1 field changed- changed
Input schema / properties / options / properties / backend / enumPrevious value: -[ - "auto", - "groq", - "glm", - "qwen3", - "deepseek" -]New value: +[ + "auto", + "groq", + "glm", + "deepseek" +]
- Changed
generate_file1 field changed- changed
Input schema / properties / options / properties / backend / enumPrevious value: -[ - "auto", - "local", - "deepseek", - "glm", - "qwen3", - "gemini", - "groq" -]New value: +[ + "auto", + "local", + "deepseek", + "glm", + "gemini", + "groq" +]
- Changed
get_analytics1 field changed- changed
Input schema / properties / report_type / descriptionPrevious value: -"`current` = stats since this server started (invocation counts, success rate, p50/p95 latency per backend). `historical` = time-bucketed series over `time_range`. `cost` = estimated token spend per backend, with cost-per-1K-tokens projections. `recommendations` = SAB heuristics on backend selection (e.g. \"switch coding tasks to qwen3 — 18% faster on your traces\"). `full_report` = all of the above."New value: +"`current` = stats since this server started (invocation counts, success rate, p50/p95 latency per backend). `historical` = time-bucketed series over `time_range`. `cost` = estimated token spend per backend, with cost-per-1K-tokens projections. `recommendations` = SAB heuristics on backend selection (e.g. \"switch coding tasks to nvidia_glm — 18% faster on your traces\"). `full_report` = all of the above."
- Changed
modify_file1 field changed- changed
Input schema / properties / options / properties / backend / enumPrevious value: -[ - "auto", - "local", - "deepseek", - "glm", - "qwen3", - "gemini", - "groq" -]New value: +[ + "auto", + "local", + "deepseek", + "glm", + "gemini", + "groq" +]
- Changed
refactor1 field changed- changed
Input schema / properties / options / properties / backend / enumPrevious value: -[ - "auto", - "local", - "deepseek", - "glm", - "qwen3", - "gemini", - "groq" -]New value: +[ + "auto", + "local", + "deepseek", + "glm", + "gemini", + "groq" +]
16 tool updates
- Changed
analyze_file1 field changed- changed
Input schema / properties / options / properties / backend / enumPrevious value: -[ - "auto", - "local", - "deepseek", - "qwen3", - "gemini", - "groq" -]New value: +[ + "auto", + "local", + "deepseek", + "glm", + "qwen3", + "gemini", + "groq" +]
- Added
ask - Added
backup_restore - Changed
batch_analyze1 field changed- changed
Input schema / properties / options / properties / backend / enumPrevious value: -[ - "auto", - "local", - "deepseek", - "qwen3", - "gemini", - "groq" -]New value: +[ + "auto", + "local", + "deepseek", + "glm", + "qwen3", + "gemini", + "groq" +]
- Added
batch_modify - Added
check_backend_health - Changed
council1 field changed- changed
Input schema / properties / topic / descriptionPrevious value: -"Topic category - determines which backends are consulted: coding (nvidia_qwen, local), reasoning (nvidia_deepseek), architecture (nvidia_deepseek, nvidia_qwen), general (gemini, groq), creative (gemini, nvidia_qwen), security (nvidia_deepseek, nvidia_qwen), performance (nvidia_deepseek, local)"New value: +"Topic category - determines which backends are consulted: coding (nvidia_glm, local), reasoning (nvidia_deepseek), architecture (nvidia_deepseek, nvidia_glm), general (gemini, groq), creative (gemini, nvidia_glm), security (nvidia_deepseek, nvidia_glm), performance (nvidia_deepseek, local)"
- Added
dual_iterate - Changed
explore1 field changed- changed
Input schema / properties / options / properties / backend / enumPrevious value: -[ - "auto", - "groq", - "qwen3", - "deepseek" -]New value: +[ + "auto", + "groq", + "glm", + "qwen3", + "deepseek" +]
- Changed
generate_file1 field changed- changed
Input schema / properties / options / properties / backend / enumPrevious value: -[ - "auto", - "local", - "deepseek", - "qwen3", - "gemini", - "groq" -]New value: +[ + "auto", + "local", + "deepseek", + "glm", + "qwen3", + "gemini", + "groq" +]
- Added
get_analytics - Changed
modify_file1 field changed- changed
Input schema / properties / options / properties / backend / enumPrevious value: -[ - "auto", - "local", - "deepseek", - "qwen3", - "gemini", - "groq" -]New value: +[ + "auto", + "local", + "deepseek", + "glm", + "qwen3", + "gemini", + "groq" +]
- Added
parallel_agents - Added
refactor - Added
spawn_subagent - Added
write_files_atomic
11 tool updates
v2.8.1- Removed
ask - Removed
backup_restore - Removed
batch_modify - Removed
check_backend_health - Removed
dual_iterate - Removed
get_analytics - Removed
manage_conversation - Removed
parallel_agents - Removed
refactor - Removed
spawn_subagent - Removed
write_files_atomic
9 tool updates
v2.6.0- Changed
analyze_file1 field changed- changed
Input schema / properties / options / properties / analysisType / descriptionPrevious value: -"Type of analysis to perform"New value: +"`general` = open-ended question (default). `bug` = look for defects, off-by-ones, race conditions. `security` = vulnerability-focused (SQLi, XSS, secret leaks, OWASP-style review). `performance` = bottlenecks, hot loops, allocation churn. `architecture` = design issues, coupling, layering. The choice also influences which backend is preferred for the analysis."
- Changed
ask2 fields changed- changed
Input schema / properties / model / descriptionPrevious value: -"AI backend to query: auto (smart routing selects optimal backend), local (autodiscover vLLM/llama.cpp/LM Studio), gemini (Gemini Enhanced, 32K tokens), nvidia_deepseek (NVIDIA DeepSeek with streaming + reasoning, 8K tokens), nvidia_qwen (NVIDIA Qwen3 Coder 480B, 32K tokens), openai (OpenAI GPT-5.2, 128K context, premium reasoning), groq (Llama 3.3 70B, ultra-fast 500+ t/s)"New value: +"AI backend to query: auto (smart routing selects optimal backend), local (autodiscover vLLM/llama.cpp/LM Studio), gemini (Gemini Enhanced, 32K tokens), nvidia_deepseek (NVIDIA DeepSeek with streaming + reasoning, 8K tokens), nvidia_qwen (NVIDIA Qwen3 Coder 480B, 32K tokens), openai (OpenAI GPT-5.2, 128K context, premium reasoning), groq (Llama 3.3 70B, ultra-fast 500+ t/s). The friendly aliases `deepseek` and `qwen3` are also accepted (mapped to nvidia_deepseek / nvidia_qwen), matching the other tools." - changed
Input schema / properties / model / enumPrevious value: -[ - "auto", - "local", - "gemini", - "nvidia_deepseek", - "nvidia_qwen", - "openai", - "groq" -]New value: +[ + "auto", + "local", + "gemini", + "groq", + "deepseek", + "qwen3", + "nvidia_deepseek", + "nvidia_qwen", + "openai" +]
- Changed
backup_restore10 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Required. Operation to perform on the backup store." - added
Input schema / properties / backup_id / descriptionAdded value: +"Identifier of the backup to restore (timestamp from `<path>.backup.<timestamp>`). Required for `restore`, ignored for other actions." - added
Input schema / properties / cleanup_options / descriptionAdded value: +"Policy controls for the `cleanup` action. Ignored by other actions." - added
Input schema / properties / cleanup_options / properties / dry_run / descriptionAdded value: +"When true, report what would be deleted without actually removing files." - added
Input schema / properties / cleanup_options / properties / max_age_days / descriptionAdded value: +"Backups older than this many days are eligible for deletion." - added
Input schema / properties / cleanup_options / properties / max_count_per_file / descriptionAdded value: +"When a file has more than this many backups, the oldest extras are deleted." - added
Input schema / properties / file_path / descriptionAdded value: +"For `create`: file to snapshot (required). For `list`: optional filter to one file. Ignored for `restore` (use backup_id) and `cleanup` (operates on the whole store)." - added
Input schema / properties / metadata / descriptionAdded value: +"Optional tags and description attached to a `create` snapshot for later identification via `list`." - added
Input schema / properties / metadata / properties / description / descriptionAdded value: +"Human-readable note attached to this backup." - added
Input schema / properties / metadata / properties / tags / descriptionAdded value: +"String labels for filtering in `list`."
- Changed
batch_modify1 field changed- changed
Input schema / properties / options / properties / transactionMode / descriptionPrevious value: -"Transaction mode for atomic operations"New value: +"`all_or_nothing` (default, safer): if ANY file fails, every successfully-modified file is restored from its backup and the batch reports failure. `best_effort`: keep the files that succeeded, report which ones failed. Use best_effort only when partial success is acceptable."
- Changed
dual_iterate1 field changed- changed
Input schema / properties / quality_threshold / descriptionPrevious value: -"Quality threshold for accepting code (0.5-1.0)"New value: +"Minimum reviewer score (0.5–1.0) needed to accept and stop iterating. 0.7 (default) = balanced. 0.85+ = strict (more iterations, better code, may exhaust `max_iterations`). 0.5 = lenient (returns first plausible attempt). The loop also stops at `max_iterations` regardless of threshold."
- Changed
get_analytics3 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"Output format for reports (default: json)"New value: +"`json` = machine-readable nested object. `markdown` = human-readable summary with tables. Default: json." - changed
Input schema / properties / report_type / descriptionPrevious value: -"Type of analytics to retrieve: current (session stats), historical (time-series data), cost (cost analysis), recommendations (optimization tips), full_report (comprehensive report)"New value: +"`current` = stats since this server started (invocation counts, success rate, p50/p95 latency per backend). `historical` = time-bucketed series over `time_range`. `cost` = estimated token spend per backend, with cost-per-1K-tokens projections. `recommendations` = SAB heuristics on backend selection (e.g. \"switch coding tasks to qwen3 — 18% faster on your traces\"). `full_report` = all of the above." - changed
Input schema / properties / time_range / descriptionPrevious value: -"Time range for historical data (default: 7d)"New value: +"Lookback window for `historical` and `cost` reports. Ignored for `current` and `recommendations`. Default: 7d."
- Changed
refactor1 field changed- changed
Input schema / properties / scope / descriptionPrevious value: -"Refactoring scope: function (single function), class (class and members), module (module-level), project (project-wide)"New value: +"How wide the reference search goes. `function` = the target function and its direct callers in the same module. `class` = the class definition, its methods, and call sites within the same module. `module` = the file containing `target` plus any file that imports from it. `project` = whole-repo search (slowest, most thorough). Pick the narrowest scope that covers your actual change."
- Changed
spawn_subagent3 fields changed- changed
Input schema / properties / verdict_mode / descriptionPrevious value: -"Verdict parsing mode: summary (extract key fields only) or full (return complete verdict data)"New value: +"`summary` returns the agent's key findings + recommended actions only (faster, less for Claude to read). `full` returns the agent's complete structured verdict including reasoning trace." - changed
Input schema / properties / work_directory / descriptionPrevious value: -"Directory for generated files (default: /tmp/subagent-{role}-{timestamp})"New value: +"Destination directory when `write_files:true`. Auto-created if missing. Defaults to `/tmp/subagent-<role>-<timestamp>`." - changed
Input schema / properties / write_files / descriptionPrevious value: -"Write generated code blocks to files (default: false). Set to true to save output code to work_directory."New value: +"When true, code blocks the agent emits are saved into `work_directory` as separate files. Default false — code is returned inline in the response, which keeps disk state clean but adds tokens."
- Changed
write_files_atomic6 fields changed- added
Input schema / properties / create_backup / descriptionAdded value: +"When true, each file that would be overwritten is first copied to `<path>.backup.<timestamp>`. Set false only when you know the prior content is recoverable from version control." - added
Input schema / properties / file_operations / descriptionAdded value: +"Array of write operations to apply atomically. If any operation fails, all previously written files are restored from their backups." - added
Input schema / properties / file_operations / items / properties / content / descriptionAdded value: +"Full file content (for operation 'write') or content to append (for operation 'append')." - added
Input schema / properties / file_operations / items / properties / operation / descriptionAdded value: +"'write' overwrites the file with content; 'append' adds content to the end. The legacy 'modify' value is no longer accepted — use the `modify_file` tool for search/replace edits." - changed
Input schema / properties / file_operations / items / properties / operation / enumPrevious value: -[ - "write", - "append", - "modify" -]New value: +[ + "write", + "append" +] - added
Input schema / properties / file_operations / items / properties / path / descriptionAdded value: +"Absolute or relative file path. Parent directories are auto-created if missing."
1 tool update
v2.5.0- Removed
validate_changes
1 tool update
v1.2.2- Added
council
1 tool update
v2.2.0- Removed
council
1 tool update
v2.2.1- Added
council
1 tool update
v1.3.1- Removed
council
TDQS
Most tools have clearly separated purposes, and the descriptions explicitly cross-reference alternatives to reduce confusion (e.g., analyze_file vs batch_analyze vs explore; generate_file vs dual_iterate). Minor residual ambiguity exists among ask/council/spawn_subagent and review/analyze_file, but the in-description disambiguation is strong.
The file-focused tools follow a recognizable verb_file pattern (analyze_file, generate_file, modify_file) and batch_* is a useful prefix, but the set mixes bare verbs (ask, review, explore, refactor), noun-style names (council, parallel_agents), and compound names (dual_iterate, check_backend_health). No single naming convention is sustained across the full toolset.
At 17 tools, the server is slightly past the typical 3-15 well-scoped range, but it spans codebase analysis, file mutation, backup management, AI orchestration, and backend operations, so most tools earn their place. It is a bit heavy for an agent to choose among, but not bloated.
The surface covers file generation, single and batch editing, refactoring, backup/restore, code analysis/search, and multiple multi-agent orchestration modes, leaving few dead ends. The main gaps are the lack of a delete/remove file operation and any high-level management of backend/routing configuration beyond health checks and analytics.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for building and testing AI agents with multi-model experimentation and insights.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
One MCP endpoint for Claude, GPT & Gemini: 100+ tools + no-code connectors + agent workers.
AI-native git hosting — repos, PRs, issues, CI gates, and AI code review over MCP (60 tools).
Related MCP Servers
- AlicenseBqualityAmaintenanceMCP server orchestrating API-first cross-review between Claude, ChatGPT Codex, Gemini, DeepSeek, Grok, and Perplexity with unanimous convergence gates.31634Apache 2.0
- AlicenseCqualityDmaintenanceA production-grade MCP server providing an autonomous AI agent swarm, persistent semantic memory, browser automation, multi-model reasoning, and 78+ tools for AI-first testing and development.63MIT
- FlicenseNot gradedqualityCmaintenanceEnterprise MCP server providing a suite of tools including file, database, GitHub, Slack, calendar, email, vector search, and Python execution, with safe defaults and OpenAI integration for automatic tool selection.-
- FlicenseNot gradedqualityCmaintenanceA production-grade MCP server with 6 sandboxed tools and an agent orchestration engine for autonomous task completion, featuring an evaluation suite with CI/CD quality gates.-
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Platano78/Smart-AI-Bridge'
If you have feedback or need assistance with the MCP directory API, please join our Discord server