25 KiB
MCP-Tasks Story and Task Management
This skill provides guidance on using the mcp-tasks MCP server for task and story management.
Overview
The mcp-tasks MCP server provides:
- Tools: For managing tasks (create, update, select, complete, delete)
- Prompts: Workflow templates for executing tasks and stories
- Resources: Category instructions and execution state
MCP Tools
Task Query and Modification
| Tool | Purpose | Key Parameters |
|---|---|---|
select-tasks |
Query tasks with filtering | task-id, parent-id, category, type, status, title-pattern, limit, unique |
add-task |
Create new task | Required: category, title. Optional: description, parent-id, type, prepend |
update-task |
Update task fields | Required: task-id. Optional: title, description, design, category, type, status, parent-id, meta, relations |
complete-task |
Mark complete and archive | Identify by task-id or title. Optional: completion-comment |
delete-task |
Delete task | Identify by task-id or title-pattern. Cannot delete with non-closed children |
Task Environment Setup
work-on - Prepares task execution environment (called automatically by execute prompts)
- Required:
task-id - Actions: Records execution state, manages branches/worktrees (if configured)
- Returns: Task info (
:task-id,:category,:type,:title,:status), environment info (:worktree-path,:worktree-name,:branch-name,:worktree-clean?,:worktree-created?), state file path
Available Activities
Each activity can be invoked via slash command or by programmatically accessing the MCP resource using ReadMcpResourceTool.
Task Activities
Execute task by criteria
- Slash command:
/mcp-tasks:execute-task [selection-criteria...] - Arguments:
category=X,parent-id=N,type=X(combinable) - MCP resource:
prompt://execute-task - Implementation: Use slash command OR read resource and follow prompt instructions
Execute next task for category
- Slash command:
/mcp-tasks:next-<category> - Arguments: None
- MCP resource:
prompt://next-<category> - Implementation: Use slash command OR read resource and follow prompt instructions
Refine task
- Slash command:
/mcp-tasks:refine-task [task-spec] [context...] - Arguments: Task ID ("#59", "59", "task 59") or pattern ("Update prompt")
- MCP resource:
prompt://refine-task - Implementation: Use slash command OR read resource and follow prompt instructions
Story Activities
Create story tasks
- Slash command:
/mcp-tasks:create-story-tasks [story-spec] [context...] - Arguments: Story ID ("#59", "59", "story 59") or pattern ("Story title")
- MCP resource:
prompt://create-story-tasks - Implementation: Use slash command OR read resource and follow prompt instructions
Execute story task
- Slash command:
/mcp-tasks:execute-story-child [story-spec] [context...] - Arguments: Same as create-story-tasks
- MCP resource:
prompt://execute-story-child - Implementation: Use slash command OR read resource and follow prompt instructions
Create story PR
- Slash command:
/mcp-tasks:create-story-pr [story-spec] - Arguments: Same as create-story-tasks
- MCP resource:
prompt://create-story-pr - Implementation: Use slash command OR read resource and follow prompt instructions
Review story implementation
- Slash command:
/mcp-tasks:review-story-implementation [story-spec] - Arguments: Same as create-story-tasks
- MCP resource:
prompt://review-story-implementation - Implementation: Use slash command OR read resource and follow prompt instructions
Complete story
- Slash command:
/mcp-tasks:complete-story [story-spec] - Arguments: Same as create-story-tasks
- MCP resource:
prompt://complete-story - Implementation: Use slash command OR read resource and follow prompt instructions
Story Shared Context
Stories maintain a shared context (:shared-context field) that
enables inter-task communication during story execution. This allows
child tasks to coordinate by reading context from previous tasks and
appending discoveries, decisions, and important information for
subsequent tasks.
How It Works:
- Reading Context: Child tasks access parent story's shared context via
:parent-shared-contextfield returned byselect-tasks - Writing Context: Tasks append to parent story's shared context using
update-taskwith the story's task ID - Automatic Prefixing: System reads current task ID from execution state (
.mcp-tasks-current.edn) and automatically prefixes each entry with "Task NNN: " - Persistence: Context persists with story throughout execution and is archived when story completes
Context Precedence Rule:
Shared context takes precedence over a task's static :description and
:design fields when conflicts exist or new information emerges. This
ensures tasks work with the most current state.
When to Update Shared Context:
Update during execution when you:
- Make architectural or design decisions
- Discover important information (API endpoints, configuration, constraints)
- Find edge cases or issues
- Implement features that subsequent tasks depend on
- Choose between alternatives that affect later work
The system automatically prefixes your update with "Task NNN:" where NNN is the current task ID. Multiple updates accumulate with newest first.
Key Points:
- Append Only: New entries are appended to existing context (not replaced)
- Chronological Order: Entries maintain order with task ID prefix showing sequence
- Size Limit: 50KB total serialized EDN (enforced by
update-task) - Story Scope: Context shared only among story and its children (not across stories)
- Security: Don't store sensitive data - context appears in task files and may appear in PRs
Other Resources
Category instructions:
prompt://category-<category>- Execution instructions for specific category (e.g.,prompt://category-simple)
Execution state:
resource://current-execution- Current execution state (story-id,task-id,started-at)
Accessing MCP Resources Programmatically
;; Example: Access execute-task prompt
(ReadMcpResourceTool
:server "mcp-tasks"
:uri "prompt://execute-task")
Common workflow: All execution activities follow: Find task → Call work-on → Execute category workflow → Mark complete
Common Workflows
Execute simple task:
/mcp-tasks:next-simple
Story workflow:
/mcp-tasks:create-story-tasks 59 # Break into tasks
/mcp-tasks:execute-story-child 59 # Execute (repeat for each task)
/mcp-tasks:review-story-implementation 59
/mcp-tasks:complete-story 59
Refine then execute:
/mcp-tasks:refine-task 123
/mcp-tasks:execute-task task-id=123
Complete Task Lifecycle Walkthrough
Prerequisites
- mcp-tasks MCP server configured and running
- Project initialized with
.mcp-tasks/directory - Optional:
:worktree-management?enabled in.mcp-tasks.edn - Optional:
:base-branchconfigured for branch management
This section covers two workflows: Standalone Tasks and Story-Based Workflows.
Workflow A: Standalone Task
Example: Executing standalone task #123 "Add user authentication" (category: medium).
1. Refine Task (Optional - Skip for Simple/Clear Tasks)
/mcp-tasks:refine-task 123
What happens:
- Agent analyzes task in project context
- Reviews design patterns and codebase
- Suggests improvements interactively
- Updates task with
update-tasktool - Sets
meta: {"refined": "true"}
When to skip: Simple tasks with clear requirements need no refinement.
2. Execute Task
/mcp-tasks:execute-task task-id=123
Behind the scenes - work-on tool (automatic):
The execute prompt calls work-on which:
- Writes execution state to
.mcp-tasks-current.edn - Creates/switches to worktree (if
:worktree-management?enabled) - Creates/switches to branch
123-add-user-authentication(if branch management configured)
See work-on Tool Reference for complete return value specification.
Agent displays working environment:
Worktree: project-123-add-user-authentication
Directory: /Users/user/project-123-add-user-authentication
Branch: 123-add-user-authentication
Category workflow execution (medium):
- Analyze - Agent reviews task spec, researches patterns
- Check understanding - Agent confirms understanding with user
- Plan - Agent creates implementation plan
- Implement - Agent writes code
- Commit - Agent creates git commit in main repository
3. Complete Task
After successful implementation, the agent calls:
(complete-task :task-id 123 :completion-comment "Implemented JWT auth")
What happens:
- Task status changed to
:closed - Task moved from
tasks.ednltocomplete.ednl - Execution state cleared from
.mcp-tasks-current.edn - Automatic worktree cleanup (if
:worktree-management?enabled) - see Worktree Cleanup Mechanism
Configuration Impact
| Feature | Enabled | Disabled |
|---|---|---|
| Worktree Management | Creates sibling directory worktree, auto-cleanup on completion | Works in current directory |
| Branch Management | Creates <id>-<title-slug> branch automatically |
Uses current branch |
See Git Integration for naming conventions and Error Recovery for failure handling.
Workflow B: Story-Based Workflow
Example: Story #408 "Improve mcp-tasks skill" with multiple child tasks.
1. Refine Story (Optional but Recommended)
/mcp-tasks:refine-task 408
What happens:
- Agent analyzes story in project context
- Suggests improvements to requirements
- Updates story with
update-tasktool - Sets
meta: {"refined": "true"}
Note: The create-story-tasks prompt will halt and require explicit user confirmation to proceed if story is unrefined. Agents must never proceed automatically.
2. Create Story Tasks
/mcp-tasks:create-story-tasks 408
What happens:
- Retrieves story using
select-tasks(type: story) - Checks refinement status, warns if not refined
- Displays story content to user
- Analyzes and breaks down into specific tasks
- Presents task breakdown for user approval
- Adds each task using
add-taskwith:parent-id: Story ID (408)category: Appropriate category per tasktype: Usually:task,:feature, or:bug
Example tasks created:
Task #410: Add walkthrough section (category: medium, parent-id: 408)
Task #411: Document git integration (category: medium, parent-id: 408)
Task #412: Add error recovery section (category: simple, parent-id: 408)
3. Execute Story Tasks (Repeat for Each Task)
/mcp-tasks:execute-story-child 408
What happens:
- Finds story and first incomplete child task
- Shows progress: "2 of 5 tasks completed"
- Calls
work-ontool with task ID - For first task only (if worktree/branch management enabled):
- Creates worktree:
project-408-improve-mcp-tasks-skill/ - Creates branch:
408-improve-mcp-tasks-skill - All story tasks use same worktree/branch
- Creates worktree:
- Executes task using its category workflow
- Creates git commit
- Marks task complete with
complete-task - Preserves worktree for remaining story tasks
Repeat until all story tasks complete.
4. Create Pull Request (Optional)
/mcp-tasks:create-story-pr 408
What happens:
- Finds story using
select-tasks - Verifies current branch (must not be master/main)
- Collects commits from story branch
- Generates PR content:
- Title: Story title (with optional semantic prefix)
- Description: Story details + commit summary
- Creates PR targeting default branch
- Returns PR URL
Prerequisites:
- Must be on story branch
- Remote repository configured
ghCLI or similar tool available
5. Complete Story (After PR Merged)
/mcp-tasks:complete-story 408
What happens:
- Requires user confirmation before archiving. Never complete a story without explicit user approval.
- Moves story and all child tasks to archive
- Preserves implementation history
Worktree cleanup: After PR is merged, manually remove worktree:
git worktree remove /path/to/project-408-improve-mcp-tasks-skill
Or if automatic cleanup enabled, it happens on last task completion.
work-on Tool Reference
Invocation Rules
| Context | Invocation | Who Calls |
|---|---|---|
| Execute prompts | Automatic | Execute prompt calls work-on before category workflow |
| Manual setup | Manual | User calls work-on directly via tool |
| Typical use | Automatic | Most users never call work-on directly |
When to call manually:
- Custom workflows outside standard execute prompts
- Debugging execution state issues
- Setting up environment without executing task
When Agents Should Call work-on Directly
Agents must call the work-on tool explicitly when the user instructs them to work on a specific task or story:
User instruction patterns requiring explicit work-on call:
- "Work on task 123"
- "Start working on task 123"
- "Work on story 59"
- "Begin task 123"
- Similar direct instructions to start working on a specific task/story
Process:
- Parse user instruction to identify task/story ID
- Call
mcp__mcp-tasks__work-onwith the task ID - Display working environment context (worktree, branch if present)
- Proceed with task execution according to the category workflow
Contrast with execute prompts:
- Execute prompts (e.g.,
/mcp-tasks:execute-story-child) callwork-onautomatically - When user gives direct instruction to work on a task, agent must call
work-onbefore proceeding
Return Value Specification
work-on returns a map with task and environment information:
| Field | Type | Always Present | Description |
|---|---|---|---|
:task-id |
int | Yes | Task ID being worked on |
:category |
string | Yes | Task category |
:type |
keyword | Yes | Task type (:task, :bug, :feature, :story, :chore) |
:title |
string | Yes | Task title |
:status |
keyword | Yes | Task status (:open, :in-progress, :blocked, :closed) |
:message |
string | Yes | Status message about operation |
:execution-state-file |
string | Yes | Path to .mcp-tasks-current.edn |
:worktree-path |
string | Conditional | Full path to worktree (only if in worktree) |
:worktree-name |
string | Conditional | Worktree directory name (only if :worktree-path present) |
:branch-name |
string | Conditional | Current branch name (only if branch management active) |
:worktree-clean? |
boolean | Conditional | No uncommitted changes (only if in worktree) |
:worktree-created? |
boolean | Conditional | New worktree created vs reused (only if in worktree) |
Example response (with worktree management enabled):
{:task-id 123
:category "medium"
:type :task
:title "Add user authentication"
:status :open
:message "Task validated successfully and execution state written"
:worktree-path "/Users/user/project-123-add-user-authentication"
:worktree-name "project-123-add-user-authentication"
:branch-name "123-add-user-authentication"
:worktree-clean? true
:worktree-created? true
:execution-state-file "/Users/user/project-123-add-user-authentication/.mcp-tasks-current.edn"}
Example response (worktree management disabled):
{:task-id 123
:category "medium"
:type :task
:title "Add user authentication"
:status :open
:message "Task validated successfully and execution state written"
:execution-state-file ".mcp-tasks-current.edn"}
Git Integration
Branch Naming Convention
Format: <id>-<title-slug>
Slugification process:
- Extract first N words from title (default: 4, configurable via
:branch-title-words) - Convert to lowercase
- Replace spaces with dashes
- Remove all special characters (keep only a-z, 0-9, -)
Examples:
| Task ID | Title | :branch-title-words |
Branch Name |
|---|---|---|---|
| 123 | "Implement user authentication with OAuth" | 4 (default) | 123-implement-user-authentication-with |
| 123 | "Implement user authentication with OAuth" | 2 | 123-implement-user |
| 123 | "Implement user authentication with OAuth" | nil | 123-implement-user-authentication-with-oauth |
| 59 | "Add JWT support" | 4 | 59-add-jwt-support |
| 408 | "Improve mcp-tasks skill" | 4 | 408-improve-mcp-tasks-skill |
Worktree Naming Convention
Format: Depends on :worktree-prefix configuration
:worktree-prefix |
Format | Example |
|---|---|---|
:project-name |
<project>-<id>-<title-slug> |
mcp-tasks-123-implement-user-authentication-with |
:none |
<id>-<title-slug> |
123-implement-user-authentication-with |
Title slug: Same process as branch naming (first N words, slugified)
Location: Sibling directory to main repository
/Users/user/project/ # Main repo
/Users/user/project-123-add-auth/ # Worktree (with :project-name prefix)
/Users/user/123-add-auth/ # Worktree (with :none prefix)
Commit Timing and Location
When commits occur:
- During category workflow execution (varies by category)
- Simple: After implementation complete
- Medium: After implementation complete
- Large: After each significant milestone + final implementation
Where commits occur:
- Always in the main repository (
.gitdirectory location) - Even when working in a worktree, commits are recorded in main repo
- Worktrees share the same commit history
Who creates commits:
- The agent executing the category workflow
- Follows category-specific commit instructions
- Uses git operations in current working directory
Task/Branch/Worktree Relationships
Story Task #408 "Improve mcp-tasks skill"
├─ Branch: 408-improve-mcp-tasks-skill
├─ Worktree: /path/to/project-408-improve-mcp-tasks-skill/
│
├─ Child Task #410 (category: medium)
│ └─ Uses same branch + worktree as parent story
│
├─ Child Task #411 (category: medium)
│ └─ Uses same branch + worktree as parent story
│
└─ Child Task #412 (category: simple)
└─ Uses same branch + worktree as parent story
Standalone Task #123 "Add authentication"
├─ Branch: 123-add-authentication
└─ Worktree: /path/to/project-123-add-authentication/
Rules:
- Story tasks share parent story's branch and worktree
- Standalone tasks get unique branch and worktree
- One worktree per task/story (not per child task)
- All commits for story tasks go to story branch
Worktree Cleanup Mechanism
Automatic cleanup (when :worktree-management? enabled):
Triggered by complete-task tool when:
- Task is completed successfully
- Current working directory is inside a worktree
Safety checks before removal:
| Check | Requirement | Failure Result |
|---|---|---|
| Clean working directory | No uncommitted changes | Task marked complete, worktree preserved, warning shown |
| Pushed commits | All commits pushed to remote (if remote configured) | Task marked complete, worktree preserved, warning shown |
Cleanup outcomes:
| Scenario | Task Status | Worktree | Branch | Message |
|---|---|---|---|---|
| Success | :closed |
Removed | Preserved | "Worktree removed at /path (switch directories to continue)" |
| Uncommitted changes | :closed |
Preserved | Preserved | "Warning: Could not remove worktree: Uncommitted changes exist" |
| Unpushed commits | :closed |
Preserved | Preserved | "Warning: Could not remove worktree: Unpushed commits exist" |
| Git error | :closed |
Preserved | Preserved | "Warning: Could not remove worktree: " |
Manual cleanup commands:
# From main repository directory
git worktree remove /path/to/worktree
# Force removal (use with caution)
git worktree remove --force /path/to/worktree
# List all worktrees
git worktree list
# Remove worktree that was already deleted from filesystem
git worktree prune
When to use manual cleanup:
- Automatic cleanup failed due to safety checks
- Worktree directory deleted manually
- Need to clean up multiple worktrees at once
- Worktree in inconsistent state
Error Recovery
Task Execution Failures
If task execution fails or is interrupted:
- Execution state persists:
.mcp-tasks-current.ednremains with:started-attimestamp - Task status unchanged: Stays
:open(not marked complete) - Worktree/branch preserved: Environment remains set up
- To resume: Re-run the execute prompt
work-onoverwrites stale execution state automatically- Execution continues from current code state
Common failure scenarios:
| Failure | Recovery Action |
|---|---|
| Agent context limit exceeded | Break task into smaller subtasks, execute separately |
| Implementation error/bug | Fix manually, re-run execute prompt to continue |
| Network/tool failure | Re-run execute prompt (idempotent) |
| User interruption (Ctrl-C) | Re-run execute prompt |
Handling Blocked Tasks
When a task depends on another task:
;; Mark current task as blocked
(update-task
:task-id 123
:status :blocked
:relations [{:relates-to 456, :as-type :blocked-by}])
Relation types:
| Type | Meaning | Example |
|---|---|---|
:blocked-by |
Cannot proceed until other task completes | Task #123 blocked by #456 |
:related |
Related but not blocking | Task #123 related to #456 |
:discovered-during |
Found while working on another task | Task #123 found during #456 |
Unblocking workflow:
- Execute blocking task first (e.g., task #456)
- Complete blocking task
- Update blocked task to remove relation and set status to
:open - Execute previously blocked task
Delete vs Update vs Complete
Decision matrix:
| Scenario | Action | Tool | Reason |
|---|---|---|---|
| Task done successfully | Complete | complete-task |
Preserves audit trail in complete.ednl |
| Task no longer needed | Delete | delete-task |
Removes from tasks.ednl, archives in complete.ednl with :status :deleted |
| Task needs clarification | Update | update-task |
Modify :description or :design fields |
| Task scope changed | Update | update-task |
Modify :title, :description, :category |
| Task blocked temporarily | Update | update-task |
Set :status :blocked, add :relations |
| Task duplicates another | Delete | delete-task |
Add :relations to other task first |
| Task split into subtasks | Create subtasks then delete parent | add-task + delete-task |
Use :parent-id for subtasks |
Constraints:
- Cannot delete task with non-closed children (must complete or delete children first)
- Cannot complete task if blocked (must update to
:openfirst) - Deleted tasks are archived, not permanently removed
Recovering from Interrupted Execution
Stale execution state detection:
External tools detect stale executions via :started-at timestamp in .mcp-tasks-current.edn:
{:story-id 408
:task-id 411
:started-at "2025-10-29T10:30:00Z"} ; If hours/days old = likely stale
Recovery steps:
-
Check current execution state:
cat .mcp-tasks-current.edn -
Verify if execution actually stale:
- Check timestamp age
- Check if agent still running
- Check if work in progress
-
Resume or restart:
- If continuing same task: Re-run execute prompt
- If switching tasks: Run execute prompt for different task (overwrites state)
- If abandoning task: Manually delete
.mcp-tasks-current.edn
-
Manual state cleanup (if needed):
rm .mcp-tasks-current.edn
Note: work-on automatically overwrites execution state, so manual cleanup rarely needed.
Best Practices
- Refine complex/unclear tasks before execution
- Match task complexity to category
- Use
parent-idwhen creating story tasks - Monitor execution via
resource://current-execution - Never create story child tasks for unrefined stories without explicit user confirmation
- Always call work-on tool when user instructs you to work on a specific task or story
- Never complete stories without explicit user confirmation
File Locations
- Tasks:
.mcp-tasks/tasks.ednl - Completed:
.mcp-tasks/complete.ednl - Execution state:
.mcp-tasks-current.edn - Category prompts:
.mcp-tasks/prompts/<category>.md(optional overrides) - Story prompts:
.mcp-tasks/story/prompts/<name>.md(optional overrides)