saga-mcp 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,7 +12,8 @@ A Jira-like project tracker MCP server for AI agents. SQLite-backed, per-project
12
12
  - **Dashboard**: One tool call gives full project overview (stats, blocked tasks, recent changes)
13
13
  - **Notes system**: Decisions, context, meeting notes, blockers — all searchable
14
14
  - **Batch operations**: Create multiple subtasks or update multiple tasks in one call
15
- - **22 focused tools**: Reduced from typical 38+ by combining related operations
15
+ - **23 focused tools**: With MCP safety annotations on every tool
16
+ - **Cross-platform**: Works on macOS, Windows, and Linux
16
17
 
17
18
  ## Quick Start
18
19
 
@@ -59,64 +60,148 @@ npm install -g saga-mcp
59
60
  DB_PATH=./my-project/.tracker.db saga-mcp
60
61
  ```
61
62
 
63
+ ## Configuration
64
+
65
+ saga-mcp requires a single environment variable:
66
+
67
+ | Variable | Required | Description |
68
+ |----------|----------|-------------|
69
+ | `DB_PATH` | Yes | Absolute path to the `.tracker.db` SQLite file. The file and schema are auto-created on first use. |
70
+
71
+ No API keys, no accounts, no external services. Everything is stored locally in the SQLite file you specify.
72
+
62
73
  ## Tools
63
74
 
64
75
  ### Getting Started
65
76
 
66
- | Tool | Description |
67
- |------|-------------|
68
- | `tracker_init` | Initialize tracker and create first project |
69
- | `tracker_dashboard` | Full project overview — **call this first when resuming work** |
77
+ | Tool | Description | Annotations |
78
+ |------|-------------|-------------|
79
+ | `tracker_init` | Initialize tracker and create first project | `readOnly: false`, `idempotent: true` |
80
+ | `tracker_dashboard` | Full project overview — **call this first when resuming work** | `readOnly: true` |
70
81
 
71
82
  ### Projects
72
83
 
73
- | Tool | Description |
74
- |------|-------------|
75
- | `project_create` | Create a new project |
76
- | `project_list` | List projects with completion stats |
77
- | `project_update` | Update project (archive to soft-delete) |
84
+ | Tool | Description | Annotations |
85
+ |------|-------------|-------------|
86
+ | `project_create` | Create a new project | `readOnly: false` |
87
+ | `project_list` | List projects with completion stats | `readOnly: true` |
88
+ | `project_update` | Update project (archive to soft-delete) | `readOnly: false`, `idempotent: true` |
78
89
 
79
90
  ### Epics
80
91
 
81
- | Tool | Description |
82
- |------|-------------|
83
- | `epic_create` | Create an epic within a project |
84
- | `epic_list` | List epics with task counts |
85
- | `epic_update` | Update an epic |
92
+ | Tool | Description | Annotations |
93
+ |------|-------------|-------------|
94
+ | `epic_create` | Create an epic within a project | `readOnly: false` |
95
+ | `epic_list` | List epics with task counts | `readOnly: true` |
96
+ | `epic_update` | Update an epic | `readOnly: false`, `idempotent: true` |
86
97
 
87
98
  ### Tasks
88
99
 
89
- | Tool | Description |
90
- |------|-------------|
91
- | `task_create` | Create a task within an epic |
92
- | `task_list` | List/filter tasks (by epic, status, priority, assignee, tag) |
93
- | `task_get` | Get task with subtasks and related notes |
94
- | `task_update` | Update task (status changes auto-logged) |
95
- | `task_batch_update` | Update multiple tasks at once |
100
+ | Tool | Description | Annotations |
101
+ |------|-------------|-------------|
102
+ | `task_create` | Create a task within an epic | `readOnly: false` |
103
+ | `task_list` | List/filter tasks (by epic, status, priority, assignee, tag) | `readOnly: true` |
104
+ | `task_get` | Get task with subtasks and related notes | `readOnly: true` |
105
+ | `task_update` | Update task (status changes auto-logged) | `readOnly: false`, `idempotent: true` |
106
+ | `task_batch_update` | Update multiple tasks at once | `readOnly: false`, `idempotent: true` |
96
107
 
97
108
  ### Subtasks
98
109
 
99
- | Tool | Description |
100
- |------|-------------|
101
- | `subtask_create` | Create subtask(s) — supports batch |
102
- | `subtask_update` | Update subtask title/status |
103
- | `subtask_delete` | Delete subtask(s) — supports batch |
110
+ | Tool | Description | Annotations |
111
+ |------|-------------|-------------|
112
+ | `subtask_create` | Create subtask(s) — supports batch | `readOnly: false` |
113
+ | `subtask_update` | Update subtask title/status | `readOnly: false`, `idempotent: true` |
114
+ | `subtask_delete` | Delete subtask(s) — supports batch | `destructive: true`, `idempotent: true` |
104
115
 
105
116
  ### Notes
106
117
 
107
- | Tool | Description |
108
- |------|-------------|
109
- | `note_save` | Create or update a note (upsert) |
110
- | `note_list` | List notes with filters |
111
- | `note_search` | Full-text search across notes |
112
- | `note_delete` | Delete a note |
118
+ | Tool | Description | Annotations |
119
+ |------|-------------|-------------|
120
+ | `note_save` | Create or update a note (upsert) | `readOnly: false` |
121
+ | `note_list` | List notes with filters | `readOnly: true` |
122
+ | `note_search` | Full-text search across notes | `readOnly: true` |
123
+ | `note_delete` | Delete a note | `destructive: true`, `idempotent: true` |
113
124
 
114
125
  ### Intelligence
115
126
 
116
- | Tool | Description |
117
- |------|-------------|
118
- | `tracker_search` | Cross-entity search (projects, epics, tasks, notes) |
119
- | `activity_log` | View change history with filters |
127
+ | Tool | Description | Annotations |
128
+ |------|-------------|-------------|
129
+ | `tracker_search` | Cross-entity search (projects, epics, tasks, notes) | `readOnly: true` |
130
+ | `activity_log` | View change history with filters | `readOnly: true` |
131
+ | `tracker_session_diff` | Show what changed since a given timestamp — call at session start | `readOnly: true` |
132
+
133
+ ## Usage Examples
134
+
135
+ ### Example 1: Starting a new project
136
+
137
+ **User prompt:** "Set up tracking for my new e-commerce API project"
138
+
139
+ **Tool calls:**
140
+ ```
141
+ tracker_init({ project_name: "E-Commerce API", project_description: "REST API for online store" })
142
+ epic_create({ project_id: 1, name: "Authentication", priority: "high" })
143
+ epic_create({ project_id: 1, name: "Product Catalog", priority: "medium" })
144
+ task_create({ epic_id: 1, title: "Implement JWT auth", priority: "high" })
145
+ task_create({ epic_id: 1, title: "Add OAuth2 Google login", priority: "medium" })
146
+ subtask_create({ task_id: 1, titles: ["Set up JWT library", "Create login endpoint", "Create refresh endpoint", "Add middleware"] })
147
+ ```
148
+
149
+ **Expected output:** Project created with ID 1, two epics, two tasks, and four subtasks. Activity log records all creations.
150
+
151
+ ### Example 2: Resuming work on an existing project
152
+
153
+ **User prompt:** "What's the current status of my project? What should I work on next?"
154
+
155
+ **Tool calls:**
156
+ ```
157
+ tracker_dashboard({})
158
+ ```
159
+
160
+ **Expected output:**
161
+ ```json
162
+ {
163
+ "project": { "id": 1, "name": "E-Commerce API", "status": "active" },
164
+ "stats": {
165
+ "total_epics": 2,
166
+ "total_tasks": 5,
167
+ "tasks_done": 2,
168
+ "tasks_in_progress": 1,
169
+ "tasks_blocked": 1,
170
+ "tasks_todo": 1,
171
+ "completion_pct": 40.0
172
+ },
173
+ "epics": [
174
+ { "name": "Authentication", "task_count": 3, "done_count": 2, "completion_pct": 66.7 },
175
+ { "name": "Product Catalog", "task_count": 2, "done_count": 0, "completion_pct": 0 }
176
+ ],
177
+ "blocked_tasks": [
178
+ { "id": 4, "title": "Add rate limiting", "epic_name": "Authentication" }
179
+ ],
180
+ "recent_activity": [...],
181
+ "recent_notes": [...]
182
+ }
183
+ ```
184
+
185
+ The dashboard immediately shows: 40% done, 1 blocked task in Auth, Product Catalog hasn't started. The LLM can now prioritize unblocking the rate limiting task or starting on the catalog.
186
+
187
+ ### Example 3: Recording a decision and marking tasks done
188
+
189
+ **User prompt:** "We decided to use Redis for caching. Mark the caching research tasks as done."
190
+
191
+ **Tool calls:**
192
+ ```
193
+ note_save({
194
+ title: "Decision: Use Redis for caching",
195
+ content: "After evaluating Redis vs Memcached vs in-memory, decided on Redis.\n\nReasons:\n- Built-in persistence\n- Pub/sub for cache invalidation\n- Better data structure support\n\nTrade-offs: Extra infrastructure, but managed Redis on AWS is acceptable.",
196
+ note_type: "decision",
197
+ related_entity_type: "epic",
198
+ related_entity_id: 3,
199
+ tags: ["caching", "infrastructure"]
200
+ })
201
+ task_batch_update({ ids: [8, 9], status: "done" })
202
+ ```
203
+
204
+ **Expected output:** Decision note created with ID, linked to the epic. Tasks 8 and 9 marked as done. Activity log records both the note creation and the status changes with "status: todo -> done" entries.
120
205
 
121
206
  ## How It Works
122
207
 
@@ -163,11 +248,18 @@ Every create, update, and delete is automatically recorded:
163
248
  }
164
249
  ```
