Skip to main content
Glama

vibe-mcp

An MCP server that lets Claude Code hand well-specified coding work (implement, simplify, mechanical refactors) to the Mistral Vibe CLI, so the expensive model plans and reviews while a cheaper one writes the code.

  • Asynchronous. vibe_submit returns at once; Claude keeps working and calls vibe_wait.

  • Isolated. Every job runs in its own git worktree and branch, inside a bubblewrap sandbox.

  • Compact. Results are short plain text (summary, diffstat, cost). The full diff is on request.

  • Safe to merge. vibe_apply stages a job's changes in your checkout and never commits.

Status: unit-tested against a fake sandbox (no network, no cost), and smoke-tested against real Vibe 3.1.0 with the reference sandbox by a script driving the server over stdio: parallel jobs, apply, conflict report, cancel (no processes left behind), writes outside the worktree, and serial chaining. It has also been used from a live Claude Code session on Linux: the server served the repo Claude Code was started in, the keyring login reached the jobs, and a cleanup, a review, vibe_apply and a four-minute job all worked. Only Vibe 3.1.x and mistral-large-4 have been tried.

Requirements

You need

Why

Check

Linux

the reference sandbox uses bubblewrap

git 2.22+, and a repo with at least one commit

each job is a worktree branched from HEAD

vibe-mcp doctor

uv

installs this tool; it downloads Python 3.14 itself if you lack it

bubblewrap (bwrap) with unprivileged user namespaces allowed

the sandbox; some distros restrict namespaces and need extra setup

vibe-mcp doctor

Mistral Vibe, installed with uv tool install mistral-vibe

the reference sandbox binds ~/.local/bin, ~/.local/share/uv and ~/.vibe, so a Vibe installed another way (pipx, pip) is invisible inside it

vibe --version

A Mistral login: the system keyring (vibe --setup) or MISTRAL_API_KEY

Vibe calls the Mistral API

vibe-mcp doctor

for the keyring login: xdg-dbus-proxy and a running Secret Service (gnome-keyring, KeePassXC, KWallet)

the sandbox reaches the keyring through a filtered D-Bus proxy; DBUS_SESSION_BUS_ADDRESS must reach the server (often missing over SSH or in tmux; use the API key there)

vibe-mcp doctor

python3 on the PATH

the reference sandbox uses it to read Vibe's export

Only Vibe 3.1.x has been tested. On the common distros the packages are called bubblewrap and xdg-dbus-proxy.

Related MCP server: worker-mcp

Install

# 1. Vibe, then log in (skip the login if you will use MISTRAL_API_KEY instead)
uv tool install mistral-vibe        # see Mistral's docs if the package name changes
vibe --setup

# 2. this project, and the reference sandbox from the same clone
git clone https://github.com/idaho06/vibe-mcp && cd vibe-mcp
install -m755 contrib/vibe-sandbox ~/.local/bin/
uv tool install .

# 3. check the machine; every failing line says how to fix it
vibe-mcp doctor

# 4. register the server with Claude Code for all your projects
claude mcp add --scope user vibe -- vibe-mcp
claude mcp list                     # should show `vibe` as connected

To update later: git pull && uv tool install --force .

If you use MISTRAL_API_KEY, the server process must receive it. Pass it when registering (see claude mcp add --help for the environment-variable option) instead of relying on your shell.

Using it

Start Claude Code inside the repository you want to work on (it needs at least one commit). The server works on the git repository of its working directory and prints serving git repo <path> on stderr at startup; check that line. Do not wrap the command in something that changes directory (for example uv run --directory; use uv run --project instead), or it will serve the wrong repository.

Claude Code asks before using MCP tools. Allow the five tools (named like mcp__vibe__vibe_submit) in its permission settings if you do not want a prompt for each call.

Using a different sandbox

