saga-mcp 1.1.0 → 1.2.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.
Files changed (3) hide show
  1. package/README.md +137 -41
  2. package/manifest.json +80 -0
  3. package/package.json +3 -2
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
+ - **22 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,147 @@ 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
+
132
+ ## Usage Examples
133
+
134
+ ### Example 1: Starting a new project
135
+
136
+ **User prompt:** "Set up tracking for my new e-commerce API project"
137
+
138
+ **Tool calls:**
139
+ ```
140
+ tracker_init({ project_name: "E-Commerce API", project_description: "REST API for online store" })
141
+ epic_create({ project_id: 1, name: "Authentication", priority: "high" })
142
+ epic_create({ project_id: 1, name: "Product Catalog", priority: "medium" })
143
+ task_create({ epic_id: 1, title: "Implement JWT auth", priority: "high" })
144
+ task_create({ epic_id: 1, title: "Add OAuth2 Google login", priority: "medium" })
145
+ subtask_create({ task_id: 1, titles: ["Set up JWT library", "Create login endpoint", "Create refresh endpoint", "Add middleware"] })
146
+ ```
147
+
148
+ **Expected output:** Project created with ID 1, two epics, two tasks, and four subtasks. Activity log records all creations.
149
+
150
+ ### Example 2: Resuming work on an existing project
151
+
152
+ **User prompt:** "What's the current status of my project? What should I work on next?"
153
+
154
+ **Tool calls:**
155
+ ```
156
+ tracker_dashboard({})
157
+ ```
158
+
159
+ **Expected output:**
160
+ ```json
161
+ {
162
+ "project": { "id": 1, "name": "E-Commerce API", "status": "active" },
163
+ "stats": {
164
+ "total_epics": 2,
165
+ "total_tasks": 5,
166
+ "tasks_done": 2,
167
+ "tasks_in_progress": 1,
168
+ "tasks_blocked": 1,
169
+ "tasks_todo": 1,
170
+ "completion_pct": 40.0
171
+ },
172
+ "epics": [
173
+ { "name": "Authentication", "task_count": 3, "done_count": 2, "completion_pct": 66.7 },
174
+ { "name": "Product Catalog", "task_count": 2, "done_count": 0, "completion_pct": 0 }
175
+ ],
176
+ "blocked_tasks": [
177
+ { "id": 4, "title": "Add rate limiting", "epic_name": "Authentication" }
178
+ ],
179
+ "recent_activity": [...],
180
+ "recent_notes": [...]
181
+ }
182
+ ```
183
+
184
+ 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.
185
+
186
+ ### Example 3: Recording a decision and marking tasks done
187
+
188
+ **User prompt:** "We decided to use Redis for caching. Mark the caching research tasks as done."
189
+
190
+ **Tool calls:**
191
+ ```
192
+ note_save({
193
+ title: "Decision: Use Redis for caching",
194
+ 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.",
195
+ note_type: "decision",
196
+ related_entity_type: "epic",
197
+ related_entity_id: 3,
198
+ tags: ["caching", "infrastructure"]
199
+ })
200
+ task_batch_update({ ids: [8, 9], status: "done" })
201
+ ```
202
+
203
+ **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
204
 
121
205
  ## How It Works
122
206
 
@@ -163,11 +247,18 @@ Every create, update, and delete is automatically recorded:
163
247
  }
164
248
  ```
165
249
 
166
- ## Environment Variables
250
+ ## Privacy Policy
167
251
 
168
- | Variable | Required | Description |
169
- |----------|----------|-------------|
170
- | `DB_PATH` | Yes | Absolute path to the `.tracker.db` file |
252
+ saga-mcp is a fully local, offline tool. It does **not**:
253
+
254
+ - Collect any user data
255
+ - Send any data to external servers
256
+ - Require internet access after installation
257
+ - Use analytics, telemetry, or tracking of any kind
258
+
259
+ 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.
260
+
261
+ For questions about privacy, open an issue at https://github.com/spranab/saga-mcp/issues.
171
262
 
172
263
  ## Development
173
264
 
@@ -179,6 +270,11 @@ npm run build
179
270
  DB_PATH=./test.db npm start
180
271
  ```
181
272
 
273
+ ## Support
274
+
275
+ - **Issues**: https://github.com/spranab/saga-mcp/issues
276
+ - **Repository**: https://github.com/spranab/saga-mcp
277
+
182
278
  ## License
183
279
 
184
280
  MIT
package/manifest.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "manifest_version": "0.3",
3
+ "name": "saga-mcp",
4
+ "display_name": "Saga — Project Tracker for AI Agents",
5
+ "version": "1.1.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- 22 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
+ ],
66
+ "compatibility": {
67
+ "platforms": ["darwin", "win32", "linux"],
68
+ "runtimes": {
69
+ "node": ">=18.0.0"
70
+ }
71
+ },
72
+ "user_config": {
73
+ "db_path": {
74
+ "type": "file",
75
+ "title": "Database Path",
76
+ "description": "Path to the .tracker.db SQLite file. The file and schema are auto-created on first use.",
77
+ "required": true
78
+ }
79
+ }
80
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "saga-mcp",
3
- "version": "1.1.0",
3
+ "version": "1.2.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",