Skip to main content
Glama

Brutalist MCP

An MCP server that runs reviews through locally installed Claude Code, Codex, and Antigravity (agy) CLIs. A roast runs the selected critics in parallel and returns their responses together. A debate assigns opposing positions to two critics across multiple rounds.

The CLI processes run on your machine; inference uses the services and credentials configured for each CLI. Findings are model output: check the cited files, commands, and sources before acting on them.

Install

Use Node.js 24 and at least one authenticated CLI. CI also tests Node.js 20.

1. Install and sign in to a critic

On macOS or Linux, install whichever CLIs you want to use:

# Claude Code
curl -fsSL https://claude.ai/install.sh | bash

# Codex
npm install -g @openai/codex

# Antigravity CLI
curl -fsSL https://antigravity.google/cli/install.sh | bash

Launch claude, codex, or agy and complete sign-in. Brutalist's Agy adapter also requires python3 on PATH and a POSIX environment; native Windows is unsupported, so use WSL there. For other platforms and installation options, use the official Claude Code, Codex, and Antigravity CLI instructions.

Brutalist prefers ~/.local/bin/agy when it exists, avoiding the Antigravity desktop launcher's PATH collision. Set AGY_BIN to the executable's path if your CLI is elsewhere.

2. Connect your MCP client

Claude Code — user scope makes the server available across projects:

claude mcp add --scope user brutalist -- npx -y @brutalist/mcp@latest

Codex:

codex mcp add brutalist -- npx -y @brutalist/mcp@latest

Codex's default MCP tool timeout is 60 seconds. Persist a larger timeout in ~/.codex/config.toml; codex mcp add has no dedicated timeout flag:

[mcp_servers.brutalist]
command = "npx"
args = ["-y", "@brutalist/mcp@latest"]
tool_timeout_sec = 9000

Brutalist waits for the critics to finish. A 9,000-second client timeout covers the default two-hour critic budget plus 30 minutes for startup and response processing. It is a suggested budget, not a minimum for every review. Increase it for debates, which run multiple turns and may retry. See Codex MCP configuration.

Other MCP clients — register a local stdio server with command npx and arguments -y, @brutalist/mcp@latest. For clients that use an mcpServers object:

{
  "mcpServers": {
    "brutalist": {
      "command": "npx",
      "args": ["-y", "@brutalist/mcp@latest"]
    }
  }
}

Place this in your client's MCP configuration, not a shell. The same server can be used from Cursor, VS Code, or Devin Desktop (formerly Windsurf); configuration locations and formats belong to those clients.

@latest selects the current npm release when the server is launched; an already running process keeps its loaded version. Restart or reconnect the MCP server after an update. To fix the package version, replace @latest with a version such as @1.18.10.

3. Check detection

Ask your assistant to call cli_agent_roster with {}. It reports detected CLIs and model configuration. Detection does not prove that authentication, quota, or a particular model will work; confirm with a roast.

Related MCP server: multi-ai-collab

Tools

These are MCP tools invoked by your assistant, not terminal commands. The server exposes four:

Tool

Purpose

roast

Review a path and context using a selected domain.

roast_cli_debate

Have two critics defend explicit opposing positions.

cli_agent_roster

Report detected critics and model configuration.

brutalist_discover

Suggest domains from an intent string.

Legacy names such as roast_codebase and roast_security are not registered tools. Use roast with domain instead.

Roast a repository

Call roast with:

{
  "domain": "codebase",
  "target": "/absolute/path/to/repo",
  "context": "Review the authentication changes. Trace session creation, expiry, and authorization checks. Cite file paths and lines.",
  "limit": 20000
}

Use an existing directory as target. The path is included in the critic's prompt; it does not change the subprocess working directory, which defaults to the server's launch directory. Use absolute paths and identify the files or commands you want checked in context. For domains that review an idea, plan, or other text, put that material in context:

{
  "domain": "architecture",
  "target": "/absolute/path/to/repo",
  "context": "We plan to move invoice generation to a queue. Assess duplicate delivery, transaction boundaries, and recovery after a worker crash."
}

Domain

Review subject

Additional arguments

codebase

Implementation

—

file_structure

Directory and module organization

depth

dependencies

Package dependencies

includeDevDeps

git_history

Commits and change history

commitRange

test_coverage

