Skip to main content
Glama

Vibeflow

Task management for AI coding agents — with annotation and verification built in.

Vibeflow gives your coding agent sequenced, claimable work: tasks with hierarchy, an atomic --next claim, and a review gate with verification verdicts — on a local-first kanban board that stays in your repo. Clicking a UI element to file a ticket with its exact selector, URL, and source location is built in, so visual feedback arrives as structured tasks instead of prose.

npm install -g @vibeflow-tools/cli
vibeflow kanban

Why It Matters

AI agents write code fast, but understanding what to change is slow. Describing a UI issue in prose wastes tokens and produces wrong fixes.

Vibeflow turns visual feedback into structured tasks:

  • Click any element → instant task with CSS selector, URL, and source file location

  • Track on a Kanban board → see everything at a glance, drag between columns

  • Agents implement with context → no guessing, no wrong elements, no wasted iterations

Perfect for small UI fixes, broken layouts, spacing issues, and anything where pointing is faster than explaining.


Related MCP server: kanban-pro

Quick Start

# 1. Embed the overlay into your app (bookmarklet, script tag, or devtools)
#    Visit /inject on your running server for ready-to-use snippets

# 2. Open the Kanban board
vibeflow kanban

# 3. Click elements in your app to annotate, or create tasks on the board

# 4. Your agent picks the next task with full context executing following command
vibeflow tasks --next

Commands

Command

Description

vibeflow kanban [dir]

Start the server and open the live Kanban board in your browser

vibeflow serve [target]

Serve HTML files with live annotation overlay, or run API-only task server for existing apps

vibeflow tasks

List, filter, create, edit, and comment on tasks

vibeflow telemetry

Manage CLI usage telemetry (opt-out at any time)

vibeflow kanban [dir]

vibeflow kanban                   # open Kanban board for current directory
vibeflow kanban ./my-project      # open Kanban for a specific project

The Kanban board provides a visual task tracker with drag-and-drop columns, agent status display, and file attachments. Create tasks directly on the board or import them from annotated prototypes.

vibeflow serve [target]

vibeflow serve .                  # serve all HTML files in current directory
vibeflow serve dashboard.html     # serve a single file
vibeflow serve -p 4000 .          # custom port
vibeflow serve --no-open .        # don't open browser automatically
vibeflow serve                    # API-only mode — connects to an existing hosted app

Serve HTML prototypes with the annotation overlay — click any element to create a task with its CSS selector, URL, and source location.

vibeflow tasks

Full task management from the command line — designed to be agent-friendly.

# Pick the next task (auto-claims a ROOT task in todo)
vibeflow tasks --next                             # highest-priority ROOT task in todo
vibeflow tasks --next --type Bug                  # next bug ROOT task only

# List tasks
vibeflow tasks                                    # ROOT tasks only (default: 20 most recent)
vibeflow tasks --children                         # include child tasks
vibeflow tasks --all                            # show all tasks (explicit paging, bounded per request)
# NOTE (ticket b2e56212): --limit 0 is NOT an unbounded mode — it resolves
# to the default (20) loudly. Use --all for everything.
vibeflow tasks --json                             # machine-readable JSON output

# Filter
vibeflow tasks --status todo                      # by status
vibeflow tasks --type Bug                         # by type (Task, Bug, Feature, Enhancement, Research)
vibeflow tasks --user dev@example.com             # by author email
vibeflow tasks --tag frontend --tag urgent        # by tags (AND matching)

# Get full details of a single task
vibeflow tasks --get <id>                         # supports partial ID prefix

# Create a task
vibeflow tasks --add --title "Fix header" --description "Button overflows on mobile"

# Edit a task
vibeflow tasks --edit <id> --set-status in-progress
vibeflow tasks --edit <id> --title "Updated title" --description "More detail"

# Mark as review (requires implementation report)
vibeflow tasks --edit <id> --set-status review \
  --commit-message "fix: header layout" \
  --comment "Fixed the alignment issue by adjusting flex-wrap"

Task types: Task · Bug · Feature · Enhancement · Research
Task statuses: backlog → todo → in-progress → review → done
Priorities: Critical · High · Medium · Low

Root and child tasks

A task with a parent link is a child; a task without one is a root. The CLI hands an agent whole units of work, so both listing and claiming operate on roots:

  • vibeflow tasks lists root tasks only. A child belongs to its parent and is rendered inside that parent's card on the board, so listing it as a peer would contradict the board. The footer reports how many children the query matched — · 3 child tasks hidden (use --children) — so they are never hidden silently. Pass --children to include them.

  • vibeflow tasks --next claims only a root whose own status is todo, and never a child. The result carries that root's children with their ids, titles and statuses, so the agent sees what remains without a second call. Claiming a root does not cascade to its children — the agent walks them.

  • vibeflow tasks --get <id> is deliberately unfiltered: it resolves any task, child or root, so a child is always reachable by id.

# A root with children, claimed as one unit of work
vibeflow tasks --next
#   ▶ NEXT TASK — Status moved to in-progress. Implement this now:
#   [in-progress] Rebuild the settings page
#     ↓ 2 child tasks (1 done)
#       [done]        a1b2c3d4  Remove the legacy toggle
#       [todo]        e5f6a7b8  Add the keyboard shortcut

Because --next only considers roots whose own status is todo, a child in todo whose parent is in backlog, in-progress or done is not returned by --next. Move the root to todo to make the whole unit claimable.

vibeflow telemetry

vibeflow telemetry              # show current status
vibeflow telemetry --disable    # opt out of usage tracking
vibeflow telemetry --enable     # opt back in

No PII is ever collected. User identity is hashed.

What is collected. One command_run event per invocation with a small, coarse property set:

  • command — the top-level command (tasks, serve, kanban, …)

  • subcommand — the mode within a command that has one: tasks emits list / get / add / edit / next / reindex, serve emits api (API-only task server) or prototype (an HTML target was given)

  • from_status / to_status — on tasks --edit only: the task's status before and after the edit, drawn from backlog | todo | in-progress | review | done, so status transitions are queryable as a funnel

Never collected: task ids, titles, descriptions, file paths, selectors, URLs, or any other task content.


Browser Overlay

The overlay is a Shadow DOM panel injected into any page — HTML prototypes or live apps:

  • Click-to-annotate — click any element to open a task form, pre-filled with CSS selector, URL, and source location

  • Task sidebar — lists open tasks with status badges; click to jump to the annotated element

  • Task indicators — numbered markers on annotated elements

  • Real-time sync — over WebSocket with live file watching

  • Screenshot capture — attach screenshots to tasks via the overlay

  • Dark theme — polished dark UI, no configuration needed

  • Keyboard shortcut — Alt+A to toggle annotation mode

  • CSP-safe injection — bookmarklet bypasses script-src restrictions

Injection Methods

The overlay can be injected into any page three ways:

Method

Best for

CSP-safe

