Saga
FreeMaintainedA 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
About
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.
README
Your coding agent loses the plan between sessions. You come back tomorrow and
it has no idea which of the five things you agreed on are done, which one is
blocked on which, or why you rejected the second approach — because the plan
lived in the context window, or in a TODO.md nobody updates.
saga-mcp gives the agent a real tracker instead: a SQLite file in your project holding projects, epics, tasks, subtasks, dependencies, comments, notes and decisions, exposed as 31 MCP tools. The agent writes to it as it works and reads the dashboard when it comes back. No accounts, no external service, no network calls — the database is a file you own.
Install (60 seconds)
Claude Code — add to your project's .mcp.json:
{
"mcpServers": {
"saga": {
"command": "npx",
"args": ["-y", "saga-mcp"],
"env": { "DB_PATH": "/absolute/path/to/your/project/.tracker.db" }
}
}
}
Restart the client. DB_PATH is the only setting; the file and schema are
created on first use.
What it looks like
You: "Set up tracking for the e-commerce API and plan out auth."
tracker_init({ project_name: "E-Commerce API" })
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", depends_on: [1] })
task_create({ epic_id: 1, title: "Add OAuth2 Google login", depends_on: [2] })
Tasks 2 and 3 come back blocked — their dependencies aren't done. Finish task 1 and task 2 unblocks itself.
Next session, you: "Where were we?"
tracker_dashboard({})
→ "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 structured data behind it: stats, epics, blocked and overdue tasks, recent activity, notes.
Features
- Full hierarchy: Projects > Epics > Tasks > Subtasks
- Task dependencies: Express sequencing with auto-block/unblock when deps are met
- Comments: Threaded discussions on tasks — leave breadcrumbs across sessions
- Templates: Reusable task sets with
{variable}substitution - Dashboard: One tool call gives full overview with natural language summary
- SQLite: Self-contained
.tracker.dbfile per project — zero setup, no external database - Activity log: Every mutation is automatically tracked with old/new values
- Notes system: Decisions, context, meeting notes, blockers — all searchable
- Batch operations: Create multiple subtasks or update multiple tasks in one call
- 31 focused tools: With MCP safety annotations on every tool
- Import/export: Full project backup and migration as JSON (with dependencies and comments)
- Source references: Link tasks to specific code locations
- Auto time tracking: Hours computed automatically from activity log
- Cross-platform: Works on macOS, Windows, and Linux
Other clients
Claude Code
Add to your project's .mcp.json:
{
"mcpServers": {
"saga": {
"command": "npx",
"args": ["-y", "saga-mcp"],
"env": {
"DB_PATH": "/absolute/path/to/your/project/.tracker.db"
}
}
}
}
With Claude Desktop
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"
}
}
}
}
Manual install
npm install -g saga-mcp
DB_PATH=./my-project/.tracker.db saga-mcp
Configuration
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.
Tools
Getting Started
| 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 |
Projects
| 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 |
Epics
| 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 |
Tasks
| 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 |
Subtasks
| 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 |
Comments
| 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 |
Templates
| 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 |
Notes
| 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 |
Intelligence
| 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 |
Import / Export
| 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 |
Usage Examples
Example 1: Starting a project with dependencies
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.
Example 2: Resuming work with dashboard summary
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).
Example 3: Using templates for repeated workflows
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".
Example 4: Task comments as decision trail
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.
How It Works
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.
Hierarchy
Project
└── Epic (feature/workstream)
└── Task (unit of work)
├── Subtask (checklist item)
├── Comment (discussion thread)
└── Dependencies (blocked by other tasks)
Task Dependencies
Tasks can depend on other tasks. When you set depends_on: [2, 3] on a task:
- The task is auto-blocked if any dependency isn't
done - When a dependency is marked
done, downstream tasks are re-evaluated - If all dependencies are met, the blocked task auto-unblocks to
todo
Note Types
Notes 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 |
Activity Log
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"
}
Privacy Policy
saga-mcp is a fully local, offline tool. It does not:
- Collect any user data
- Send any data to external servers
- Require internet access after installation
- Use analytics, telemetry, or tracking of any kind
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.
Development
git clone https://github.com/spranab/saga-mcp.git
cd saga-mcp
npm install
npm run build
DB_PATH=./test.db npm start
Support
- Issues: https://github.com/spranab/saga-mcp/issues
- Repository: https://github.com/spranab/saga-mcp
Related projects
Part of a set of agent infrastructure built by one person, meant to be used together:
- yantrikdb-mcp — persistent cognitive memory for the same agent: what it learned, not what it planned.
- brainstorm-mcp — multi-model debate before you commit a plan to the tracker.
- swarmcode — real-time channel between Claude Code instances on different machines.
- truenas-mcp — 278 TrueNAS SCALE actions behind one hierarchical tool.
- mcpier — self-hosted MCP control plane that keeps API keys off your clients.
License
MIT
Install Saga in Claude Desktop, Claude Code & Cursor
unyly install saga-mcpInstalls into Claude Desktop, Claude Code, Cursor & VS Code — handles npx, uvx and build-from-source repos for you.
First time? Get the CLI: curl -fsSL https://unyly.org/install | sh
Or configure manually
Run in your terminal:
claude mcp add saga-mcp --env DB_PATH="" -- npx -y saga-mcpStep-by-step: how to install Saga
FAQ
Is Saga MCP free?
Yes, Saga MCP is free — one-click install via Unyly at no cost.
Does Saga need an API key?
Yes, it requires environment variables: DB_PATH. Unyly injects them into the config during install.
Is Saga hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Saga in Claude Desktop, Claude Code or Cursor?
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.
Changes
Versions and requested access over time.
- New version published
- New version published
Related MCPs
wenb1n-dev/SmartDB_MCP
A universal database MCP server supporting simultaneous connections to multiple databases. It provides tools for database operations, health analysis, SQL optim
by wenb1n-devPostgres Server
This server enables interaction with PostgreSQL databases through the Model Context Protocol, optimized for the AWS Bedrock AgentCore Runtime. It provides tools
by madhurprashPostgres
Query your database in natural language
by AnthropicPostgreSQL
Read-only database access with schema inspection.
by modelcontextprotocolRedis
Interact with Redis key-value stores.
by modelcontextprotocolSQLite
Database interaction and business intelligence capabilities.
by modelcontextprotocolmxcp
Open-source framework for building enterprise-grade MCP servers using just YAML, SQL, and Python, with built-in auth, monitoring, ETL and policy enforcement.
by raw-labstadas-github/a2asearch-mcp
MCP server to search 4,800+ MCP servers, AI agents, CLI tools and agent skills. Install: npx -y a2asearch-mcp. Ask Claude: "Find MCP servers for database access
by tadas-githubjulien040/anyquery
Query more than 40 apps with one binary using SQL. It can also connect to your PostgreSQL, MySQL, or SQLite compatible database. Local-first and private by desi
by julien040drakonkat/wizzy-mcp-tmdb
A MCP server for The Movie Database API that enables AI assistants to search and retrieve movie, TV show, and person information.
by drakonkatCompare Saga with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All data MCPs