Tests and coverage gaps

runCoverage

idea

A proposal

resources, timeline

architecture

System design

scale, constraints, deployment

research

Research methods and claims

field, claims, data

security

Security controls and threats

assets, threatModel, compliance

product

Product decisions

users, competition, metrics

infrastructure

Deployment and operations

scale, sla, budget

design

Interface or visual design

medium, audience, brand, url

legal

Legal arguments or documents

practice, jurisdiction, posture

For design, supplying a live url gives critics a concrete interface to inspect. The domain automatically requests the registered Playwright MCP server. Playwright is the built-in integration; the first Claude browser review may download Chromium. Register additional servers through the BRUTALIST_MCP_SERVERS JSON environment variable, keyed by name with command and args. Request names with mcp_servers. Claude and Codex wire these integrations; Agy currently ignores the field. Requested integrations replace Codex's configured MCP server set for that run. Check the result for actual browser observations.

Choose critics and models

Omit clis to run all detected native critics. To select a subset, add:

{
  "domain": "codebase",
  "target": "/absolute/path/to/repo",
  "clis": ["claude", "codex"]
}

No model override means the CLI chooses its configured/default model. Brutalist does not select the newest model or update the critic CLIs for you.

Critic

Per-call selection

Claude Code

models.claude is passed to the CLI.

Codex

Uses its CLI configuration. models.codex is ignored unless the server has BRUTALIST_CODEX_ALLOW_MODEL_OVERRIDE=true; enabled overrides use discovered model migrations.

Antigravity

models.agy is passed through native --model. Run agy models to get choices available to your account.

For Agy, copy a current ID or label from agy models into models.agy. Unpinned Agy responses leave the model unspecified: the adapter's plain-text output does not identify the selected model. Check Agy's local logs when you need that evidence. Brutalist disables Agy's CLI auto-update during critic runs; this does not pin the model.

Debate a decision

Call roast_cli_debate with a topic and both positions:

{
  "topic": "Should invoice generation move to a queue?",
  "proPosition": "Use a queue to isolate retries and absorb load spikes.",
  "conPosition": "Keep generation synchronous until idempotency and reconciliation are proven.",
  "agents": ["claude", "codex"],
  "rounds": 2,
  "context": "Current design: checkout writes the order and invoice in one database transaction. The proposed worker would receive an order ID after commit and retry on failure."
}

Debates require at least two detected CLIs. agents is optional; when supplied it contains exactly two critics, otherwise two are selected randomly. rounds accepts 1–3 and defaults to 3. The current debate handler accepts target but does not forward it to the critics; supply the evidence to debate in context. Use roast for a repository review. Positions are assigned for the debate. Its arguments are not independent endorsements. Custom routed clients are supported by roast, not debates.

Read large results and follow up

limit accepts 1,000–100,000 and sets a chunk-size target in characters, not tokens. Roast pagination defaults to 90,000 characters; debate and automatic pagination use smaller defaults. Chunk boundaries, a minimum chunk size, and response headers mean it is not a hard output ceiling. Set it explicitly if your MCP client truncates results.

For another page, reuse the returned context_id and the next offset reported in the response. Keep the original domain and target; omit resume. For example, if the response asks you to continue at offset 20,000:

{
  "domain": "codebase",
  "target": "/absolute/path/to/repo",
  "context_id": "<returned context_id>",
  "offset": 20000,
  "limit": 20000
}

You can also pass a cursor such as "offset:20000" instead of offset. Page reads retrieve cached output. The cache defaults to two hours and belongs to the server process; a restart loses it.

For a fresh follow-up, include the relevant earlier findings in context and set force_refresh: true:

{
  "domain": "codebase",
  "target": "/absolute/path/to/repo",
  "force_refresh": true,
  "context": "The earlier review found duplicate invoice creation after retries. Check whether the new idempotency key prevents it; inspect both the database constraint and worker retry path."
}

The tool also accepts context_id with resume: true for history-based continuation, but the current handler has limitations: filesystem follow-ups record the target path as the new conversation message, and a cache hit can return earlier output without running critics. force_refresh skips history loading. Use the fresh-follow-up pattern above when you need a new review.

Use force_refresh: true after changing files, routed clients, or MCP integrations. File contents, clients, and mcp_servers are not all represented in the cache key.

