@damper/mcp 0.1.9 → 0.1.12
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 +3 -1
- package/dist/index.js +12 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -71,7 +71,7 @@ The AI will see tools from both servers and can distinguish between them:
|
|
|
71
71
|
|
|
72
72
|
| Tool | Description |
|
|
73
73
|
|------|-------------|
|
|
74
|
-
| `list_tasks` | Get roadmap tasks (filter by `status`, `type`) |
|
|
74
|
+
| `list_tasks` | Get roadmap tasks (filter by `status`, `type`, `quarter`) |
|
|
75
75
|
| `get_task` | Task details + subtasks + linked feedback |
|
|
76
76
|
| `create_task` | Create task with type (bug, feature, improvement, task) |
|
|
77
77
|
| `update_task` | Update description, plan, priority, effort, quarter, labels |
|
|
@@ -150,6 +150,8 @@ When you start a task, it's locked to prevent other agents from working on it si
|
|
|
150
150
|
```
|
|
151
151
|
> What tasks are available?
|
|
152
152
|
> List bugs I can fix
|
|
153
|
+
> Show tasks for Q2 2025
|
|
154
|
+
> What's unscheduled? (quarter: none)
|
|
153
155
|
> Import my TODO.md into Damper
|
|
154
156
|
> Work on the dark mode feature
|
|
155
157
|
> Show me the subtasks for this task
|
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.11',
|
|
38
38
|
});
|
|
39
39
|
// Output schemas
|
|
40
40
|
const SubtaskProgressSchema = z.object({
|
|
@@ -104,10 +104,11 @@ const FeedbackDetailSchema = z.object({
|
|
|
104
104
|
server.registerTool('list_tasks', {
|
|
105
105
|
title: 'List Tasks',
|
|
106
106
|
description: 'Get roadmap tasks. Returns planned/in-progress by default. ' +
|
|
107
|
-
'Filter by type
|
|
107
|
+
'Filter by type, quarter, etc.',
|
|
108
108
|
inputSchema: z.object({
|
|
109
109
|
status: z.enum(['planned', 'in_progress', 'done', 'all']).optional(),
|
|
110
110
|
type: z.enum(['bug', 'feature', 'improvement', 'task']).optional().describe('Filter by task type'),
|
|
111
|
+
quarter: z.string().optional().describe('Filter by quarter (e.g., "Q1 2025") or "none" for unscheduled'),
|
|
111
112
|
limit: z.number().optional(),
|
|
112
113
|
}),
|
|
113
114
|
outputSchema: z.object({
|
|
@@ -120,19 +121,22 @@ server.registerTool('list_tasks', {
|
|
|
120
121
|
idempotentHint: true,
|
|
121
122
|
openWorldHint: false,
|
|
122
123
|
},
|
|
123
|
-
}, async ({ status, type, limit }) => {
|
|
124
|
+
}, async ({ status, type, quarter, limit }) => {
|
|
124
125
|
const params = new URLSearchParams();
|
|
125
126
|
if (status)
|
|
126
127
|
params.set('status', status);
|
|
127
128
|
if (type)
|
|
128
129
|
params.set('type', type);
|
|
130
|
+
if (quarter)
|
|
131
|
+
params.set('quarter', quarter);
|
|
129
132
|
if (limit)
|
|
130
133
|
params.set('limit', String(limit));
|
|
131
134
|
const query = params.toString();
|
|
132
135
|
const data = await api('GET', `/api/agent/tasks${query ? `?${query}` : ''}`);
|
|
133
136
|
if (!data.tasks.length) {
|
|
137
|
+
const filters = [type && `type: ${type}`, quarter && `quarter: ${quarter}`].filter(Boolean).join(', ');
|
|
134
138
|
return {
|
|
135
|
-
content: [{ type: 'text', text: `No tasks in "${data.project.name}"${
|
|
139
|
+
content: [{ type: 'text', text: `No tasks in "${data.project.name}"${filters ? ` (${filters})` : ''}` }],
|
|
136
140
|
structuredContent: { project: data.project.name, tasks: [] },
|
|
137
141
|
};
|
|
138
142
|
}
|
|
@@ -165,9 +169,10 @@ server.registerTool('get_task', {
|
|
|
165
169
|
}, async ({ taskId }) => {
|
|
166
170
|
const t = await api('GET', `/api/agent/tasks/${taskId}`);
|
|
167
171
|
const typeIcon = t.type === 'bug' ? '🐛' : t.type === 'feature' ? '✨' : t.type === 'improvement' ? '💡' : '📌';
|
|
172
|
+
const scorePart = t.voteScore > 0 ? ` | Score: ${t.voteScore}` : '';
|
|
168
173
|
const parts = [
|
|
169
174
|
`# ${typeIcon} ${t.title}`,
|
|
170
|
-
`Type: ${t.type} | Status: ${t.status}
|
|
175
|
+
`Type: ${t.type} | Status: ${t.status}${scorePart}`,
|
|
171
176
|
];
|
|
172
177
|
// Add priority/effort/quarter/labels if present
|
|
173
178
|
const meta = [];
|
|
@@ -565,9 +570,10 @@ server.registerTool('get_feedback', {
|
|
|
565
570
|
},
|
|
566
571
|
}, async ({ feedbackId }) => {
|
|
567
572
|
const f = await api('GET', `/api/agent/feedback/${feedbackId}`);
|
|
573
|
+
const scorePart = f.voteScore > 0 ? ` | Score: ${f.voteScore}` : '';
|
|
568
574
|
const parts = [
|
|
569
575
|
`# ${f.title}`,
|
|
570
|
-
`Type: ${f.type} | Status: ${f.status}
|
|
576
|
+
`Type: ${f.type} | Status: ${f.status}${scorePart}`,
|
|
571
577
|
f.linkedTaskId ? `Linked: ${f.linkedTaskId}` : '',
|
|
572
578
|
`\n${f.description}`,
|
|
573
579
|
].filter(Boolean);
|