sandbox_cmd in the config can point to any wrapper that behaves like this. The doctor checks that are specific to the reference sandbox are skipped for other commands.

  • It is called as vibe-sandbox RUN_DIR [vibe arguments...] with the current directory inside a git repo.

  • RUN_DIR is named vibe-run.*, and the wrapper makes Vibe write RUN_DIR/export/export.json (Vibe's --output-dir RUN_DIR/export).

  • It exits with Vibe's exit code (0 finished, 3 stopped at a limit, anything else failed).

  • It should let Vibe write only the current directory (the job's worktree) and the git directory.

  • Keep data_dir short: the wrapper may create a Unix socket in RUN_DIR (108-character limit).

Read contrib/vibe-sandbox before you rely on it: it decides what Vibe can see and write.

Tools

Tool

Purpose

vibe_submit(spec, title?, scope?, base_job?, max_turns?, time_limit?, max_price?, skill?)

Queue a task and return its job id at once. spec must be complete and self-contained: Vibe sees neither the chat nor your project docs. skill names a skill whose instructions go in front of the task (see Skills).

vibe_wait(job_ids?, timeout=120, wait_all=false)

Block until any (or all) of the jobs end, or timeout seconds pass. timeout=0 is a status check. Default: all active jobs.

vibe_result(job_id, diff=false)

Vibe's own summary (unverified), diffstat, added files, scope violations, tokens, cost. diff=true adds the capped diff.

vibe_cancel(job_id)

Cancel a queued job or kill a running one. Its worktree is kept.

vibe_apply(job_id, discard=false)

Stage the job's changes in your checkout (git merge --squash, no commit). Conflicts are reported and nothing changes. discard=true removes the job's worktree and branch instead.

Typical flow: vibe_submit (one or several jobs) → vibe_wait → vibe_result → review the diff → vibe_apply → you run the tests and git commit.

Scopes and parallel jobs

scope lists the repo-relative paths a job may touch. Jobs whose scopes overlap run one after another; jobs with disjoint scopes run in parallel (up to max_concurrent). A job with no scope counts as the whole repo. A waiting job reserves its scope, so it cannot be starved by later jobs. After the run, changed files outside the scope are reported as SCOPE VIOLATIONS (not blocked).

base_job starts a job from another job's result. It waits until that job ends, and fails with a clear message if that job failed, was cancelled, applied or discarded.

Isolation modes

  • isolation = "worktree" (default): every job starts from the current HEAD.

  • isolation = "serial": one job at a time, and each job starts from the latest finished job's branch, so work accumulates like a single shared worktree.

Skills and project context

A job runs in a fresh worktree, which holds only the files git tracks. Anything kept out of git (a gitignored .vibe/ folder, an untracked AGENTS.md) is missing there, and Vibe cannot see your main checkout. Two features bring that material in. Both read from your main checkout when the job is submitted, so they work even for files git ignores.

Skills

A skill is a SKILL.md file of instructions. vibe_submit(skill="simplify", spec="...") puts the skill's text (without its frontmatter) in front of your task. The server looks for it in:

  1. <repo>/.vibe/skills/<name>/SKILL.md (per project; wins), then

  2. ~/.vibe/skills/<name>/SKILL.md (global).

These are Vibe's own skill folders, so the same files also work in interactive Vibe. A wrong name is rejected at once with the list of available skills, and nothing is queued.

Shipped skills. contrib/skills has two lightweight skills written for unattended jobs. Install them once:

mkdir -p ~/.vibe/skills && cp -r contrib/skills/* ~/.vibe/skills/
  • simplify cleans up the code your task names (reuse, dead code, nesting, wasted work) without changing behavior, and edits the files in place.

  • code-review is read-only and reports real defects, each with the input that triggers it.

Both never ask questions, stay inside the scope the task names, run only the commands the task gives them, and end with a short fixed-format report. They are single-agent: nothing like a multi-agent review. Write your own for anything else, or override these per project.

A third, code-simplifier, is in contrib/skills-apache: an adaptation of Anthropic's Apache-2.0 code-simplifier agent, kept under that license with a notice of what changed. It is also single-agent.

Writing a skill. Create <name>/SKILL.md with frontmatter holding a name (lowercase letters, digits and hyphens) and a description, then the instructions. The frontmatter is YAML: quote the description if it contains : (a colon followed by a space), or Vibe rejects the file. Remember the job is headless: the skill should say not to ask questions, how to find its target, and how short the final report must be, because Claude pays for every line of the result.

Project context

context_files in the config lists repo files to put in front of every task, for example your coding standards when AGENTS.md is not tracked in git:

context_files = ["AGENTS.md"]

Missing or empty files are skipped, and each file is cut at 50,000 characters. List only files Vibe cannot see by itself: a tracked file is already in the worktree, and AGENTS.md is one Vibe reads on its own. The default is empty, so specs stay self-contained unless you opt in.

Naming the target of a cleanup or review

The worktree starts at HEAD, so uncommitted changes in your checkout are not in the job. Commit first, then say exactly what to work on in the spec: "simplify the changes in HEAD~3..HEAD" or "review src/parser.py". The shipped skills do nothing and say so when the task names no target.

Cost

Every job pays Vibe's fixed per-session overhead, and a skill adds its own text (about 400 to 600 tokens for the shipped ones). In tests with Vibe 3.1.0 and mistral-large-4 on a 45-line change, using larger skills than the shipped ones, a review cost about $0.02 to $0.03 and a cleanup $0.04 to $0.06. Vibe's cost report may not include subagents, so treat figures as lower bounds, and check vibe-mcp stats on your own work.

Configuration

Optional file ~/.config/vibe-mcp/config.toml (or the path in $VIBE_MCP_CONFIG). Unknown keys and wrong types are rejected at startup.

Key

Default

Meaning

isolation

"worktree"

"worktree" or "serial"

max_concurrent

3

parallel jobs (forced to 1 in serial mode)

model

"mistral-large-4"

Vibe model alias

sandbox_cmd

"vibe-sandbox"

sandbox wrapper command (may include arguments)

data_dir

"~/.local/share/vibe-mcp"

run directories and worktrees

max_turns

200

default per-job turn budget (per-call override)

time_limit

1200

default per-job time limit in seconds (per-call override)

max_price

0

default per-job price cap in dollars; 0 = no cap

max_message_chars

2000

cap on Vibe's final message in results

max_diff_bytes

20000

cap on the diff in results

context_files

[]

repo files whose text is put in front of every task (see Skills)

Things to know

  • Long waits are fine in Claude Code. It moves a tool call that runs longer than about 120 seconds to the background and tells Claude when it finishes. A vibe_wait on a four-minute job returned its result that way, as a notification, without an error. (Seen in one session; other clients may differ.)

  • Vibe's code is unreviewed. The server never runs tests or the code Vibe wrote. Read the diff (vibe_result diff=true), then run your own checks before committing.

  • Trust the diff, not Vibe's report. Vibe can say it wrote files outside its worktree, such as into your checkout or another job's worktree. With the reference sandbox those writes land in a throwaway in-memory filesystem and vanish, but Vibe still reports success. Only the committed diff counts.

  • Every job has a cost floor. A one-line fix cost about 33K tokens (mostly Vibe's cached system prompt) and $0.013 in a test with Vibe 3.1.0. Delegate medium and large tasks, not one-liners.

  • Jobs live with the server. Closing Claude Code kills running jobs; queued and running jobs left behind show up as lost on the next start. Their worktrees are kept until you discard them.

  • Main checkout guard. The sandbox must share the git directory, so a job could in principle move your branch. If your checkout's branch or HEAD changed while a job ran, the result starts with a WARNING (it also fires when you committed meanwhile).

  • Vibe's streaming output is undocumented. It is only used for live progress and the final message; the outcome, cost and tokens come from Vibe's export.json.

Measuring the savings

vibe-mcp stats (add --json for scripts) sums up every saved job: counts by state, total and average cost, tokens and duration. To compare with another delegation setup, run the same tasks through both and compare wall time and Vibe cost from stats, plus the Claude tokens in the session transcripts.

Development

uv sync
uv run pytest        # no network, no cost: uses tests/fake_sandbox.py
uv run ruff check && uv run ruff format --check

Tests drive a fake sandbox (tests/fake_sandbox.py) that takes JSON directives, so the whole scheduler, git handling and MCP surface are covered without running Vibe.

License

MIT, except contrib/skills-apache/, which is Apache-2.0 (see its README).

Available Tools

5 tools
vibe_applyA

Stage a finished job's changes in the main checkout (git merge --squash, no commit).

Conflicts are reported and nothing changes. discard=true drops the job's worktree and branch instead.

NameRequiredDescriptionDefault
job_idYes
discardNo

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations supplied, the description carries the full behavioral burden and does meaningful work: it discloses that conflicts are reported with no partial change (atomicity), that no commit is created, and that discard=true destroys the job's worktree and branch. It stops short of covering permissions or whether a successful apply can be repeated safely.

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

Conciseness5/5

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

Two short sentences, front-loaded with the primary behavior and the git primitive, then the failure mode, then the destructive alternative. No filler or redundancy.

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

Completeness4/5

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

For a two-parameter mutation tool with no annotations and no output schema, the description covers the core semantics, the no-op-on-conflict guarantee, and the destructive discard path. Only the shape of what gets reported on conflict is left unstated, which is modest given the tool's simplicity.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate, and it does for the non-obvious parameter by explaining exactly what discard=true does (drops the worktree and branch) rather than leaving a bare boolean. job_id's meaning is only inferable from "a finished job's changes," which is a minor remaining gap.

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

Purpose4/5

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

The description names a specific verb-and-resource pair ("Stage a finished job's changes in the main checkout") and pins down the mechanism with "git merge --squash, no commit." It does not explicitly name a sibling like vibe_result or vibe_wait, but "finished job" implicitly frames the ordering relative to those tools.

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?

"A finished job's" signals the precondition that the job must have completed, which implies when this tool is appropriate. The discard branch is described as an alternative behavior, but neither branch states when an agent should choose apply versus simply reading the result with vibe_result.

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

vibe_cancelA

Cancel a queued job, or kill a running one. Its worktree is kept.

NameRequiredDescriptionDefault
job_idYes

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 and does disclose two useful facts: the operation is a mutation that terminates running work, and the worktree survives. It does not say whether a running job is killed gracefully, what permissions are needed, whether the call is idempotent, or whether an error is returned for already-completed jobs.

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

Conciseness5/5

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

Two short sentences, zero filler, and the state distinction is front-loaded before the artifact-preservation detail. Nothing is repeated and nothing is padded.

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

Completeness3/5

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

For a one-parameter mutation with no annotations and no output schema, the description covers the core action and one side effect, but leaves the agent guessing about the return value, failure modes, and id provenance. It is adequate to call the tool but not complete.

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

Parameters2/5

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

There is a single required job_id parameter with 0% schema description coverage, so the description must compensate and largely does not: it never says where job_id comes from (presumably vibe_submit), what format it takes, or how an invalid or unknown id is handled. It only implies that the id must refer to a queued or running job.

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

Purpose4/5

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

The description names a specific verb pair (cancel/kill) and the resource (a queued or running job), and its state-dependent framing makes the tool's scope immediately clear. It does not reference any sibling, but none of vibe_submit, vibe_wait, vibe_result or vibe_apply overlaps with cancellation, so disambiguation is effectively implicit rather than stated.

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 phrase 'a queued job' versus 'a running one' tells an agent the two contexts in which to call it and what happens in each. It stops short of exclusions or follow-up guidance, such as whether to read results via vibe_result afterwards or what to do if the job has already finished.

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

vibe_resultA

Outcome of a job: Vibe's own summary (unverified), diffstat, added files, scope violations, tokens and cost. diff=true appends the diff (capped).

NameRequiredDescriptionDefault
diffNo
job_idYes

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full load and does disclose real behavioral traits: the summary is explicitly 'unverified' (a trust caveat) and the diff is 'capped' when diff=true (a size limit). It omits error behavior when job_id is unknown or the job is incomplete, which keeps it below a 5.

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

Conciseness5/5

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

A single dense sentence with the returned payload front-loaded and the diff flag explained last; there is no redundant or filler text.

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?

There is no output schema, so the description must describe the return value, and it enumerates the returned fields plus the optional diff. Complete enough to call correctly, with only edge-case/error behavior and sibling routing left unaddressed.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it does for the key optional flag: 'diff=true appends the diff (capped)' explains both effect and limit. job_id is only implicitly defined as identifying the job, leaving one parameter thinly covered.

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

Purpose4/5

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

The description states a specific resource ('Outcome of a job') and enumerates exactly what the outcome contains: summary, diffstat, added files, scope violations, tokens, cost. That is far more concrete than the bare name, though it never explicitly names how it differs from siblings like vibe_wait or vibe_apply.

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?

Usage is only implied: you call this to retrieve a job's outcome, presumably after it completes, but the description never says whether it works on a still-running job or how it relates to vibe_wait/vibe_apply. There are no explicit when-not conditions.

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

vibe_submitA

Queue a coding task for Mistral Vibe (a cheaper model) in an isolated git worktree.

spec: complete and self-contained; Vibe sees neither this chat nor project docs. skill: name of a Vibe skill (.vibe/skills//SKILL.md in the repo or ~) to follow. scope: repo-relative paths the task may touch; jobs with overlapping scopes run one after another (omit = whole repo). base_job: build on another job's result. Returns at once. Then: vibe_wait, vibe_result, vibe_apply.

NameRequiredDescriptionDefault
specYes
scopeNo
skillNo
titleNo
base_jobNo
max_priceNo
max_turnsNo
time_limitNo

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the burden and it does cover the important traits: isolated worktree execution, immediate return rather than blocking, and concurrency serialization when scopes overlap (omit = whole repo). It does not state cost implications despite mentioning a 'cheaper model', nor what happens on failure, timeout, or cancellation, and never says what value is returned for handing to vibe_wait.

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?

Tight and front-loaded: the purpose leads, the parameter glosses follow, and the workflow hand-off is one short line at the end. The telegraphic 'name: meaning' fragments are efficient but border on cryptic for the skill and scope lines, which cost it a point.

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?

This is an 8-parameter mutating/queueing tool with no annotations, no output schema, and 0% schema coverage, so the description must do nearly all the work. It covers the core mental model and next steps well, but omits the four budget/limit parameters and does not say that submission returns a job identifier — a real gap given that vibe_wait, vibe_result, and vibe_apply presumably need that ID.

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

Parameters3/5

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

Schema description coverage is 0% across 8 parameters, so the description is the only source of parameter meaning — and it only explains four of them (spec, skill, scope, base_job). Useful semantics are added for those (where the skill file lives, scope overlap behavior, building on a prior job), but title, max_price, max_turns, and time_limit get nothing beyond self-describing names, leaving half the surface un-elaborated.

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 first sentence gives a specific verb and resource — 'Queue a coding task for Mistral Vibe ... in an isolated git worktree' — naming the executor and the isolation model. It is clearly separable from siblings because the closing line maps the whole follow-up lifecycle (vibe_wait, vibe_result, vibe_apply) and leaves vibe_submit as the entry point. An agent can pick it out without opening a schema.

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?

Usage context is clear: this is the asynchronous delegation path, and the spec guidance ('complete and self-contained; Vibe sees neither this chat nor project docs') tells the agent how to use it correctly. It also directs follow-up to the specific sibling tools in order. It stops short of stating when NOT to delegate or what to do instead (e.g., doing the edit inline), so it is not a full 5.

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

vibe_waitA

Wait until any job (every job if wait_all) in job_ids ends, or timeout seconds pass.

Default job_ids: all active jobs. timeout=0 just reports status. One line per job.

NameRequiredDescriptionDefault
job_idsNo
timeoutNo
wait_allNo

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations present, the description carries the full burden. It usefully discloses the blocking nature, the default scope, the timeout=0 special case, and that output is one line per job. It does not say what happens when the timeout expires before any job ends (error vs partial result), which is the key behavioral ambiguity for a wait tool.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core semantics (blocking wait, scope, timeout) before the defaults and output note. No redundant or filler wording; every clause conveys information.

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?

For a 3-parameter, zero-required, annotation-free tool with no output schema, the description covers defaults, special values, and the shape of the return ('one line per job'). The main remaining gap is the outcome when the timeout elapses, which an agent needs in order to handle the result correctly.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it does: job_ids is explained with its default of all active jobs, timeout is explained as a bound with a documented timeout=0 status-only mode, and wait_all is defined as every-vs-any. Only the unit/format of timeout and the expected id format are left unstated.

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?

States a specific verb and resource ('Wait until ... job[s] ... ends') and clarifies the scope of the wait (any job, or every job when wait_all is set). It does not explicitly distinguish itself from the sibling vibe_result, which an agent could reasonably confuse with a blocking wait, so it falls short of a 5.

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

Usage Guidelines3/5

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

Useful context is given implicitly: default job_ids covers all active jobs, and timeout=0 is a pure status check rather than a wait. However, there is no explicit statement of when to prefer vibe_wait over vibe_result or vibe_submit, so the agent must infer the choice from sibling names.

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. 5 tool updatesv0.1.0
    • First observedvibe_apply
    • First observedvibe_cancel
    • First observedvibe_result
    • First observedvibe_submit
    • First observedvibe_wait

TDQS

A3.9/5.0

Scored across 5 tools

Disambiguation5/5

Each tool maps to a distinct lifecycle phase: submit queues work, wait blocks for completion, result inspects the outcome, apply stages or discards changes, and cancel aborts a job. The boundaries are reinforced by descriptions that cross-reference the natural workflow (submit -> wait -> result -> apply), leaving little room for misselection.

Naming Consistency4/5

All tools share a consistent vibe_ prefix with single-word suffixes, which is predictable and readable. The minor deviation is that four names are verbs (submit, wait, cancel, apply) while vibe_result is a noun, though that is idiomatic for an inspection tool.

Tool Count5/5

Five tools is well-scoped for a job-delegation lifecycle, and each one earns its place with no redundant overlap. Nothing feels thin because wait with timeout=0 doubles as a status poll, and nothing feels padded.

Completeness4/5

The surface covers the full lifecycle: enqueue, await, inspect (summary, diffstat, diff, cost, scope violations), apply/discard, and cancel. Minor gaps remain, such as no dedicated job-listing/history tool for finished jobs and no way to un-apply a staged squash without manual git work, but these are workable.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables Claude to delegate coding tasks to a worker CLI, handling actual code modifications and command execution while Claude supervises and verifies results.
    -