@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 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.9',
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 to get bugs, features, etc.',
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}"${type ? ` (type: ${type})` : ''}` }],
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} | Score: ${t.voteScore}`,
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} | Score: ${f.voteScore}`,
576
+ `Type: ${f.type} | Status: ${f.status}${scorePart}`,
571
577
  f.linkedTaskId ? `Linked: ${f.linkedTaskId}` : '',
572
578
  `\n${f.description}`,
573
579
  ].filter(Boolean);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@damper/mcp",
3
- "version": "0.1.9",
3
+ "version": "0.1.12",
4
4
  "description": "MCP server for Damper task management",
5
5
  "author": "Damper <hello@usedamper.com>",
6
6
  "repository": {