Taskwarrior MCP
MCP server wrapping the Taskwarrior CLI for structured, project-scoped task management.
★ 0No licenseother
Install
Config snippet generator goes here (5 client tabs)
README
# task-warrior-mcp
A [Model Context Protocol](https://modelcontextprotocol.io) server that wraps the [Taskwarrior](https://taskwarrior.org) CLI. Gives Claude (or any MCP client) structured, project-scoped access to your tasks.
## Why project-scoped?
Every read and write operation requires a `project` field. The server automatically prepends `project:<name>` to all Taskwarrior queries. Without this, a single `task next` call can dump thousands of unrelated tasks into your LLM's context — slow, expensive, and useless. An explicit `all_projects` boolean opt-out exists for the rare cases that genuinely need a global view.
## Requirements
- [Taskwarrior](https://taskwarrior.org/download/) (`task` on `$PATH`)
## Installation
### From MCP Registry (recommended)
Find `task-warrior-mcp` on the [MCP Registry](https://registry.modelcontextprotocol.io) and follow the installation prompt in your MCP client. No build step required.
### From source
Requires [Rust](https://rustup.rs) (stable).
```sh
git clone https://github.com/<you>/task-warrior-mcp
cd task-warrior-mcp
cargo build --release
```
The binary lands at `target/release/task-warrior-mcp`.
## Configuration
### Claude Code (global, all sessions)
If installed via the MCP registry, your client handles configuration automatically. For a local build:
```sh
claude mcp add --scope user taskwarrior /path/to/task-warrior-mcp/target/release/task-warrior-mcp
```
### Claude Desktop
Merge the snippet below into your `claude_desktop_config.json` (replace `<INSTALL_DIR>` with the absolute path to this repo):
```json
{
"mcpServers": {
"taskwarrior": {
"command": "<INSTALL_DIR>/target/release/task-warrior-mcp",
"args": []
}
}
}
```
**macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
**Linux:** `~/.config/Claude/claude_desktop_config.json`
## Tools
| Tool | Required | Optional |
|---|---|---|
| `add_task` | `description`, `project` | `due`, `tags`, `priority`, `wait`, `scheduled` |
| `list_tasks` | `project` | `filter`, `report`, `all_projects` |
| `search_tasks` | `pattern`, `project` | `filter`, `all_projects` |
| `get_task` | `id` | — |
| `modify_task` | `id`, `modifications` | — |
| `complete_task` | `id` | — |
| `delete_task` | `id` | — |
| `annotate_task` | `id`, `note` | — |
### Date syntax
`today` · `tomorrow` · `eow` · `eom` · `friday` · `2025-06-15` · `2025-06-15T14:30` · `today+3d` · `later`
### Filter virtual tags
`+OVERDUE` · `+DUE` · `+TODAY` · `+READY` · `+ACTIVE` · `+BLOCKED` · `+BLOCKING` · `+WAITING`
### Reports
`next` (default, urgency-sorted) · `list` · `all` · `completed` · `waiting` · `blocked`
### Priorities
`H` (high) · `M` (medium) · `L` (low)
## Development
```sh
just build # cargo build --release
just test # run all tests (each isolated in a temp taskwarrior DB)
just lint # clippy + fmt check
```
Or use cargo directly:
```sh
cargo test
cargo clippy
cargo fmt
```
A pre-push hook runs fmt + clippy + tests automatically — no setup needed after cloning.
CI runs the same checks on every push and PR via GitHub Actions.
### Releasing
Requires: [`just`](https://github.com/casey/just), [`gh`](https://cli.github.com), `jq`, `openssl`, and [`cargo-edit`](https://github.com/killercup/cargo-edit) (`just setup`).
```sh
just setup # install cargo-edit (one-time)
just release # bump patch, build, push tag, create GitHub release, update server.json
just release minor # bump minor version
just release-version 1.2.3 # explicit version
just publish # push server.json to the MCP registry (after mcp-publisher login)
```