backlog-mcp 0.1.2 → 0.2.1
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 +17 -10
- package/dist/server.js +64 -56
- package/dist/server.js.map +1 -1
- package/dist/summary.d.ts +2 -0
- package/dist/summary.js +14 -0
- package/dist/summary.js.map +1 -0
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# backlog-mcp
|
|
2
2
|
|
|
3
|
-
Minimal task backlog
|
|
3
|
+
Minimal task backlog MCP server for Claude and AI agents.
|
|
4
|
+
|
|
5
|
+
> **Quick start**: Tell your LLM: `Add backlog-mcp to .mcp.json and use it to track tasks`
|
|
4
6
|
|
|
5
7
|
## Task Schema
|
|
6
8
|
|
|
@@ -17,14 +19,18 @@ Minimal task backlog as an MCP server. Records state, doesn't enforce workflow.
|
|
|
17
19
|
}
|
|
18
20
|
```
|
|
19
21
|
|
|
20
|
-
## MCP
|
|
22
|
+
## MCP Tool
|
|
23
|
+
|
|
24
|
+
Single unified tool with action parameter:
|
|
21
25
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
```
|
|
27
|
+
backlog action="list" # List all tasks
|
|
28
|
+
backlog action="list" summary=true # Get counts by status
|
|
29
|
+
backlog action="list" status=["open"] # Filter by status
|
|
30
|
+
backlog action="get" id="TASK-0001" # Get task details
|
|
31
|
+
backlog action="create" title="Fix bug" # Create task
|
|
32
|
+
backlog action="update" id="TASK-0001" set_status="done" # Update task
|
|
33
|
+
```
|
|
28
34
|
|
|
29
35
|
## Installation
|
|
30
36
|
|
|
@@ -52,8 +58,9 @@ npm start
|
|
|
52
58
|
|
|
53
59
|
## Storage
|
|
54
60
|
|
|
55
|
-
-
|
|
56
|
-
-
|
|
61
|
+
- Default: `data/backlog.json` (local to project)
|
|
62
|
+
- Global: Set `BACKLOG_DATA_DIR=~/.backlog` for cross-project persistence
|
|
63
|
+
- Completed/cancelled tasks auto-archive to `archive.json`
|
|
57
64
|
- Atomic writes via temp + rename
|
|
58
65
|
|
|
59
66
|
## License
|
package/dist/server.js
CHANGED
|
@@ -3,6 +3,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { createTask, STATUSES } from './schema.js';
|
|
6
|
+
import { countTasks } from './summary.js';
|
|
6
7
|
import { loadBacklog, getTask, listTasks, addTask, saveTask, getTaskCounts } from './storage.js';
|
|
7
8
|
// ============================================================================
|
|
8
9
|
// Server
|
|
@@ -17,65 +18,72 @@ const storageOptions = {
|
|
|
17
18
|
// ============================================================================
|
|
18
19
|
// Tools
|
|
19
20
|
// ============================================================================
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
const ACTIONS = ['list', 'get', 'create', 'update'];
|
|
22
|
+
server.registerTool('backlog', {
|
|
23
|
+
description: 'Manage tasks. Actions: list, get, create, update',
|
|
22
24
|
inputSchema: {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
action: z.enum(ACTIONS).describe('Action to perform'),
|
|
26
|
+
// list options
|
|
27
|
+
status: z.array(z.enum(STATUSES)).optional().describe('Filter by status (list)'),
|
|
28
|
+
summary: z.boolean().optional().describe('Return counts instead of list (list)'),
|
|
29
|
+
// get/update options
|
|
30
|
+
id: z.string().optional().describe('Task ID (get, update)'),
|
|
31
|
+
// create/update options
|
|
32
|
+
title: z.string().optional().describe('Task title (create, update)'),
|
|
33
|
+
description: z.string().optional().describe('Task description (create, update)'),
|
|
34
|
+
// update-only options
|
|
35
|
+
set_status: z.enum(STATUSES).optional().describe('New status (update)'),
|
|
36
|
+
blocked_reason: z.string().optional().describe('Reason for blocked status (update)'),
|
|
37
|
+
evidence: z.array(z.string()).optional().describe('Evidence of completion (update)'),
|
|
25
38
|
},
|
|
26
|
-
}, async ({ status, summary }) => {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
39
|
+
}, async ({ action, status, summary, id, title, description, set_status, blocked_reason, evidence }) => {
|
|
40
|
+
switch (action) {
|
|
41
|
+
case 'list': {
|
|
42
|
+
const tasks = listTasks(status ? { status } : undefined, storageOptions);
|
|
43
|
+
if (summary) {
|
|
44
|
+
const counts = status ? countTasks(tasks) : getTaskCounts(storageOptions);
|
|
45
|
+
return { content: [{ type: 'text', text: JSON.stringify(counts, null, 2) }] };
|
|
46
|
+
}
|
|
47
|
+
const list = tasks.map((t) => ({ id: t.id, title: t.title, status: t.status }));
|
|
48
|
+
return { content: [{ type: 'text', text: JSON.stringify(list, null, 2) }] };
|
|
49
|
+
}
|
|
50
|
+
case 'get': {
|
|
51
|
+
if (!id) {
|
|
52
|
+
return { content: [{ type: 'text', text: 'Missing required: id' }], isError: true };
|
|
53
|
+
}
|
|
54
|
+
const task = getTask(id, storageOptions);
|
|
55
|
+
if (!task) {
|
|
56
|
+
return { content: [{ type: 'text', text: `Not found: ${id}` }], isError: true };
|
|
57
|
+
}
|
|
58
|
+
return { content: [{ type: 'text', text: JSON.stringify(task, null, 2) }] };
|
|
59
|
+
}
|
|
60
|
+
case 'create': {
|
|
61
|
+
if (!title) {
|
|
62
|
+
return { content: [{ type: 'text', text: 'Missing required: title' }], isError: true };
|
|
63
|
+
}
|
|
64
|
+
const backlog = loadBacklog(storageOptions);
|
|
65
|
+
const task = createTask({ title, description }, backlog.tasks);
|
|
66
|
+
addTask(task, storageOptions);
|
|
67
|
+
return { content: [{ type: 'text', text: `Created ${task.id}` }] };
|
|
68
|
+
}
|
|
69
|
+
case 'update': {
|
|
70
|
+
if (!id) {
|
|
71
|
+
return { content: [{ type: 'text', text: 'Missing required: id' }], isError: true };
|
|
72
|
+
}
|
|
73
|
+
const task = getTask(id, storageOptions);
|
|
74
|
+
if (!task) {
|
|
75
|
+
return { content: [{ type: 'text', text: `Not found: ${id}` }], isError: true };
|
|
76
|
+
}
|
|
77
|
+
const updates = { title, description, status: set_status, blocked_reason, evidence };
|
|
78
|
+
const updated = {
|
|
79
|
+
...task,
|
|
80
|
+
...Object.fromEntries(Object.entries(updates).filter(([_, v]) => v !== undefined)),
|
|
81
|
+
updated_at: new Date().toISOString(),
|
|
82
|
+
};
|
|
83
|
+
saveTask(updated, storageOptions);
|
|
84
|
+
return { content: [{ type: 'text', text: `Updated ${id}` }] };
|
|
85
|
+
}
|
|
31
86
|
}
|
|
32
|
-
const list = tasks.map((t) => ({ id: t.id, title: t.title, status: t.status }));
|
|
33
|
-
return { content: [{ type: 'text', text: JSON.stringify(list, null, 2) }] };
|
|
34
|
-
});
|
|
35
|
-
server.registerTool('backlog_get', {
|
|
36
|
-
description: 'Get a task by ID',
|
|
37
|
-
inputSchema: { id: z.string().describe('Task ID') },
|
|
38
|
-
}, async ({ id }) => {
|
|
39
|
-
const task = getTask(id, storageOptions);
|
|
40
|
-
if (!task) {
|
|
41
|
-
return { content: [{ type: 'text', text: `Not found: ${id}` }], isError: true };
|
|
42
|
-
}
|
|
43
|
-
return { content: [{ type: 'text', text: JSON.stringify(task, null, 2) }] };
|
|
44
|
-
});
|
|
45
|
-
server.registerTool('backlog_create', {
|
|
46
|
-
description: 'Create a new task',
|
|
47
|
-
inputSchema: {
|
|
48
|
-
title: z.string().describe('Task title'),
|
|
49
|
-
description: z.string().optional().describe('Task description'),
|
|
50
|
-
},
|
|
51
|
-
}, async ({ title, description }) => {
|
|
52
|
-
const backlog = loadBacklog(storageOptions);
|
|
53
|
-
const task = createTask({ title, description }, backlog.tasks);
|
|
54
|
-
addTask(task, storageOptions);
|
|
55
|
-
return { content: [{ type: 'text', text: `Created ${task.id}` }] };
|
|
56
|
-
});
|
|
57
|
-
server.registerTool('backlog_update', {
|
|
58
|
-
description: 'Update a task (any field)',
|
|
59
|
-
inputSchema: {
|
|
60
|
-
id: z.string().describe('Task ID'),
|
|
61
|
-
title: z.string().optional(),
|
|
62
|
-
description: z.string().optional(),
|
|
63
|
-
status: z.enum(STATUSES).optional(),
|
|
64
|
-
blocked_reason: z.string().optional(),
|
|
65
|
-
evidence: z.array(z.string()).optional(),
|
|
66
|
-
},
|
|
67
|
-
}, async ({ id, ...updates }) => {
|
|
68
|
-
const task = getTask(id, storageOptions);
|
|
69
|
-
if (!task) {
|
|
70
|
-
return { content: [{ type: 'text', text: `Not found: ${id}` }], isError: true };
|
|
71
|
-
}
|
|
72
|
-
const updated = {
|
|
73
|
-
...task,
|
|
74
|
-
...Object.fromEntries(Object.entries(updates).filter(([_, v]) => v !== undefined)),
|
|
75
|
-
updated_at: new Date().toISOString(),
|
|
76
|
-
};
|
|
77
|
-
saveTask(updated, storageOptions);
|
|
78
|
-
return { content: [{ type: 'text', text: `Updated ${id}` }] };
|
|
79
87
|
});
|
|
80
88
|
// ============================================================================
|
|
81
89
|
// Main
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAa,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAuB,MAAM,cAAc,CAAC;AAEtH,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,MAAM,cAAc,GAAmB;IACrC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,MAAM;CAChD,CAAC;AAEF,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E,MAAM,CAAC,YAAY,CACjB,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAa,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAuB,MAAM,cAAc,CAAC;AAEtH,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,MAAM,cAAc,GAAmB;IACrC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,MAAM;CAChD,CAAC;AAEF,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAE7D,MAAM,CAAC,YAAY,CACjB,SAAS,EACT;IACE,WAAW,EAAE,kDAAkD;IAC/D,WAAW,EAAE;QACX,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACrD,eAAe;QACf,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAChF,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAChF,qBAAqB;QACrB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC3D,wBAAwB;QACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACpE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAChF,sBAAsB;QACtB,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACvE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACpF,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KACrF;CACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,EAAE;IAClG,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YACzE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;gBAC1E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACzF,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAChF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACvF,CAAC;QAED,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC/F,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3F,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACvF,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAClG,CAAC;YACD,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,WAAW,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAC9E,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC/F,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3F,CAAC;YACD,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;YACrF,MAAM,OAAO,GAAS;gBACpB,GAAG,IAAI;gBACP,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;gBAClF,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACrC,CAAC;YACF,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YAClC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QACzE,CAAC;IACH,CAAC;AACH,CAAC,CACF,CAAC;AAEF,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAE/E,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/summary.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,KAA0B;IACnD,MAAM,MAAM,GAAmC;QAC7C,IAAI,EAAE,CAAC;QACP,WAAW,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,CAAC;QACP,SAAS,EAAE,CAAC;KACb,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "backlog-mcp",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Minimal task backlog MCP server for Claude and AI agents",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
@@ -38,7 +38,8 @@
|
|
|
38
38
|
"build": "tsc",
|
|
39
39
|
"clean": "rm -rf dist",
|
|
40
40
|
"start": "node dist/server.js",
|
|
41
|
-
"test": "
|
|
41
|
+
"test": "vitest run",
|
|
42
|
+
"test:watch": "vitest",
|
|
42
43
|
"dev": "tsx watch src/server.ts"
|
|
43
44
|
},
|
|
44
45
|
"engines": {
|
|
@@ -48,7 +49,8 @@
|
|
|
48
49
|
"devDependencies": {
|
|
49
50
|
"@types/node": "^22.0.0",
|
|
50
51
|
"tsx": "^4.19.0",
|
|
51
|
-
"typescript": "^5.7.0"
|
|
52
|
+
"typescript": "^5.7.0",
|
|
53
|
+
"vitest": "^2.1.9"
|
|
52
54
|
},
|
|
53
55
|
"dependencies": {
|
|
54
56
|
"@modelcontextprotocol/sdk": "^1.25.1"
|