Custom Claude-compatible endpoints

roast can add named Claude Code clients routed through Anthropic-compatible endpoints. Set the token in the MCP server's environment and reference its variable name:

{
  "domain": "codebase",
  "target": "/absolute/path/to/repo",
  "clis": [],
  "clients": [
    {
      "id": "gateway",
      "provider": "claude",
      "baseUrl": "https://gateway.example.com",
      "authTokenEnv": "REVIEW_GATEWAY_TOKEN",
      "model": "<model supported by your endpoint>"
    }
  ]
}

clients is additive to native critics; clis: [] runs only named clients. Up to 16 clients are accepted. Endpoint, model, and credential-routing fields are supported only for the claude provider. You can also configure default clients through the server's BRUTALIST_CLAUDE_CLIENTS JSON environment variable. A nonempty per-call clients array replaces those defaults.

Routed clients use separate configuration directories under ~/.brutalist/claude-clients/<id> unless configDir is supplied. They do not inherit native Claude credentials unless includeProcessAuth: true is set. Their smallFastModel defaults to the routed model.

The default containment setting, named hardened, suppresses requested MCP integrations. It does not sandbox shell commands or network access: Bash, WebFetch, and WebSearch remain available. containment: "standard" restores requested MCP integrations.

Execution and troubleshooting

Critics can inspect files and invoke tools. Codex runs with --sandbox read-only. Claude denies its named mutation tools but enables Bash and web tools while bypassing permission prompts; this is not a filesystem sandbox. Agy runs with --sandbox and permission prompts disabled, and can write scratch artifacts. External MCP tools add their own capabilities. Use a checkout and credentials appropriate for those processes.

A roast can return findings when only some critics succeed. Check which critics contributed; a missing critic is not agreement. Error text may be generic or redacted. Authentication failures, quota limits, unsupported models, and client timeouts need separate diagnosis.

Useful server environment variables:

Variable

Purpose

BRUTALIST_TIMEOUT

Per-agent roast timeout in milliseconds; default 7200000 (two hours).

BRUTALIST_AGY_TIMEOUT

Agy timeout ceiling in milliseconds; can shorten, not extend, the selected agent budget.

AGY_BIN

Override the Agy executable path.

BRUTALIST_CODEX_ALLOW_MODEL_OVERRIDE

Set exactly true to pass models.codex to Codex.

BRUTALIST_MCP_SERVERS

Additional MCP server definitions as a JSON object keyed by server name.

BRUTALIST_CACHE_TTL_HOURS

Result-cache lifetime; default 2.

BRUTALIST_LOG_FILE

Set exactly true to enable NDJSON file logs.

BRUTALIST_LOG_DIR

Override the log directory; default ~/.brutalist-mcp/logs.

BRUTALIST_LOG_LEVEL

Minimum file-log level; default info.

Set these on the MCP server process, using your client's server environment configuration. The client tool timeout is a separate setting. Logs can contain paths, model names, and prompt excerpts; redaction does not make the entire file safe to share.

The legal, research, and security prompts ask critics to verify external authorities and label citations with [VERIFIED: URL | "quote"], [SUPPLIED: location | "quote"], or [UNVERIFIED: reason]. These are prompt instructions, not a programmatic guarantee that a citation was checked.

GitHub pull-request reviews

The repository also contains a GitHub Action and orchestrator. The Action posts findings as a PR review and has its own CLI installation and credential requirements. Use its README and input definitions for workflow setup, OAuth provisioning, and custom-claude-clients configuration.

Development

npm ci
npm run build
npm test -- tests/unit tests/integration/pagination-e2e.test.ts tests/integration/cache.integration.test.ts tests/smoke

The CI workflow also tests and builds the orchestrator and GitHub Action. Tagged releases publish the MCP package to npm with provenance after those checks pass.

License: MIT · Report an issue

Available Tools

4 tools
brutalist_discoverB

Discover relevant brutalist tools based on your intent. Returns the top 3 most relevant analysis tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
intentYesWhat you want to analyze (e.g., 'review security of my auth system', 'check code quality')

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries full burden. It only states the output (top 3 tools) but does not disclose whether the tool is read-only, has side effects, or any rate limits. The minimal description lacks behavioral context.

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

Conciseness4/5

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

