Vibeflow
Manage a local-first Vibeflow task board for AI coding agents over MCP — inspect and mutate tasks, claim work, verify visually, and start the Kanban/overlay server.
List and filter tasks (root vs children, status, type, user, tags, field selection, limits) and fetch full task details with comments/files.
Create and update tasks, including status, priority, description, parent/link relationships, comments, and review-gate metadata.
Claim the highest-priority root todo task as in-progress; an empty board returns null as a successful result.
Add comments and attach files, including .md reports that satisfy the Research report gate.
Export tasks or the whole board as markdown or JSON prompts for LLM consumption.
Run visual verification for annotated tasks and record pass/fail/cannot verdicts.
Inspect the resolved project (root, branch, mode).
Start the local Kanban server idempotently and retrieve overlay/bookmarklet integration instructions.
Integrates with Git repositories: reads the current Git branch for project context and links code changes back to tasks via [proto:task-id] in commit messages, with task updates supporting branch and commit message fields.
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 kanbanWhy 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 |
| Start the server and open the live Kanban board in your browser |
| Serve HTML files with live annotation overlay, or run API-only task server for existing apps |
| List, filter, create, edit, and comment on tasks |
| 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 projectThe 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 appServe 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 taskslists 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--childrento include them.vibeflow tasks --nextclaims only a root whose own status istodo, 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 shortcutBecause --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 inNo 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:tasksemitslist/get/add/edit/next/reindex,serveemitsapi(API-only task server) orprototype(an HTML target was given)from_status/to_status— ontasks --editonly: the task's status before and after the edit, drawn frombacklog | 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+Ato toggle annotation modeCSP-safe injection — bookmarklet bypasses
script-srcrestrictions
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 --nextOverlay — embed the bookmarklet or script into your app, click any element to annotate
Kanban — open the board to see all tasks at a glance, create new ones directly
Tasks —
vibeflow tasks --nextclaims the highest-priority root task in todo, and returns it with its children — the whole unit of work, with full context for your agentIterate — 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 with optional filters (root tasks only unless |
| One task by ID, with comments and files |
| The resolved project this server is attached to — root, branch, mode |
| Create a task, optionally annotated with a URL and selector |
| Edit a task: status, title, links, and the verification verdict |
| Claim the highest-priority root task in |
| Comment on a task |
| Attach a file (base64); a |
| Run visual verification for an annotated task |
| Start the local Kanban board server and return its URLs |
| 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 boardGET/POST /api/tasks— list and create tasksGET/PATCH/DELETE /api/tasks/:id— manage individual tasksGET/POST /api/tasks/:id/comments— task commentsGET/POST/DELETE /api/tasks/:id/files— file attachmentsPOST /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/cliOr run without installing:
npx @vibeflow-tools/cli kanbanRequirements: Node.js >= 22
Contributing
pnpm install # install dependencies
pnpm build:cli # build CLI
pnpm test # unit tests
pnpm test:e2e # end-to-end testsLicense
Apache-2.0 — see NOTICE for third-party attributions.
Available Tools
12 toolsadd_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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Task 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. | |
| author | No | Comment author. Defaults to agent; the CLI always derives it from git config, so only MCP can override it. | agent |
| dryRun | No | Preview only: validate the comment without writing it to the task. | |
| comment | Yes | The 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Task 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. | |
| dryRun | No | Preview only: validate the filename and payload without writing a file. | |
| filename | Yes | Bare 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. | |
| contentB64 | Yes | The 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Only claim a task carrying every listed tag (AND). Omit for no tag filter. | |
| type | No | Only claim a task of this type. Omit to claim across all types. | |
| user | No | Only claim a task assigned to this user (matched against the task author). Omit to claim anyone's work. | |
| dryRun | No | Preview only: name the task that WOULD be claimed without moving it to in-progress. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL the annotation targets. Together with selector this makes the task annotated (overlay-verifiable); omit both for a plain task. | |
| tags | No | Tags for filtering (list_tasks --tag matches every listed tag). Omit for untagged. | |
| type | No | Task type. Defaults to Task; use Research for an investigation (it reaches review on its attached .md report, with no verification verdict). | Task |
| links | No | ADD 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. | |
| title | Yes | Task title — the only required field. | |
| dryRun | No | Preview only: validate the input and report what WOULD be created without writing a task file. | |
| fields | No | 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. | |
| parent | No | 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. | |
| status | No | Initial status. Defaults to todo; pass another status only to create the task already in motion. | todo |
| sortKey | No | Explicit board ordering key. Omit it — core auto-assigns one — unless you must place the task exactly. | |
| priority | No | Priority tier, driving claim order (Critical first). Defaults to Medium. | Medium |
| selector | No | CSS selector of the annotated element (default "/", meaning the whole page). Only meaningful with url. | / |
| cssSelector | No | Alias of selector for clients that prefer the explicit name; both write the same field. | |
| description | No | Longer task body (what to do, acceptance criteria). Optional; omit when the title says it all. |
TDQS
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.
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.
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.
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.
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.
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 guideARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 projectARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 taskARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Task 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. | |
| fields | No | Return only these task fields (e.g. ["id","title","status"]) instead of the full task with comments and files. Omit for full details. |
TDQS
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.
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.
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.
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.
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.
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 tasksARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Every listed tag must be present on the task (AND, not OR). Combines with the other filters. | |
| type | No | Task type, matched case-insensitively (a task with no type counts as Task). Combines with the other filters. | |
| user | No | Assignee match, trimmed and case-insensitive. Combines with the other filters. | |
| limit | No | 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). | |
| fields | No | 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. | |
| status | No | Exact status match (backlog, todo, in-progress, review, done). Combines with the other filters: every given filter must match. | |
| children | No | 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. |
TDQS
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.
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.
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.
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.
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.
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 boardAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | Project 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. | |
| board | No | Board to pull from. Omit to use the saved board (same rule as the CLI's --board flag). | |
| dryRun | No | Preview only: report what WOULD be pulled without writing anything (same as the CLI's --dry-run flag). | |
| preferLocal | No | Restore local-wins for `status` (same as the CLI's --prefer-local flag). Default false: status follows the remote record. | |
| preferRemote | No | On 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
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.
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.
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.
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.
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.
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 serverAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Bind 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. | |
| port | No | Port to bind. Defaults to 3700, the same default as the `vibeflow serve` / `vibeflow kanban` commands. Ignored when the server is already running. | |
| dryRun | No | Preview only: report the URLs and guide the server WOULD serve, and bind nothing. Never starts a process. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Task 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. | |
| links | No | ADD 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. | |
| title | No | Replacement title. Omit to keep the current one. | |
| branch | No | Branch for this task's work. REQUIRED on the review transition when the project sets createBranch (refused BRANCH_REQUIRED); stored as branchName. | |
| dryRun | No | Preview only: validate the edit and report what WOULD change without writing the task file. | |
| fields | No | 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. | |
| parent | No | 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. | |
| status | No | New status. Moving to review triggers the review gate (comment, and for annotated tasks a verdict, may be required). | |
| comment | No | 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. | |
| addLinks | No | ADD links without touching the rest (merge). Same semantics as `links` — sending both merges their union once. Use clearLinks:true to drop the whole set. | |
| setVerify | No | Your 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. | |
| clearLinks | No | Remove EVERY link from the task. Applied BEFORE the merge: clearLinks -> (links + addLinks) -> removeLinks. `true` clears; `false` or absent is a no-op. | |
| description | No | Replacement task body. Omit to keep the current one. | |
| removeLinks | No | REMOVE the listed links without touching the rest. Applied after clearLinks and after the links/addLinks merge. | |
| verifyReason | No | Why the task cannot be verified. REQUIRED with setVerify:"cannot", and refused as E_USAGE on its own — a reason belongs to a "cannot" verdict. | |
| commitMessage | No | 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. |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Task 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`. | |
| url | No | App URL to verify against. Overrides the task's stored url for this run only; omit to use the task's own url. | |
| dryRun | No | Preview only: resolve the id and report that verification WOULD run, without launching a browser or writing anything. | |
| timeoutMs | No | Per-run timeout in milliseconds (1000-300000, default 60000). Exceeding it refuses with VERIFY_TIMEOUT — raise it for slow apps. |
TDQS
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.
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.
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.
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.
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.
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.
10 tool updates
v0.22.0- Changed
add_comment2 fields changed- added
Input schema / properties / author / descriptionAdded value: +"Comment author. Defaults to agent; the CLI always derives it from git config, so only MCP can override it." - added
Input schema / properties / dryRun / descriptionAdded value: +"Preview only: validate the comment without writing it to the task."
- Changed
attach_file1 field changed- added
Input schema / properties / dryRun / descriptionAdded value: +"Preview only: validate the filename and payload without writing a file."
- Changed
claim_next_task4 fields changed- added
Input schema / properties / dryRun / descriptionAdded value: +"Preview only: name the task that WOULD be claimed without moving it to in-progress." - added
Input schema / properties / tag / descriptionAdded value: +"Only claim a task carrying every listed tag (AND). Omit for no tag filter." - added
Input schema / properties / type / descriptionAdded value: +"Only claim a task of this type. Omit to claim across all types." - added
Input schema / properties / user / descriptionAdded value: +"Only claim a task assigned to this user (matched against the task author). Omit to claim anyone's work."
- Changed
create_task12 fields changed- added
Input schema / properties / cssSelector / descriptionAdded value: +"Alias of selector for clients that prefer the explicit name; both write the same field." - added
Input schema / properties / description / descriptionAdded value: +"Longer task body (what to do, acceptance criteria). Optional; omit when the title says it all." - added
Input schema / properties / dryRun / descriptionAdded value: +"Preview only: validate the input and report what WOULD be created without writing a task file." - added
Input schema / properties / parent / descriptionAdded 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." - added
Input schema / properties / priority / descriptionAdded value: +"Priority tier, driving claim order (Critical first). Defaults to Medium." - added
Input schema / properties / selector / descriptionAdded value: +"CSS selector of the annotated element (default \"/\", meaning the whole page). Only meaningful with url." - added
Input schema / properties / sortKey / descriptionAdded value: +"Explicit board ordering key. Omit it — core auto-assigns one — unless you must place the task exactly." - added
Input schema / properties / status / descriptionAdded value: +"Initial status. Defaults to todo; pass another status only to create the task already in motion." - added
Input schema / properties / tags / descriptionAdded value: +"Tags for filtering (list_tasks --tag matches every listed tag). Omit for untagged." - added
Input schema / properties / title / descriptionAdded value: +"Task title — the only required field." - added
Input schema / properties / type / descriptionAdded value: +"Task type. Defaults to Task; use Research for an investigation (it reaches review on its attached .md report, with no verification verdict)." - added
Input schema / properties / url / descriptionAdded value: +"URL the annotation targets. Together with selector this makes the task annotated (overlay-verifiable); omit both for a plain task."
- Removed
export_prompt - Changed
get_task1 field changed- added
Input schema / properties / fields / descriptionAdded value: +"Return only these task fields (e.g. [\"id\",\"title\",\"status\"]) instead of the full task with comments and files. Omit for full details."
- Changed
list_tasks8 fields changed- added
Input schema / properties / children / descriptionAdded 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." - changed
Input schema / properties / fields / descriptionPrevious 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." - changed
Input schema / properties / limit / defaultPrevious value: -5New value: +20 - changed
Input schema / properties / limit / descriptionPrevious 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)." - added
Input schema / properties / status / descriptionAdded value: +"Exact status match (backlog, todo, in-progress, review, done). Combines with the other filters: every given filter must match." - added
Input schema / properties / tag / descriptionAdded value: +"Every listed tag must be present on the task (AND, not OR). Combines with the other filters." - added
Input schema / properties / type / descriptionAdded value: +"Task type, matched case-insensitively (a task with no type counts as Task). Combines with the other filters." - added
Input schema / properties / user / descriptionAdded value: +"Assignee match, trimmed and case-insensitive. Combines with the other filters."
- Added
pull - Changed
update_task5 fields changed- added
Input schema / properties / branch / descriptionAdded value: +"Branch for this task's work. REQUIRED on the review transition when the project sets createBranch (refused BRANCH_REQUIRED); stored as branchName." - added
Input schema / properties / description / descriptionAdded value: +"Replacement task body. Omit to keep the current one." - added
Input schema / properties / dryRun / descriptionAdded value: +"Preview only: validate the edit and report what WOULD change without writing the task file." - added
Input schema / properties / status / descriptionAdded value: +"New status. Moving to review triggers the review gate (comment, and for annotated tasks a verdict, may be required)." - added
Input schema / properties / title / descriptionAdded value: +"Replacement title. Omit to keep the current one."
- Changed
verify_task3 fields changed- added
Input schema / properties / dryRun / descriptionAdded value: +"Preview only: resolve the id and report that verification WOULD run, without launching a browser or writing anything." - added
Input schema / properties / timeoutMs / descriptionAdded value: +"Per-run timeout in milliseconds (1000-300000, default 60000). Exceeding it refuses with VERIFY_TIMEOUT — raise it for slow apps." - added
Input schema / properties / url / descriptionAdded value: +"App URL to verify against. Overrides the task's stored url for this run only; omit to use the task's own url."
12 tool updates
v0.21.1- Changed
add_comment1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
attach_file1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
claim_next_task1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
create_task2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / fieldsAdded 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" +}
- Changed
export_prompt1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_integration_guide1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_project1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
get_task1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
list_tasks2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / fields / descriptionAdded value: +"Return only these task fields per row (e.g. [\"id\",\"title\",\"status\"]) to save context. Omit for the full task objects."
- Changed
start_kanban1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Changed
update_task5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / comment / descriptionAdded 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." - added
Input schema / properties / commitMessage / descriptionAdded 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." - added
Input schema / properties / fieldsAdded 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" +} - added
Input schema / properties / parentAdded 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" +}
- Changed
verify_task1 field changed- added
Input schema / additionalPropertiesAdded value: +false
12 tool updates
v0.20.0- First observed
add_comment - First observed
attach_file - First observed
claim_next_task - First observed
create_task - First observed
export_prompt - First observed
get_integration_guide - First observed
get_project - First observed
get_task - First observed
list_tasks - First observed
start_kanban - First observed
update_task - First observed
verify_task
TDQS
Scored across 12 tools
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.
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.
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.
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
Related MCP Connectors
Task & board management for AI agents + humans. Kanban, comments, digests via MCP.
Kanban board for teams and coding agents: manage tasks, subtasks, sprints and wiki pages via MCP.
AI-native Kanban board — connect Claude to claim, work and move your tasks over MCP.
Remote MCP for Kanban AI boards—manage projects, tasks, and comments from AI tools.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA local-first Kanban board for AI agents that enables ticket management via MCP tools, with a real-time web UI.8 npm4MIT
- AlicenseAqualityCmaintenanceA kanban board system served over MCP that lets coding agents manage shared work pipelines with enforced state transitions, work reports, and audit trails.37AGPL 3.0
- FlicenseNot gradedqualityDmaintenanceA local-first Kanban system with MCP tools for AI agents to manage tickets, features, and tasks, paired with a React UI for human users.-
- AlicenseNot gradedqualityBmaintenanceA local kanban board and docs tool that AI agents can drive over MCP. It enables project management without accounts or API keys.MIT