loading…
Search for a command to run...
loading…
A Jira-like project tracker MCP server for AI agents. SQLite-backed, per-project scoped, with full hierarchy and activity logging — so LLMs never lose track. No
A Jira-like project tracker MCP server for AI agents. SQLite-backed, per-project scoped, with full hierarchy and activity logging — so LLMs never lose track. No more scattered markdown files. saga-mcp gives your AI assistant a structured database to track projects, epics, tasks, subtasks, notes, and decisions across sessions.
A Jira-like project tracker MCP server for AI agents. SQLite-backed, per-project scoped, with full hierarchy and activity logging — so LLMs never lose track.
No more scattered markdown files. saga-mcp gives your AI assistant a structured database to track projects, epics, tasks, subtasks, notes, and decisions across sessions.
{variable} substitution.tracker.db file per project — zero setup, no external databaseAdd to your project's .mcp.json:
{
"mcpServers": {
"saga": {
"command": "npx",
"args": ["-y", "saga-mcp"],
"env": {
"DB_PATH": "/absolute/path/to/your/project/.tracker.db"
}
}
}
}
Add to your Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"saga": {
"command": "npx",
"args": ["-y", "saga-mcp"],
"env": {
"DB_PATH": "/absolute/path/to/your/project/.tracker.db"
}
}
}
}
npm install -g saga-mcp
DB_PATH=./my-project/.tracker.db saga-mcp
saga-mcp requires a single environment variable:
| Variable | Required | Description |
|---|---|---|
DB_PATH |
Yes | Absolute path to the .tracker.db SQLite file. The file and schema are auto-created on first use. |
No API keys, no accounts, no external services. Everything is stored locally in the SQLite file you specify.
| Tool | Description | Annotations |
|---|---|---|
tracker_init |
Initialize tracker and create first project | readOnly: false, idempotent: true |
tracker_dashboard |
Full project overview with natural language summary | readOnly: true |
| Tool | Description | Annotations |
|---|---|---|
project_create |
Create a new project | readOnly: false |
project_list |
List projects with completion stats | readOnly: true |
project_update |
Update project (archive to soft-delete) | readOnly: false, idempotent: true |
| Tool | Description | Annotations |
|---|---|---|
epic_create |
Create an epic within a project | readOnly: false |
epic_list |
List epics with task counts | readOnly: true |
epic_update |
Update an epic | readOnly: false, idempotent: true |
| Tool | Description | Annotations |
|---|---|---|
task_create |
Create a task with optional dependencies | readOnly: false |
task_list |
List/filter tasks with dependency info | readOnly: true |
task_get |
Get task with subtasks, notes, comments, and dependencies | readOnly: true |
task_update |
Update task (auto-logs, auto-blocks/unblocks) | readOnly: false, idempotent: true |
task_batch_update |
Update multiple tasks at once | readOnly: false, idempotent: true |
| Tool | Description | Annotations |
|---|---|---|
subtask_create |
Create subtask(s) — supports batch | readOnly: false |
subtask_update |
Update subtask title/status | readOnly: false, idempotent: true |
subtask_delete |
Delete subtask(s) — supports batch | destructive: true, idempotent: true |
| Tool | Description | Annotations |
|---|---|---|
comment_add |
Add a comment to a task (threaded discussion) | readOnly: false |
comment_list |
List all comments on a task | readOnly: true |
| Tool | Description | Annotations |
|---|---|---|
template_create |
Create a reusable task template with {variable} placeholders |
readOnly: false |
template_list |
List available templates | readOnly: true |
template_apply |
Apply template to create tasks with variable substitution | readOnly: false |
template_delete |
Delete a template | destructive: true, idempotent: true |
| Tool | Description | Annotations |
|---|---|---|
note_save |
Create or update a note (upsert) | readOnly: false |
note_list |
List notes with filters | readOnly: true |
note_search |
Full-text search across notes | readOnly: true |
note_delete |
Delete a note | destructive: true, idempotent: true |
| Tool | Description | Annotations |
|---|---|---|
tracker_search |
Cross-entity search (projects, epics, tasks, notes) | readOnly: true |
activity_log |
View change history with filters | readOnly: true |
tracker_session_diff |
Show what changed since a given timestamp — call at session start | readOnly: true |
| Tool | Description | Annotations |
|---|---|---|
tracker_export |
Export full project as nested JSON (includes dependencies and comments) | readOnly: true |
tracker_import |
Import project from JSON (matching export format) | readOnly: false |
User prompt: "Set up tracking for my new e-commerce API project"
Tool calls:
tracker_init({ project_name: "E-Commerce API", project_description: "REST API for online store" })
epic_create({ project_id: 1, name: "Authentication", priority: "high" })
task_create({ epic_id: 1, title: "Design auth schema", priority: "critical" })
task_create({ epic_id: 1, title: "Implement JWT auth", priority: "high", depends_on: [1] })
task_create({ epic_id: 1, title: "Add OAuth2 Google login", priority: "medium", depends_on: [2] })
Result: Task 2 and 3 are auto-blocked because their dependencies aren't done yet. When task 1 is marked done, task 2 auto-unblocks.
Tool calls:
tracker_dashboard({})
Response includes a natural language summary:
"E-Commerce API: 5 tasks across 2 epics. 40% complete. Active: Authentication (2/3 done). Next up: Product Catalog (2 tasks). 1 blocked task(s)."
Plus the full structured data (stats, epics, blocked tasks, overdue tasks, activity, notes).
Create a template:
template_create({
name: "feature_workflow",
description: "Standard feature implementation",
tasks: [
{ "title": "Design {feature} API", "priority": "critical", "estimated_hours": 2 },
{ "title": "Implement {feature}", "priority": "high", "estimated_hours": 8 },
{ "title": "Write tests for {feature}", "priority": "high", "estimated_hours": 4 },
{ "title": "Document {feature}", "priority": "medium", "estimated_hours": 1 }
]
})
Apply it:
template_apply({ template_id: 1, epic_id: 2, variables: { "feature": "user auth" } })
Creates 4 tasks: "Design user auth API", "Implement user auth", "Write tests for user auth", "Document user auth".
comment_add({ task_id: 5, content: "Investigated root cause: CORS headers missing on preflight" })
comment_add({ task_id: 5, content: "Fixed by adding OPTIONS handler. Tested with curl." })
task_update({ id: 5, status: "done" })
Comments persist across sessions — next time an agent calls task_get(5), it sees the full discussion thread.
saga-mcp stores everything in a single SQLite file (.tracker.db) per project. The database is auto-created on first use with all tables and indexes — no migration step needed.
Project
└── Epic (feature/workstream)
└── Task (unit of work)
├── Subtask (checklist item)
├── Comment (discussion thread)
└── Dependencies (blocked by other tasks)
Tasks can depend on other tasks. When you set depends_on: [2, 3] on a task:
donedone, downstream tasks are re-evaluatedtodoNotes replace scattered markdown files. Each note has a type:
| Type | Use case |
|---|---|
general |
Free-form notes |
decision |
Architecture/design decisions |
context |
Conversation context for future sessions |
meeting |
Meeting notes |
technical |
Technical details, specs |
blocker |
Blockers and issues |
progress |
Progress updates |
release |
Release notes |
Every create, update, and delete is automatically recorded:
{
"summary": "Task 'Fix CORS issue' status: blocked -> done",
"action": "status_changed",
"entity_type": "task",
"entity_id": 15,
"field_name": "status",
"old_value": "blocked",
"new_value": "done",
"created_at": "2026-02-21T18:30:00"
}
saga-mcp is a fully local, offline tool. It does not:
All data is stored exclusively in the local SQLite file specified by DB_PATH. You own your data completely. Uninstalling saga-mcp and deleting the .tracker.db file removes all traces.
For questions about privacy, open an issue at https://github.com/spranab/saga-mcp/issues.
git clone https://github.com/spranab/saga-mcp.git
cd saga-mcp
npm install
npm run build
DB_PATH=./test.db npm start
MIT
Run in your terminal:
claude mcp add saga-mcp -- npx Yes, Saga MCP is free — one-click install via Unyly at no cost.
No, Saga runs without API keys or environment variables.
Self-hosted: the server runs locally on your machine via the install command above.
Open Saga on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Query your database in natural language
by AnthropicA universal database MCP server supporting simultaneous connections to multiple databases. It provides tools for database operations, health analysis, SQL optim
by wenb1n-devThis server enables interaction with PostgreSQL databases through the Model Context Protocol, optimized for the AWS Bedrock AgentCore Runtime. It provides tools
by madhurprashRead-only database access with schema inspection.
by modelcontextprotocolNot sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All data MCPs