The description is two sentences, concise and front-loaded. It efficiently conveys the core purpose and output. However, it could include more detail without being verbose.

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

Completeness3/5

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

Given the single parameter and no output schema, the description is adequate but leaves out the format of the returned tools (e.g., names, IDs). It is complete enough for a simple discovery tool but could be improved.

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

Parameters3/5

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

Schema coverage is 100% with one parameter 'intent' well-described. The description reinforces that intent is used for discovery but adds no new semantic information beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool discovers brutalist tools based on intent and returns the top 3, specifying the verb and resource. It distinguishes from sibling tools like 'roast' or 'cli_agent_roster' which have different purposes.

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

Usage Guidelines3/5

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

The description implies usage when a user wants to find analysis tools, but it does not explicitly state when not to use or provide alternatives. The context from sibling names is not leveraged.

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

cli_agent_rosterA

Know your weapons. Display the available CLI agent critics (Claude Code, Codex, Antigravity/Agy) ready to demolish your work, their capabilities, and how to deploy them for systematic destruction.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries full burden and clearly indicates a read-only display operation. It does not mention side effects, auth requirements, or rate limits, but this is acceptable for a simple listing tool.

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

Conciseness4/5

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

The description is a single sentence that quickly communicates the tool's purpose. The dramatic language ('demolish your work') may be slightly confusing but does not detract from clarity. It is front-loaded and efficient.

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

Completeness4/5

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

Given zero parameters, no output schema, and simple functionality, the description adequately covers what the tool does. It could mention whether the output is a list or formatted text, but this is not critical.

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

Parameters4/5

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

The tool has zero parameters, and schema description coverage is 100%. Baseline for 0 params is 4. The description does not need to add parameter meaning, and it appropriately avoids redundant information.

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

Purpose5/5

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

The description clearly states the tool displays available CLI agent critics, their capabilities, and deployment instructions. It uses a specific verb ('display') and resource ('roster'), and distinguishes from siblings which involve discovery (brutalist_discover) or actions (roast, roast_cli_debate).

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

Usage Guidelines3/5

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

The description implies using the tool to learn about available critics before deploying them, but does not explicitly state when to use or when not to use it. No exclusions or alternatives are mentioned, leaving the agent to infer usage context.

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

roastA

Unified brutal AI critique delivered by a multi-critic panel running in parallel. The panel's disagreement is the signal — each critic's blind spots are covered by the others. Specify domain for targeted analysis. Consolidates all roast_* tools into one polymorphic API. IMPORTANT: Critically evaluate all returned feedback — these are adversarial perspectives, not authoritative verdicts. Weigh each claim against evidence before presenting to the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
slaNoSLA for infrastructure
urlNoLive URL for visual evaluation (e.g., 'http://localhost:5173'). When provided with design domain, critics use Playwright to navigate and visually evaluate the running interface. Strongly recommended for design critiques.
clisNoSubset of native critics to run. [] = run ONLY the named clients[] (no default critics); omit to run all available.
dataNoData for research
brandNoBrand identity or design system constraints for design domain
depthNoMax depth for file_structure
fieldNoField for research
limitNoMax chars/chunk
scaleNoScale for architecture/infrastructure
usersNoUsers for product
assetsNoAssets for security
budgetNoBudget for infrastructure
claimsNoClaims for research
cursorNoPagination cursor
domainYesAnalysis domain
mediumNoDesign medium for design domain (web, mobile, spatial, print)
modelsNoPer-CLI model override. Claude honors overrides. Codex uses the Codex CLI configured/default model by default; set BRUTALIST_CODEX_ALLOW_MODEL_OVERRIDE=true to allow a codex override. Agy accepts a human-readable label ("Gemini 3.1 Pro (High)", "Claude Sonnet 4.6 (Thinking)", etc.) via its native --model flag (1.0.10+); Pro/Claude/GPT-OSS tiers require Antigravity entitlement. Omit to use each CLI's configured default.
offsetNoPagination offset
resumeNoContinue conversation with a new prompt; omit for pagination/page reads
targetYesFilesystem path to analyze (e.g., '/path/to/project' or '.'). Directs agents to the relevant part of the codebase.
clientsNoNamed CLI clients to run, ADDITIVE to the native critics (use clis:[] to run ONLY these). Allows multiple isolated Claude Code clients (up to 16), including custom Anthropic-compatible endpoints, in one roast.
contextNoEssential context for the critique. For abstract domains (idea, architecture, security, etc.), this is the primary input describing what to evaluate. For filesystem domains, provides supplementary background (e.g., goals, constraints, team context).
metricsNoMetrics for product
postureNoProcedural posture or use context for legal domain (e.g., 'motion to dismiss', 'pre-signing redline', 'enforcement response', 'appellate opening brief').
verboseNoDetailed output
audienceNoTarget audience for design domain
practiceNoPractice register for legal domain — freeform (e.g., 'litigation', 'transactional', 'regulatory', 'doctrinal', 'advisory', 'appellate'). Modulates the critic's adversary geometry.
timelineNoTimeline for idea
resourcesNoResources for idea
complianceNoCompliance for security
context_idNoContext ID for cached pagination or conversation continuation
deploymentNoDeployment for architecture
commitRangeNoCommit range for git_history
competitionNoCompetition for product
constraintsNoConstraints for architecture
mcp_serversNoMCP servers to enable for CLI agents (e.g., ["playwright"]). Enables evidence-backed analysis via external tools. Available: playwright. Auto-enabled for design domain.
runCoverageNoRun coverage for test_coverage
threatModelNoThreat model for security
jurisdictionNoGoverning jurisdiction or forum for legal domain (e.g., 'US federal', 'NY state', '9th Cir.', 'Delaware Chancery', 'EU').
force_refreshNoIgnore cache
includeDevDepsNoInclude dev deps for dependencies

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It helpfully discloses that critics run in parallel, that their disagreement is the signal, and that output is adversarial feedback to be weighed rather than authoritative — useful output-nature context. But it omits operational traits the 41-param surface implies: latency/cost of spawning up to 16 clients plus native critics, and the fact that agents have Bash/WebFetch/WebSearch access.

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