Bookmarklet (recommended)

Any page, including production apps

Yes

Script tag

Pages you control the HTML of

No

DevTools console

Quick one-off sessions

Yes

Visit /inject on your running server for ready-to-use bookmarklets and snippets.


How It Works

You browse your app  →  click to annotate  →  task created with context
         ↑                                         ↓
   browser reloads  ←  agent implements  ←  vibeflow tasks --next
  1. Overlay — embed the bookmarklet or script into your app, click any element to annotate

  2. Kanban — open the board to see all tasks at a glance, create new ones directly

  3. Tasks — vibeflow tasks --next claims the highest-priority root task in todo, and returns it with its children — the whole unit of work, with full context for your agent

  4. Iterate — agent implements, browser reloads, annotate again


Agent Integration

Vibeflow tasks are formatted for AI agents with full context:

  • CSS selectors — exact element targeting, no guesswork

  • Source locations — file, line, and column where the element is defined

  • Screenshots — visual context attached to tasks

  • Comments — threaded discussions on each task

  • File attachments — research reports, specs, and reference materials

  • Git commits — changes linked back to tasks via [proto:task-id] in commit messages

Agents can also run directly from the Kanban board via POST /api/agent/run, which spawns opencode with full task context.


MCP Server

Vibeflow gives an AI coding agent a Kanban board over your own repository: click any element in your app and it becomes a ticket carrying that element's CSS selector, URL, source file and line. Tasks, progress and verification then live in one place instead of being scattered across a chat transcript.

The server runs locally over stdio, one process per project — there is no hosted Vibeflow service to sign up for. It is published as an MCP server in the official MCP Registry (server.json in this repo).

Install and run

npm install -g @vibeflow-tools/cli
vibeflow mcp --project /path/to/project

--project is required. The project root is resolved once at startup and every tool call uses that root, so a server can never write into the wrong project. Point it at your own repository.

Client configuration

Claude Desktop — add to claude_desktop_config.json:

{
  "mcpServers": {
    "vibeflow": {
      "command": "npx",
      "args": ["-y", "@vibeflow-tools/cli", "mcp", "--project", "/path/to/project"]
    }
  }
}

Cursor — the same block goes in .cursor/mcp.json in your project:

{
  "mcpServers": {
    "vibeflow": {
      "command": "npx",
      "args": ["-y", "@vibeflow-tools/cli", "mcp", "--project", "/path/to/project"]
    }
  }
}

Tools

Tool

What it does

list_tasks

List tasks with optional filters (root tasks only unless children)

get_task

One task by ID, with comments and files

get_project

The resolved project this server is attached to — root, branch, mode

create_task

Create a task, optionally annotated with a URL and selector

update_task

Edit a task: status, title, links, and the verification verdict

claim_next_task

Claim the highest-priority root task in todo as in-progress

add_comment

Comment on a task

attach_file

Attach a file (base64); a .md satisfies the research-report gate

verify_task

Run visual verification for an annotated task

start_kanban

Start the local Kanban board server and return its URLs

get_integration_guide

The overlay/bookmarklet integration instructions

The published package exposes every tool listed above. server.json records that count as toolsAtPinnedVersion, and sync-server-manifest.mjs checks it against packages/cli/src/mcp/manifest.ts on every release — a mismatch warns loudly rather than shipping a number nobody verified.

Authentication

None required. Vibeflow is local-first: no login, no account, no API key. Every task is a file in your repo.

An HTTP transport also exists (vibeflow serve, MCP endpoint at /api/mcp), but it is a local loopback server rather than a public one.

For the full protocol reference — result envelope shape, refusal codes, notices, and the dryRun preview — see the CLI package README.


API

A REST API and tRPC router are available at http://localhost:3700 for integrations and the browser overlay. Key endpoints:

  • /kanban — live Kanban board

  • GET/POST /api/tasks — list and create tasks

  • GET/PATCH/DELETE /api/tasks/:id — manage individual tasks

  • GET/POST /api/tasks/:id/comments — task comments

  • GET/POST/DELETE /api/tasks/:id/files — file attachments

  • POST /api/agent/run — spawn an AI agent for a task

  • /inject — overlay injection helper page

See src/server/server.ts for the full API.


Installation

npm install -g @vibeflow-tools/cli

Or run without installing:

npx @vibeflow-tools/cli kanban

Requirements: Node.js >= 22


Contributing

pnpm install       # install dependencies
pnpm build:cli     # build CLI
pnpm test          # unit tests
pnpm test:e2e      # end-to-end tests

License

Apache-2.0 — see NOTICE for third-party attributions.

Available Tools

12 tools
add_commentAdd commentA

Add a comment to a task without changing any of its fields. The body is comment — the same name as the CLI's --comment flag and update_task's field. author defaults to agent; pass dryRun to validate without writing. Use it to discuss or record progress; use update_task's comment when the note accompanies a status or field change (review REQUIRES the note on the same call).

NameRequiredDescriptionDefault
idYesTask id — a full id, or any unique prefix of one, of the task to comment on. An id that matches nothing is refused with TASK_NOT_FOUND; no task is created.
authorNoComment author. Defaults to agent; the CLI always derives it from git config, so only MCP can override it.agent
dryRunNoPreview only: validate the comment without writing it to the task.
commentYesThe comment body — what changed, what you verified, what a reviewer should know. Required and non-empty: an empty body is refused by input validation before the tool runs.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (not read-only, non-destructive, non-idempotent), and the description adds genuinely new behavior: the append-only semantics, the `author` default of agent with the note that only MCP can override git config, and dryRun as a validate-without-write path. It stops short of saying what happens on repeated identical calls, which matters given idempotentHint=false, so not 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.

Conciseness4/5

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

Three tight sentences, front-loaded with what the tool does and the no-field-change guarantee, then naming, then routing. The CLI-flag aside is mildly incidental but earns its place by anchoring the parameter name across surfaces.

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 4-parameter, no-output-schema append tool, the description covers mutation scope, defaults, the dry-run escape hatch, and sibling routing. The only real gap is return/duplication behavior (does a second identical call add a second comment?), which is a meaningful omission given idempotentHint=false.

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 100%, so the baseline is 3, but the description adds cross-tool semantics the schema cannot: `comment` is the same name as the CLI's --comment flag and update_task's field, which is directly actionable for an agent composing calls. It also reinforces the author and dryRun defaults, though those largely restate the schema.

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?

States a specific verb and resource ('Add a comment to a task') and immediately bounds the scope with 'without changing any of its fields,' which separates it from update_task. An agent can distinguish it from every sibling 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 Guidelines5/5

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

Gives an explicit routing rule: use this to discuss or record progress, use update_task's `comment` when the note accompanies a status or field change. It even flags a hard constraint ('review REQUIRES the note on the same call'), which prevents a wrong-tool call that would otherwise look valid.

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

attach_fileAttach fileA