165
250
 
166
- ## Environment Variables
251
+ ## Privacy Policy
167
252
 
168
- | Variable | Required | Description |
169
- |----------|----------|-------------|
170
- | `DB_PATH` | Yes | Absolute path to the `.tracker.db` file |
253
+ saga-mcp is a fully local, offline tool. It does **not**:
254
+
255
+ - Collect any user data
256
+ - Send any data to external servers
257
+ - Require internet access after installation
258
+ - Use analytics, telemetry, or tracking of any kind
259
+
260
+ 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.
261
+
262
+ For questions about privacy, open an issue at https://github.com/spranab/saga-mcp/issues.
171
263
 
172
264
  ## Development
173
265
 
@@ -179,6 +271,11 @@ npm run build
179
271
  DB_PATH=./test.db npm start
180
272
  ```
181
273
 
274
+ ## Support
275
+
276
+ - **Issues**: https://github.com/spranab/saga-mcp/issues
277
+ - **Repository**: https://github.com/spranab/saga-mcp
278
+
182
279
  ## License
183
280
 
184
281
  MIT
@@ -24,6 +24,21 @@ export const definitions = [
24
24
  },
25
25
  },
26
26
  },
27
+ {
28
+ name: 'tracker_session_diff',
29
+ description: 'Show what changed since a given timestamp. Returns aggregated summary with counts by action and entity type, plus highlights of key changes. Call this at the start of a session to understand what happened since the last one.',
30
+ annotations: { title: 'Session Diff', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
31
+ inputSchema: {
32
+ type: 'object',
33
+ properties: {
34
+ since: {
35
+ type: 'string',
36
+ description: 'ISO 8601 datetime — show changes after this time (e.g. "2026-02-21T15:00:00")',
37
+ },
38
+ },
39
+ required: ['since'],
40
+ },
41
+ },
27
42
  {
28
43
  name: 'task_batch_update',
29
44
  description: 'Update multiple tasks at once. Useful for changing status of several tasks (e.g., mark 3 tasks as done) or reassigning tasks.',
@@ -74,6 +89,42 @@ function handleActivityLog(args) {
74
89
  params.push(limit);
75
90
  return db.prepare(sql).all(...params);
76
91
  }
92
+ function handleSessionDiff(args) {
93
+ const db = getDb();
94
+ const since = args.since;
95
+ const rows = db
96
+ .prepare('SELECT * FROM activity_log WHERE created_at >= ? ORDER BY created_at ASC')
97
+ .all(since);
98
+ const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
99
+ // Aggregate by action
100
+ const summary = { created: 0, updated: 0, status_changed: 0, deleted: 0 };
101
+ // Aggregate by entity_type -> action
102
+ const byEntity = {};
103
+ const highlights = [];
104
+ for (const row of rows) {
105
+ const action = row.action;
106
+ const entityType = row.entity_type;
107
+ summary[action] = (summary[action] ?? 0) + 1;
108
+ if (!byEntity[entityType]) {
109
+ byEntity[entityType] = { created: 0, updated: 0, status_changed: 0, deleted: 0 };
110
+ }
111
+ byEntity[entityType][action] = (byEntity[entityType][action] ?? 0) + 1;
112
+ // Pick out highlights: status changes, creates, and deletes
113
+ if (action === 'status_changed' || action === 'created' || action === 'deleted') {
114
+ if (row.summary)
115
+ highlights.push(row.summary);
116
+ }
117
+ }
118
+ return {
119
+ since,
120
+ until: now,
121
+ total_changes: rows.length,
122
+ summary,
123
+ by_entity_type: byEntity,
124
+ highlights,
125
+ activity: rows,
126
+ };
127
+ }
77
128
  function handleTaskBatchUpdate(args) {
78
129
  const db = getDb();
79
130
  const ids = args.ids;
@@ -122,6 +173,7 @@ function handleTaskBatchUpdate(args) {
122
173
  }
123
174
  export const handlers = {
124
175
  activity_log: handleActivityLog,
176
+ tracker_session_diff: handleSessionDiff,
125
177
  task_batch_update: handleTaskBatchUpdate,
126
178
  };
127
179
  //# sourceMappingURL=activity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/tools/activity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/tools/activity.ts"],"names":[],"mappings":"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"}
package/manifest.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "manifest_version": "0.3",
3
+ "name": "saga-mcp",
4
+ "display_name": "Saga — Project Tracker for AI Agents",
5
+ "version": "1.3.0",
6
+ "description": "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.",
7
+ "long_description": "Saga gives your AI assistant a structured SQLite database to track projects, epics, tasks, subtasks, notes, and decisions across sessions. No more scattered markdown files — one `tracker_dashboard` call gives full project context to resume work.\n\n**Key features:**\n- Full hierarchy: Projects > Epics > Tasks > Subtasks\n- SQLite: Self-contained `.tracker.db` file per project — zero setup\n- Activity log: Every mutation is automatically tracked\n- Dashboard: One tool call gives full project overview\n- Notes system: Decisions, context, meeting notes, blockers\n- Batch operations: Create multiple subtasks or update multiple tasks in one call\n- 23 focused tools with safety annotations",
8
+ "author": {
9
+ "name": "spranab",
10
+ "url": "https://github.com/spranab"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/spranab/saga-mcp.git"
15
+ },
16
+ "homepage": "https://github.com/spranab/saga-mcp#readme",
17
+ "documentation": "https://github.com/spranab/saga-mcp#readme",
18
+ "support": "https://github.com/spranab/saga-mcp/issues",
19
+ "keywords": [
20
+ "mcp",
21
+ "project-tracker",
22
+ "task-manager",
23
+ "sqlite",
24
+ "jira-alternative",
25
+ "ai-agent",
26
+ "llm-tools",
27
+ "model-context-protocol"
28
+ ],
29
+ "license": "MIT",
30
+ "privacy_policies": [],
31
+ "server": {
32
+ "type": "node",
33
+ "entry_point": "dist/index.js",
34
+ "mcp_config": {
35
+ "command": "node",
36
+ "args": ["${__dirname}/dist/index.js"],
37
+ "env": {
38
+ "DB_PATH": "${user_config.db_path}"
39
+ }
40
+ }
41
+ },
42
+ "tools": [
43
+ { "name": "tracker_init", "description": "Initialize tracker and create first project" },
44
+ { "name": "tracker_dashboard", "description": "Full project overview — call this first when resuming work" },
45
+ { "name": "project_create", "description": "Create a new project" },
46
+ { "name": "project_list", "description": "List projects with completion stats" },
47
+ { "name": "project_update", "description": "Update project (archive to soft-delete)" },
48
+ { "name": "epic_create", "description": "Create an epic within a project" },
49
+ { "name": "epic_list", "description": "List epics with task counts" },
50
+ { "name": "epic_update", "description": "Update an epic" },
51
+ { "name": "task_create", "description": "Create a task within an epic" },
52
+ { "name": "task_list", "description": "List/filter tasks by epic, status, priority, assignee, tag" },
53
+ { "name": "task_get", "description": "Get task with subtasks and related notes" },
54
+ { "name": "task_update", "description": "Update task (status changes auto-logged)" },
55
+ { "name": "task_batch_update", "description": "Update multiple tasks at once" },
56
+ { "name": "subtask_create", "description": "Create subtask(s) — supports batch" },
57
+ { "name": "subtask_update", "description": "Update subtask title/status" },
58
+ { "name": "subtask_delete", "description": "Delete subtask(s) — supports batch" },
59
+ { "name": "note_save", "description": "Create or update a note (upsert)" },
60
+ { "name": "note_list", "description": "List notes with filters" },
61
+ { "name": "note_search", "description": "Full-text search across notes" },
62
+ { "name": "note_delete", "description": "Delete a note" },
63
+ { "name": "tracker_search", "description": "Cross-entity search (projects, epics, tasks, notes)" },
64
+ { "name": "activity_log", "description": "View change history with filters" },
65
+ { "name": "tracker_session_diff", "description": "Show what changed since a given timestamp — call at session start" }
66
+ ],
67
+ "compatibility": {
68
+ "platforms": ["darwin", "win32", "linux"],
69
+ "runtimes": {
70
+ "node": ">=18.0.0"
71
+ }
72
+ },
73
+ "user_config": {
74
+ "db_path": {
75
+ "type": "file",
76
+ "title": "Database Path",
77
+ "description": "Path to the .tracker.db SQLite file. The file and schema are auto-created on first use.",
78
+ "required": true
79
+ }
80
+ }
81
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "saga-mcp",
3
- "version": "1.1.0",
3
+ "version": "1.3.0",
4
4
  "description": "A Jira-like project tracker MCP server for AI agents. SQLite-backed, per-project scoped, with full hierarchy (Projects > Epics > Tasks > Subtasks), activity logging, and a dashboard — so LLMs never lose track.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -9,7 +9,8 @@
9
9
  },
10
10
  "files": [
11
11
  "dist",
12
- "README.md"
12
+ "README.md",
13
+ "manifest.json"
13
14
  ],
14
15
  "scripts": {
15
16
  "build": "tsc",