Conciseness4/5

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

Four sentences, front-loaded with the core purpose, followed by the key behavioral caveat about evaluating adversarial output. Efficient and well-ordered, with only mild redundancy in the consolidation and evaluation-caveat lines.

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

Completeness4/5

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

Given no output schema, the description does convey the nature of the return (panel disagreement, adversarial perspectives) and how to treat it, which is the main return-value guidance needed. It is thin on navigating the 41-parameter surface, but with 100% schema coverage that burden is largely offloaded. Adequate overall.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3 and the schema already documents all 41 parameters in depth. The description adds only the marginal note that domain drives targeted analysis, plus schema-level detail elsewhere. No compensating value beyond what the schema provides.

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

Purpose4/5

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

The description clearly states a specific verb+resource: a unified AI critique produced by a multi-critic panel running in parallel, and notes it consolidates all roast_* tools into one polymorphic API. It implicitly distinguishes itself from the debate-style sibling ('running in parallel'), though it does not name roast_cli_debate or the discover/roster siblings. Clear purpose, but sibling differentiation is only suggestive.

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

Usage Guidelines3/5

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

It says to 'specify domain for targeted analysis' and advises critically evaluating returned feedback, which implies usage context. However, it never states when to choose this tool over roast_cli_debate, brutalist_discover, or cli_agent_roster, nor any prerequisites. Usage is implied rather than spelled out.

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

roast_cli_debateA

Deploy 2 CLI agents in structured adversarial debate with constitutional position anchoring. Calling agent should extract PRO/CON positions from topic before invoking. IMPORTANT: Critically evaluate all debate output — positions are assigned, not necessarily held. Weigh each argument's validity independently before presenting to the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
topicYesThe debate topic
agentsNoTwo specific debaters to use.
cursorNo
modelsNoModel overrides for specific agents. Codex uses the Codex CLI configured/default model by default unless BRUTALIST_CODEX_ALLOW_MODEL_OVERRIDE=true. Agy honors the model label via its native --model flag (1.0.10+).
offsetNo
resumeNoContinue debate with a new prompt; omit for pagination/page reads
roundsNoNumber of debate rounds (default: 3)
targetNoFilesystem path to analyze (e.g., '/path/to/project' or '.'). Directs agents to the relevant part of the codebase.
clientsNoNOT SUPPORTED in debate. Use `agents` to pick the two debaters; custom Claude-routed clients (e.g. GLM) run only via `roast`.
contextNoEssential context for the debate — the substantive background, constraints, and details that shape the argument.
verboseNo
context_idNoContext ID for cached pagination or debate continuation
conPositionYesThe CON thesis to defend (extracted by calling agent)
mcp_serversNoMCP servers to enable for debate agents (e.g., ["playwright"]). Available: playwright
proPositionYesThe PRO thesis to defend (extracted by calling agent)
force_refreshNo

