backlog
A persistent, cross-session task management server for AI agents with full task lifecycle management, rich filtering, documentation, and archiving.
Create & Import
task_add— Add tasks with description, priority, due date, tags, project, agent, recurrence, and dependenciestask_log— Record already-completed worktask_duplicate— Copy an existing task with optional field overridestask_import— Bulk-create tasks from a JSON array
Query & Discover
task_list— Filter tasks by status, project, priority, tags, virtual tags (+OVERDUE,+ACTIVE,+BLOCKED,+READY), dates, and boolean operatorstask_count— Count matching tasks without fetching full datatask_info— Get full details for a single tasktask_projects/task_tags— List all projects or tags with pending/recurring tasks
Status & Lifecycle
task_start/task_stop— Mark tasks as active or pausedtask_done— Complete a tasktask_modify— Partial-update any field on matching taskstask_delete— Soft-delete (restorable)task_purge— Permanently remove deleted taskstask_undo— Reverse the most recent operation
Annotations & Docs
task_annotate/task_denotate— Add or remove timestamped short notestask_doc_write/task_doc_read/task_doc_delete— Attach, read, or remove full markdown documents (specs, design notes, handoffs)
Archiving
task_archive— Move old completed/deleted tasks to quarterly segmentstask_archive_list/task_archive_load— List and inspect archived tasks read-only
backlog
Persistent, cross-session task management for Claude Code. Tasks survive sessions so work started by one agent can be picked up by another.
Built on @backloghq/agentdb — typed schemas, auto-increment IDs, virtual filters, blob storage. Pure TypeScript, zero native dependencies.
Install
/plugin marketplace add backloghq/backlog
/plugin install backlog@backloghq-backlogFrom source
git clone https://github.com/backloghq/backlog.git
cd backlog && npm install && npm run build
claude --plugin-dir /path/to/backlogStandalone MCP server
Add to your project's .claude/settings.json:
{
"mcpServers": {
"backlog": {
"command": "node",
"args": ["/path/to/agent-teams-task-mcp/dist/index.js"],
"env": {
"TASKDATA": "/path/to/task-data"
}
}
}
}Skills
Skill | Description |
| Show the current backlog — pending, active, blocked, overdue tasks |
| Break down a goal into tasks with dependencies, priorities, and specs |
| Daily standup — done, in progress, blocked, up next |
| Groom the backlog — fix vague tasks, missing priorities, broken deps, stale items |
| Write a spec document for a task before implementation |
| Pick up a task, read its spec, implement it, mark done |
| Prepare for next session — annotate progress, stop active tasks, summarize state |
Agent
The task-planner agent can be auto-invoked by Claude when someone needs to plan work. It reads the codebase, decomposes goals into tasks with dependencies, and writes specs for complex items.
Hooks
Event | What it does |
| Shows pending task count when a session begins |
| Syncs Claude's built-in tasks to the persistent backlog |
| Marks the matching backlog task as done when Claude completes a built-in task |
| Auto-assigns unassigned pending tasks to the spawned agent |
Tools (MCP)
Tools for full task lifecycle management:
Tool | Description |
| Query tasks with filter syntax. Returns JSON array with all fields. |
| Count tasks matching a filter. Same syntax as task_list. |
| Create a new pending task. Only description required; all other fields optional. |
| Record already-completed work directly in completed status. |
| Partial-update one or more tasks matching a filter. Only provided fields change. |
| Copy an existing task with optional field overrides. |
| Mark a task as completed with end timestamp. |
| Soft-delete a task. Restorable with task_undo. Use task_purge to permanently remove. |
| Add a timestamped note. Use task_doc_write for longer content. |
| Remove an annotation by exact text match. |
| Mark a task as actively being worked on. Visible in +ACTIVE queries. |
| Stop working on a task. Returns it to pending status. |
| Undo the most recent operation. Can be called repeatedly. |
| Get full JSON details for a single task by ID or UUID. |
| Bulk-create tasks from a JSON array. Atomic batch operation. |
| Permanently remove a deleted task. Irreversible. |
| Attach/replace a markdown document on a task (specs, notes, context). |
| Read the markdown document attached to a task. |
| Remove a task's document. Permanent. |
| Move old completed/deleted tasks to quarterly archive segments. |
| List available archive segments. |
| Load archived tasks for read-only inspection. |
| List project names with pending/recurring tasks. |
| List tags with pending/recurring tasks. |
Filter Syntax
status:pending # all pending tasks
project:backend +bug # bugs in backend project
priority:H due.before:friday # high priority due before friday
+OVERDUE # overdue tasks
+ACTIVE # tasks currently being worked on
+BLOCKED # tasks blocked by dependencies
+READY # actionable tasks (past scheduled date)
agent:explorer # tasks assigned to the explorer agent
( project:web or project:api ) # boolean with parentheses
description.contains:auth # substring matchSupports attribute modifiers (.before, .after, .by, .has, .not, .none, .any, .startswith, .endswith), tags (+tag, -tag), virtual tags (+OVERDUE, +ACTIVE, +BLOCKED, +READY, +TAGGED, +ANNOTATED, etc.), and boolean operators (and, or).
Task Docs
Attach markdown documents (specs, context, handoff notes) to any task:
task_doc_write id:"1" content:"# Spec\n\nBuild the auth flow.\n"
task_doc_read id:"1"
task_doc_delete id:"1"Writing a doc adds a +doc tag and has_doc:yes, so agents can discover tasks with docs:
task_list filter:"+doc"
task_list filter:"has_doc:yes"Agent Identity
Tasks support an agent field for tracking which agent owns a task:
task_add description:"Investigate bug" agent:"explorer"
task_list filter:"agent:explorer status:pending"Project Isolation
Each project gets its own task data automatically. When used as a plugin, task data lives in ~/.claude/plugins/data/backlog/projects/<project-slug>/. When used standalone, set TASKDATA explicitly.
Variable | Description |
| Explicit path to task data directory (overrides auto-derivation) |
| Root directory for auto-derived per-project task data |
| Explicit collection name (default: |
| Set to |
| Agent ID for multi-writer support (Claude, Gemini, etc.) |
| Storage backend: omit for filesystem (default), |
| S3 bucket name (required when |
| AWS region (optional if using default credentials) |
Multi-Writer Support
Backlog supports concurrent access from multiple processes (e.g., Claude Desktop and Gemini CLI) sharing the same data. To enable this:
Assign a unique
BACKLOG_AGENT_IDto each process (e.g.,claude,gemini).When an agent ID is set, the engine uses per-agent write logs, avoiding file locks.
Each process automatically calls
refresh()before operations to pick up changes from other agents.
Namespacing
If you want to use a single TASKDATA directory (like a shared S3 bucket or a global ~/.backlog folder) for multiple projects, you can use namespaces to keep tasks separate:
Manual: Set
BACKLOG_NAMESPACE=my-projectto use a specific collection name.Automatic: Set
BACKLOG_AUTO_NAMESPACE=trueto have Backlog automatically derive a collection name from your current working directory (e.g.my-app-a1b2c3d4).
Example Configuration (.claude/settings.json):
{
"mcpServers": {
"backlog": {
"command": "node",
"args": ["/path/to/backlog/dist/index.js"],
"env": {
"TASKDATA": "/home/user/.backlog",
"BACKLOG_AUTO_NAMESPACE": "true",
"BACKLOG_AGENT_ID": "claude-desktop"
}
}
}
}Both methods allow multiple projects to share the same storage backend while maintaining isolated, project-specific backlogs.
S3 Backend
Store task data in S3 for team sharing or cloud persistence. Requires @backloghq/opslog-s3:
npm install @backloghq/opslog-s3Configure via environment variables in .claude/settings.json:
{
"mcpServers": {
"backlog": {
"command": "node",
"args": ["/path/to/backlog/dist/index.js"],
"env": {
"TASKDATA": "my-project/tasks",
"BACKLOG_BACKEND": "s3",
"BACKLOG_S3_BUCKET": "my-team-backlog",
"BACKLOG_S3_REGION": "us-east-1"
}
}
}
}When using S3, TASKDATA becomes the key prefix in the bucket instead of a filesystem path.
Docker
docker build -t backlog .
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' \
| docker run --rm -i backlogDevelopment
npm install
npm run build # compile TypeScript
npm run lint # run ESLint
npm test # run tests
npm run test:coverage # run tests with coverage
npm run dev # watch modeCommunity
GitHub Discussions — questions, ideas, show & tell
Issue Tracker — bug reports and feature requests
Documentation — full docs, skills reference, filter syntax
If backlog is useful to you, consider giving it a star — it helps others find the project.
License
MIT
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/backloghq/backlog'
If you have feedback or need assistance with the MCP directory API, please join our Discord server