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"
}
}
}
}Related MCP server: Vibe Board VE
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
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
20 tool updates
v1.5.0- Changed
task_add12 fields changed- changed
Input schema / properties / agent / descriptionPrevious value: -"Agent identity, e.g. 'explorer', 'planner', 'reviewer'"New value: +"Agent identity for tracking task ownership across agent teams. E.g. 'explorer', 'planner', 'reviewer'." - changed
Input schema / properties / depends / descriptionPrevious value: -"UUID(s) of tasks this depends on, comma-separated"New value: +"Comma-separated UUIDs of tasks this depends on. Task shows as +BLOCKED until dependencies are completed." - changed
Input schema / properties / description / descriptionPrevious value: -"Task description text"New value: +"Task description (required, max 500 chars). Brief summary of what needs to be done." - changed
Input schema / properties / due / descriptionPrevious value: -"Due date, e.g. 'tomorrow', '2025-12-31', 'eow'"New value: +"Due date. Accepts: ISO dates ('2025-12-31'), relative ('3d', '2w'), named ('tomorrow', 'friday', 'eow', 'eom'), compound ('now+3d')." - changed
Input schema / properties / extra / descriptionPrevious value: -"Additional raw attributes"New value: +"Space-separated additional attributes or +tag/-tag modifiers." - changed
Input schema / properties / priority / descriptionPrevious value: -"Priority: H (high), M (medium), L (low)"New value: +"Priority: H (high), M (medium), L (low). Affects urgency score and sort order." - changed
Input schema / properties / project / descriptionPrevious value: -"Project name, e.g. 'backend'"New value: +"Project name for grouping (alphanumeric, hyphens, underscores). E.g. 'backend', 'auth-refactor'" - changed
Input schema / properties / recur / descriptionPrevious value: -"Recurrence frequency, e.g. 'daily', 'weekly', '2wks', 'monthly'. Requires a due date."New value: +"Recurrence pattern. Requires 'due' to be set. Values: 'daily', 'weekly', 'weekdays', 'biweekly', 'monthly', 'quarterly', 'yearly', or numeric like '3d', '2w'." - changed
Input schema / properties / scheduled / descriptionPrevious value: -"Scheduled date — when to start working on the task, e.g. 'monday', 'tomorrow'"New value: +"Scheduled start date — when to begin working. Same date formats as 'due'." - changed
Input schema / properties / tags / descriptionPrevious value: -"Tags to apply, as comma-separated list or JSON array. E.g. 'bug,urgent' or '[\"bug\",\"urgent\"]'"New value: +"Tags as comma-separated list or JSON array. E.g. 'bug,urgent' or '[\"bug\",\"urgent\"]'. Used for filtering with +tag/-tag syntax." - changed
Input schema / properties / until / descriptionPrevious value: -"End date for recurrence — no instances generated past this date, e.g. '2026-12-31'"New value: +"End date for recurrence — no instances generated past this date. Only meaningful with 'recur'. Same date formats as 'due'." - changed
Input schema / properties / wait / descriptionPrevious value: -"Wait date — task hidden until this date"New value: +"Wait date — task is hidden from default views until this date. Same date formats as 'due'."
- Changed
task_annotate2 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Task ID number or UUID"New value: +"Task ID number (e.g. '1') or UUID." - changed
Input schema / properties / text / descriptionPrevious value: -"Annotation text"New value: +"Annotation text to add. Stored with a timestamp. Keep concise — use task_doc_write for longer content."
- Changed
task_archive1 field changed- changed
Input schema / properties / older_than_days / descriptionPrevious value: -"Number of days. Archive tasks completed/deleted more than this many days ago. Default: 90"New value: +"Archive tasks completed/deleted more than this many days ago. Default: 90. E.g. '30' for tasks older than a month."
- Changed
task_archive_load1 field changed- changed
Input schema / properties / segment / descriptionPrevious value: -"Archive segment name, e.g. '2026-Q1'"New value: +"Archive segment name, e.g. '2026-Q1'. Use task_archive_list to see available segments."
- Changed
task_count1 field changed- changed
Input schema / properties / filter / descriptionPrevious value: -"Filter expression. Leave empty for all pending tasks."New value: +"Filter expression. Same syntax as task_list. Examples: 'status:pending', '+OVERDUE', 'project:backend +bug'. Leave empty for all pending tasks."
- Changed
task_delete1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Task ID number or UUID"New value: +"Task ID number (e.g. '1') or UUID of the task to delete."
- Changed
task_denotate2 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Task ID number or UUID"New value: +"Task ID number (e.g. '1') or UUID." - changed
Input schema / properties / text / descriptionPrevious value: -"Exact annotation text to remove"New value: +"Exact annotation text to remove (case-sensitive). Must match a previously added annotation."
- Changed
task_doc_delete1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Task ID number or UUID"New value: +"Task ID number (e.g. '1') or UUID."
- Changed
task_doc_read1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Task ID number or UUID"New value: +"Task ID number (e.g. '1') or UUID."
- Changed
task_doc_write2 fields changed- changed
Input schema / properties / content / descriptionPrevious value: -"Document content (markdown)"New value: +"Document content in markdown format. Replaces any existing document on this task." - changed
Input schema / properties / id / descriptionPrevious value: -"Task ID number or UUID"New value: +"Task ID number (e.g. '1') or UUID."
- Changed
task_done1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Task ID number or UUID"New value: +"Task ID number (e.g. '1') or UUID. Task must be in pending or active status."
- Changed
task_duplicate8 fields changed- changed
Input schema / properties / agent / descriptionPrevious value: -"Agent identity"New value: +"Agent identity for the new task." - changed
Input schema / properties / description / descriptionPrevious value: -"New description (overrides original)"New value: +"New description to override the original." - changed
Input schema / properties / due / descriptionPrevious value: -"New due date"New value: +"New due date. Pass empty string to clear." - changed
Input schema / properties / extra / descriptionPrevious value: -"Additional raw attributes"New value: +"Space-separated additional attributes or +tag/-tag modifiers." - changed
Input schema / properties / id / descriptionPrevious value: -"Task ID number or UUID to duplicate"New value: +"Task ID number (e.g. '1') or UUID of the task to copy." - changed
Input schema / properties / priority / descriptionPrevious value: -"New priority"New value: +"New priority. Pass empty string to clear." - changed
Input schema / properties / project / descriptionPrevious value: -"New project"New value: +"New project. Pass empty string to clear." - changed
Input schema / properties / tags / descriptionPrevious value: -"Tags to add or remove, as comma-separated list. E.g. 'frontend,urgent' or '-old,+new'"New value: +"Tags to add (+) or remove (-). E.g. '+frontend,-old'. Applied on top of the copied tags."
- Changed
task_import1 field changed- changed
Input schema / properties / tasks / descriptionPrevious value: -"JSON array of task objects, e.g. '[{\"description\":\"My task\",\"project\":\"foo\"}]'"New value: +"JSON array of task objects. Required field: 'description'. Optional: 'project', 'tags' (string[]), 'priority' (H/M/L), 'due', 'status', 'depends' (UUID[]), 'recur', 'agent', 'uuid' (to set explicit ID). Example: '[{\"description\":\"My task\",\"project\":\"foo\",\"priority\":\"H\"}]'"
- Changed
task_info1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Task ID number or UUID"New value: +"Task ID number (e.g. '1') or UUID. Returns an error if no task matches."
- Changed
task_list1 field changed- changed
Input schema / properties / filter / descriptionPrevious value: -"Filter expression. Leave empty for all pending tasks."New value: +"Filter expression to match tasks. Examples: 'status:pending', 'project:backend +bug', 'due.before:tomorrow', '+OVERDUE', '+BLOCKED', 'priority:H', 'agent:explorer'. Combine with 'and'/'or' and parentheses. Leave empty for all pending tasks."
- Changed
task_log6 fields changed- changed
Input schema / properties / agent / descriptionPrevious value: -"Agent identity"New value: +"Agent identity that completed the work." - changed
Input schema / properties / description / descriptionPrevious value: -"Task description text"New value: +"Description of the completed work (required, max 500 chars)." - changed
Input schema / properties / extra / descriptionPrevious value: -"Additional raw attributes"New value: +"Space-separated additional attributes or +tag modifiers." - changed
Input schema / properties / priority / descriptionPrevious value: -"Priority: H/M/L"New value: +"Priority: H (high), M (medium), L (low)." - changed
Input schema / properties / project / descriptionPrevious value: -"Project name"New value: +"Project name for grouping." - changed
Input schema / properties / tags / descriptionPrevious value: -"Tags to apply, as comma-separated list. E.g. 'done,reviewed'"New value: +"Tags as comma-separated list. E.g. 'done,reviewed'"
- Changed
task_modify13 fields changed- changed
Input schema / properties / agent / descriptionPrevious value: -"Agent identity, e.g. 'explorer', 'planner', 'reviewer'"New value: +"Agent identity. Pass empty string to unassign." - changed
Input schema / properties / depends / descriptionPrevious value: -"New dependency UUIDs"New value: +"New dependency UUIDs (comma-separated). Replaces existing dependencies. Pass empty string to clear." - changed
Input schema / properties / description / descriptionPrevious value: -"New description text"New value: +"New description text (max 500 chars). Only set if you want to change it." - changed
Input schema / properties / due / descriptionPrevious value: -"New due date"New value: +"New due date. Accepts ISO dates, relative ('3d'), named ('friday', 'eow'). Pass empty string to clear." - changed
Input schema / properties / extra / descriptionPrevious value: -"Additional raw attributes"New value: +"Space-separated additional attributes or +tag/-tag modifiers." - changed
Input schema / properties / filter / descriptionPrevious value: -"Filter to select tasks to modify (ID, UUID, or filter expression)"New value: +"Filter to select tasks. Can be a numeric ID ('1'), UUID, or filter expression ('project:backend priority:H'). Matches may update multiple tasks." - changed
Input schema / properties / priority / descriptionPrevious value: -"New priority (empty string to clear)"New value: +"New priority. Pass empty string to clear priority entirely." - changed
Input schema / properties / project / descriptionPrevious value: -"New project name"New value: +"New project name. Pass empty string to clear." - changed
Input schema / properties / recur / descriptionPrevious value: -"New recurrence frequency"New value: +"New recurrence pattern ('daily', 'weekly', '3d', etc). Pass empty string to clear." - changed
Input schema / properties / scheduled / descriptionPrevious value: -"New scheduled date"New value: +"New scheduled start date. Pass empty string to clear." - changed
Input schema / properties / tags / descriptionPrevious value: -"Tags to add (+) or remove (-), as comma-separated list. E.g. 'frontend,urgent' or '-old,+new'"New value: +"Tags to add (+) or remove (-). E.g. '+frontend,+urgent' or '-old,+new'. Prefix with + to add, - to remove. Without prefix, tags are added." - changed
Input schema / properties / until / descriptionPrevious value: -"End date for recurrence — no instances generated past this date, e.g. '2026-12-31'"New value: +"End date for recurrence. Pass empty string to clear." - changed
Input schema / properties / wait / descriptionPrevious value: -"New wait date"New value: +"New wait date. Task hidden from default views until this date. Pass empty string to clear."
- Changed
task_purge1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Task ID number or UUID of a deleted task"New value: +"Task ID number (e.g. '1') or UUID. Task must be in 'deleted' status."
- Changed
task_start1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Task ID number or UUID"New value: +"Task ID number (e.g. '1') or UUID. Task must be in pending status."
- Changed
task_stop1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Task ID number or UUID"New value: +"Task ID number (e.g. '1') or UUID. Task must be currently active (started)."
24 tool updates
v1.4.0- First observed
task_add - First observed
task_annotate - First observed
task_archive - First observed
task_archive_list - First observed
task_archive_load - First observed
task_count - First observed
task_delete - First observed
task_denotate - First observed
task_doc_delete - First observed
task_doc_read - First observed
task_doc_write - First observed
task_done - First observed
task_duplicate - First observed
task_import - First observed
task_info - First observed
task_list - First observed
task_log - First observed
task_modify - First observed
task_projects - First observed
task_purge - First observed
task_start - First observed
task_stop - First observed
task_tags - First observed
task_undo
TDQS
Each tool has a distinct, clearly separated purpose with explicit cross-references in descriptions (e.g., 'use task_log instead', 'use task_doc_write instead'). No overlapping functionality—CRUD, lifecycle, archival, and document operations are cleanly partitioned.
Strict snake_case convention with consistent 'task_' prefix. Sub-resources follow predictable patterns (task_doc_read/write/delete, task_archive_list/load). Verbs are clear and consistently placed (task_add, task_delete, task_modify).
24 tools is above the typical ideal range but justified by the domain complexity. The set covers full task lifecycle, document attachments, archival management, annotations, and discovery without redundancy. Each tool earns its place for a comprehensive backlog system.
Excellent coverage of CRUD, status workflow (start/stop/done), soft-delete with purge, annotations, document attachments, and archival. Minor gap: archived tasks are view-only with no restore-to-active operation, though this appears to be an intentional cold-storage design.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Persistent AI memory shared across Claude, ChatGPT, coding agents, and compatible MCP clients.
Persistent context for Claude. Your AI always knows your projects and next actions across sessions.
AI-native Kanban board — connect Claude to claim, work and move your tasks over MCP.
- mcpOAuthai.butlerbrain
Persistent memory for AI assistants. Save once; recall from Claude, ChatGPT, or any MCP client.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAI-native project management with persistent memory for coding agents. 17 MCP tools for features, stories, sprints, architecture decisions, knowledge base, and session tracking.3MIT
- AlicenseAqualityBmaintenancePersistent memory and task board for Claude Code. 14 tools spanning projects, tasks, sessions, and activity logs — backed by Firestore, runs on the free tier. Handoff notes survive context compaction; the next session reads the last handoff and picks up where you stopped.14MIT
- AlicenseNot gradedqualityDmaintenanceA comprehensive project management and workflow tracking system that integrates with Claude Code via MCP, automatically capturing sessions, tools, agents, and project tasks into a centralized dashboard and database.20MIT
- FlicenseNot gradedqualityDmaintenanceMCP server for project planning inside Claude. It tracks progress, knows your codebase, and resumes exactly where you left off every session.145-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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