TDQS

A3.7/5.0
Behavior3/5

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

Without annotations, the description must fully disclose behavior. It reveals that positions are assigned and not necessarily held, which is a key behavioral trait. However, it lacks detail on side effects, costs, or what 'constitutional position anchoring' entails. Some behavioral context is provided, but not comprehensive.

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

Conciseness4/5

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

The description is concise with three front-loaded sentences. The first sentence states the purpose, the second gives an instruction, and the third warns about output interpretation. It wastes no words but could be slightly more structured.

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

Completeness2/5

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

Given 17 parameters, nested objects, and no output schema, the description lacks completeness. It does not explain pagination parameters (cursor, offset, context_id), debate flow, return values, or configuration of agents/models. The schema descriptions help, but the tool description itself is insufficient for full understanding.

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

Parameters3/5

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

Schema description coverage is 71%, so the schema already documents most parameters. The description adds no significant per-parameter detail beyond what is in the schema, aside from emphasizing extraction of pro/con positions. This meets the baseline for high coverage.

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

Purpose5/5

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

The description clearly states the tool's function: deploying two CLI agents in a structured adversarial debate with constitutional position anchoring. This distinguishes it from siblings like 'roast' (likely single-agent) and 'cli_agent_roster' (listing agents).

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

Usage Guidelines4/5

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

