Back to Finance

Tasks

๐Ÿš€ Ultra-efficient MCP task management server designed for Cursor & AI clients! Minimize tool confusion with just 5 powerful commands while maximizing your LLM budget. Multi-format support (Markdown/JSON/YAML), intelligent search, batch operations, auto work-in-progress management & duplicate prevention. Revolutionary safety: AI can add & organize tasks but NEVER accidentally delete your work. ``` { "mcp-tasks": { "command": "npx", "args": ["-y", "mcp-tasks"] } } ```

Last updated: 1/27/2026

README

# MCP Tasks ๐Ÿ“‹

[![Install MCP Server](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/install-mcp?name=mcp-tasks&config=JTdCJTIyY29tbWFuZCUyMiUzQSUyMm5weCUyMC15JTIwbWNwLXRhc2tzJTIyJTdE)
[![npm version](https://img.shields.io/npm/v/mcp-tasks.svg)](https://www.npmjs.com/package/mcp-tasks)
[![Node.js](https://img.shields.io/node/v/mcp-tasks.svg)](https://nodejs.org/)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![Docker](https://img.shields.io/docker/v/flesler/mcp-tasks?label=docker)](https://hub.docker.com/r/flesler/mcp-tasks)

An efficient task manager. Designed to minimize tool confusion and maximize LLM budget efficiency while providing powerful search, filtering, and organization capabilities across multiple file formats (Markdown, JSON, YAML)

## ๐Ÿ“š **Table of Contents**

- [โœจ Features](#-features)
- [๐Ÿš€ Quick Start](#-quick-start)
- [๐Ÿค– AI Integration Tips](#-ai-integration-tips)
- [๐Ÿ”ง Installation Examples](#-installation-examples)
- [๐Ÿ“ Supported File Formats](#-supported-file-formats)
- [๐Ÿ› ๏ธ Available Tools](#๏ธ-available-tools)
- [๐ŸŽ›๏ธ Environment Variables](#๏ธ-environment-variables)
- [๐Ÿ“Š File Formats](#-file-formats)
- [๐Ÿ–ฅ๏ธ Server Usage](#๏ธ-server-usage)
- [๐Ÿ’ป CLI Usage](#-cli-usage)
- [๐Ÿงช Development](#-development)
- [๐Ÿ› ๏ธ Troubleshooting](#๏ธ-troubleshooting)
- [Why not let AI edit files directly?](#why-not-just-have-ai-edit-the-task-files-directly)
- [๐Ÿค Contributing](#-contributing)
- [๐Ÿ“„ License](#-license)
- [๐Ÿ”— Links](#-links)

## โœจ **Features**

- โšก **Ultra-efficient design**: Minimal tool count (5 tools) to reduce AI confusion
- ๐ŸŽฏ **Budget-optimized**: Batch operations, smart defaults and auto-operations minimize LLM API calls
- ๐Ÿš€ **Multi-format support**: Markdown (`.md`), JSON (`.json`), and YAML (`.yml`) task files
- ๐Ÿ” **Powerful search**: Case-insensitive text/status filtering with OR logic, and ID-based lookup
- ๐Ÿ“Š **Smart organization**: Status-based filtering with customizable workflow states
- ๐ŸŽฏ **Position-based indexing**: Easy task ordering with 0-based insertion
- ๐Ÿ“ **Multi-source support**: Manage multiple task files simultaneously
- ๐Ÿ”„ **Real-time updates**: Changes persist automatically to your chosen format
- ๐Ÿค– **Auto WIP management**: Automatically manages work-in-progress task limits
- ๐Ÿšซ **Duplicate prevention**: Automatically prevents duplicate tasks
- ๐Ÿ›ก๏ธ **Type-safe**: Full TypeScript support with Zod validation
- ๐Ÿ”’ **Ultra-safe**: AI has no way to rewrite or delete your tasks (unless you enable it), only add and move them
- ๐Ÿ“… **Optional reminders**: Enable a dedicated Reminders section the AI constantly sees and can maintain

## ๐Ÿš€ **Quick Start**

Add this to `~/.cursor/mcp.json` for Cursor, `~/.config/claude_desktop_config.json` for Claude Desktop.

### Option 1: NPX (Recommended)
```json
{
  "mcpServers": {
    "mcp-tasks": {
      "command": "npx",
      "args": ["-y", "mcp-tasks"]
    }
  }
}
```

### Option 2: Docker
```json
{
  "mcpServers": {
    "mcp-tasks": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "flesler/mcp-tasks"
      ]
    }
  }
}
```

## ๐Ÿค– **AI Integration Tips**

To encourage the AI to use these tools, you can start with a prompt like the following, with any path you want with .md (recommended), .json, .yml:

```
Use mcp-tasks tools to track our work in path/to/tasks.md
```

If you are telling it about new or updated tasks, you can append this to the end of your prompt:

```
use mcp-tasks
```

**Adding tasks while AI works:** To safely add tasks without interfering with AI operations, [use the CLI](#-cli-usage) from a separate terminal:

```bash
npx mcp-tasks add "Your new task text" "To Do" 0
```


## ๐Ÿ”ง **Installation Examples**

**Full configuration with custom environment:**
```json
{
  "mcpServers": {
    "mcp-tasks": {
      "command": "npx",
      "args": ["-y", "mcp-tasks"],
      "env": {
        "STATUS_WIP": "In Progress",
        "STATUS_TODO": "To Do",
        "STATUS_DONE": "Done",
        "STATUS_REMINDERS": "Reminders",
        "STATUS_NOTES": "Notes",
        "STATUSES": "In Progress,To Do,Done,Backlog,Reminders,Notes",
        "AUTO_WIP": "true",
        "PREFIX_TOOLS": "true",
        "KEEP_DELETED": "true",
        "TRANSPORT": "stdio",
        "PORT": "4680",
        "INSTRUCTIONS": "Use mcp-tasks tools when the user mentions new or updated tasks"
      }
    }
  }
}
```

**HTTP transport for remote access:**

First run the server:
```bash
TRANSPORT=http PORT=4680 npx mcp-tasks
```
Then:
```json
{
  "mcpServers": {
    "mcp-tasks": {
      "type": "streamableHttp",
      "url": "http://localhost:4680/mcp"
    }
  }
}
```

## ๐Ÿ“ **Supported File Formats**

| Extension | Format | Best For | Auto-Created |
|-----------|--------|----------|--------------|
| `.md` | Markdown | Human-readable task lists | โœ… |
| `.json` | JSON | Structured data, APIs | โœ… |
| `.yml` | YAML | Configuration files | โœ… |

**Format is auto-detected from file extension.** All formats support the same features and can be mixed in the same project.

**Recommended**: Markdown (`.md`) for human readability and editing

**โš ๏ธ Warning**: Start with a new file rather than using pre-existing task files to avoid losing non-task content.

## ๐Ÿ› ๏ธ **Available Tools**

When `PREFIX_TOOLS=true` (default), all tools are prefixed with `tasks_`:

| Tool | Description | Parameters |
|------|-------------|------------|
| `tasks_setup` | Initialize a task file (creates if missing, supports `.md`, `.json`, `.yml`) | `source_path`, `workspace?` |
| `tasks_search` | Search tasks with filtering | `source_id`, `statuses?`, `terms?`, `ids?` |
| `tasks_add` | Add new tasks to a status | `source_id`, `texts[]`, `status`, `index?` |
| `tasks_update` | Update tasks by ID | `source_id`, `ids[]`, `status`, `index?` |
| `tasks_summary` | Get task counts and work-in-progress | `source_id` |

**ID Format**: Both `source_id` (from file path) and task `id` (from task text) are 4-character alphanumeric strings (e.g., `"xK8p"`, `"m3Qw"`).

### Tool Examples

**Setup a task file:**
```javascript
tasks_setup({
  workspace: "/path/to/project",
  source_path: "tasks.md"  // relative to workspace or absolute
  // source_path: "tasks.json"
  // source_path: "tasks.yml"
})
// Returns: {"source":{"id":"xK8p","path":"/path/to/project/tasks.md"},"Backlog":0,"To Do":0,"In Progress":0,"Done":0,"inProgress":[]}
// Source ID (4-char alphanumeric) is used for all subsequent operations
```

**Add tasks:**
```javascript
tasks_add({
  source_id: "xK8p", // From setup response
  texts: ["Implement authentication", "Write tests"],
  status: "To Do",
  index: 0  // Add at top (optional)
})
// Returns: {"source":{"id":"xK8p","path":"/absolute/path/to/tasks.md"},"Backlog":0,"To Do":2,"In Progress":0,"Done":0,"inProgress":[],"tasks":[{"id":"m3Qw","text":"Implement authentication","status":"To Do","index":0},{"id":"p9Lx","text":"Write tests","status":"To Do","index":1}]}
```

**Search and filter:**
```javascript
tasks_search({
  source_id: "xK8p",        // From setup response
  terms: ["auth", "deploy"],          // Search terms (text or status, OR logic)
  statuses: ["To Do"],      // Filter by status
  ids: ["m3Qw", "p9Lx"]     // Filter by specific task IDs
})
// Returns: [{"id":"m3Qw","text":"Implement authentication","status":"To Do","index":0}]
```

**Update tasks status:**
```javascript
tasks_update({
  source_id: "xK8p",        // From setup response
  ids: ["m3Qw", "p9Lx"],    // Task IDs from add/search responses
  status: "Done"            // Use "Deleted" to remove
})
// Returns: {"source":{"id":"xK8p","path":"/absolute/path/to/tasks.md"},"Backlog":0,"To Do":0,"In Progress":0,"Done":2,"inProgress":[],"tasks":[{"id":"m3Qw","text":"Implement authentication","status":"Done","index":0},{"id":"p9Lx","text":"Write tests","status":"Done","index":1}]}
```

**Get overview:**
```javascript
tasks_summary({
  source_id: "xK8p"         // From setup response
})
// Returns: {"source":{"id":"xK8p","path":"/absolute/path/to/tasks.md"},"Backlog":0,"To Do":0,"In Progress":1,"Done":2,"inProgress":[{"id":"r7Km","text":"Fix critical bug","status":"In Progress","index":0}]}
```

## ๐ŸŽ›๏ธ **Environment Variables**

| Variable | Default | Description |
|----------|---------|-------------|
| `TRANSPORT` | `stdio` | Transport mode: `stdio` or `http` |
| `PORT` | `4680` | HTTP server port (when `TRANSPORT=http`) |
| `PREFIX_TOOLS` | `true` | Prefix tool names with `tasks_` |
| `STATUS_WIP` | `In Progress` | Work-in-progress status name |
| `STATUS_TODO` | `To Do` | ToDo status name |
| `STATUS_DONE` | `Done` | Completed status name |
| `STATUS_REMINDERS` | `Reminders` | Reminders for the AI (empty string to disable) |
| `STATUS_NOTES` | `Notes` | Notes/non-actionable tasks (empty string to disable) |
| `STATUSES` | `Backlog` | Comma-separated additional statuses |
| `AUTO_WIP` | `true` | One WIP moves rest to To Do, first To Do to WIP when no WIP's |
| `KEEP_DELETED` | `true` | Retain deleted tasks (AI can't lose you tasks!) |
| `INSTRUCTIONS` | `...` | Included in all tool responses, for the AI to follow |
| `SOURCES_PATH` | `./sources.json` | File to store source registry (internal) |
| `DEBUG` | `false` | if true, enable the `tasks_debug` tool |

### Advanced Configuration Examples

Optional, the WIP/ToDo/Done statuses can be included to control their order.

**Custom workflow statuses:**
```json
{
  "env": {
    "STATUSES": "WIP,Pending,Archived,Done,To Review",
    "STATUS_WIP": "WIP",
    "STATUS_TODO": "Pending",
    "AUTO_WIP": "false"
  }
}
```

## ๐Ÿ“Š **File Formats**

### Markdown (`.md`) - Human-Readable
```markdown
# Tasks - File Name

## In Progress
- [ ] Write user registration

## To Do
- [ ] Implement authentication
- [ ] Set up CI/CD pipeline

## Backlog
- [ ] Plan architecture
- [ ] Design database schema

## Done
- [x] Set up project structure
- [x] Initialize repository

## Reminders
- [ ] Don't move to Done until you verified it works
- [ ] After you move to Done, commit all the changes, use the task name as the commit message

## Notes
- [ ] The task tools were really great to use!
```

### JSON (`.json`) - Structured Data
```json
{
  "groups": {
    "In Progress": [
      "Write user registration"
    ],
    "To Do": [
      "Implement authentication",
      "Set up CI/CD pipeline"
    ],
    "Backlog": [
      "Plan architecture",
      "Design database schema"
    ],
    "Done": [
      "Set up project structure",
      "Initialize repository"
    ],
    "Reminders": [
      "Don't move to Done until you verified it works",
      "After you move to Done, commit all the changes, use the task name as the commit message"
    ],
    "Notes": [
      "The task tools were really great to use!"
    ]
  }
}
```

### YAML (`.yml`) - Configuration-Friendly
```yaml
groups:
  "In Progress":
    - Write user registration
  "To Do":
    - Implement authentication
    - Set up CI/CD pipeline
  Backlog:
    - Plan architecture
    - Design database schema
  Done:
    - Set up project structure
    - Initialize repository
  Reminders:
    - Don't move to Done until you verified it works
    - After you move to Done, commit all the changes, use the task name as the commit message
```

## ๐Ÿ–ฅ๏ธ **Server Usage**

```bash
# Show help
mcp-tasks --help

# Default: stdio transport
mcp-tasks

# HTTP transport
TRANSPORT=http mcp-tasks
TRANSPORT=http PORT=8080 mcp-tasks

# Custom configuration
STATUS_WIP="Working" AUTO_WIP=false mcp-tasks
```

## ๐Ÿ’ป **CLI Usage**

You can also use `mcp-tasks` (or `npx mcp-tasks`) as a command-line tool for quick task management:

```bash
# Setup a task file
mcp-tasks setup tasks.md $PWD                      # Setup with workspace

# Add tasks
mcp-tasks add "Implement authentication"           # Defaults to "To Do" status
mcp-tasks add "Write tests" "Backlog"              # Add with specific status
mcp-tasks add "Fix critical bug" "In Progress" 0   # Add at top (index 0)

# Search tasks
mcp-tasks search                                    # All tasks
mcp-tasks search "" "auth,login"                   # Search for specific terms
mcp-tasks search "To Do,Done" ""                   # Filter by statuses
mcp-tasks search "In Progress" "bug"               # Filter by status and search terms

# Update task status (comma-separated IDs)
mcp-tasks update m3Qw,p9Lx Done

# Get summary
mcp-tasks summary

# Add a reminder (feature must be enabled with REMINDERS=true)
mcp-tasks add "Don't move to Done until you verified it works" Reminders
```

**CLI Features:**
- Direct access to all MCP tool functionality
- JSON output for easy parsing and scripting
- Same reliability and duplicate prevention as MCP tools
- Perfect for automation scripts and CI/CD pipelines

## ๐Ÿงช **Development**

```bash
# Clone and setup
git clone https://github.com/flesler/mcp-tasks
cd mcp-tasks
npm install

# Development mode (auto-restart)
npm run dev              # STDIO transport
npm run dev:http         # HTTP transport on port 4680

# Build and test
npm run build           # Compile TypeScript
npm run lint            # Check code style
npm run lint:full       # Build + lint
```

## ๐Ÿ› ๏ธ **Troubleshooting**

### **Requirements**
- **Node.js โ‰ฅ20** - This package requires Node.js version 20 or higher

### **Common Issues**

**ERR_MODULE_NOT_FOUND when running `npx-tasks`**
- **Problem**: Error like `Cannot find module '@modelcontextprotocol/sdk/dist/esm/server/index.js'` when running `npx mcp-tasks`
- **Cause**: Corrupt or incomplete npx cache preventing proper dependency resolution
- **Solution**: Clear the npx cache and try again:
  ```bash
  npx clear-npx-cache
  npx mcp-tasks
  ```
- **Note**: This issue can occur on both Node.js v20 and v22, and the cache clear resolves it

**Where are my tasks stored?**
- Tasks are stored in the file path you specified by the AI in `tasks_setup`
- The absolute path is returned in every tool call response under `source.path`
- If you forgot the location, check any tool response or ask the AI to show it to you

**Lost content in Markdown files:**
- โš ๏ธ The tools will rewrite the entire file, preserving only tasks under recognized status sections
- Non-task content (notes, documentation) may be lost when tools modify the file
- Use a dedicated task file rather than mixing tasks with other content

## Why not just have AI edit the task files directly?

- **File parsing complexity:** AI must read entire files, parse markdown structure, and understand current state - expensive and error-prone
- **Multi-step operations:** Moving a task from "In Progress" to "Done" requires multiple `read_file`, `grep_search`, `sed` calls to locate and modify correct sections
- **Context loss:** Large task files forcing AI to work with incomplete chunks due to token restrictions and lose track of overall structure
- **State comprehension:** AI struggles to understand true project state when reading fragmented file sections - which tasks are actually in progress?
- **Edit precision:** Manual editing risks corrupting markdown formatting, losing tasks, or accidentally modifying the wrong sections
- **Concurrent editing conflicts:** When AI directly edits files, humans can't safely make manual changes without creating conflicts or overwrites
- **Token inefficiency:** Reading+parsing+editing cycles consume far more tokens than structured tool calls with clear inputs/outputs
- **Safety:** AI can accidentally change or delete tasks when directly editing files, but with these tools it cannot rewrite or delete your tasks

## ๐Ÿค **Contributing**

We welcome contributions! Please:

1. Fork the repository
2. Create a feature branch: `git checkout -b feature-name`
3. Make your changes with tests
4. Run: `npm run lint:full`
5. Submit a pull request

## ๐Ÿ“„ **License**

MIT License - see [LICENSE](LICENSE) for details.

## ๐Ÿ”— **Links**

- ๐Ÿ“ฆ **[NPM Package](https://www.npmjs.com/package/mcp-tasks)**
- ๐Ÿ™ **[GitHub Repository](https://github.com/flesler/mcp-tasks)**
- ๐Ÿ› **[Report Issues](https://github.com/flesler/mcp-tasks/issues)**
- ๐Ÿ“š **[MCP Specification](https://modelcontextprotocol.io/)**
- โšก **[FastMCP Framework](https://github.com/punkpeye/fastmcp)**

Installation

Add this MCP to your configuration:

{
  "mcpServers": {
    "tasks": {
      // See GitHub repository for configuration
    }
  }
}

See the GitHub repository for full installation instructions.