Kanban-style task manager with table and drag-and-drop board views
Server has 8 tools with mostly complete schemas and descriptions. Naming follows verb_noun convention (create_board_task, find_board_task, move_task, etc.). Descriptions are detailed and context-aware, averaging ~150 chars, well above the 10-char minimum. All parameters have type definitions and descriptions. However, several tools lack enum constraints for constrained inputs (priority, column, status), and error handling is minimal, most tools return dict responses without actionable recovery guidance. Output schemas are not formally documented. The server demonstrates good composition (board-scoped tools, batch operations) but falls short of A-grade polish in validation and error messaging.
Archive a single task by flipping its status to 'archived'. Archived tasks are filtered out of the active board view. Use this instead of update_task when the intent is to archive — update_task cannot write status (it's an Upjack base-entity field).
Archive all completed tasks on a board that have been done for more than N days. Keeps boards clean by moving old finished work to archived status.
Get an aggregate view of a board: per-column task counts, WIP status, overdue tasks, and stalled tasks (unchanged for >3 days). Read-only, no side effects.
Create a task on a specific board. ALWAYS use this instead of create_task — it auto-links the task to the board so it appears in the UI. Pass the board ID from visible state (selectedBoard.id). The column defaults to the board's default column if not specified.
Find tasks on a specific board by title. ALWAYS use this instead of search_tasks when the user is viewing a board — pass the board ID from the visible state (selectedBoard.id). Only fall back to search_tasks if this returns no matches.
Missing enum constraints for constrained inputs. 'priority' in create_board_task accepts free-form string instead of enum [low, medium, high, urgent]. 'column' and 'status' fields similarly lack enums, inviting hallucinated values.
Output schemas not formally documented. Tools return dict responses (e.g., set_custom_instructions returns {status, error}) but no schema definition visible in code. LLMs cannot reliably parse or chain results.
Error handling lacks recovery guidance. set_custom_instructions returns {status: error, error: str(err)} but does not tell the LLM what to do next or how to self-correct. No categorization of retryable vs fatal errors.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Move a task to a different column on its board. Validates the column exists, checks WIP limits (warns but doesn't block), and auto-sets completed_at when moving to done/complete/closed columns. Use instead of raw task update for column moves.
Batch-update positions of all tasks within a column after a drag-and-drop reorder. Pass task IDs in desired order; each gets position = its array index.
Save custom instructions for this Todo Board. Use sparingly — only when the user explicitly asks to save a convention (e.g. "always triage with the priority matrix" or "default new tasks to medium priority"). Empty text clears the instruction. Capped at 8 KiB. The saved text is surfaced to the agent on every conversation turn via NimbleBrain's `app://instructions` contract, so the agent picks up the convention without you having to repeat it.
Parameter 'older_than_days' in batch_archive lacks bounds. No min/max specified; LLM could pass negative or absurdly large values. Should constrain to 1 - 365.
Tool descriptions reference UI state (selectedBoard.id) but do not explain fallback behavior if state is unavailable. Agents may fail silently if board context is missing.