Skip to main content

Bridging AI and Task Management with MCP

· 4 min read
Max Kaido
Architect

After months of struggling with task management across different modules and components of our project, I've finally found a solution that works: an MCP (Model Context Protocol) server for TaskWarrior integration! This bridge between our AI assistants and task management system enables seamless task listing, creation, and completion directly through AI interactions. The implementation is surprisingly straightforward, yet it solves several long-standing pain points in our development workflow.

What is MCP and Why It Matters

The Model Context Protocol (MCP) is a powerful standard that allows AI assistants like Claude to interact with external tools and data sources. It follows a client-server architecture where:

  • The client is typically an AI application (like Claude Desktop or Cursor)
  • The server provides access to specific tools and data sources

By building an MCP server for TaskWarrior, I've created a bridge between our AI assistants and our task management system. This means our AI tools can now:

  1. List pending tasks
  2. Add new tasks with proper metadata
  3. Mark tasks as completed
  4. Get the next most important tasks

The Implementation

The implementation is surprisingly straightforward. Here's the core of what makes it work:

// Create an MCP server
const server = new McpServer({
name: 'taskwarrior-server',
version: '1.0.0',
});

// Add tools to the server
server.tool('get_next_tasks', listPendingTasksSchema, async (params) => {
// Implementation that calls TaskWarrior CLI
});

server.tool('list_tasks', listTasksSchema, async (params) => {
// Implementation that calls TaskWarrior CLI
});

server.tool('mark_task_done', markTaskDoneSchema, async (params) => {
// Implementation that calls TaskWarrior CLI
});

server.tool('add_task', addTaskSchema, async (params) => {
// Implementation that calls TaskWarrior CLI
});

Each tool is backed by a schema defined with Zod, ensuring type safety and validation. The actual implementation uses Node.js's execSync to call the TaskWarrior CLI commands, making it compatible with any system that has TaskWarrior installed.

Top 3 Features to Add Next

While the current implementation provides the essential functionality, here are the three most valuable features we should add next:

1. Task Dependencies and Blocking Tasks

TaskWarrior has powerful dependency tracking capabilities that we should expose through our MCP server. This would allow:

  • Setting dependencies between tasks (task 42 modify depends:37,15)
  • Visualizing task dependency chains
  • Automatically prioritizing tasks that are blocking others

This feature would be particularly valuable for complex projects where task sequencing matters. Imagine asking Claude: "What tasks are currently blocking the Apollo module work?" and getting an immediate, accurate response.

2. Custom Reports with Filtering

TaskWarrior's reporting system is incredibly flexible. We should add a tool that allows:

  • Creating and running custom reports with specific columns and sorting
  • Complex filtering by multiple attributes (project, tags, priority, etc.)
  • Saving frequently used report configurations

For example, this would enable queries like: "Show me all high-priority tasks in the Minerva module that are tagged with 'bug' and due within the next week."

3. Recurring Tasks and Task Templates

For team workflows with regular tasks, we should implement:

  • Creating recurring tasks with various schedules (daily, weekly, monthly)
  • Defining task templates for common work items
  • Bulk task creation from templates

This would streamline processes like sprint planning, regular maintenance tasks, and standardized workflows. It would allow statements like: "Create our standard sprint review tasks for next Friday" and have all the necessary tasks automatically created with the right metadata.

Why This Matters for Our Project

This integration solves several long-standing pain points:

  1. Visibility: AI assistants can now see tasks related to specific modules or components
  2. Consistency: Tasks are managed in a standardized way across the project
  3. Efficiency: Marking tasks as done or adding new ones can happen right in the conversation flow
  4. Context: AI tools have more context about what needs to be done next

TaskWarrior Style Guide

To make the most of this integration, here's a style guide for how we should structure our tasks in TaskWarrior:

Task Description Format

Good task descriptions should be:

  • Action-oriented: Start with a verb (e.g., "Implement", "Fix", "Refactor")
  • Specific: Clearly state what needs to be done
  • Concise: Keep it under 50 characters if possible

Examples:

  • ✅ "Implement JWT authentication for API endpoints"
  • ✅ "Fix memory leak in data processing module"
  • ❌ "Authentication" (too vague)
  • ❌ "Look into the issue with the thing that's not working properly when users try to do that one action we discussed last week" (too verbose)

Project Structure

Use a hierarchical structure for projects:

project:mercury.apollo    # Apollo module in Mercury
project:mercury.minerva # Minerva module in Mercury
project:arcana.bot # Bot component in Arcana

This allows filtering tasks by specific modules or components.

Priority Levels

Use priority levels consistently:

  • H (High): Critical issues, blocking tasks
  • M (Medium): Important but not blocking
  • L (Low): Nice-to-have improvements
  • (none): Default priority for regular tasks

Tags for Context

Use tags to provide additional context:

  • +bug: Bug fixes
  • +feature: New features
  • +refactor: Code improvements
  • +docs: Documentation tasks
  • +test: Testing-related tasks
  • +perf: Performance improvements

Due Dates

Only add due dates for genuine deadlines, not aspirational targets. This keeps the urgency calculation meaningful.

TaskWarrior TUI Configuration

If you're using the TaskWarrior TUI, here's a recommended configuration for your .taskrc:

# TaskWarrior's configuration
data.location=~/.task
verbose=affected,blank,context,edit,header,footnote,label,new-id,project,special,sync,recur
uda.priority.values=H,M,,L

# TaskWarrior-TUI configuration
uda.taskwarrior-tui.keyconfig.done=x
uda.taskwarrior-tui.keyconfig.delete=d

# Custom report for our project structure
report.next.labels=ID,P,Project,Tags,Due,Description
report.next.columns=id,priority,project,tags,due.relative,description.truncated_count
report.next.filter=(status:pending or status:waiting)

Getting Started

To use this MCP server:

  1. Install TaskWarrior if you haven't already
  2. Clone the mcp-task-warrior repository
  3. Run npm install to install dependencies
  4. Start the server with npm start
  5. Connect your AI assistant to the MCP server

What's Next?

With this foundation in place, we can now:

  1. Create project-specific views for different teams
  2. Integrate with our CI/CD pipeline to automatically create and update tasks
  3. Build dashboards to visualize task progress across modules
  4. Extend the MCP server with more advanced TaskWarrior features

Conclusion

This MCP server for TaskWarrior is a small but significant step toward better project management. It bridges the gap between our AI tools and our task tracking system, making it easier to stay organized and focused on what matters.

The months of pain dealing with disconnected task management are hopefully behind us. Now we can move forward with a more integrated, efficient approach to tracking and completing our work.

If you have ideas for improving this integration or want to contribute, please reach out!