snboard-mcp 1.1.0 → 1.1.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/dist/index.js +185 -331
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -102,12 +102,22 @@ var kanbanApi = {
|
|
|
102
102
|
createCard: (data) => api("/api/cards", { method: "POST", body: JSON.stringify(data) }),
|
|
103
103
|
updateCard: (id, data) => api(`/api/cards/${id}`, { method: "PUT", body: JSON.stringify(data) }),
|
|
104
104
|
deleteCard: (id) => api(`/api/cards/${id}`, { method: "DELETE" }),
|
|
105
|
-
archiveCard: (id) => api(`/api/cards/${id}`, {
|
|
106
|
-
|
|
105
|
+
archiveCard: (id) => api(`/api/cards/${id}`, {
|
|
106
|
+
method: "PUT",
|
|
107
|
+
body: JSON.stringify({ isArchived: true })
|
|
108
|
+
}),
|
|
109
|
+
unarchiveCard: (id) => api(`/api/cards/${id}`, {
|
|
110
|
+
method: "PUT",
|
|
111
|
+
body: JSON.stringify({ isArchived: false })
|
|
112
|
+
}),
|
|
107
113
|
listArchivedCards: (boardId) => api(`/api/archived?boardId=${boardId}`),
|
|
108
114
|
moveCard: (id, targetColumnId, newOrder) => api("/api/cards/move", {
|
|
109
115
|
method: "POST",
|
|
110
|
-
body: JSON.stringify({
|
|
116
|
+
body: JSON.stringify({
|
|
117
|
+
cardId: id,
|
|
118
|
+
targetColumnId,
|
|
119
|
+
...newOrder !== void 0 && { newOrder }
|
|
120
|
+
})
|
|
111
121
|
}),
|
|
112
122
|
getBranchName: (id, type) => api(`/api/cards/${id}/branch?type=${type}`),
|
|
113
123
|
searchCards: (params) => {
|
|
@@ -179,12 +189,20 @@ var kanbanApi = {
|
|
|
179
189
|
return { epic, cards: cardResults, created: cardResults.length };
|
|
180
190
|
},
|
|
181
191
|
bulkCreateEpicWithFeatures: async (data) => {
|
|
182
|
-
const epic = await api("/api/epics", {
|
|
192
|
+
const epic = await api("/api/epics", {
|
|
193
|
+
method: "POST",
|
|
194
|
+
body: JSON.stringify(data.epic)
|
|
195
|
+
});
|
|
183
196
|
const features = await Promise.all(
|
|
184
197
|
data.features.map(
|
|
185
198
|
(f) => api("/api/features", {
|
|
186
199
|
method: "POST",
|
|
187
|
-
body: JSON.stringify({
|
|
200
|
+
body: JSON.stringify({
|
|
201
|
+
epicId: epic.id,
|
|
202
|
+
title: f.title,
|
|
203
|
+
slug: f.slug,
|
|
204
|
+
description: f.description
|
|
205
|
+
})
|
|
188
206
|
})
|
|
189
207
|
)
|
|
190
208
|
);
|
|
@@ -205,10 +223,18 @@ var kanbanApi = {
|
|
|
205
223
|
body: JSON.stringify({ cardId: card.id })
|
|
206
224
|
});
|
|
207
225
|
}
|
|
208
|
-
return {
|
|
226
|
+
return {
|
|
227
|
+
id: feature.id,
|
|
228
|
+
slug: feature.slug,
|
|
229
|
+
title: feature.title,
|
|
230
|
+
cardIds: cards.map((c) => c.id)
|
|
231
|
+
};
|
|
209
232
|
})
|
|
210
233
|
);
|
|
211
|
-
const totalCards = featureResults.reduce(
|
|
234
|
+
const totalCards = featureResults.reduce(
|
|
235
|
+
(sum, f) => sum + f.cardIds.length,
|
|
236
|
+
0
|
|
237
|
+
);
|
|
212
238
|
return {
|
|
213
239
|
epic: { id: epic.id, slug: epic.slug, name: epic.name },
|
|
214
240
|
features: featureResults,
|
|
@@ -388,7 +414,10 @@ var kanbanApi = {
|
|
|
388
414
|
createFeature: (data) => api("/api/features", { method: "POST", body: JSON.stringify(data) }),
|
|
389
415
|
updateFeature: (id, data) => api(`/api/features/${id}`, { method: "PATCH", body: JSON.stringify(data) }),
|
|
390
416
|
deleteFeature: (id) => api(`/api/features/${id}`, { method: "DELETE" }),
|
|
391
|
-
addCardToFeature: (featureId, cardId) => api(`/api/features/${featureId}/cards`, {
|
|
417
|
+
addCardToFeature: (featureId, cardId) => api(`/api/features/${featureId}/cards`, {
|
|
418
|
+
method: "POST",
|
|
419
|
+
body: JSON.stringify({ cardId })
|
|
420
|
+
}),
|
|
392
421
|
removeCardFromFeature: (featureId, cardId) => api(`/api/features/${featureId}/cards/${cardId}`, { method: "DELETE" }),
|
|
393
422
|
getFeatureCards: (featureId) => api(`/api/features/${featureId}/cards`),
|
|
394
423
|
// Card Links
|
|
@@ -416,45 +445,7 @@ var kanbanApi = {
|
|
|
416
445
|
linkCardToPr: (cardId, prUrl) => api(`/api/cards/${cardId}`, {
|
|
417
446
|
method: "PUT",
|
|
418
447
|
body: JSON.stringify({ githubPrUrl: prUrl })
|
|
419
|
-
})
|
|
420
|
-
// GitHub API
|
|
421
|
-
githubListRepos: (userId, type) => api(`/api/github/repos?userId=${userId}${type ? `&type=${type}` : ""}`),
|
|
422
|
-
githubCreateBranch: (data) => api("/api/github/branches", { method: "POST", body: JSON.stringify(data) }),
|
|
423
|
-
githubCreatePr: (data) => api("/api/github/pull-requests", {
|
|
424
|
-
method: "POST",
|
|
425
|
-
body: JSON.stringify(data)
|
|
426
|
-
}),
|
|
427
|
-
// Ideas
|
|
428
|
-
listIdeas: (params) => {
|
|
429
|
-
const searchParams = new URLSearchParams();
|
|
430
|
-
if (params?.status) searchParams.set("status", params.status);
|
|
431
|
-
if (params?.filter) searchParams.set("filter", params.filter);
|
|
432
|
-
const query = searchParams.toString();
|
|
433
|
-
return api(`/api/ideas${query ? `?${query}` : ""}`);
|
|
434
|
-
},
|
|
435
|
-
getIdea: (id) => api(`/api/ideas/${id}`),
|
|
436
|
-
createIdea: (data) => api("/api/ideas", { method: "POST", body: JSON.stringify(data) }),
|
|
437
|
-
updateIdea: (id, data) => api(`/api/ideas/${id}`, { method: "PATCH", body: JSON.stringify(data) }),
|
|
438
|
-
deleteIdea: (id) => api(`/api/ideas/${id}`, { method: "DELETE" }),
|
|
439
|
-
convertIdeaToCard: (ideaId, data) => api(`/api/ideas/${ideaId}/convert`, { method: "POST", body: JSON.stringify(data) }),
|
|
440
|
-
// Time Tracking
|
|
441
|
-
getTimeTracking: (params) => {
|
|
442
|
-
const searchParams = new URLSearchParams();
|
|
443
|
-
if (params?.startDate) searchParams.set("startDate", params.startDate);
|
|
444
|
-
if (params?.endDate) searchParams.set("endDate", params.endDate);
|
|
445
|
-
if (params?.projectId) searchParams.set("projectId", params.projectId);
|
|
446
|
-
const query = searchParams.toString();
|
|
447
|
-
return api(`/api/time-tracking${query ? `?${query}` : ""}`);
|
|
448
|
-
},
|
|
449
|
-
logActivity: (data) => api("/api/time-tracking", { method: "POST", body: JSON.stringify(data) }),
|
|
450
|
-
endTimeSession: () => api("/api/time-tracking", { method: "DELETE" }),
|
|
451
|
-
// Daily Summary
|
|
452
|
-
getDailySummary: () => api("/api/daily-summary"),
|
|
453
|
-
// Retrospective
|
|
454
|
-
getRetrospective: (days) => api(`/api/retrospectives/weekly${days ? `?days=${days}` : ""}`),
|
|
455
|
-
// Export
|
|
456
|
-
exportBoard: (boardId) => api(`/api/export/board/${boardId}`),
|
|
457
|
-
exportProject: (projectId) => api(`/api/export/project/${projectId}`)
|
|
448
|
+
})
|
|
458
449
|
};
|
|
459
450
|
var server = new Server(
|
|
460
451
|
{ name: "kanban-mcp", version: "1.1.0" },
|
|
@@ -535,7 +526,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
535
526
|
inputSchema: {
|
|
536
527
|
type: "object",
|
|
537
528
|
properties: {
|
|
538
|
-
folderId: {
|
|
529
|
+
folderId: {
|
|
530
|
+
type: "string",
|
|
531
|
+
description: 'Filter by folder. Use "none" for orphan projects'
|
|
532
|
+
},
|
|
539
533
|
limit: { type: "number" },
|
|
540
534
|
compact: { type: "boolean" }
|
|
541
535
|
}
|
|
@@ -580,7 +574,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
580
574
|
description: { type: "string" },
|
|
581
575
|
emoji: { type: "string" },
|
|
582
576
|
color: { type: "string" },
|
|
583
|
-
folderId: {
|
|
577
|
+
folderId: {
|
|
578
|
+
type: "string",
|
|
579
|
+
description: "Move to folder (null to remove)"
|
|
580
|
+
}
|
|
584
581
|
},
|
|
585
582
|
required: ["projectId"]
|
|
586
583
|
}
|
|
@@ -602,7 +599,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
602
599
|
properties: {
|
|
603
600
|
projectId: { type: "string" },
|
|
604
601
|
targetProjectId: { type: "string" },
|
|
605
|
-
folderId: {
|
|
602
|
+
folderId: {
|
|
603
|
+
type: "string",
|
|
604
|
+
description: "Folder context (null for orphans)"
|
|
605
|
+
}
|
|
606
606
|
},
|
|
607
607
|
required: ["projectId", "targetProjectId"]
|
|
608
608
|
}
|
|
@@ -758,8 +758,14 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
758
758
|
dueDate: { type: "string" },
|
|
759
759
|
epicId: { type: "string" },
|
|
760
760
|
tagIds: { type: "array", items: { type: "string" } },
|
|
761
|
-
estimatedMinutes: {
|
|
762
|
-
|
|
761
|
+
estimatedMinutes: {
|
|
762
|
+
type: "number",
|
|
763
|
+
description: "Estimated time in minutes"
|
|
764
|
+
},
|
|
765
|
+
cognitiveLoad: {
|
|
766
|
+
type: "string",
|
|
767
|
+
description: "Cognitive load level"
|
|
768
|
+
}
|
|
763
769
|
},
|
|
764
770
|
required: ["columnId", "title"]
|
|
765
771
|
}
|
|
@@ -775,7 +781,11 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
775
781
|
description: { type: "string" },
|
|
776
782
|
priority: { type: "string", enum: ["P1", "P2", "P3"] },
|
|
777
783
|
dueDate: { type: "string" },
|
|
778
|
-
tagIds: {
|
|
784
|
+
tagIds: {
|
|
785
|
+
type: "array",
|
|
786
|
+
items: { type: "string" },
|
|
787
|
+
description: "Replace all tags with these IDs"
|
|
788
|
+
},
|
|
779
789
|
cognitiveLoad: { type: "string" },
|
|
780
790
|
estimatedMinutes: { type: "number" },
|
|
781
791
|
githubBranch: { type: "string" },
|
|
@@ -829,7 +839,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
829
839
|
properties: {
|
|
830
840
|
cardId: { type: "string" },
|
|
831
841
|
targetColumnId: { type: "string" },
|
|
832
|
-
newOrder: {
|
|
842
|
+
newOrder: {
|
|
843
|
+
type: "number",
|
|
844
|
+
description: "Position in target column (0-indexed, default: end)"
|
|
845
|
+
}
|
|
833
846
|
},
|
|
834
847
|
required: ["cardId", "targetColumnId"]
|
|
835
848
|
}
|
|
@@ -1035,7 +1048,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
1035
1048
|
type: "object",
|
|
1036
1049
|
properties: {
|
|
1037
1050
|
title: { type: "string" },
|
|
1038
|
-
slug: {
|
|
1051
|
+
slug: {
|
|
1052
|
+
type: "string",
|
|
1053
|
+
description: "UPPERCASE slug (auto-generated from title if omitted)"
|
|
1054
|
+
},
|
|
1039
1055
|
description: { type: "string" },
|
|
1040
1056
|
cards: {
|
|
1041
1057
|
type: "array",
|
|
@@ -1224,7 +1240,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
1224
1240
|
status: { type: "string" },
|
|
1225
1241
|
startDate: { type: "string" },
|
|
1226
1242
|
targetDate: { type: "string" },
|
|
1227
|
-
syncDates: {
|
|
1243
|
+
syncDates: {
|
|
1244
|
+
type: "boolean",
|
|
1245
|
+
description: "Sync targetDate to all card due dates"
|
|
1246
|
+
}
|
|
1228
1247
|
},
|
|
1229
1248
|
required: ["epicId"]
|
|
1230
1249
|
}
|
|
@@ -1264,7 +1283,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
1264
1283
|
type: "object",
|
|
1265
1284
|
properties: {
|
|
1266
1285
|
epicId: { type: "string" },
|
|
1267
|
-
slug: {
|
|
1286
|
+
slug: {
|
|
1287
|
+
type: "string",
|
|
1288
|
+
description: "Filter by feature slug (UPPERCASE)"
|
|
1289
|
+
}
|
|
1268
1290
|
}
|
|
1269
1291
|
}
|
|
1270
1292
|
},
|
|
@@ -1275,7 +1297,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
1275
1297
|
type: "object",
|
|
1276
1298
|
properties: {
|
|
1277
1299
|
featureId: { type: "string", description: "Feature ID or slug" },
|
|
1278
|
-
featureSlug: {
|
|
1300
|
+
featureSlug: {
|
|
1301
|
+
type: "string",
|
|
1302
|
+
description: "Feature slug (UPPERCASE), alternative to featureId"
|
|
1303
|
+
}
|
|
1279
1304
|
}
|
|
1280
1305
|
}
|
|
1281
1306
|
},
|
|
@@ -1294,7 +1319,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
1294
1319
|
title: { type: "string" },
|
|
1295
1320
|
slug: { type: "string" },
|
|
1296
1321
|
description: { type: "string" },
|
|
1297
|
-
status: {
|
|
1322
|
+
status: {
|
|
1323
|
+
type: "string",
|
|
1324
|
+
enum: ["planning", "in_progress", "completed", "on_hold"]
|
|
1325
|
+
}
|
|
1298
1326
|
},
|
|
1299
1327
|
required: ["title"]
|
|
1300
1328
|
}
|
|
@@ -1309,7 +1337,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
1309
1337
|
title: { type: "string" },
|
|
1310
1338
|
slug: { type: "string" },
|
|
1311
1339
|
description: { type: "string" },
|
|
1312
|
-
status: {
|
|
1340
|
+
status: {
|
|
1341
|
+
type: "string",
|
|
1342
|
+
enum: ["planning", "in_progress", "completed", "on_hold"]
|
|
1343
|
+
},
|
|
1313
1344
|
order: { type: "number" },
|
|
1314
1345
|
epicId: { type: "string", description: "Move to another epic" }
|
|
1315
1346
|
},
|
|
@@ -1333,7 +1364,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
1333
1364
|
properties: {
|
|
1334
1365
|
cardId: { type: "string" },
|
|
1335
1366
|
featureId: { type: "string", description: "Feature ID or slug" },
|
|
1336
|
-
featureSlug: {
|
|
1367
|
+
featureSlug: {
|
|
1368
|
+
type: "string",
|
|
1369
|
+
description: "Feature slug (UPPERCASE), alternative to featureId"
|
|
1370
|
+
}
|
|
1337
1371
|
},
|
|
1338
1372
|
required: ["cardId"]
|
|
1339
1373
|
}
|
|
@@ -1346,7 +1380,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
1346
1380
|
properties: {
|
|
1347
1381
|
cardId: { type: "string" },
|
|
1348
1382
|
featureId: { type: "string", description: "Feature ID or slug" },
|
|
1349
|
-
featureSlug: {
|
|
1383
|
+
featureSlug: {
|
|
1384
|
+
type: "string",
|
|
1385
|
+
description: "Feature slug (UPPERCASE), alternative to featureId"
|
|
1386
|
+
}
|
|
1350
1387
|
},
|
|
1351
1388
|
required: ["cardId"]
|
|
1352
1389
|
}
|
|
@@ -1358,7 +1395,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
1358
1395
|
type: "object",
|
|
1359
1396
|
properties: {
|
|
1360
1397
|
featureId: { type: "string", description: "Feature ID or slug" },
|
|
1361
|
-
featureSlug: {
|
|
1398
|
+
featureSlug: {
|
|
1399
|
+
type: "string",
|
|
1400
|
+
description: "Feature slug (UPPERCASE), alternative to featureId"
|
|
1401
|
+
}
|
|
1362
1402
|
}
|
|
1363
1403
|
}
|
|
1364
1404
|
},
|
|
@@ -1468,194 +1508,6 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
1468
1508
|
properties: { cardId: { type: "string" }, prUrl: { type: "string" } },
|
|
1469
1509
|
required: ["cardId", "prUrl"]
|
|
1470
1510
|
}
|
|
1471
|
-
},
|
|
1472
|
-
// GITHUB API
|
|
1473
|
-
{
|
|
1474
|
-
name: "github_list_repos",
|
|
1475
|
-
description: "List user repos",
|
|
1476
|
-
inputSchema: {
|
|
1477
|
-
type: "object",
|
|
1478
|
-
properties: {
|
|
1479
|
-
userId: { type: "string" },
|
|
1480
|
-
type: { type: "string", enum: ["all", "owner", "member"] }
|
|
1481
|
-
},
|
|
1482
|
-
required: ["userId"]
|
|
1483
|
-
}
|
|
1484
|
-
},
|
|
1485
|
-
{
|
|
1486
|
-
name: "github_create_branch",
|
|
1487
|
-
description: "Create branch",
|
|
1488
|
-
inputSchema: {
|
|
1489
|
-
type: "object",
|
|
1490
|
-
properties: {
|
|
1491
|
-
userId: { type: "string" },
|
|
1492
|
-
owner: { type: "string" },
|
|
1493
|
-
repo: { type: "string" },
|
|
1494
|
-
branchName: { type: "string" },
|
|
1495
|
-
sourceBranch: { type: "string" }
|
|
1496
|
-
},
|
|
1497
|
-
required: ["userId", "owner", "repo", "branchName"]
|
|
1498
|
-
}
|
|
1499
|
-
},
|
|
1500
|
-
{
|
|
1501
|
-
name: "github_create_pr",
|
|
1502
|
-
description: "Create PR",
|
|
1503
|
-
inputSchema: {
|
|
1504
|
-
type: "object",
|
|
1505
|
-
properties: {
|
|
1506
|
-
userId: { type: "string" },
|
|
1507
|
-
owner: { type: "string" },
|
|
1508
|
-
repo: { type: "string" },
|
|
1509
|
-
title: { type: "string" },
|
|
1510
|
-
head: { type: "string" },
|
|
1511
|
-
base: { type: "string" },
|
|
1512
|
-
body: { type: "string" }
|
|
1513
|
-
},
|
|
1514
|
-
required: ["userId", "owner", "repo", "title", "head"]
|
|
1515
|
-
}
|
|
1516
|
-
},
|
|
1517
|
-
// IDEAS
|
|
1518
|
-
{
|
|
1519
|
-
name: "list_ideas",
|
|
1520
|
-
description: "List ideas (canvas notes). Filter by status: active, archived, all",
|
|
1521
|
-
inputSchema: {
|
|
1522
|
-
type: "object",
|
|
1523
|
-
properties: {
|
|
1524
|
-
status: { type: "string", enum: ["active", "archived", "all"] },
|
|
1525
|
-
filter: { type: "string", enum: ["week"], description: "Filter by recent (week)" }
|
|
1526
|
-
}
|
|
1527
|
-
}
|
|
1528
|
-
},
|
|
1529
|
-
{
|
|
1530
|
-
name: "get_idea",
|
|
1531
|
-
description: "Get an idea with its tags",
|
|
1532
|
-
inputSchema: {
|
|
1533
|
-
type: "object",
|
|
1534
|
-
properties: { ideaId: { type: "string" } },
|
|
1535
|
-
required: ["ideaId"]
|
|
1536
|
-
}
|
|
1537
|
-
},
|
|
1538
|
-
{
|
|
1539
|
-
name: "create_idea",
|
|
1540
|
-
description: "Create a new idea (canvas note)",
|
|
1541
|
-
inputSchema: {
|
|
1542
|
-
type: "object",
|
|
1543
|
-
properties: {
|
|
1544
|
-
title: { type: "string" },
|
|
1545
|
-
description: { type: "string" },
|
|
1546
|
-
color: { type: "string" },
|
|
1547
|
-
posX: { type: "number" },
|
|
1548
|
-
posY: { type: "number" },
|
|
1549
|
-
tagIds: { type: "array", items: { type: "string" } }
|
|
1550
|
-
},
|
|
1551
|
-
required: ["title"]
|
|
1552
|
-
}
|
|
1553
|
-
},
|
|
1554
|
-
{
|
|
1555
|
-
name: "update_idea",
|
|
1556
|
-
description: "Update an idea",
|
|
1557
|
-
inputSchema: {
|
|
1558
|
-
type: "object",
|
|
1559
|
-
properties: {
|
|
1560
|
-
ideaId: { type: "string" },
|
|
1561
|
-
title: { type: "string" },
|
|
1562
|
-
description: { type: "string" },
|
|
1563
|
-
status: { type: "string", enum: ["active", "archived"] },
|
|
1564
|
-
color: { type: "string" },
|
|
1565
|
-
posX: { type: "number" },
|
|
1566
|
-
posY: { type: "number" },
|
|
1567
|
-
tagIds: { type: "array", items: { type: "string" } }
|
|
1568
|
-
},
|
|
1569
|
-
required: ["ideaId"]
|
|
1570
|
-
}
|
|
1571
|
-
},
|
|
1572
|
-
{
|
|
1573
|
-
name: "delete_idea",
|
|
1574
|
-
description: "Delete an idea",
|
|
1575
|
-
inputSchema: {
|
|
1576
|
-
type: "object",
|
|
1577
|
-
properties: { ideaId: { type: "string" } },
|
|
1578
|
-
required: ["ideaId"]
|
|
1579
|
-
}
|
|
1580
|
-
},
|
|
1581
|
-
{
|
|
1582
|
-
name: "convert_idea_to_card",
|
|
1583
|
-
description: "Convert an idea to a card in a specific board/column",
|
|
1584
|
-
inputSchema: {
|
|
1585
|
-
type: "object",
|
|
1586
|
-
properties: {
|
|
1587
|
-
ideaId: { type: "string" },
|
|
1588
|
-
boardId: { type: "string" },
|
|
1589
|
-
columnId: { type: "string" }
|
|
1590
|
-
},
|
|
1591
|
-
required: ["ideaId", "boardId", "columnId"]
|
|
1592
|
-
}
|
|
1593
|
-
},
|
|
1594
|
-
// TIME TRACKING
|
|
1595
|
-
{
|
|
1596
|
-
name: "get_time_tracking",
|
|
1597
|
-
description: "Get time tracking sessions with project breakdown",
|
|
1598
|
-
inputSchema: {
|
|
1599
|
-
type: "object",
|
|
1600
|
-
properties: {
|
|
1601
|
-
startDate: { type: "string", description: "ISO date (default: 7 days ago)" },
|
|
1602
|
-
endDate: { type: "string", description: "ISO date (default: now)" },
|
|
1603
|
-
projectId: { type: "string" }
|
|
1604
|
-
}
|
|
1605
|
-
}
|
|
1606
|
-
},
|
|
1607
|
-
{
|
|
1608
|
-
name: "log_activity",
|
|
1609
|
-
description: "Log activity to create/update time session",
|
|
1610
|
-
inputSchema: {
|
|
1611
|
-
type: "object",
|
|
1612
|
-
properties: {
|
|
1613
|
-
projectId: { type: "string" },
|
|
1614
|
-
cardId: { type: "string" },
|
|
1615
|
-
activityType: { type: "string" }
|
|
1616
|
-
}
|
|
1617
|
-
}
|
|
1618
|
-
},
|
|
1619
|
-
{
|
|
1620
|
-
name: "end_time_session",
|
|
1621
|
-
description: "End the current active time tracking session",
|
|
1622
|
-
inputSchema: { type: "object", properties: {} }
|
|
1623
|
-
},
|
|
1624
|
-
// DAILY SUMMARY
|
|
1625
|
-
{
|
|
1626
|
-
name: "get_daily_summary",
|
|
1627
|
-
description: "Get daily report: working on, blocked, completed today, weekly stats",
|
|
1628
|
-
inputSchema: { type: "object", properties: {} }
|
|
1629
|
-
},
|
|
1630
|
-
// RETROSPECTIVE
|
|
1631
|
-
{
|
|
1632
|
-
name: "get_retrospective",
|
|
1633
|
-
description: "Get retrospective data: completed, created, stale, blocked cards + movements",
|
|
1634
|
-
inputSchema: {
|
|
1635
|
-
type: "object",
|
|
1636
|
-
properties: {
|
|
1637
|
-
days: { type: "number", description: "Period in days (default: 7)" }
|
|
1638
|
-
}
|
|
1639
|
-
}
|
|
1640
|
-
},
|
|
1641
|
-
// EXPORT
|
|
1642
|
-
{
|
|
1643
|
-
name: "export_board",
|
|
1644
|
-
description: "Export a board as JSON (columns, cards, tags, comments)",
|
|
1645
|
-
inputSchema: {
|
|
1646
|
-
type: "object",
|
|
1647
|
-
properties: { boardId: { type: "string" } },
|
|
1648
|
-
required: ["boardId"]
|
|
1649
|
-
}
|
|
1650
|
-
},
|
|
1651
|
-
{
|
|
1652
|
-
name: "export_project",
|
|
1653
|
-
description: "Export a project as JSON (boards, columns, cards)",
|
|
1654
|
-
inputSchema: {
|
|
1655
|
-
type: "object",
|
|
1656
|
-
properties: { projectId: { type: "string" } },
|
|
1657
|
-
required: ["projectId"]
|
|
1658
|
-
}
|
|
1659
1511
|
}
|
|
1660
1512
|
]
|
|
1661
1513
|
}));
|
|
@@ -1672,7 +1524,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1672
1524
|
result = await kanbanApi.createFolder(args);
|
|
1673
1525
|
break;
|
|
1674
1526
|
case "update_folder":
|
|
1675
|
-
result = await kanbanApi.updateFolder(
|
|
1527
|
+
result = await kanbanApi.updateFolder(
|
|
1528
|
+
args.folderId,
|
|
1529
|
+
args
|
|
1530
|
+
);
|
|
1676
1531
|
break;
|
|
1677
1532
|
case "delete_folder":
|
|
1678
1533
|
result = await kanbanApi.deleteFolder(args.folderId);
|
|
@@ -1697,10 +1552,16 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1697
1552
|
result = await kanbanApi.createProject(args);
|
|
1698
1553
|
break;
|
|
1699
1554
|
case "get_project":
|
|
1700
|
-
result = await kanbanApi.getProject(
|
|
1555
|
+
result = await kanbanApi.getProject(
|
|
1556
|
+
args.projectId,
|
|
1557
|
+
args
|
|
1558
|
+
);
|
|
1701
1559
|
break;
|
|
1702
1560
|
case "update_project":
|
|
1703
|
-
result = await kanbanApi.updateProject(
|
|
1561
|
+
result = await kanbanApi.updateProject(
|
|
1562
|
+
args.projectId,
|
|
1563
|
+
args
|
|
1564
|
+
);
|
|
1704
1565
|
break;
|
|
1705
1566
|
case "delete_project":
|
|
1706
1567
|
result = await kanbanApi.deleteProject(args.projectId);
|
|
@@ -1723,7 +1584,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1723
1584
|
result = await kanbanApi.getBoard(args.boardId, args);
|
|
1724
1585
|
break;
|
|
1725
1586
|
case "update_board":
|
|
1726
|
-
result = await kanbanApi.updateBoard(args.boardId, {
|
|
1587
|
+
result = await kanbanApi.updateBoard(args.boardId, {
|
|
1588
|
+
name: args.name
|
|
1589
|
+
});
|
|
1727
1590
|
break;
|
|
1728
1591
|
case "delete_board":
|
|
1729
1592
|
result = await kanbanApi.deleteBoard(args.boardId);
|
|
@@ -1733,7 +1596,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1733
1596
|
result = await kanbanApi.createColumn(args);
|
|
1734
1597
|
break;
|
|
1735
1598
|
case "update_column":
|
|
1736
|
-
result = await kanbanApi.updateColumn(
|
|
1599
|
+
result = await kanbanApi.updateColumn(
|
|
1600
|
+
args.columnId,
|
|
1601
|
+
args
|
|
1602
|
+
);
|
|
1737
1603
|
break;
|
|
1738
1604
|
case "delete_column":
|
|
1739
1605
|
result = await kanbanApi.deleteColumn(args.columnId);
|
|
@@ -1755,7 +1621,11 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1755
1621
|
result = await kanbanApi.deleteCard(args.cardId);
|
|
1756
1622
|
break;
|
|
1757
1623
|
case "move_card":
|
|
1758
|
-
result = await kanbanApi.moveCard(
|
|
1624
|
+
result = await kanbanApi.moveCard(
|
|
1625
|
+
args.cardId,
|
|
1626
|
+
args.targetColumnId,
|
|
1627
|
+
args.newOrder
|
|
1628
|
+
);
|
|
1759
1629
|
break;
|
|
1760
1630
|
case "archive_card":
|
|
1761
1631
|
result = await kanbanApi.archiveCard(args.cardId);
|
|
@@ -1767,7 +1637,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1767
1637
|
result = await kanbanApi.listArchivedCards(args.boardId);
|
|
1768
1638
|
break;
|
|
1769
1639
|
case "add_comment":
|
|
1770
|
-
result = await kanbanApi.addComment(
|
|
1640
|
+
result = await kanbanApi.addComment(
|
|
1641
|
+
args.cardId,
|
|
1642
|
+
args.content
|
|
1643
|
+
);
|
|
1771
1644
|
break;
|
|
1772
1645
|
case "delete_comment":
|
|
1773
1646
|
result = await kanbanApi.deleteComment(args.commentId);
|
|
@@ -1851,10 +1724,16 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1851
1724
|
result = await kanbanApi.deleteTag(args.tagId);
|
|
1852
1725
|
break;
|
|
1853
1726
|
case "add_tag_to_card":
|
|
1854
|
-
result = await kanbanApi.addTagToCard(
|
|
1727
|
+
result = await kanbanApi.addTagToCard(
|
|
1728
|
+
args.cardId,
|
|
1729
|
+
args.tagId
|
|
1730
|
+
);
|
|
1855
1731
|
break;
|
|
1856
1732
|
case "remove_tag_from_card":
|
|
1857
|
-
result = await kanbanApi.removeTagFromCard(
|
|
1733
|
+
result = await kanbanApi.removeTagFromCard(
|
|
1734
|
+
args.cardId,
|
|
1735
|
+
args.tagId
|
|
1736
|
+
);
|
|
1858
1737
|
break;
|
|
1859
1738
|
// EPICS
|
|
1860
1739
|
case "list_epics":
|
|
@@ -1873,21 +1752,30 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1873
1752
|
result = await kanbanApi.deleteEpic(args.epicId);
|
|
1874
1753
|
break;
|
|
1875
1754
|
case "add_card_to_epic":
|
|
1876
|
-
result = await kanbanApi.addCardToEpic(
|
|
1755
|
+
result = await kanbanApi.addCardToEpic(
|
|
1756
|
+
args.epicId,
|
|
1757
|
+
args.cardId
|
|
1758
|
+
);
|
|
1877
1759
|
break;
|
|
1878
1760
|
case "remove_card_from_epic":
|
|
1879
|
-
result = await kanbanApi.removeCardFromEpic(
|
|
1761
|
+
result = await kanbanApi.removeCardFromEpic(
|
|
1762
|
+
args.epicId,
|
|
1763
|
+
args.cardId
|
|
1764
|
+
);
|
|
1880
1765
|
break;
|
|
1881
1766
|
// FEATURES
|
|
1882
1767
|
case "list_features": {
|
|
1883
1768
|
const features = await kanbanApi.listFeatures(args.epicId);
|
|
1884
1769
|
const slugFilter = args.slug;
|
|
1885
|
-
result = slugFilter ? (Array.isArray(features) ? features : []).filter(
|
|
1770
|
+
result = slugFilter ? (Array.isArray(features) ? features : []).filter(
|
|
1771
|
+
(f) => f.slug === slugFilter.toUpperCase()
|
|
1772
|
+
) : features;
|
|
1886
1773
|
break;
|
|
1887
1774
|
}
|
|
1888
1775
|
case "get_feature": {
|
|
1889
1776
|
const fId = args.featureId || args.featureSlug;
|
|
1890
|
-
if (!fId)
|
|
1777
|
+
if (!fId)
|
|
1778
|
+
throw new Error("Either featureId or featureSlug is required");
|
|
1891
1779
|
result = await kanbanApi.getFeature(fId);
|
|
1892
1780
|
break;
|
|
1893
1781
|
}
|
|
@@ -1898,34 +1786,46 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1898
1786
|
result = await kanbanApi.createFeature(args);
|
|
1899
1787
|
break;
|
|
1900
1788
|
case "update_feature":
|
|
1901
|
-
result = await kanbanApi.updateFeature(
|
|
1789
|
+
result = await kanbanApi.updateFeature(
|
|
1790
|
+
args.featureId,
|
|
1791
|
+
args
|
|
1792
|
+
);
|
|
1902
1793
|
break;
|
|
1903
1794
|
case "delete_feature":
|
|
1904
1795
|
result = await kanbanApi.deleteFeature(args.featureId);
|
|
1905
1796
|
break;
|
|
1906
1797
|
case "add_card_to_feature": {
|
|
1907
1798
|
let addFeatureId = args.featureId || args.featureSlug;
|
|
1908
|
-
if (!addFeatureId)
|
|
1799
|
+
if (!addFeatureId)
|
|
1800
|
+
throw new Error("Either featureId or featureSlug is required");
|
|
1909
1801
|
if (args.featureSlug && !args.featureId) {
|
|
1910
1802
|
const resolved = await kanbanApi.getFeature(addFeatureId);
|
|
1911
1803
|
addFeatureId = resolved.id;
|
|
1912
1804
|
}
|
|
1913
|
-
result = await kanbanApi.addCardToFeature(
|
|
1805
|
+
result = await kanbanApi.addCardToFeature(
|
|
1806
|
+
addFeatureId,
|
|
1807
|
+
args.cardId
|
|
1808
|
+
);
|
|
1914
1809
|
break;
|
|
1915
1810
|
}
|
|
1916
1811
|
case "remove_card_from_feature": {
|
|
1917
1812
|
let removeFeatureId = args.featureId || args.featureSlug;
|
|
1918
|
-
if (!removeFeatureId)
|
|
1813
|
+
if (!removeFeatureId)
|
|
1814
|
+
throw new Error("Either featureId or featureSlug is required");
|
|
1919
1815
|
if (args.featureSlug && !args.featureId) {
|
|
1920
1816
|
const resolved = await kanbanApi.getFeature(removeFeatureId);
|
|
1921
1817
|
removeFeatureId = resolved.id;
|
|
1922
1818
|
}
|
|
1923
|
-
result = await kanbanApi.removeCardFromFeature(
|
|
1819
|
+
result = await kanbanApi.removeCardFromFeature(
|
|
1820
|
+
removeFeatureId,
|
|
1821
|
+
args.cardId
|
|
1822
|
+
);
|
|
1924
1823
|
break;
|
|
1925
1824
|
}
|
|
1926
1825
|
case "get_feature_cards": {
|
|
1927
1826
|
let cardsFeatureId = args.featureId || args.featureSlug;
|
|
1928
|
-
if (!cardsFeatureId)
|
|
1827
|
+
if (!cardsFeatureId)
|
|
1828
|
+
throw new Error("Either featureId or featureSlug is required");
|
|
1929
1829
|
if (args.featureSlug && !args.featureId) {
|
|
1930
1830
|
const resolved = await kanbanApi.getFeature(cardsFeatureId);
|
|
1931
1831
|
cardsFeatureId = resolved.id;
|
|
@@ -1955,73 +1855,27 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
1955
1855
|
result = await kanbanApi.getGithubIntegration(args.projectId);
|
|
1956
1856
|
break;
|
|
1957
1857
|
case "update_github_integration":
|
|
1958
|
-
result = await kanbanApi.updateGithubIntegration(
|
|
1858
|
+
result = await kanbanApi.updateGithubIntegration(
|
|
1859
|
+
args.projectId,
|
|
1860
|
+
args
|
|
1861
|
+
);
|
|
1959
1862
|
break;
|
|
1960
1863
|
case "remove_github_integration":
|
|
1961
|
-
result = await kanbanApi.removeGithubIntegration(
|
|
1864
|
+
result = await kanbanApi.removeGithubIntegration(
|
|
1865
|
+
args.projectId
|
|
1866
|
+
);
|
|
1962
1867
|
break;
|
|
1963
1868
|
case "link_card_to_branch":
|
|
1964
|
-
result = await kanbanApi.linkCardToBranch(
|
|
1869
|
+
result = await kanbanApi.linkCardToBranch(
|
|
1870
|
+
args.cardId,
|
|
1871
|
+
args.branch
|
|
1872
|
+
);
|
|
1965
1873
|
break;
|
|
1966
1874
|
case "link_card_to_pr":
|
|
1967
|
-
result = await kanbanApi.linkCardToPr(
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
result = await kanbanApi.githubListRepos(args.userId, args.type);
|
|
1972
|
-
break;
|
|
1973
|
-
case "github_create_branch":
|
|
1974
|
-
result = await kanbanApi.githubCreateBranch(args);
|
|
1975
|
-
break;
|
|
1976
|
-
case "github_create_pr":
|
|
1977
|
-
result = await kanbanApi.githubCreatePr(args);
|
|
1978
|
-
break;
|
|
1979
|
-
// IDEAS
|
|
1980
|
-
case "list_ideas":
|
|
1981
|
-
result = await kanbanApi.listIdeas(args);
|
|
1982
|
-
break;
|
|
1983
|
-
case "get_idea":
|
|
1984
|
-
result = await kanbanApi.getIdea(args.ideaId);
|
|
1985
|
-
break;
|
|
1986
|
-
case "create_idea":
|
|
1987
|
-
result = await kanbanApi.createIdea(args);
|
|
1988
|
-
break;
|
|
1989
|
-
case "update_idea":
|
|
1990
|
-
result = await kanbanApi.updateIdea(args.ideaId, args);
|
|
1991
|
-
break;
|
|
1992
|
-
case "delete_idea":
|
|
1993
|
-
result = await kanbanApi.deleteIdea(args.ideaId);
|
|
1994
|
-
break;
|
|
1995
|
-
case "convert_idea_to_card":
|
|
1996
|
-
result = await kanbanApi.convertIdeaToCard(args.ideaId, {
|
|
1997
|
-
boardId: args.boardId,
|
|
1998
|
-
columnId: args.columnId
|
|
1999
|
-
});
|
|
2000
|
-
break;
|
|
2001
|
-
// TIME TRACKING
|
|
2002
|
-
case "get_time_tracking":
|
|
2003
|
-
result = await kanbanApi.getTimeTracking(args);
|
|
2004
|
-
break;
|
|
2005
|
-
case "log_activity":
|
|
2006
|
-
result = await kanbanApi.logActivity(args);
|
|
2007
|
-
break;
|
|
2008
|
-
case "end_time_session":
|
|
2009
|
-
result = await kanbanApi.endTimeSession();
|
|
2010
|
-
break;
|
|
2011
|
-
// DAILY SUMMARY
|
|
2012
|
-
case "get_daily_summary":
|
|
2013
|
-
result = await kanbanApi.getDailySummary();
|
|
2014
|
-
break;
|
|
2015
|
-
// RETROSPECTIVE
|
|
2016
|
-
case "get_retrospective":
|
|
2017
|
-
result = await kanbanApi.getRetrospective(args.days);
|
|
2018
|
-
break;
|
|
2019
|
-
// EXPORT
|
|
2020
|
-
case "export_board":
|
|
2021
|
-
result = await kanbanApi.exportBoard(args.boardId);
|
|
2022
|
-
break;
|
|
2023
|
-
case "export_project":
|
|
2024
|
-
result = await kanbanApi.exportProject(args.projectId);
|
|
1875
|
+
result = await kanbanApi.linkCardToPr(
|
|
1876
|
+
args.cardId,
|
|
1877
|
+
args.prUrl
|
|
1878
|
+
);
|
|
2025
1879
|
break;
|
|
2026
1880
|
default:
|
|
2027
1881
|
throw new Error(`Unknown tool: ${name}`);
|