Attach a file to a task (content as base64) without changing any of its fields. Re-attaching an existing filename overwrites its bytes in place — the file list gains no duplicate. Pass dryRun to validate without writing. A filename ending in .md is what satisfies the research-report gate: a type:"Research" task is refused review with RESEARCH_REPORT_REQUIRED until a .md is attached, so attaching the report is how to recover from that refusal. Use it for reports, screenshots and evidence; use add_comment for discussion text.

NameRequiredDescriptionDefault
idYesTask id — a full id, or any unique prefix of one, of the task to attach to. An id that matches nothing is refused with TASK_NOT_FOUND; no file is written.
dryRunNoPreview only: validate the filename and payload without writing a file.
filenameYesBare filename, no directory part. The EXTENSION decides acceptance: a .md is what satisfies the research-report gate, and an unsupported extension is refused with UNSUPPORTED_FILE_TYPE.
contentB64YesThe file content, base64-encoded (not raw bytes, and not a path to read). Required: omitting it is refused by input validation before the tool runs.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses in-place byte overwrite with no duplicate entry on re-attach, that dryRun validates without writing, and that attaching a .md is what unblocks review of a Research task. Annotations only declare the generic write/idempotency profile, so this added mutation semantics carries real value.

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?

Front-loaded with the core action, then overwrite semantics, dryRun, and the gate rule in descending priority. It is dense but every sentence carries distinct information; the research-gate sentence restates the refusal consequence twice ('refused review ... so attaching the report is how to recover'), which is the only real 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 4-parameter mutation with no output schema and no rich annotations, the definition covers write semantics, validation mode, failure codes and sibling routing. It does not say what a successful attach returns (file id, size, resulting file list), which leaves a small gap an agent may care about.

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 100%, so the baseline is 3; the description still adds meaning by tying the filename extension to acceptance and the research gate, and by tying id to the attach target and TASK_NOT_FOUND failure. The base64-vs-path distinction for contentB64 is left mostly to the schema.

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?

States a specific verb and resource ('Attach a file to a task') plus the payload form (base64) and the key invariant ('without changing any of its fields'). The final sentence contrasts it directly with the add_comment sibling, so an agent can distinguish the two without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit use cases ('reports, screenshots and evidence'), a named alternative for the adjacent case ('use add_comment for discussion text'), a validation-only mode ('Pass dryRun'), and a concrete trigger/recovery path for the research gate (RESEARCH_REPORT_REQUIRED until a .md is attached). Both when-to-use and when-not-to-use are covered.

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

claim_next_taskClaim next taskA

Claim the highest-priority todo task and set it to in-progress: the returned object IS the claimed task. Roots first: a todo ROOT is claimed before any child — the root is the unit of work, so work through its children after claiming it. When no todo root is claimable, falls back to the highest-priority matching todo child of live work (parent chain todo/in-progress/review) and says so explicitly (a CHILD_CLAIM notice naming the parent); children of backlog/done parents are refused, never sliced off. Optional type/user/tag filters narrow the pool (tags every-match); pass dryRun to preview the claim without moving the task. An empty board — or a valid filter matching nothing — is a SUCCESS with a null result, the same as 'vibeflow tasks --next --json' reporting task:null with exit 0. Use it to pull the next unit of work; use list_tasks to browse without claiming, and get_task to inspect a task you already hold.

NameRequiredDescriptionDefault
tagNoOnly claim a task carrying every listed tag (AND). Omit for no tag filter.
typeNoOnly claim a task of this type. Omit to claim across all types.
userNoOnly claim a task assigned to this user (matched against the task author). Omit to claim anyone's work.
dryRunNoPreview only: name the task that WOULD be claimed without moving it to in-progress.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only flag it as a non-readonly, non-destructive, non-idempotent mutation; the description adds substantial context beyond that: the root-before-child ordering rule, the fallback behavior and its explicit notice, the refusal of orphaned children, and the empty-board-is-success-with-null semantics. No contradiction with readOnlyHint=false since it genuinely mutates state.

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?

Front-loaded with the core action and return-value guarantee, and most sentences carry distinct information (root-first, fallback, refusals, dryRun). It runs long and repeats the filter idea already in the schema, but nothing is wasted enough to penalize heavily.

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

Completeness5/5

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

No output schema exists, and the description compensates by explaining the return semantics (the object is the task; empty/filtered-out yields null success equivalently to the CLI with exit 0). Combined with the ordering and fallback rules, an agent has enough to invoke it correctly.

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% and all four parameters (tag AND-matching, type enum, user, dryRun preview) are already documented in the schema. The description adds only light framing (filters 'narrow the pool') without new syntax or format detail, so the baseline 3 applies.

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?

States a specific verb (claim) and resource (highest-priority todo task) and the resulting state change (set to in-progress), plus clarifies the returned object IS the claimed task. It also explicitly differentiates itself from siblings by naming list_tasks for browsing and get_task for inspecting an already-held task.

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

Usage Guidelines5/5

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

Explicit when-to-use (pull the next unit of work) and when-to-use alternatives (list_tasks to browse without claiming, get_task to inspect a held task). It also spells out the root-first preference, the child fallback condition with CHILD_CLAIM notice, and the refusal of children under backlog/done parents.

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

create_taskCreate taskA

Create a new task with title, description, and metadata. Pass fields (e.g. ["id","title","status"]) for a compact answer instead of the full task object; pass dryRun to validate without writing anything. LINKS merge: links ADDS every listed taskId+type pair to the new task and parent (when given) is folded into the same union, so sending both merges once and a pair named twice is a no-op — the same MERGE semantic update_task has, where a link you do not name is simply absent (a new task has nothing to preserve). links: [] is REFUSED — omit the field for no links. Use it for a new unit of work; use update_task to change an existing task, and add_comment to discuss one without editing it.