The description provides specific usage instructions: 'Calling agent should extract PRO/CON positions from topic before invoking' and advises critical evaluation of output since positions are assigned. It does not explicitly mention when not to use or alternatives, but the guidance is clear and actionable.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv1.18.10
    • Addedbrutalist_discover
    • Addedroast
  2. 2 tool updatesv1.18.9
    • Removedbrutalist_discover
    • Removedroast
  3. 2 tool updatesv1.18.3
    • Changedroast4 fields changed
      • addedInput schema / properties / clients
        Added value: +{
        +  "description": "Named CLI clients to run, ADDITIVE to the native critics (use clis:[] to run ONLY these). Allows multiple isolated Claude Code clients (up to 16), including custom Anthropic-compatible endpoints, in one roast.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "authToken": {
        +        "description": "Bearer token for ANTHROPIC_AUTH_TOKEN. Prefer authTokenEnv for shared configs.",
        +        "type": "string"
        +      },
        +      "authTokenEnv": {
        +        "description": "Environment variable name containing the bearer token.",
        +        "type": "string"
        +      },
        +      "baseUrl": {
        +        "description": "Claude-compatible endpoint base URL for ANTHROPIC_BASE_URL (http(s) only). Presence marks the client 'routed': isolated from native credentials and hardened (no web egress/MCP) by default.",
        +        "format": "uri",
        +        "type": "string"
        +      },
        +      "configDir": {
        +        "description": "Per-client CLAUDE_CONFIG_DIR for Claude Code state isolation. Defaults to ~/.brutalist/claude-clients/<id> for routed clients.",
        +        "type": "string"
        +      },
        +      "containment": {
        +        "description": "Tool/sandbox policy. 'hardened' (DEFAULT for any routed/custom-endpoint client) additionally denies WebFetch, WebSearch, and all MCP servers. 'standard' restores the native tool surface — only for an endpoint you fully trust.",
        +        "enum": [
        +          "hardened",
        +          "standard"
        +        ],
        +        "type": "string"
        +      },
        +      "env": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "description": "Additional per-client environment variables (applied last; override resolved values).",
        +        "type": "object"
        +      },
        +      "id": {
        +        "description": "Stable display id for this CLI client, e.g. claude-native or glm.",
        +        "maxLength": 80,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "includeProcessAuth": {
        +        "description": "Routed clients are isolated by default (no native Claude credentials). Set true to ALSO inherit the process ANTHROPIC_API_KEY/CLAUDE_CODE_OAUTH_TOKEN into this client; set false to force isolation on an otherwise-native client.",
        +        "type": "boolean"
        +      },
        +      "mcpServers": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "model": {
        +        "description": "Per-client model override.",
        +        "type": "string"
        +      },
        +      "provider": {
        +        "default": "claude",
        +        "description": "Underlying CLI provider.",
        +        "enum": [
        +          "claude",
        +          "codex",
        +          "agy"
        +        ],
        +        "type": "string"
        +      },
        +      "smallFastModel": {
        +        "description": "Claude Code small/fast model override for ANTHROPIC_SMALL_FAST_MODEL. Defaults to `model` for routed clients so a gateway never sees Claude's built-in haiku name.",
        +        "type": "string"
        +      },
        +      "timeout": {
        +        "exclusiveMinimum": 0,
        +        "type": "integer"
        +      },
        +      "workingDirectory": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 16,
        +  "type": "array"
        +}
      • changedInput schema / properties / clis / description
        Previous value: -"Subset of critics to run."New value: +"Subset of native critics to run. [] = run ONLY the named clients[] (no default critics); omit to run all available."
      • changedInput schema / properties / clis / minItems
        Previous value: -1New value: +0
      • changedInput schema / properties / models / description
        Previous value: -"Per-CLI model override. Claude honors overrides. Codex uses the Codex CLI configured/default model by default; set BRUTALIST_CODEX_ALLOW_MODEL_OVERRIDE=true to allow a codex override. Agy accepts a human-readable label (\"Gemini 3.1 Pro (High)\", \"Claude Sonnet 4.6 (Thinking)\", etc.) via settings.json swap under flock(2); Pro/Claude/GPT-OSS tiers require Antigravity entitlement. Omit to use each CLI's configured default."New value: +"Per-CLI model override. Claude honors overrides. Codex uses the Codex CLI configured/default model by default; set BRUTALIST_CODEX_ALLOW_MODEL_OVERRIDE=true to allow a codex override. Agy accepts a human-readable label (\"Gemini 3.1 Pro (High)\", \"Claude Sonnet 4.6 (Thinking)\", etc.) via its native --model flag (1.0.10+); Pro/Claude/GPT-OSS tiers require Antigravity entitlement. Omit to use each CLI's configured default."
    • Changedroast_cli_debate2 fields changed
      • addedInput schema / properties / clients
        Added value: +{
        +  "description": "NOT SUPPORTED in debate. Use `agents` to pick the two debaters; custom Claude-routed clients (e.g. GLM) run only via `roast`.",
        +  "type": "array"
        +}
      • changedInput schema / properties / models / description
        Previous value: -"Model overrides for specific agents. Codex uses the Codex CLI configured/default model by default unless BRUTALIST_CODEX_ALLOW_MODEL_OVERRIDE=true. Agy is Flash-pinned (no --model flag); field ignored."New value: +"Model overrides for specific agents. Codex uses the Codex CLI configured/default model by default unless BRUTALIST_CODEX_ALLOW_MODEL_OVERRIDE=true. Agy honors the model label via its native --model flag (1.0.10+)."
  4. 4 tool updatesv1.14.0
    • First observedbrutalist_discover
    • First observedcli_agent_roster
    • First observedroast
    • First observedroast_cli_debate

TDQS

A3.5/5.0

Scored across 4 tools

Disambiguation3/5

roast and roast_cli_debate overlap: both deliver adversarial AI critique via CLI agents, with the debate being a specialized variant. brutalist_discover and cli_agent_roster are both meta/informational tools that could be confused about their distinct roles, though descriptions do clarify them somewhat.

Naming Consistency2/5

Names mix conventions: a bare verb (roast), a prefixed verb (roast_cli_debate), and two differently-prefixed nouns (brutalist_discover, cli_agent_roster). The roast_ prefix appears on unrelated tools and prefix families (brutalist_, cli_, roast_) don't follow a single predictable pattern.

Tool Count4/5

Four tools is slightly thin but reasonable for a focused critique/debate server. The presence of a discovery tool hints at a larger intended toolset that isn't surfaced, but the count itself isn't problematic.

Completeness4/5

The surface covers single-panel critique, multi-agent debate, agent discovery, and roster inspection — a fairly full lifecycle for adversarial analysis. Minor gap: discovery implies additional brutalist tools that aren't actually exposed here.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers