@damper/mcp 0.1.6 → 0.1.8
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 +16 -1
- package/dist/index.js +103 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -74,8 +74,10 @@ The AI will see tools from both servers and can distinguish between them:
|
|
|
74
74
|
| `list_tasks` | Get roadmap tasks (filter by `status`, `type`) |
|
|
75
75
|
| `get_task` | Task details + subtasks + linked feedback |
|
|
76
76
|
| `create_task` | Create task with type (bug, feature, improvement, task) |
|
|
77
|
+
| `update_task` | Update description, plan, priority, effort, labels |
|
|
77
78
|
| `start_task` | Lock and start task (use `force` to take over) |
|
|
78
79
|
| `add_note` | Add progress note |
|
|
80
|
+
| `create_subtask` | Add subtask to a task |
|
|
79
81
|
| `update_subtask` | Mark subtask done/undone |
|
|
80
82
|
| `complete_task` | Mark done, release lock |
|
|
81
83
|
| `abandon_task` | Release lock, return to planned |
|
|
@@ -103,6 +105,17 @@ Tasks include project management fields visible in `list_tasks` and `get_task`:
|
|
|
103
105
|
- **Labels**: Custom tags
|
|
104
106
|
- **Due date**: Target completion date
|
|
105
107
|
|
|
108
|
+
### Updating Tasks
|
|
109
|
+
|
|
110
|
+
Refine task details as you work:
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
> Set priority to high for this task
|
|
114
|
+
> Update the implementation plan with what I've learned
|
|
115
|
+
> Add labels: backend, api, auth
|
|
116
|
+
> Set effort to medium
|
|
117
|
+
```
|
|
118
|
+
|
|
106
119
|
### Subtasks
|
|
107
120
|
|
|
108
121
|
Tasks can have subtasks for tracking incremental progress. Use `get_task` to see subtasks with their IDs:
|
|
@@ -113,9 +126,11 @@ Tasks can have subtasks for tracking incremental progress. Use `get_task` to see
|
|
|
113
126
|
- [ ] Implement API endpoints (id: def456)
|
|
114
127
|
```
|
|
115
128
|
|
|
116
|
-
|
|
129
|
+
Create and update subtasks as you work:
|
|
117
130
|
|
|
118
131
|
```
|
|
132
|
+
> Add a subtask "Write unit tests" to this task
|
|
133
|
+
> Create subtask for database migrations
|
|
119
134
|
> Mark the database schema subtask as done
|
|
120
135
|
> Update subtask def456 to done
|
|
121
136
|
```
|
package/dist/index.js
CHANGED
|
@@ -34,7 +34,7 @@ async function api(method, path, body) {
|
|
|
34
34
|
// Server
|
|
35
35
|
const server = new McpServer({
|
|
36
36
|
name: 'damper',
|
|
37
|
-
version: '0.1.
|
|
37
|
+
version: '0.1.8',
|
|
38
38
|
});
|
|
39
39
|
// Output schemas
|
|
40
40
|
const SubtaskProgressSchema = z.object({
|
|
@@ -62,9 +62,9 @@ const SubtaskSchema = z.object({
|
|
|
62
62
|
const TaskDetailSchema = z.object({
|
|
63
63
|
id: z.string(),
|
|
64
64
|
title: z.string(),
|
|
65
|
-
description: z.string().optional(),
|
|
65
|
+
description: z.string().nullable().optional(),
|
|
66
66
|
type: z.string(),
|
|
67
|
-
implementationPlan: z.string().optional(),
|
|
67
|
+
implementationPlan: z.string().nullable().optional(),
|
|
68
68
|
status: z.string(),
|
|
69
69
|
priority: z.string().nullable().optional(),
|
|
70
70
|
effort: z.string().nullable().optional(),
|
|
@@ -72,7 +72,7 @@ const TaskDetailSchema = z.object({
|
|
|
72
72
|
dueDate: z.string().nullable().optional(),
|
|
73
73
|
voteScore: z.number(),
|
|
74
74
|
subtasks: z.array(SubtaskSchema).optional(),
|
|
75
|
-
agentNotes: z.string().optional(),
|
|
75
|
+
agentNotes: z.string().nullable().optional(),
|
|
76
76
|
feedback: z.array(z.object({
|
|
77
77
|
id: z.string(),
|
|
78
78
|
title: z.string(),
|
|
@@ -199,6 +199,71 @@ server.registerTool('get_task', {
|
|
|
199
199
|
structuredContent: t,
|
|
200
200
|
};
|
|
201
201
|
});
|
|
202
|
+
// Tool: Update task
|
|
203
|
+
server.registerTool('update_task', {
|
|
204
|
+
title: 'Update Task',
|
|
205
|
+
description: 'Update task fields like description, implementation plan, priority, effort, or labels. ' +
|
|
206
|
+
'Useful for refining task details as you learn more about the work.',
|
|
207
|
+
inputSchema: z.object({
|
|
208
|
+
taskId: z.string().describe('Task ID'),
|
|
209
|
+
description: z.string().optional().describe('Task description'),
|
|
210
|
+
implementationPlan: z.string().optional().describe('Implementation plan (markdown)'),
|
|
211
|
+
priority: z.enum(['high', 'medium', 'low']).nullable().optional().describe('Task priority'),
|
|
212
|
+
effort: z.enum(['xs', 's', 'm', 'l', 'xl']).nullable().optional().describe('Estimated effort'),
|
|
213
|
+
labels: z.array(z.string()).optional().describe('Labels/tags'),
|
|
214
|
+
}),
|
|
215
|
+
outputSchema: z.object({
|
|
216
|
+
id: z.string(),
|
|
217
|
+
title: z.string(),
|
|
218
|
+
description: z.string().nullable().optional(),
|
|
219
|
+
implementationPlan: z.string().nullable().optional(),
|
|
220
|
+
priority: z.string().nullable().optional(),
|
|
221
|
+
effort: z.string().nullable().optional(),
|
|
222
|
+
labels: z.array(z.string()).optional(),
|
|
223
|
+
}),
|
|
224
|
+
annotations: {
|
|
225
|
+
readOnlyHint: false,
|
|
226
|
+
destructiveHint: false,
|
|
227
|
+
idempotentHint: true,
|
|
228
|
+
openWorldHint: false,
|
|
229
|
+
},
|
|
230
|
+
}, async ({ taskId, description, implementationPlan, priority, effort, labels }) => {
|
|
231
|
+
const body = {};
|
|
232
|
+
if (description !== undefined)
|
|
233
|
+
body.description = description;
|
|
234
|
+
if (implementationPlan !== undefined)
|
|
235
|
+
body.implementationPlan = implementationPlan;
|
|
236
|
+
if (priority !== undefined)
|
|
237
|
+
body.priority = priority;
|
|
238
|
+
if (effort !== undefined)
|
|
239
|
+
body.effort = effort;
|
|
240
|
+
if (labels !== undefined)
|
|
241
|
+
body.labels = labels;
|
|
242
|
+
const result = await api('PATCH', `/api/agent/tasks/${taskId}`, body);
|
|
243
|
+
const updates = [];
|
|
244
|
+
if (description !== undefined)
|
|
245
|
+
updates.push('description');
|
|
246
|
+
if (implementationPlan !== undefined)
|
|
247
|
+
updates.push('plan');
|
|
248
|
+
if (priority !== undefined)
|
|
249
|
+
updates.push(`priority=${priority || 'none'}`);
|
|
250
|
+
if (effort !== undefined)
|
|
251
|
+
updates.push(`effort=${effort || 'none'}`);
|
|
252
|
+
if (labels !== undefined)
|
|
253
|
+
updates.push(`labels=[${labels.join(', ')}]`);
|
|
254
|
+
return {
|
|
255
|
+
content: [{ type: 'text', text: `📝 Updated ${result.title}: ${updates.join(', ')}` }],
|
|
256
|
+
structuredContent: {
|
|
257
|
+
id: result.id,
|
|
258
|
+
title: result.title,
|
|
259
|
+
description: result.description,
|
|
260
|
+
implementationPlan: result.implementationPlan,
|
|
261
|
+
priority: result.priority,
|
|
262
|
+
effort: result.effort,
|
|
263
|
+
labels: result.labels,
|
|
264
|
+
},
|
|
265
|
+
};
|
|
266
|
+
});
|
|
202
267
|
// Tool: Create task
|
|
203
268
|
server.registerTool('create_task', {
|
|
204
269
|
title: 'Create Task',
|
|
@@ -310,6 +375,40 @@ server.registerTool('add_note', {
|
|
|
310
375
|
structuredContent: { taskId, success: true },
|
|
311
376
|
};
|
|
312
377
|
});
|
|
378
|
+
// Tool: Create subtask
|
|
379
|
+
server.registerTool('create_subtask', {
|
|
380
|
+
title: 'Create Subtask',
|
|
381
|
+
description: 'Add a new subtask to a task. Useful for breaking down work into smaller steps.',
|
|
382
|
+
inputSchema: z.object({
|
|
383
|
+
taskId: z.string().describe('Task ID'),
|
|
384
|
+
title: z.string().describe('Subtask title'),
|
|
385
|
+
}),
|
|
386
|
+
outputSchema: z.object({
|
|
387
|
+
taskId: z.string(),
|
|
388
|
+
subtask: z.object({
|
|
389
|
+
id: z.string(),
|
|
390
|
+
title: z.string(),
|
|
391
|
+
done: z.boolean(),
|
|
392
|
+
}),
|
|
393
|
+
totalSubtasks: z.number(),
|
|
394
|
+
}),
|
|
395
|
+
annotations: {
|
|
396
|
+
readOnlyHint: false,
|
|
397
|
+
destructiveHint: false,
|
|
398
|
+
idempotentHint: false,
|
|
399
|
+
openWorldHint: false,
|
|
400
|
+
},
|
|
401
|
+
}, async ({ taskId, title }) => {
|
|
402
|
+
const result = await api('POST', `/api/agent/tasks/${taskId}/subtasks`, { title });
|
|
403
|
+
return {
|
|
404
|
+
content: [{ type: 'text', text: `➕ Created subtask: "${result.subtask.title}" (${result.totalSubtasks} total)` }],
|
|
405
|
+
structuredContent: {
|
|
406
|
+
taskId,
|
|
407
|
+
subtask: result.subtask,
|
|
408
|
+
totalSubtasks: result.totalSubtasks,
|
|
409
|
+
},
|
|
410
|
+
};
|
|
411
|
+
});
|
|
313
412
|
// Tool: Update subtask
|
|
314
413
|
server.registerTool('update_subtask', {
|
|
315
414
|
title: 'Update Subtask',
|