NameRequiredDescriptionDefault
urlNoURL the annotation targets. Together with selector this makes the task annotated (overlay-verifiable); omit both for a plain task.
tagsNoTags for filtering (list_tasks --tag matches every listed tag). Omit for untagged.
typeNoTask type. Defaults to Task; use Research for an investigation (it reaches review on its attached .md report, with no verification verdict).Task
linksNoADD the listed links to the new task (merge, same as update_task's `links`). Combined with `parent` as a union; a pair named twice is a no-op. `links: []` is REFUSED — omit the field for no links.
titleYesTask title — the only required field.
dryRunNoPreview only: validate the input and report what WOULD be created without writing a task file.
fieldsNoReturn only these task fields (e.g. ["id","title","status"]) instead of the full task object. Omit for the full object — same selector list_tasks and get_task take.
parentNoParent task id (full id or unique prefix) to create this task as a child. Omit for a root task; merges with links as one union when both are given.
statusNoInitial status. Defaults to todo; pass another status only to create the task already in motion.todo
sortKeyNoExplicit board ordering key. Omit it — core auto-assigns one — unless you must place the task exactly.
priorityNoPriority tier, driving claim order (Critical first). Defaults to Medium.Medium
selectorNoCSS selector of the annotated element (default "/", meaning the whole page). Only meaningful with url./
cssSelectorNoAlias of selector for clients that prefer the explicit name; both write the same field.
descriptionNoLonger task body (what to do, acceptance criteria). Optional; omit when the title says it all.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses that `links` is an additive MERGE unioned with `parent`, that duplicate pairs are no-ops, and that `links: []` is REFUSED — non-obvious failure behavior an agent would otherwise trip on. dryRun explicitly validates without writing, consistent with destructiveHint=false.

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?

Front-loads the core action and the usage routing first, then the tricky merge semantics. The merge paragraph is dense but every clause carries non-obvious information; only slight redundancy (repeating the links refusal in both schema and prose) keeps it from a 5.

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 14-parameter mutation tool with no output schema, the description covers the risky areas (link merging, dryRun, field selection) that an agent must get right. Edge parameters (sortKey, selector/cssSelector alias, type enums) are adequately handled by the 100%-covered schema, so nothing critical is missing.

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 100%, so baseline is 3, but the description adds real semantics the schema does not: the union/merge behavior of `links`+`parent`, the refusal of an empty array, and equivalence of the `fields` selector with list_tasks/get_task. Minor params like sortKey and cssSelector alias are left to the schema, keeping it short of a 5.

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?

States a specific verb and resource ("Create a new task with title, description, and metadata") and immediately contrasts it against update_task (change existing) and add_comment (discuss without editing). An agent can distinguish it from every sibling without opening the schema.

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

Usage Guidelines5/5

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

Explicit routing: "Use it for a new unit of work; use update_task to change an existing task, and add_comment to discuss one without editing it." It also gives when-to-use guidance for dryRun (validate without writing) and fields (compact response), leaving little to inference.

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

get_integration_guideGet integration guideA
Read-onlyIdempotent

Get the overlay/bookmarklet integration instructions — the text of the /inject page: the script tag to paste, the browser-console snippet, the bookmarklet, and the /inject URL. Works whether or not the server is running; when it is not, the guide is built against the default port and the result says serverRunning:false, so call start_kanban first for real URLs.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds meaningful runtime context beyond them: it works offline, falls back to a default port, and surfaces a serverRunning:false flag. This is exactly the kind of state-dependent behavior annotations cannot express.

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 sentences, front-loaded with the outcome and artifact list, then the server-state caveat and the corrective action. Every clause carries information; nothing is padding.

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

Completeness5/5

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

With no output schema, the description volunteers the return contents (script tag, console snippet, bookmarklet, /inject URL, serverRunning flag) and the condition affecting them. An agent has everything needed to call it and interpret the result.

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 takes zero parameters, so the schema baseline applies; there is nothing to document. The description correctly adds no parameter chatter, keeping the text focused on behavior.

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?

States a specific verb (get) and resource (overlay/bookmarklet integration instructions) and enumerates the exact artifacts returned: script tag, console snippet, bookmarklet, /inject URL. It is clearly distinguishable from siblings like export_prompt or start_kanban.

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

Usage Guidelines5/5

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

Explicitly says it works whether or not the server is running, explains the degraded case (guide built against default port, serverRunning:false), and names the alternative to call first (start_kanban) to get real URLs. No inference required.

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

get_projectGet projectA
Read-onlyIdempotent

Return the resolved project this server is attached to: name, absolute root, git branch and mode. Read-only; takes no input and changes nothing. Call it when you need board location or branch context before operating on tasks.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so 'Read-only; takes no input and changes nothing' mostly restates them. The description still adds real value by disclosing the server-scoped resolution behavior and the exact returned fields (name, absolute root, branch, mode), which annotations do not cover.

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 compact sentences: purpose and return fields first, safety second, usage trigger last. No filler, and the most important information is front-loaded.

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

Completeness5/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's enumeration of the returned values is exactly what an agent needs to decide whether to call it. Combined with annotations covering safety and a zero-parameter schema, nothing material is missing.

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?

With zero parameters the baseline is 4, and the description correctly confirms 'takes no input,' aligning with the empty schema. There is no parameter meaning left to add.

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?

States a specific verb ('Return') and resource ('the resolved project this server is attached to'), then enumerates the returned fields: name, absolute root, git branch and mode. That scope cleanly separates it from the task-oriented siblings such as get_task and list_tasks.

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?

Explicitly says when to call it: 'when you need board location or branch context before operating on tasks.' That gives a clear triggering condition, though it names no alternatives or exclusions for cases where project context is already known.

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

get_taskGet taskA
Read-onlyIdempotent

Get a single task by ID with full details including comments and files. Pass fields (e.g. ["id","title","status"]) for a compact projection instead of the full record. Read-only; changes nothing. Use it when list_tasks gave you an id or you already hold one; use list_tasks to search the board, and claim_next_task to pull the next unit of work.

NameRequiredDescriptionDefault
idYesTask id — a full id, or any unique prefix of one. Get a real id from list_tasks; an id that matches nothing is refused with TASK_NOT_FOUND.
fieldsNoReturn only these task fields (e.g. ["id","title","status"]) instead of the full task with comments and files. Omit for full details.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so 'Read-only; changes nothing' is largely redundant. It does add value beyond structured data by disclosing the payload shape (comments and files are returned by default, and can be suppressed via fields), which matters for response size.

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 tight sentences, front-loaded with what it does, then the projection option, then routing. No filler and nothing buried.

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

Completeness5/5

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

No output schema exists, yet the description conveys the return shape (full task with comments and files, or a compact projection), which is exactly the gap it needs to fill. Parameters are fully covered by the schema, so nothing an agent needs to invoke this correctly is missing.

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% and both parameters are documented with equivalent examples (the fields example is literally identical in schema and description). The description correctly frames the compact-vs-full tradeoff but adds no syntax, format, or edge-case detail the schema lacks.

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?

Specific verb ('Get') plus resource ('a single task by ID') and explicit scope ('full details including comments and files'). It is immediately distinguishable from list_tasks, claim_next_task, and update_task named in the same paragraph.

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

Usage Guidelines5/5

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

States the triggering condition ('when list_tasks gave you an id or you already hold one') and routes to the alternatives by name: list_tasks for board search, claim_next_task for pulling the next unit of work. Both when-to-use and when-not-to-use are covered.

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

list_tasksList tasksA
Read-onlyIdempotent

List tasks with optional filters — the same listing as vibeflow tasks (same filters, same scope, same order). Unfiltered: ROOT tasks only (a child belongs to its parent's card — set children:true to include them). Filtered (status/type/user/tag): an explicit search returning EVERY match, children included. Counts are labelled by scope: totalMatching (every match), totalRoots (matching roots), hiddenChildren (matches omitted by root-only scope), returned (rows in tasks), limit (echoed RESOLVED — 0 is not supported and falls back to the default of 20, named in limitNotice; there is no unbounded mode, page with nextCursor or CLI --all for everything), truncated + hint (present only when the limit cut rows). Position: offset (0-based index of the first returned row), remaining (rows in THIS query's scope NOT in this response — totalRoots-based when root-only, totalMatching-based otherwise, so offset + returned + remaining always equals the scope size; 0 means exhausted), nextCursor (opaque continuation, null exactly when exhausted), order (the effective sort applied, so a continuation is stable). Projected rows (fields) always carry commentCount/fileCount even when the arrays are omitted. Use it to browse or search the board; use get_task when you already hold an id, and claim_next_task when you want the next unit of work claimed rather than just listed.

NameRequiredDescriptionDefault
tagNoEvery listed tag must be present on the task (AND, not OR). Combines with the other filters.
typeNoTask type, matched case-insensitively (a task with no type counts as Task). Combines with the other filters.
userNoAssignee match, trimmed and case-insensitive. Combines with the other filters.
limitNoHow many tasks to return (default 20). 0 is NOT supported and is resolved to the default LOUDLY — the response echoes the resolved limit and names the fallback in `limitNotice` — so never pass 0 meaning "all": there is no unbounded mode. A negative value is refused by input validation before the tool runs. Cost of asking for everything: roughly ~900 tokens per task, so a 500-task board costs ~450k context tokens — keep the default page and continue via offset/remaining/nextCursor (CLI: --all pages for you).
fieldsNoReturn only these task fields per row (e.g. ["id","title","status"]) to save context. Omit for the full task objects. Projected rows ALWAYS carry commentCount/fileCount even when the comments/files arrays are omitted, so a projection never silently hides that discussion or attachments exist.
statusNoExact status match (backlog, todo, in-progress, review, done). Combines with the other filters: every given filter must match.
childrenNoInclude child tasks in an UNFILTERED listing (default false: roots only, matching the board). A filtered query always includes matching children, so this flag only matters when no status/type/user/tag filter is given.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent safety, yet the description goes further with non-obvious behavior: 0-limit falls back to default 20 and is echoed in `limitNotice`, offsets are 0-based, `remaining` is scope-dependent, `nextCursor` is null exactly when exhausted, and the cost of full listing (~900 tokens/task, ~450k for a 500-task board). This is exactly the context annotations cannot express.

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

Conciseness3/5

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

Front-loaded and every clause is informative, but it is a single semicolon-chained wall of text that duplicates schema details (the 0-limit rule and the field projection caveat appear in both). Structure would improve with the response-field semantics broken into a short list rather than one dense paragraph.

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

Completeness5/5

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

There is no output schema, and the description compensates by naming and explaining every response field (totalMatching, totalRoots, hiddenChildren, returned, limit, truncated/hint, offset, remaining, nextCursor, order). An agent can consume the result correctly without guessing.

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 100%, so the baseline would be 3, but the description contributes cross-parameter semantics the schema keeps separate: `children` only matters when no status/type/user/tag filter is given, and `fields` projections never hide commentCount/fileCount. It restates some limit/0-fallback detail already in the schema, hence not a 5.

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?

States a specific verb+resource ('list tasks with optional filters') and immediately gives the distinguishing scope rules: unfiltered = roots only, filtered = every match including children. An agent can tell exactly what this returns without opening the schema, and it is clearly separable from get_task and claim_next_task.

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

Usage Guidelines5/5

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

Explicitly routes: 'Use it to browse or search the board; use get_task when you already hold an id, and claim_next_task when you want the next unit of work claimed rather than just listed.' Also states the when-not for unbounded listing ('there is no unbounded mode, page with nextCursor').

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

pullPull boardA
Idempotent

Pull the online board into the local task store: the inverse of a push. ADDITIVE and never destructive — tasks and files the board holds are added or merged field-by-field into .vibeflow/, local-only data is never dropped, and nothing is ever deleted. On a conflicting field the LOCAL value wins by default, except status, which follows the remote record (the board is truth for workflow state) unless preferLocal restores local-wins for it; pass preferRemote to let the remote value win on every conflicting field instead. A second pull of an unchanged board is a byte-no-op (unchanged tasks are not rewritten, identical files untouched). Pass dryRun to preview the pull without writing anything. Use it to bring a board's tasks and file bytes local after working in another checkout or on the web; use list_tasks to browse without writing, and push to send local work up.

NameRequiredDescriptionDefault
outNoProject root to write into instead of the server's own project (same as the CLI's --out flag). Omit to pull into the current project.
boardNoBoard to pull from. Omit to use the saved board (same rule as the CLI's --board flag).
dryRunNoPreview only: report what WOULD be pulled without writing anything (same as the CLI's --dry-run flag).
preferLocalNoRestore local-wins for `status` (same as the CLI's --prefer-local flag). Default false: status follows the remote record.
preferRemoteNoOn a conflicting field the REMOTE value wins (same as the CLI's --prefer-remote flag). Default false: the local value wins and nothing is ever deleted. `status` always follows the remote record unless preferLocal is set.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations say only that it is non-destructive and idempotent; the description earns its keep by spelling out the merge model (field-by-field, local-only data retained), the conflict-resolution rule with the `status` exception, and that a repeat pull is a byte-no-op. That is exactly the behavioral detail annotations cannot express.

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?

Front-loaded with the core action and the additive guarantee, and each subsequent sentence carries a distinct rule. It runs long as a single dense paragraph, and the nesting of preferLocal/preferRemote/status takes re-reading, costing a point.

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 zero-required-param, no-output-schema tool, the description covers mutation semantics, conflict policy, idempotency and dryRun preview. The remaining gap is what the dryRun report or pull result actually contains, which nothing else documents.

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 100%, so the baseline is 3, but the description adds real semantic value the schema cannot: how preferLocal and preferRemote interact on conflicting fields and that `status` is the exception. It doesn't explain `out` beyond what the schema already says, so not a 5.

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?

States a specific verb and resource ('Pull the online board into the local task store') and immediately frames it as 'the inverse of a push', which anchors it against a sibling. An agent can distinguish it from push and list_tasks without inspecting any schema.

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

Usage Guidelines5/5

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

Explicitly names the situations to use it (after working in another checkout or on the web) and routes the agent to alternatives: list_tasks for browsing without writing, push for sending work up. This is genuine when/when-not guidance, not implied usage.

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

start_kanbanStart kanban serverA
Idempotent

Start the local kanban board server and return the instruction block the CLI prints: the kanban URL, the localhost URL when bound to 0.0.0.0, the agent prompt, and the overlay integration guide. IDEMPOTENT — one server per process; a second call returns the running instance (alreadyRunning:true) instead of fighting for the port. Pass dryRun to report the URLs without binding anything. Call it once before get_integration_guide so the guide carries real URLs; skip it entirely for remote or Docker setups where a localhost server is unreachable.

NameRequiredDescriptionDefault
hostNoBind hostname. Defaults to localhost; use 0.0.0.0 to expose the board on the LAN (the tool then also returns a localhost URL). Ignored when the server is already running.
portNoPort to bind. Defaults to 3700, the same default as the `vibeflow serve` / `vibeflow kanban` commands. Ignored when the server is already running.
dryRunNoPreview only: report the URLs and guide the server WOULD serve, and bind nothing. Never starts a process.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare idempotentHint=true and destructiveHint=false, but the description goes further by explaining the mechanism: one server per process, a second call returns alreadyRunning:true rather than 'fighting for the port.' It also discloses that the server is local, that 0.0.0.0 yields an extra localhost URL, and that host/port are ignored once running — behavioral detail not encoded in any structured field.

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?

Front-loads the core action and return contents, then layers idempotency, dryRun, and routing guidance in descending priority. Slightly dense — the return-field enumeration and the sibling guidance compete for the opening — but nearly every clause carries operational weight.

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

Completeness5/5

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

No output schema exists, and the description compensates by naming exactly what comes back, including the conditional localhost URL and the alreadyRunning flag. For a zero-required-param server-start tool, nothing an agent needs to decide whether to call it is missing.

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 100%, so baseline is 3; the description earns a bump by linking parameters to consequences — dryRun reports URLs 'without binding anything,' and binding 0.0.0.0 changes the return payload. It stops short of adding anything the schema's own per-property descriptions don't already cover for host and port.

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?

States a specific verb and resource ('Start the local kanban board server') and immediately enumerates the four things returned (kanban URL, localhost URL, agent prompt, overlay guide). It also carves out its position relative to siblings by naming get_integration_guide, so an agent can distinguish it without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('Call it once before get_integration_guide so the guide carries real URLs') and explicit when-NOT ('skip it entirely for remote or Docker setups where a localhost server is unreachable'), plus the dryRun escape hatch. That is the full when/when-not/alternative triad.

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

update_taskUpdate taskA

Update an existing task. Supports status changes, title/description updates, adding comments, and changing the task's links (parent/relates/blocks). Pass fields (e.g. ["id","status"]) for a compact answer instead of the full task object; pass dryRun to preview the edit without writing anything, and branch to record the work branch (required on the review transition when the project sets createBranch). REVIEW GATE (same rules as vibeflow tasks --edit, same codes): status "review" REQUIRES comment (refused REVIEW_COMMENT_REQUIRED); an ANNOTATED task (url + selector) additionally REQUIRES a verdict (setVerify pass/fail/cannot — refused VERIFY_REQUIRED); commitMessage is REQUIRED when auto-commit is ON (refused COMMIT_MESSAGE_REQUIRED); a Research task must NOT carry a verdict (refused RESEARCH_VERIFY_NOT_ALLOWED — submit Research with its .md report, no verdict). Pass setVerify to record your verification verdict: "pass" attests the task IS implemented correctly (verified=true, green badge — required for annotated tasks at the review transition, which vibeflow verify never sets itself), "fail" records that it is NOT implemented correctly (verified=false, amber badge, the review gate rejects it), and "cannot" clears the verdict back to absent (no badge) for a task that cannot be assessed here — "cannot" REQUIRES verifyReason, which is recorded in the task's activity. Use it to change a task you already hold; use add_comment to discuss without changing fields, and verify_task to actually RUN visual verification (a verdict here records an assessment, it runs nothing).

LINKS — everything merges, and clearLinks is the only destructive path. links and addLinks both MERGE: a link you do not name is PRESERVED, and re-sending a link that is already there is a no-op, so neither of them can destroy a link by being incomplete. removeLinks removes exactly the taskId+type pairs you name and leaves every other link alone. clearLinks: true is the ONLY way to remove links wholesale — to drop a single link, name that taskId+type in removeLinks rather than editing links. Omitting all four fields leaves links untouched. The CLI's --set-parent/--relates/--blocks/--unrelates/--unblocks behave the same way (each is surgical and preserves every link it does not name), so the CLI and MCP surfaces now agree on link semantics.

NameRequiredDescriptionDefault
idYesTask id — a full id, or any unique prefix of one, of the task to update. An id that matches nothing is refused with TASK_NOT_FOUND and changes nothing.
linksNoADD the listed links without touching the rest (merge, same as the CLI's --relates/--blocks). A pair already present is a no-op. `links: []` is REFUSED — use clearLinks:true to clear. Combining `links` with `addLinks` merges their union once.
titleNoReplacement title. Omit to keep the current one.
branchNoBranch for this task's work. REQUIRED on the review transition when the project sets createBranch (refused BRANCH_REQUIRED); stored as branchName.
dryRunNoPreview only: validate the edit and report what WOULD change without writing the task file.
fieldsNoReturn only these task fields (e.g. ["id","status"]) instead of the full task object — a status flip need not cost a full ticket dump. Omit for the full object.
parentNoSet/replace the parent task link (full id or unique prefix; same as the CLI's --set-parent). Empty string clears the parent (same as --no-parent). Applied after clearLinks/links/addLinks/removeLinks.
statusNoNew status. Moving to review triggers the review gate (comment, and for annotated tasks a verdict, may be required).
commentNoComment to attach (same as the CLI's --comment). REQUIRED when status is "review" — the review transition is refused with REVIEW_COMMENT_REQUIRED without one.
addLinksNoADD links without touching the rest (merge). Same semantics as `links` — sending both merges their union once. Use clearLinks:true to drop the whole set.
setVerifyNoYour verification verdict: "pass" = the task IS implemented correctly (required for an annotated task at review), "fail" = it is NOT (the review gate blocks it), "cannot" = unverifiable here, which REQUIRES verifyReason. Omit to leave any stored verdict untouched.
clearLinksNoRemove EVERY link from the task. Applied BEFORE the merge: clearLinks -> (links + addLinks) -> removeLinks. `true` clears; `false` or absent is a no-op.
descriptionNoReplacement task body. Omit to keep the current one.
removeLinksNoREMOVE the listed links without touching the rest. Applied after clearLinks and after the links/addLinks merge.
verifyReasonNoWhy the task cannot be verified. REQUIRED with setVerify:"cannot", and refused as E_USAGE on its own — a reason belongs to a "cannot" verdict.
commitMessageNoCommit message for the review auto-commit (same as the CLI's --commit-message). REQUIRED when status is "review" and auto-commit is ON (refused with COMMIT_MESSAGE_REQUIRED); ignored when auto-commit is off.

TDQS

A3.9/5.0
Behavior1/5

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

The annotations declare destructiveHint=false, but the description says clearLinks is 'the only destructive path' and that clearLinks removes EVERY link from the task. That is a direct contradiction of the structured safety metadata, so it must be scored 1 despite the otherwise rich detail about gates, error codes, and merge behavior.

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 purpose is front-loaded and the review-gate rules are organized with clear caps and error codes. It is long, but the complexity justifies most of the length; the repeated CLI cross-references are the main trimmable content.

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 16-parameter mutation tool with no output schema and several hard gates, the description covers the critical preconditions, error codes, and interaction rules an agent needs. It is nearly complete, though the destructiveHint contradiction undermines trust in the safety profile.

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 100%, so the baseline is 3. The description adds meaningful cross-parameter semantics: it explains that links/addLinks merge and preserve unnamed links, that clearLinks is the only wholesale removal path, and that clearLinks is applied before the merge sequence. This helps an agent reason about link operations beyond the individual field descriptions.

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?

States a specific verb and resource and enumerates the editable facets (status, title/description, comments, links). It explicitly distinguishes itself from add_comment and verify_task, so an agent can select it without opening sibling schemas.

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

Usage Guidelines5/5

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

Explicitly says when to use this tool versus add_comment (discuss without changing fields) and verify_task (actually run visual verification). It also specifies when dryRun, fields, branch, and the review-gate parameters matter, leaving little to inference.

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

verify_taskVerify taskA

Run visual verification on a task with the Playwright engine: it loads the task's annotated page (url + selector) and compares the live element against the baseline captured at annotation time. MUTATES: every run appends a system comment with the outcome — pass dryRun to resolve the id and preview without launching a browser or writing anything. Pass url to check a different app URL for this run only, and timeoutMs (default 60000, refused VERIFY_TIMEOUT past it) for slow apps. A task with no baseline refuses with E_NO_BASELINE (re-annotate in vibeflow kanban to capture one); an unknown id with E_NOT_FOUND. Use it to check an annotated task before review; use update_task's setVerify to record the human verdict (this tool never sets it).

NameRequiredDescriptionDefault
idYesTask id — a full id, or any unique prefix of one, resolved by the same shared rule every other task tool uses. An id that matches nothing is refused with E_NOT_FOUND (this tool runs the CLI verify engine, which has its own code), and every refusal it returns carries a `suggestion`.
urlNoApp URL to verify against. Overrides the task's stored url for this run only; omit to use the task's own url.
dryRunNoPreview only: resolve the id and report that verification WOULD run, without launching a browser or writing anything.
timeoutMsNoPer-run timeout in milliseconds (1000-300000, default 60000). Exceeding it refuses with VERIFY_TIMEOUT — raise it for slow apps.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false and non-idempotency; the description adds the actual side effect (every run appends a system comment), the dryRun escape hatch for a side-effect-free preview, timeout default and ceiling, and the specific refusal codes E_NO_BASELINE / E_NOT_FOUND / VERIFY_TIMEOUT. That is well beyond what the annotations convey and matches their non-read-only claim.

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?

Front-loaded with the operation, then a clearly flagged "MUTATES:" clause, then per-parameter notes and error codes — no wasted sentences. It is a dense single paragraph, so a reader must parse several compound clauses, but nothing is redundant.

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 mutating tool with no output schema, it covers side effects, preview mode, error codes and parameter overrides. The only gap is the return payload shape of a successful run (what the appended comment/outcome looks like), which the agent must discover by calling it.

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 100%, so the baseline is 3; the description still adds semantics by tying `url` to a run-only override, `timeoutMs` to the VERIFY_TIMEOUT refusal, and `dryRun` to the no-write guarantee. It largely mirrors the schema, hence 4 rather than 5.

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?

States a concrete verb+resource: run visual verification on a task with Playwright, loading the annotated page (url + selector) and comparing the live element against the baseline. It also explicitly contrasts with update_task's setVerify ("this tool never sets it"), so an agent can distinguish it from the neighbouring task tools.

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

Usage Guidelines5/5

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

Gives both when-to-use ("check an annotated task before review") and the alternative for the adjacent job ("use update_task's setVerify to record the human verdict"). It also names a preview path (dryRun) and the precondition failure (no baseline → re-annotate in `vibeflow kanban`).

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. 10 tool updatesv0.22.0
    • Changedadd_comment2 fields changed
      • addedInput schema / properties / author / description
        Added value: +"Comment author. Defaults to agent; the CLI always derives it from git config, so only MCP can override it."
      • addedInput schema / properties / dryRun / description
        Added value: +"Preview only: validate the comment without writing it to the task."
    • Changedattach_file1 field changed
      • addedInput schema / properties / dryRun / description
        Added value: +"Preview only: validate the filename and payload without writing a file."
    • Changedclaim_next_task4 fields changed
      • addedInput schema / properties / dryRun / description
        Added value: +"Preview only: name the task that WOULD be claimed without moving it to in-progress."
      • addedInput schema / properties / tag / description
        Added value: +"Only claim a task carrying every listed tag (AND). Omit for no tag filter."
      • addedInput schema / properties / type / description
        Added value: +"Only claim a task of this type. Omit to claim across all types."
      • addedInput schema / properties / user / description
        Added value: +"Only claim a task assigned to this user (matched against the task author). Omit to claim anyone's work."
    • Changedcreate_task12 fields changed
      • addedInput schema / properties / cssSelector / description
        Added value: +"Alias of selector for clients that prefer the explicit name; both write the same field."
      • addedInput schema / properties / description / description
        Added value: +"Longer task body (what to do, acceptance criteria). Optional; omit when the title says it all."
      • addedInput schema / properties / dryRun / description
        Added value: +"Preview only: validate the input and report what WOULD be created without writing a task file."
      • addedInput schema / properties / parent / description
        Added value: +"Parent task id (full id or unique prefix) to create this task as a child. Omit for a root task; merges with links as one union when both are given."
      • addedInput schema / properties / priority / description
        Added value: +"Priority tier, driving claim order (Critical first). Defaults to Medium."
      • addedInput schema / properties / selector / description
        Added value: +"CSS selector of the annotated element (default \"/\", meaning the whole page). Only meaningful with url."
      • addedInput schema / properties / sortKey / description
        Added value: +"Explicit board ordering key. Omit it — core auto-assigns one — unless you must place the task exactly."
      • addedInput schema / properties / status / description
        Added value: +"Initial status. Defaults to todo; pass another status only to create the task already in motion."
      • addedInput schema / properties / tags / description
        Added value: +"Tags for filtering (list_tasks --tag matches every listed tag). Omit for untagged."
      • addedInput schema / properties / title / description
        Added value: +"Task title — the only required field."
      • addedInput schema / properties / type / description
        Added value: +"Task type. Defaults to Task; use Research for an investigation (it reaches review on its attached .md report, with no verification verdict)."
      • addedInput schema / properties / url / description
        Added value: +"URL the annotation targets. Together with selector this makes the task annotated (overlay-verifiable); omit both for a plain task."
    • Removedexport_prompt
    • Changedget_task1 field changed
      • addedInput schema / properties / fields / description
        Added value: +"Return only these task fields (e.g. [\"id\",\"title\",\"status\"]) instead of the full task with comments and files. Omit for full details."
    • Changedlist_tasks8 fields changed
      • addedInput schema / properties / children / description
        Added value: +"Include child tasks in an UNFILTERED listing (default false: roots only, matching the board). A filtered query always includes matching children, so this flag only matters when no status/type/user/tag filter is given."
      • changedInput schema / properties / fields / description
        Previous value: -"Return only these task fields per row (e.g. [\"id\",\"title\",\"status\"]) to save context. Omit for the full task objects."New value: +"Return only these task fields per row (e.g. [\"id\",\"title\",\"status\"]) to save context. Omit for the full task objects. Projected rows ALWAYS carry commentCount/fileCount even when the comments/files arrays are omitted, so a projection never silently hides that discussion or attachments exist."
      • changedInput schema / properties / limit / default
        Previous value: -5New value: +20
      • changedInput schema / properties / limit / description
        Previous value: -"How many tasks to return. 0 (or less) means no limit. A negative value is refused by input validation before the tool runs."New value: +"How many tasks to return (default 20). 0 is NOT supported and is resolved to the default LOUDLY — the response echoes the resolved limit and names the fallback in `limitNotice` — so never pass 0 meaning \"all\": there is no unbounded mode. A negative value is refused by input validation before the tool runs. Cost of asking for everything: roughly ~900 tokens per task, so a 500-task board costs ~450k context tokens — keep the default page and continue via offset/remaining/nextCursor (CLI: --all pages for you)."
      • addedInput schema / properties / status / description
        Added value: +"Exact status match (backlog, todo, in-progress, review, done). Combines with the other filters: every given filter must match."
      • addedInput schema / properties / tag / description
        Added value: +"Every listed tag must be present on the task (AND, not OR). Combines with the other filters."
      • addedInput schema / properties / type / description
        Added value: +"Task type, matched case-insensitively (a task with no type counts as Task). Combines with the other filters."
      • addedInput schema / properties / user / description
        Added value: +"Assignee match, trimmed and case-insensitive. Combines with the other filters."
    • Addedpull
    • Changedupdate_task5 fields changed
      • addedInput schema / properties / branch / description
        Added value: +"Branch for this task's work. REQUIRED on the review transition when the project sets createBranch (refused BRANCH_REQUIRED); stored as branchName."
      • addedInput schema / properties / description / description
        Added value: +"Replacement task body. Omit to keep the current one."
      • addedInput schema / properties / dryRun / description
        Added value: +"Preview only: validate the edit and report what WOULD change without writing the task file."
      • addedInput schema / properties / status / description
        Added value: +"New status. Moving to review triggers the review gate (comment, and for annotated tasks a verdict, may be required)."
      • addedInput schema / properties / title / description
        Added value: +"Replacement title. Omit to keep the current one."
    • Changedverify_task3 fields changed
      • addedInput schema / properties / dryRun / description
        Added value: +"Preview only: resolve the id and report that verification WOULD run, without launching a browser or writing anything."
      • addedInput schema / properties / timeoutMs / description
        Added value: +"Per-run timeout in milliseconds (1000-300000, default 60000). Exceeding it refuses with VERIFY_TIMEOUT — raise it for slow apps."
      • addedInput schema / properties / url / description
        Added value: +"App URL to verify against. Overrides the task's stored url for this run only; omit to use the task's own url."
  2. 12 tool updatesv0.21.1
    • Changedadd_comment1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedattach_file1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedclaim_next_task1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedcreate_task2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / fields
        Added value: +{
        +  "description": "Return only these task fields (e.g. [\"id\",\"title\",\"status\"]) instead of the full task object. Omit for the full object — same selector list_tasks and get_task take.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedexport_prompt1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_integration_guide1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_project1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_task1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedlist_tasks2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / fields / description
        Added value: +"Return only these task fields per row (e.g. [\"id\",\"title\",\"status\"]) to save context. Omit for the full task objects."
    • Changedstart_kanban1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedupdate_task5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / comment / description
        Added value: +"Comment to attach (same as the CLI's --comment). REQUIRED when status is \"review\" — the review transition is refused with REVIEW_COMMENT_REQUIRED without one."
      • addedInput schema / properties / commitMessage / description
        Added value: +"Commit message for the review auto-commit (same as the CLI's --commit-message). REQUIRED when status is \"review\" and auto-commit is ON (refused with COMMIT_MESSAGE_REQUIRED); ignored when auto-commit is off."
      • addedInput schema / properties / fields
        Added value: +{
        +  "description": "Return only these task fields (e.g. [\"id\",\"status\"]) instead of the full task object — a status flip need not cost a full ticket dump. Omit for the full object.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / parent
        Added value: +{
        +  "description": "Set/replace the parent task link (full id or unique prefix; same as the CLI's --set-parent). Empty string clears the parent (same as --no-parent). Applied after clearLinks/links/addLinks/removeLinks.",
        +  "type": "string"
        +}
    • Changedverify_task1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
  3. 12 tool updatesv0.20.0
    • First observedadd_comment
    • First observedattach_file
    • First observedclaim_next_task
    • First observedcreate_task
    • First observedexport_prompt
    • First observedget_integration_guide
    • First observedget_project
    • First observedget_task
    • First observedlist_tasks
    • First observedstart_kanban
    • First observedupdate_task
    • First observedverify_task

TDQS

A4.2/5.0

Scored across 12 tools

Disambiguation4/5

Most tools target clearly distinct resource+action pairs (get_task vs list_tasks vs claim_next_task, verify_task vs update_task's setVerify) and the descriptions explicitly cross-reference when to pick each. The only soft overlaps are update_task's comment/setVerify fields versus add_comment and verify_task, plus start_kanban versus get_integration_guide, but each description states the boundary, so misselection risk is low.

Naming Consistency4/5

Eleven of twelve names follow a clean snake_case verb_noun or verb_noun_modifier convention (get_task, list_tasks, create_task, update_task, claim_next_task, verify_task, attach_file, add_comment, start_kanban, get_integration_guide, get_project). The sole deviation is the bare verb `pull`, which lacks the noun needed for a fully predictable pattern.

Tool Count4/5

Twelve tools is well within a healthy range for a task/kanban server that also does file attachment, verification, and board sync. Each tool maps to a real workflow step, though the start_kanban/get_integration_guide pair is one-off setup material that slightly dilutes an otherwise tight task-operation core.

Completeness4/5

Core lifecycle is covered: create, read (single and list), update with rich link/status semantics, comments, and attachments, plus claiming, verification, and pull sync. The notable gaps are the absence of any delete/archive operation and the fact that verification baseline capture is a dead end in MCP (E_NO_BASELINE defers to re-annotating via the `vibeflow kanban` CLI), both of which are workable but not self-contained.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers