snboard-mcp 1.1.0 → 1.1.2

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.
Files changed (2) hide show
  1. package/dist/index.js +793 -1553
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -50,45 +50,13 @@ var kanbanApi = {
50
50
  return api(`/api/projects${query ? `?${query}` : ""}`);
51
51
  },
52
52
  createProject: (data) => api("/api/projects", { method: "POST", body: JSON.stringify(data) }),
53
- getProject: (id, params) => {
54
- const searchParams = new URLSearchParams();
55
- if (params?.includeBoards) searchParams.set("includeBoards", "true");
56
- if (params?.boardsCompact) searchParams.set("boardsCompact", "true");
57
- const query = searchParams.toString();
58
- return api(`/api/projects/${id}${query ? `?${query}` : ""}`);
59
- },
53
+ getProject: (id) => api(`/api/projects/${id}`),
60
54
  updateProject: (id, data) => api(`/api/projects/${id}`, { method: "PUT", body: JSON.stringify(data) }),
61
55
  deleteProject: (id) => api(`/api/projects/${id}`, { method: "DELETE" }),
62
56
  reorderProjects: (projectId, targetProjectId, folderId) => api("/api/projects/reorder", {
63
57
  method: "POST",
64
58
  body: JSON.stringify({ projectId, targetProjectId, folderId })
65
59
  }),
66
- // Boards
67
- listBoards: (params) => {
68
- const searchParams = new URLSearchParams();
69
- if (params?.projectId) searchParams.set("projectId", params.projectId);
70
- if (params?.limit) searchParams.set("limit", params.limit.toString());
71
- if (params?.compact) searchParams.set("compact", "true");
72
- const query = searchParams.toString();
73
- return api(`/api/boards${query ? `?${query}` : ""}`);
74
- },
75
- createBoard: (data) => api("/api/boards", { method: "POST", body: JSON.stringify(data) }),
76
- getBoard: (id, params) => {
77
- const searchParams = new URLSearchParams();
78
- if (params?.columnId) searchParams.set("columnId", params.columnId);
79
- if (params?.includeCards) {
80
- searchParams.set("includeCards", "true");
81
- searchParams.set("cardLimit", (params?.cardLimit || 10).toString());
82
- }
83
- if (params?.includeTags) searchParams.set("includeTags", "true");
84
- if (params?.includeComments) searchParams.set("includeComments", "true");
85
- if (params?.compact) searchParams.set("compact", "true");
86
- if (params?.priority) searchParams.set("priority", params.priority);
87
- const query = searchParams.toString();
88
- return api(`/api/boards/${id}${query ? `?${query}` : ""}`);
89
- },
90
- updateBoard: (id, data) => api(`/api/boards/${id}`, { method: "PUT", body: JSON.stringify(data) }),
91
- deleteBoard: (id) => api(`/api/boards/${id}`, { method: "DELETE" }),
92
60
  // Columns
93
61
  createColumn: (data) => api("/api/columns", { method: "POST", body: JSON.stringify(data) }),
94
62
  updateColumn: (id, data) => api(`/api/columns/${id}`, { method: "PUT", body: JSON.stringify(data) }),
@@ -102,19 +70,28 @@ var kanbanApi = {
102
70
  createCard: (data) => api("/api/cards", { method: "POST", body: JSON.stringify(data) }),
103
71
  updateCard: (id, data) => api(`/api/cards/${id}`, { method: "PUT", body: JSON.stringify(data) }),
104
72
  deleteCard: (id) => api(`/api/cards/${id}`, { method: "DELETE" }),
105
- archiveCard: (id) => api(`/api/cards/${id}`, { method: "PUT", body: JSON.stringify({ isArchived: true }) }),
106
- unarchiveCard: (id) => api(`/api/cards/${id}`, { method: "PUT", body: JSON.stringify({ isArchived: false }) }),
107
- listArchivedCards: (boardId) => api(`/api/archived?boardId=${boardId}`),
73
+ archiveCard: (id) => api(`/api/cards/${id}`, {
74
+ method: "PUT",
75
+ body: JSON.stringify({ isArchived: true })
76
+ }),
77
+ unarchiveCard: (id) => api(`/api/cards/${id}`, {
78
+ method: "PUT",
79
+ body: JSON.stringify({ isArchived: false })
80
+ }),
81
+ listArchivedCards: (projectId) => api(`/api/archived?projectId=${projectId}`),
108
82
  moveCard: (id, targetColumnId, newOrder) => api("/api/cards/move", {
109
83
  method: "POST",
110
- body: JSON.stringify({ cardId: id, targetColumnId, ...newOrder !== void 0 && { newOrder } })
84
+ body: JSON.stringify({
85
+ cardId: id,
86
+ targetColumnId,
87
+ ...newOrder !== void 0 && { newOrder }
88
+ })
111
89
  }),
112
90
  getBranchName: (id, type) => api(`/api/cards/${id}/branch?type=${type}`),
113
91
  searchCards: (params) => {
114
92
  const searchParams = new URLSearchParams();
115
93
  searchParams.set("query", params.query);
116
94
  if (params.projectId) searchParams.set("projectId", params.projectId);
117
- if (params.boardId) searchParams.set("boardId", params.boardId);
118
95
  if (params.columnId) searchParams.set("columnId", params.columnId);
119
96
  if (params.epicId) searchParams.set("epicId", params.epicId);
120
97
  if (params.featureId) searchParams.set("featureId", params.featureId);
@@ -179,12 +156,20 @@ var kanbanApi = {
179
156
  return { epic, cards: cardResults, created: cardResults.length };
180
157
  },
181
158
  bulkCreateEpicWithFeatures: async (data) => {
182
- const epic = await api("/api/epics", { method: "POST", body: JSON.stringify(data.epic) });
159
+ const epic = await api("/api/epics", {
160
+ method: "POST",
161
+ body: JSON.stringify(data.epic)
162
+ });
183
163
  const features = await Promise.all(
184
164
  data.features.map(
185
165
  (f) => api("/api/features", {
186
166
  method: "POST",
187
- body: JSON.stringify({ epicId: epic.id, title: f.title, slug: f.slug, description: f.description })
167
+ body: JSON.stringify({
168
+ epicId: epic.id,
169
+ title: f.title,
170
+ slug: f.slug,
171
+ description: f.description
172
+ })
188
173
  })
189
174
  )
190
175
  );
@@ -205,10 +190,18 @@ var kanbanApi = {
205
190
  body: JSON.stringify({ cardId: card.id })
206
191
  });
207
192
  }
208
- return { id: feature.id, slug: feature.slug, title: feature.title, cardIds: cards.map((c) => c.id) };
193
+ return {
194
+ id: feature.id,
195
+ slug: feature.slug,
196
+ title: feature.title,
197
+ cardIds: cards.map((c) => c.id)
198
+ };
209
199
  })
210
200
  );
211
- const totalCards = featureResults.reduce((sum, f) => sum + f.cardIds.length, 0);
201
+ const totalCards = featureResults.reduce(
202
+ (sum, f) => sum + f.cardIds.length,
203
+ 0
204
+ );
212
205
  return {
213
206
  epic: { id: epic.id, slug: epic.slug, name: epic.name },
214
207
  features: featureResults,
@@ -228,26 +221,18 @@ var kanbanApi = {
228
221
  },
229
222
  // Aggregated views
230
223
  getWorkspace: async (projectId) => {
231
- const project = await api(
232
- `/api/projects/${projectId}?includeBoards=true&boardsCompact=true`
233
- );
234
- if (!project.boards?.length) return { project, boards: [] };
235
- const boardsWithColumns = await Promise.all(
236
- project.boards.map((b) => api(`/api/boards/${b.id}`))
237
- );
224
+ const project = await api(`/api/projects/${projectId}`);
238
225
  return {
239
226
  project: { id: project.id, name: project.name },
240
- boards: boardsWithColumns
227
+ columns: project.columns || []
241
228
  };
242
229
  },
243
- getBoardSummary: async (boardId) => {
244
- const board = await api(
245
- `/api/boards/${boardId}?includeCards=true&compact=true`
246
- );
230
+ getProjectSummary: async (projectId) => {
231
+ const project = await api(`/api/projects/${projectId}`);
247
232
  const summary = {
248
- id: board.id,
249
- name: board.name,
250
- columns: board.columns.map((col) => ({
233
+ id: project.id,
234
+ name: project.name,
235
+ columns: (project.columns || []).map((col) => ({
251
236
  id: col.id,
252
237
  name: col.name,
253
238
  cardCount: col.cards?.length || 0,
@@ -255,7 +240,7 @@ var kanbanApi = {
255
240
  p2Count: col.cards?.filter((c) => c.priority === "P2").length || 0,
256
241
  p3Count: col.cards?.filter((c) => c.priority === "P3").length || 0
257
242
  })),
258
- totalCards: board.columns.reduce(
243
+ totalCards: (project.columns || []).reduce(
259
244
  (sum, col) => sum + (col.cards?.length || 0),
260
245
  0
261
246
  )
@@ -388,7 +373,10 @@ var kanbanApi = {
388
373
  createFeature: (data) => api("/api/features", { method: "POST", body: JSON.stringify(data) }),
389
374
  updateFeature: (id, data) => api(`/api/features/${id}`, { method: "PATCH", body: JSON.stringify(data) }),
390
375
  deleteFeature: (id) => api(`/api/features/${id}`, { method: "DELETE" }),
391
- addCardToFeature: (featureId, cardId) => api(`/api/features/${featureId}/cards`, { method: "POST", body: JSON.stringify({ cardId }) }),
376
+ addCardToFeature: (featureId, cardId) => api(`/api/features/${featureId}/cards`, {
377
+ method: "POST",
378
+ body: JSON.stringify({ cardId })
379
+ }),
392
380
  removeCardFromFeature: (featureId, cardId) => api(`/api/features/${featureId}/cards/${cardId}`, { method: "DELETE" }),
393
381
  getFeatureCards: (featureId) => api(`/api/features/${featureId}/cards`),
394
382
  // Card Links
@@ -416,45 +404,7 @@ var kanbanApi = {
416
404
  linkCardToPr: (cardId, prUrl) => api(`/api/cards/${cardId}`, {
417
405
  method: "PUT",
418
406
  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}`)
407
+ })
458
408
  };
459
409
  var server = new Server(
460
410
  { name: "kanban-mcp", version: "1.1.0" },
@@ -462,1566 +412,856 @@ var server = new Server(
462
412
  );
463
413
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
464
414
  tools: [
465
- // FOLDERS
466
- {
467
- name: "list_folders",
468
- description: "List all folders with their projects",
469
- inputSchema: { type: "object", properties: {} }
470
- },
471
- {
472
- name: "create_folder",
473
- description: "Create a new folder to organize projects",
474
- inputSchema: {
475
- type: "object",
476
- properties: {
477
- name: { type: "string" },
478
- icon: { type: "string" },
479
- color: { type: "string" }
480
- },
481
- required: ["name"]
482
- }
483
- },
484
- {
485
- name: "update_folder",
486
- description: "Update a folder (name, icon, color)",
487
- inputSchema: {
488
- type: "object",
489
- properties: {
490
- folderId: { type: "string" },
491
- name: { type: "string" },
492
- icon: { type: "string" },
493
- color: { type: "string" }
494
- },
495
- required: ["folderId"]
496
- }
497
- },
498
- {
499
- name: "delete_folder",
500
- description: "Delete a folder (projects become orphans)",
501
- inputSchema: {
502
- type: "object",
503
- properties: { folderId: { type: "string" } },
504
- required: ["folderId"]
505
- }
506
- },
415
+ // 1. FOLDERS
507
416
  {
508
- name: "move_project_to_folder",
509
- description: "Move project to folder (null to remove)",
417
+ name: "manage_folders",
418
+ description: "Folder operations. Actions: list, create, update, delete, reorder, move_project",
510
419
  inputSchema: {
511
420
  type: "object",
512
421
  properties: {
513
- projectId: { type: "string" },
514
- folderId: { type: "string" }
422
+ action: {
423
+ type: "string",
424
+ enum: [
425
+ "list",
426
+ "create",
427
+ "update",
428
+ "delete",
429
+ "reorder",
430
+ "move_project"
431
+ ]
432
+ },
433
+ folderId: { type: "string", description: "update/delete/reorder" },
434
+ name: { type: "string", description: "create/update" },
435
+ icon: { type: "string", description: "create/update" },
436
+ color: { type: "string", description: "create/update" },
437
+ targetFolderId: { type: "string", description: "reorder" },
438
+ projectId: { type: "string", description: "move_project" }
515
439
  },
516
- required: ["projectId"]
440
+ required: ["action"]
517
441
  }
518
442
  },
443
+ // 2. PROJECTS
519
444
  {
520
- name: "reorder_folders",
521
- description: "Reorder folders by moving one before/after another",
445
+ name: "manage_projects",
446
+ description: "Project operations. Actions: list, create, get, update, delete, reorder, get_summary, get_workspace",
522
447
  inputSchema: {
523
448
  type: "object",
524
449
  properties: {
525
- folderId: { type: "string" },
526
- targetFolderId: { type: "string" }
450
+ action: {
451
+ type: "string",
452
+ enum: [
453
+ "list",
454
+ "create",
455
+ "get",
456
+ "update",
457
+ "delete",
458
+ "reorder",
459
+ "get_summary",
460
+ "get_workspace"
461
+ ]
462
+ },
463
+ projectId: {
464
+ type: "string",
465
+ description: "get/update/delete/reorder/get_summary/get_workspace"
466
+ },
467
+ name: { type: "string", description: "create/update" },
468
+ description: { type: "string", description: "create/update" },
469
+ emoji: { type: "string", description: "create/update" },
470
+ color: { type: "string", description: "create/update" },
471
+ folderId: {
472
+ type: "string",
473
+ description: 'list: filter by folder ("none" for orphans). create/update: assign to folder. reorder: folder context'
474
+ },
475
+ limit: { type: "number", description: "list (default:20)" },
476
+ compact: { type: "boolean", description: "list" },
477
+ targetProjectId: { type: "string", description: "reorder" }
527
478
  },
528
- required: ["folderId", "targetFolderId"]
529
- }
530
- },
531
- // PROJECTS
532
- {
533
- name: "list_projects",
534
- description: "List projects (default limit:20). Use compact:true for minimal fields",
535
- inputSchema: {
536
- type: "object",
537
- properties: {
538
- folderId: { type: "string", description: 'Filter by folder. Use "none" for orphan projects' },
539
- limit: { type: "number" },
540
- compact: { type: "boolean" }
541
- }
479
+ required: ["action"]
542
480
  }
543
481
  },
482
+ // 3. COLUMNS
544
483
  {
545
- name: "create_project",
546
- description: "Create a new project",
484
+ name: "manage_columns",
485
+ description: "Column operations. Actions: create, update, delete, reorder",
547
486
  inputSchema: {
548
487
  type: "object",
549
488
  properties: {
550
- name: { type: "string" },
551
- description: { type: "string" },
552
- emoji: { type: "string" },
553
- color: { type: "string" },
554
- folderId: { type: "string" }
489
+ action: {
490
+ type: "string",
491
+ enum: ["create", "update", "delete", "reorder"]
492
+ },
493
+ columnId: { type: "string", description: "update/delete" },
494
+ projectId: { type: "string", description: "create" },
495
+ name: { type: "string", description: "create/update" },
496
+ emoji: { type: "string", description: "create/update" },
497
+ columns: {
498
+ type: "array",
499
+ items: {
500
+ type: "object",
501
+ properties: {
502
+ id: { type: "string" },
503
+ order: { type: "number" }
504
+ },
505
+ required: ["id", "order"]
506
+ },
507
+ description: "reorder: array of {id, order}"
508
+ }
555
509
  },
556
- required: ["name"]
510
+ required: ["action"]
557
511
  }
558
512
  },
513
+ // 4. CARDS
559
514
  {
560
- name: "get_project",
561
- description: "Get project. Use includeBoards:true to get boards in 1 call",
515
+ name: "manage_cards",
516
+ description: "Card operations. Actions: get, create, update, delete, move, archive, unarchive, list_archived, search, get_branch_name, bulk_create, quick_add, bulk_move, move_by_column",
562
517
  inputSchema: {
563
518
  type: "object",
564
519
  properties: {
565
- projectId: { type: "string" },
566
- includeBoards: { type: "boolean" },
567
- boardsCompact: { type: "boolean" }
520
+ action: {
521
+ type: "string",
522
+ enum: [
523
+ "get",
524
+ "create",
525
+ "update",
526
+ "delete",
527
+ "move",
528
+ "archive",
529
+ "unarchive",
530
+ "list_archived",
531
+ "search",
532
+ "get_branch_name",
533
+ "bulk_create",
534
+ "quick_add",
535
+ "bulk_move",
536
+ "move_by_column"
537
+ ]
538
+ },
539
+ cardId: {
540
+ type: "string",
541
+ description: "get/update/delete/move/archive/unarchive/get_branch_name"
542
+ },
543
+ columnId: {
544
+ type: "string",
545
+ description: "create/bulk_create/quick_add"
546
+ },
547
+ title: { type: "string", description: "create" },
548
+ description: { type: "string", description: "create/update" },
549
+ priority: {
550
+ type: "string",
551
+ enum: ["P1", "P2", "P3"],
552
+ description: "create/update"
553
+ },
554
+ dueDate: { type: "string", description: "create/update" },
555
+ epicId: { type: "string", description: "create/search" },
556
+ tagIds: {
557
+ type: "array",
558
+ items: { type: "string" },
559
+ description: "create/update: replace all tags. search: filter"
560
+ },
561
+ estimatedMinutes: { type: "number", description: "create/update" },
562
+ cognitiveLoad: { type: "string", description: "create/update" },
563
+ githubBranch: { type: "string", description: "update" },
564
+ githubPrUrl: { type: "string", description: "update" },
565
+ isArchived: { type: "boolean", description: "update" },
566
+ targetColumnId: {
567
+ type: "string",
568
+ description: "move/bulk_move/move_by_column"
569
+ },
570
+ newOrder: {
571
+ type: "number",
572
+ description: "move: position (0-indexed)"
573
+ },
574
+ query: { type: "string", description: "search" },
575
+ projectId: { type: "string", description: "list_archived/search" },
576
+ featureId: { type: "string", description: "search" },
577
+ hasEpic: { type: "boolean", description: "search" },
578
+ status: {
579
+ type: "string",
580
+ enum: ["todo", "in_progress", "done"],
581
+ description: "search"
582
+ },
583
+ limit: { type: "number", description: "search/move_by_column" },
584
+ compact: { type: "boolean", description: "search" },
585
+ type: {
586
+ type: "string",
587
+ enum: ["feature", "fix", "chore", "refactor", "docs"],
588
+ description: "get_branch_name"
589
+ },
590
+ cards: {
591
+ type: "array",
592
+ items: {
593
+ type: "object",
594
+ properties: {
595
+ title: { type: "string" },
596
+ description: { type: "string" },
597
+ priority: { type: "string", enum: ["P1", "P2", "P3"] },
598
+ epicId: { type: "string" }
599
+ },
600
+ required: ["title"]
601
+ },
602
+ description: "bulk_create"
603
+ },
604
+ text: {
605
+ type: "string",
606
+ description: "quick_add: multiline text, 1 card per line"
607
+ },
608
+ defaultPriority: {
609
+ type: "string",
610
+ enum: ["P1", "P2", "P3"],
611
+ description: "quick_add"
612
+ },
613
+ cardIds: {
614
+ type: "array",
615
+ items: { type: "string" },
616
+ description: "bulk_move"
617
+ },
618
+ sourceColumnId: { type: "string", description: "move_by_column" }
568
619
  },
569
- required: ["projectId"]
620
+ required: ["action"]
570
621
  }
571
622
  },
623
+ // 5. COMMENTS
572
624
  {
573
- name: "update_project",
574
- description: "Update project",
625
+ name: "manage_comments",
626
+ description: "Comment operations. Actions: add, delete",
575
627
  inputSchema: {
576
628
  type: "object",
577
629
  properties: {
578
- projectId: { type: "string" },
579
- name: { type: "string" },
580
- description: { type: "string" },
581
- emoji: { type: "string" },
582
- color: { type: "string" },
583
- folderId: { type: "string", description: "Move to folder (null to remove)" }
630
+ action: { type: "string", enum: ["add", "delete"] },
631
+ cardId: { type: "string", description: "add" },
632
+ content: { type: "string", description: "add" },
633
+ commentId: { type: "string", description: "delete" }
584
634
  },
585
- required: ["projectId"]
586
- }
587
- },
588
- {
589
- name: "delete_project",
590
- description: "Delete project and all its content",
591
- inputSchema: {
592
- type: "object",
593
- properties: { projectId: { type: "string" } },
594
- required: ["projectId"]
635
+ required: ["action"]
595
636
  }
596
637
  },
638
+ // 6. CHECKLISTS
597
639
  {
598
- name: "reorder_projects",
599
- description: "Reorder projects within a folder",
640
+ name: "manage_checklists",
641
+ description: "Checklist operations. Actions: create, update, delete, create_item, update_item, delete_item",
600
642
  inputSchema: {
601
643
  type: "object",
602
644
  properties: {
603
- projectId: { type: "string" },
604
- targetProjectId: { type: "string" },
605
- folderId: { type: "string", description: "Folder context (null for orphans)" }
645
+ action: {
646
+ type: "string",
647
+ enum: [
648
+ "create",
649
+ "update",
650
+ "delete",
651
+ "create_item",
652
+ "update_item",
653
+ "delete_item"
654
+ ]
655
+ },
656
+ cardId: { type: "string", description: "create" },
657
+ checklistId: {
658
+ type: "string",
659
+ description: "update/delete/create_item"
660
+ },
661
+ title: { type: "string", description: "create/update" },
662
+ itemId: { type: "string", description: "update_item/delete_item" },
663
+ content: {
664
+ type: "string",
665
+ description: "create_item/update_item"
666
+ },
667
+ completed: { type: "boolean", description: "update_item" }
606
668
  },
607
- required: ["projectId", "targetProjectId"]
669
+ required: ["action"]
608
670
  }
609
671
  },
610
- // BOARDS
672
+ // 7. TAGS
611
673
  {
612
- name: "list_boards",
613
- description: "List boards for a project",
674
+ name: "manage_tags",
675
+ description: "Tag operations. Actions: list, create, delete, add_to_card, remove_from_card",
614
676
  inputSchema: {
615
677
  type: "object",
616
678
  properties: {
617
- projectId: { type: "string" },
618
- limit: { type: "number" },
619
- compact: { type: "boolean" }
679
+ action: {
680
+ type: "string",
681
+ enum: [
682
+ "list",
683
+ "create",
684
+ "delete",
685
+ "add_to_card",
686
+ "remove_from_card"
687
+ ]
688
+ },
689
+ tagId: {
690
+ type: "string",
691
+ description: "delete/add_to_card/remove_from_card"
692
+ },
693
+ name: { type: "string", description: "create" },
694
+ color: { type: "string", description: "create" },
695
+ cardId: {
696
+ type: "string",
697
+ description: "add_to_card/remove_from_card"
698
+ }
620
699
  },
621
- required: ["projectId"]
622
- }
623
- },
624
- {
625
- name: "create_board",
626
- description: "Create board with default columns",
627
- inputSchema: {
628
- type: "object",
629
- properties: { projectId: { type: "string" }, name: { type: "string" } },
630
- required: ["projectId", "name"]
700
+ required: ["action"]
631
701
  }
632
702
  },
703
+ // 8. EPICS
633
704
  {
634
- name: "get_board",
635
- description: "Get board with columns. Cards NOT included by default. Use includeCards:true + cardLimit + columnId to get specific cards.",
705
+ name: "manage_epics",
706
+ description: "Epic operations. Actions: list, create, get, update, delete, add_card, remove_card, get_summary, bulk_create_with_cards, bulk_create_with_features",
636
707
  inputSchema: {
637
708
  type: "object",
638
709
  properties: {
639
- boardId: { type: "string" },
640
- columnId: { type: "string", description: "Get only this column" },
641
- includeCards: {
642
- type: "boolean",
643
- description: "Include cards (default: false)"
710
+ action: {
711
+ type: "string",
712
+ enum: [
713
+ "list",
714
+ "create",
715
+ "get",
716
+ "update",
717
+ "delete",
718
+ "add_card",
719
+ "remove_card",
720
+ "get_summary",
721
+ "bulk_create_with_cards",
722
+ "bulk_create_with_features"
723
+ ]
644
724
  },
645
- cardLimit: {
646
- type: "number",
647
- description: "Max cards per column (e.g. 5)"
725
+ epicId: {
726
+ type: "string",
727
+ description: "get/update/delete/add_card/remove_card/get_summary"
648
728
  },
649
- priority: { type: "string", enum: ["P1", "P2", "P3"] },
650
- compact: {
729
+ slug: { type: "string", description: "create/update" },
730
+ name: { type: "string", description: "create/update" },
731
+ description: { type: "string", description: "create/update" },
732
+ emoji: { type: "string", description: "create/update" },
733
+ color: { type: "string", description: "create/update" },
734
+ status: { type: "string", description: "list/update" },
735
+ startDate: { type: "string", description: "create/update" },
736
+ targetDate: { type: "string", description: "create/update" },
737
+ syncDates: {
651
738
  type: "boolean",
652
- description: "Minimal fields (id, title, priority)"
739
+ description: "update: sync targetDate to all card due dates"
653
740
  },
654
- includeTags: { type: "boolean" },
655
- includeComments: {
656
- type: "boolean",
657
- description: "Include comments (max 5)"
658
- }
659
- },
660
- required: ["boardId"]
661
- }
662
- },
663
- {
664
- name: "update_board",
665
- description: "Rename a board",
666
- inputSchema: {
667
- type: "object",
668
- properties: { boardId: { type: "string" }, name: { type: "string" } },
669
- required: ["boardId", "name"]
670
- }
671
- },
672
- {
673
- name: "delete_board",
674
- description: "Delete board and all content",
675
- inputSchema: {
676
- type: "object",
677
- properties: { boardId: { type: "string" } },
678
- required: ["boardId"]
679
- }
680
- },
681
- // COLUMNS
682
- {
683
- name: "create_column",
684
- description: "Create column in board",
685
- inputSchema: {
686
- type: "object",
687
- properties: {
688
- boardId: { type: "string" },
689
- name: { type: "string" },
690
- emoji: { type: "string" }
691
- },
692
- required: ["boardId", "name"]
693
- }
694
- },
695
- {
696
- name: "update_column",
697
- description: "Update column",
698
- inputSchema: {
699
- type: "object",
700
- properties: {
701
- columnId: { type: "string" },
702
- name: { type: "string" },
703
- emoji: { type: "string" }
704
- },
705
- required: ["columnId"]
706
- }
707
- },
708
- {
709
- name: "delete_column",
710
- description: "Delete column and cards",
711
- inputSchema: {
712
- type: "object",
713
- properties: { columnId: { type: "string" } },
714
- required: ["columnId"]
715
- }
716
- },
717
- {
718
- name: "reorder_columns",
719
- description: "Reorder columns in a board",
720
- inputSchema: {
721
- type: "object",
722
- properties: {
723
- columns: {
741
+ includeProgress: { type: "boolean", description: "list" },
742
+ limit: { type: "number", description: "list (default:15)" },
743
+ compact: { type: "boolean", description: "list" },
744
+ cardId: { type: "string", description: "add_card/remove_card" },
745
+ epic: {
746
+ type: "object",
747
+ properties: {
748
+ slug: { type: "string" },
749
+ name: { type: "string" },
750
+ description: { type: "string" },
751
+ emoji: { type: "string" },
752
+ color: { type: "string" }
753
+ },
754
+ required: ["slug", "name"],
755
+ description: "bulk_create_with_cards/bulk_create_with_features"
756
+ },
757
+ columnId: { type: "string", description: "bulk_create_with_cards" },
758
+ cards: {
724
759
  type: "array",
725
760
  items: {
726
761
  type: "object",
727
762
  properties: {
728
- id: { type: "string" },
729
- order: { type: "number" }
763
+ title: { type: "string" },
764
+ description: { type: "string" },
765
+ priority: { type: "string", enum: ["P1", "P2", "P3"] }
730
766
  },
731
- required: ["id", "order"]
732
- }
767
+ required: ["title"]
768
+ },
769
+ description: "bulk_create_with_cards"
770
+ },
771
+ features: {
772
+ type: "array",
773
+ items: {
774
+ type: "object",
775
+ properties: {
776
+ title: { type: "string" },
777
+ slug: {
778
+ type: "string",
779
+ description: "UPPERCASE slug (auto-generated if omitted)"
780
+ },
781
+ description: { type: "string" },
782
+ cards: {
783
+ type: "array",
784
+ items: {
785
+ type: "object",
786
+ properties: {
787
+ columnId: { type: "string" },
788
+ title: { type: "string" },
789
+ description: { type: "string" },
790
+ priority: { type: "string", enum: ["P1", "P2", "P3"] }
791
+ },
792
+ required: ["columnId", "title"]
793
+ }
794
+ }
795
+ },
796
+ required: ["title", "cards"]
797
+ },
798
+ description: "bulk_create_with_features"
733
799
  }
734
800
  },
735
- required: ["columns"]
801
+ required: ["action"]
736
802
  }
737
803
  },
738
- // CARDS
804
+ // 9. FEATURES
739
805
  {
740
- name: "get_card",
741
- description: "Get a card with all details (tags, comments, checklists, epics, features)",
806
+ name: "manage_features",
807
+ description: "Feature operations. Actions: list, get, get_active, create, update, delete, add_card, remove_card, get_cards",
742
808
  inputSchema: {
743
809
  type: "object",
744
- properties: { cardId: { type: "string" } },
745
- required: ["cardId"]
810
+ properties: {
811
+ action: {
812
+ type: "string",
813
+ enum: [
814
+ "list",
815
+ "get",
816
+ "get_active",
817
+ "create",
818
+ "update",
819
+ "delete",
820
+ "add_card",
821
+ "remove_card",
822
+ "get_cards"
823
+ ]
824
+ },
825
+ featureId: {
826
+ type: "string",
827
+ description: "get/update/delete/add_card/remove_card/get_cards: ID or slug"
828
+ },
829
+ featureSlug: {
830
+ type: "string",
831
+ description: "get/add_card/remove_card/get_cards: slug (UPPERCASE), alternative to featureId"
832
+ },
833
+ epicId: { type: "string", description: "list/create/update" },
834
+ slug: {
835
+ type: "string",
836
+ description: "list: filter by slug. create/update"
837
+ },
838
+ title: { type: "string", description: "create/update" },
839
+ description: { type: "string", description: "create/update" },
840
+ status: {
841
+ type: "string",
842
+ enum: ["planning", "in_progress", "completed", "on_hold"],
843
+ description: "create/update"
844
+ },
845
+ order: { type: "number", description: "update" },
846
+ cardId: { type: "string", description: "add_card/remove_card" }
847
+ },
848
+ required: ["action"]
746
849
  }
747
850
  },
851
+ // 10. CARD LINKS
748
852
  {
749
- name: "create_card",
750
- description: "Create card. Auto-assign to epic if epicId provided.",
853
+ name: "manage_card_links",
854
+ description: "Card link operations. Actions: link, unlink, get",
751
855
  inputSchema: {
752
856
  type: "object",
753
857
  properties: {
754
- columnId: { type: "string" },
755
- title: { type: "string" },
756
- description: { type: "string" },
757
- priority: { type: "string", enum: ["P1", "P2", "P3"] },
758
- dueDate: { type: "string" },
759
- epicId: { type: "string" },
760
- tagIds: { type: "array", items: { type: "string" } },
761
- estimatedMinutes: { type: "number", description: "Estimated time in minutes" },
762
- cognitiveLoad: { type: "string", description: "Cognitive load level" }
858
+ action: { type: "string", enum: ["link", "unlink", "get"] },
859
+ cardId: { type: "string", description: "get" },
860
+ cardId1: { type: "string", description: "link" },
861
+ cardId2: { type: "string", description: "link" },
862
+ label: { type: "string", description: "link" },
863
+ linkId: { type: "string", description: "unlink" }
763
864
  },
764
- required: ["columnId", "title"]
865
+ required: ["action"]
765
866
  }
766
867
  },
868
+ // 11. GITHUB
767
869
  {
768
- name: "update_card",
769
- description: "Update card fields",
870
+ name: "manage_github",
871
+ description: "GitHub integration. Actions: setup, get, update, remove, link_branch, link_pr",
770
872
  inputSchema: {
771
873
  type: "object",
772
874
  properties: {
773
- cardId: { type: "string" },
774
- title: { type: "string" },
775
- description: { type: "string" },
776
- priority: { type: "string", enum: ["P1", "P2", "P3"] },
777
- dueDate: { type: "string" },
778
- tagIds: { type: "array", items: { type: "string" }, description: "Replace all tags with these IDs" },
779
- cognitiveLoad: { type: "string" },
780
- estimatedMinutes: { type: "number" },
781
- githubBranch: { type: "string" },
782
- githubPrUrl: { type: "string" },
783
- isArchived: { type: "boolean" }
875
+ action: {
876
+ type: "string",
877
+ enum: [
878
+ "setup",
879
+ "get",
880
+ "update",
881
+ "remove",
882
+ "link_branch",
883
+ "link_pr"
884
+ ]
885
+ },
886
+ projectId: { type: "string", description: "setup/get/update/remove" },
887
+ repoOwner: { type: "string", description: "setup/update" },
888
+ repoName: { type: "string", description: "setup/update" },
889
+ inProgressColumnName: { type: "string", description: "setup/update" },
890
+ doneColumnName: { type: "string", description: "setup/update" },
891
+ autoMoveOnPush: { type: "boolean", description: "setup/update" },
892
+ autoMoveOnPrMerge: { type: "boolean", description: "setup/update" },
893
+ autoLinkPr: { type: "boolean", description: "setup/update" },
894
+ cardId: { type: "string", description: "link_branch/link_pr" },
895
+ branch: { type: "string", description: "link_branch" },
896
+ prUrl: { type: "string", description: "link_pr" }
784
897
  },
785
- required: ["cardId"]
786
- }
787
- },
788
- {
789
- name: "delete_card",
790
- description: "Delete a card",
791
- inputSchema: {
792
- type: "object",
793
- properties: { cardId: { type: "string" } },
794
- required: ["cardId"]
795
- }
796
- },
797
- {
798
- name: "archive_card",
799
- description: "Archive a card",
800
- inputSchema: {
801
- type: "object",
802
- properties: { cardId: { type: "string" } },
803
- required: ["cardId"]
804
- }
805
- },
806
- {
807
- name: "unarchive_card",
808
- description: "Unarchive a card (restore from archive)",
809
- inputSchema: {
810
- type: "object",
811
- properties: { cardId: { type: "string" } },
812
- required: ["cardId"]
813
- }
814
- },
815
- {
816
- name: "list_archived_cards",
817
- description: "List archived cards for a board",
818
- inputSchema: {
819
- type: "object",
820
- properties: { boardId: { type: "string" } },
821
- required: ["boardId"]
822
- }
823
- },
824
- {
825
- name: "move_card",
826
- description: "Move card to column. Use newOrder for specific positioning.",
827
- inputSchema: {
828
- type: "object",
829
- properties: {
830
- cardId: { type: "string" },
831
- targetColumnId: { type: "string" },
832
- newOrder: { type: "number", description: "Position in target column (0-indexed, default: end)" }
833
- },
834
- required: ["cardId", "targetColumnId"]
835
- }
836
- },
837
- {
838
- name: "add_comment",
839
- description: "Add comment to card",
840
- inputSchema: {
841
- type: "object",
842
- properties: { cardId: { type: "string" }, content: { type: "string" } },
843
- required: ["cardId", "content"]
844
- }
845
- },
846
- {
847
- name: "delete_comment",
848
- description: "Delete a comment",
849
- inputSchema: {
850
- type: "object",
851
- properties: { commentId: { type: "string" } },
852
- required: ["commentId"]
853
- }
854
- },
855
- // CHECKLISTS
856
- {
857
- name: "create_checklist",
858
- description: "Create checklist on card",
859
- inputSchema: {
860
- type: "object",
861
- properties: { cardId: { type: "string" }, title: { type: "string" } },
862
- required: ["cardId", "title"]
863
- }
864
- },
865
- {
866
- name: "update_checklist",
867
- description: "Update checklist title",
868
- inputSchema: {
869
- type: "object",
870
- properties: {
871
- checklistId: { type: "string" },
872
- title: { type: "string" }
873
- },
874
- required: ["checklistId", "title"]
875
- }
876
- },
877
- {
878
- name: "delete_checklist",
879
- description: "Delete checklist",
880
- inputSchema: {
881
- type: "object",
882
- properties: { checklistId: { type: "string" } },
883
- required: ["checklistId"]
884
- }
885
- },
886
- {
887
- name: "create_checklist_item",
888
- description: "Add checklist item",
889
- inputSchema: {
890
- type: "object",
891
- properties: {
892
- checklistId: { type: "string" },
893
- content: { type: "string" }
894
- },
895
- required: ["checklistId", "content"]
896
- }
897
- },
898
- {
899
- name: "update_checklist_item",
900
- description: "Update checklist item",
901
- inputSchema: {
902
- type: "object",
903
- properties: {
904
- itemId: { type: "string" },
905
- content: { type: "string" },
906
- completed: { type: "boolean" }
907
- },
908
- required: ["itemId"]
909
- }
910
- },
911
- {
912
- name: "delete_checklist_item",
913
- description: "Delete checklist item",
914
- inputSchema: {
915
- type: "object",
916
- properties: { itemId: { type: "string" } },
917
- required: ["itemId"]
918
- }
919
- },
920
- {
921
- name: "get_branch_name",
922
- description: "Generate GitHub branch name",
923
- inputSchema: {
924
- type: "object",
925
- properties: {
926
- cardId: { type: "string" },
927
- type: {
928
- type: "string",
929
- enum: ["feature", "fix", "chore", "refactor", "docs"]
930
- }
931
- },
932
- required: ["cardId"]
933
- }
934
- },
935
- {
936
- name: "search_cards",
937
- description: "Search cards, projects and boards (default limit:20). Use compact:true for minimal fields",
938
- inputSchema: {
939
- type: "object",
940
- properties: {
941
- query: { type: "string" },
942
- projectId: { type: "string" },
943
- boardId: { type: "string" },
944
- columnId: { type: "string" },
945
- epicId: { type: "string" },
946
- featureId: { type: "string" },
947
- hasEpic: { type: "boolean" },
948
- status: { type: "string", enum: ["todo", "in_progress", "done"] },
949
- tagIds: { type: "array", items: { type: "string" } },
950
- limit: { type: "number" },
951
- compact: { type: "boolean" }
952
- },
953
- required: ["query"]
954
- }
955
- },
956
- // BULK OPERATIONS
957
- {
958
- name: "bulk_create_cards",
959
- description: "Create multiple cards in 1 call",
960
- inputSchema: {
961
- type: "object",
962
- properties: {
963
- columnId: { type: "string" },
964
- cards: {
965
- type: "array",
966
- items: {
967
- type: "object",
968
- properties: {
969
- title: { type: "string" },
970
- description: { type: "string" },
971
- priority: { type: "string", enum: ["P1", "P2", "P3"] },
972
- epicId: { type: "string" }
973
- },
974
- required: ["title"]
975
- }
976
- }
977
- },
978
- required: ["columnId", "cards"]
979
- }
980
- },
981
- {
982
- name: "bulk_create_epic_with_cards",
983
- description: "Create epic + all its cards in 1 call",
984
- inputSchema: {
985
- type: "object",
986
- properties: {
987
- epic: {
988
- type: "object",
989
- properties: {
990
- slug: { type: "string" },
991
- name: { type: "string" },
992
- description: { type: "string" },
993
- emoji: { type: "string" },
994
- color: { type: "string" }
995
- },
996
- required: ["slug", "name"]
997
- },
998
- columnId: { type: "string" },
999
- cards: {
1000
- type: "array",
1001
- items: {
1002
- type: "object",
1003
- properties: {
1004
- title: { type: "string" },
1005
- description: { type: "string" },
1006
- priority: { type: "string", enum: ["P1", "P2", "P3"] }
1007
- },
1008
- required: ["title"]
1009
- }
1010
- }
1011
- },
1012
- required: ["epic", "columnId", "cards"]
1013
- }
1014
- },
1015
- {
1016
- name: "bulk_create_epic_with_features",
1017
- description: "Create epic + features + cards across projects in 1 call. Cards auto-prefixed with SLUG{N}-.",
1018
- inputSchema: {
1019
- type: "object",
1020
- properties: {
1021
- epic: {
1022
- type: "object",
1023
- properties: {
1024
- slug: { type: "string" },
1025
- name: { type: "string" },
1026
- description: { type: "string" },
1027
- emoji: { type: "string" },
1028
- color: { type: "string" }
1029
- },
1030
- required: ["slug", "name"]
1031
- },
1032
- features: {
1033
- type: "array",
1034
- items: {
1035
- type: "object",
1036
- properties: {
1037
- title: { type: "string" },
1038
- slug: { type: "string", description: "UPPERCASE slug (auto-generated from title if omitted)" },
1039
- description: { type: "string" },
1040
- cards: {
1041
- type: "array",
1042
- items: {
1043
- type: "object",
1044
- properties: {
1045
- columnId: { type: "string" },
1046
- title: { type: "string" },
1047
- description: { type: "string" },
1048
- priority: { type: "string", enum: ["P1", "P2", "P3"] }
1049
- },
1050
- required: ["columnId", "title"]
1051
- }
1052
- }
1053
- },
1054
- required: ["title", "cards"]
1055
- }
1056
- }
1057
- },
1058
- required: ["epic", "features"]
1059
- }
1060
- },
1061
- {
1062
- name: "bulk_move_cards",
1063
- description: "Move multiple cards to column in 1 call",
1064
- inputSchema: {
1065
- type: "object",
1066
- properties: {
1067
- cardIds: { type: "array", items: { type: "string" } },
1068
- targetColumnId: { type: "string" }
1069
- },
1070
- required: ["cardIds", "targetColumnId"]
1071
- }
1072
- },
1073
- {
1074
- name: "quick_add_cards",
1075
- description: 'Create cards from multiline text. Format: "- P1: task title" per line',
1076
- inputSchema: {
1077
- type: "object",
1078
- properties: {
1079
- columnId: { type: "string" },
1080
- text: {
1081
- type: "string",
1082
- description: "Multiline text, 1 card per line"
1083
- },
1084
- defaultPriority: { type: "string", enum: ["P1", "P2", "P3"] }
1085
- },
1086
- required: ["columnId", "text"]
1087
- }
1088
- },
1089
- {
1090
- name: "move_cards_by_column",
1091
- description: "Move ALL cards from one column to another",
1092
- inputSchema: {
1093
- type: "object",
1094
- properties: {
1095
- sourceColumnId: { type: "string" },
1096
- targetColumnId: { type: "string" },
1097
- limit: { type: "number" }
1098
- },
1099
- required: ["sourceColumnId", "targetColumnId"]
1100
- }
1101
- },
1102
- // AGGREGATED VIEWS
1103
- {
1104
- name: "get_workspace",
1105
- description: "Get project + all boards + columns in 1 call (no cards)",
1106
- inputSchema: {
1107
- type: "object",
1108
- properties: { projectId: { type: "string" } },
1109
- required: ["projectId"]
1110
- }
1111
- },
1112
- {
1113
- name: "get_board_summary",
1114
- description: "Get board stats only: card counts per column + priority breakdown",
1115
- inputSchema: {
1116
- type: "object",
1117
- properties: { boardId: { type: "string" } },
1118
- required: ["boardId"]
1119
- }
1120
- },
1121
- {
1122
- name: "get_epic_summary",
1123
- description: "Get epic with minimal card info: {id,title,priority,status} + progress stats",
1124
- inputSchema: {
1125
- type: "object",
1126
- properties: { epicId: { type: "string" } },
1127
- required: ["epicId"]
1128
- }
1129
- },
1130
- // TAGS
1131
- {
1132
- name: "list_tags",
1133
- description: "List all tags",
1134
- inputSchema: { type: "object", properties: {} }
1135
- },
1136
- {
1137
- name: "create_tag",
1138
- description: "Create tag",
1139
- inputSchema: {
1140
- type: "object",
1141
- properties: { name: { type: "string" }, color: { type: "string" } },
1142
- required: ["name", "color"]
1143
- }
1144
- },
1145
- {
1146
- name: "delete_tag",
1147
- description: "Delete tag",
1148
- inputSchema: {
1149
- type: "object",
1150
- properties: { tagId: { type: "string" } },
1151
- required: ["tagId"]
1152
- }
1153
- },
1154
- {
1155
- name: "add_tag_to_card",
1156
- description: "Add tag to card",
1157
- inputSchema: {
1158
- type: "object",
1159
- properties: { cardId: { type: "string" }, tagId: { type: "string" } },
1160
- required: ["cardId", "tagId"]
1161
- }
1162
- },
1163
- {
1164
- name: "remove_tag_from_card",
1165
- description: "Remove tag from card",
1166
- inputSchema: {
1167
- type: "object",
1168
- properties: { cardId: { type: "string" }, tagId: { type: "string" } },
1169
- required: ["cardId", "tagId"]
1170
- }
1171
- },
1172
- // EPICS
1173
- {
1174
- name: "list_epics",
1175
- description: "List epics (default limit:15)",
1176
- inputSchema: {
1177
- type: "object",
1178
- properties: {
1179
- status: { type: "string" },
1180
- includeProgress: { type: "boolean" },
1181
- limit: { type: "number" },
1182
- compact: { type: "boolean" }
1183
- }
1184
- }
1185
- },
1186
- {
1187
- name: "create_epic",
1188
- description: "Create epic",
1189
- inputSchema: {
1190
- type: "object",
1191
- properties: {
1192
- slug: { type: "string" },
1193
- name: { type: "string" },
1194
- description: { type: "string" },
1195
- emoji: { type: "string" },
1196
- color: { type: "string" },
1197
- startDate: { type: "string" },
1198
- targetDate: { type: "string" }
1199
- },
1200
- required: ["slug", "name"]
1201
- }
1202
- },
1203
- {
1204
- name: "get_epic",
1205
- description: "Get an epic with all its cards, features and progress",
1206
- inputSchema: {
1207
- type: "object",
1208
- properties: { epicId: { type: "string" } },
1209
- required: ["epicId"]
1210
- }
1211
- },
1212
- {
1213
- name: "update_epic",
1214
- description: "Update epic. Use syncDates:true to sync targetDate to all card due dates.",
1215
- inputSchema: {
1216
- type: "object",
1217
- properties: {
1218
- epicId: { type: "string" },
1219
- slug: { type: "string" },
1220
- name: { type: "string" },
1221
- description: { type: "string" },
1222
- emoji: { type: "string" },
1223
- color: { type: "string" },
1224
- status: { type: "string" },
1225
- startDate: { type: "string" },
1226
- targetDate: { type: "string" },
1227
- syncDates: { type: "boolean", description: "Sync targetDate to all card due dates" }
1228
- },
1229
- required: ["epicId"]
1230
- }
1231
- },
1232
- {
1233
- name: "delete_epic",
1234
- description: "Delete epic (cards unlinked)",
1235
- inputSchema: {
1236
- type: "object",
1237
- properties: { epicId: { type: "string" } },
1238
- required: ["epicId"]
1239
- }
1240
- },
1241
- {
1242
- name: "add_card_to_epic",
1243
- description: "Add card to epic",
1244
- inputSchema: {
1245
- type: "object",
1246
- properties: { epicId: { type: "string" }, cardId: { type: "string" } },
1247
- required: ["epicId", "cardId"]
1248
- }
1249
- },
1250
- {
1251
- name: "remove_card_from_epic",
1252
- description: "Remove card from epic",
1253
- inputSchema: {
1254
- type: "object",
1255
- properties: { epicId: { type: "string" }, cardId: { type: "string" } },
1256
- required: ["epicId", "cardId"]
1257
- }
1258
- },
1259
- // FEATURES
1260
- {
1261
- name: "list_features",
1262
- description: "List features. Filter by epicId or slug.",
1263
- inputSchema: {
1264
- type: "object",
1265
- properties: {
1266
- epicId: { type: "string" },
1267
- slug: { type: "string", description: "Filter by feature slug (UPPERCASE)" }
1268
- }
1269
- }
1270
- },
1271
- {
1272
- name: "get_feature",
1273
- description: "Get a feature with cards and progress. Accepts featureId or featureSlug (UPPERCASE).",
1274
- inputSchema: {
1275
- type: "object",
1276
- properties: {
1277
- featureId: { type: "string", description: "Feature ID or slug" },
1278
- featureSlug: { type: "string", description: "Feature slug (UPPERCASE), alternative to featureId" }
1279
- }
1280
- }
1281
- },
1282
- {
1283
- name: "get_active_features",
1284
- description: "Get features with cards in progress, organized by epic",
1285
- inputSchema: { type: "object", properties: {} }
1286
- },
1287
- {
1288
- name: "create_feature",
1289
- description: "Create a new feature (optionally in an epic)",
1290
- inputSchema: {
1291
- type: "object",
1292
- properties: {
1293
- epicId: { type: "string" },
1294
- title: { type: "string" },
1295
- slug: { type: "string" },
1296
- description: { type: "string" },
1297
- status: { type: "string", enum: ["planning", "in_progress", "completed", "on_hold"] }
1298
- },
1299
- required: ["title"]
1300
- }
1301
- },
1302
- {
1303
- name: "update_feature",
1304
- description: "Update a feature",
1305
- inputSchema: {
1306
- type: "object",
1307
- properties: {
1308
- featureId: { type: "string" },
1309
- title: { type: "string" },
1310
- slug: { type: "string" },
1311
- description: { type: "string" },
1312
- status: { type: "string", enum: ["planning", "in_progress", "completed", "on_hold"] },
1313
- order: { type: "number" },
1314
- epicId: { type: "string", description: "Move to another epic" }
1315
- },
1316
- required: ["featureId"]
1317
- }
1318
- },
1319
- {
1320
- name: "delete_feature",
1321
- description: "Delete a feature (cards unlinked)",
1322
- inputSchema: {
1323
- type: "object",
1324
- properties: { featureId: { type: "string" } },
1325
- required: ["featureId"]
1326
- }
1327
- },
1328
- {
1329
- name: "add_card_to_feature",
1330
- description: "Add a card to a feature. Accepts featureId or featureSlug.",
1331
- inputSchema: {
1332
- type: "object",
1333
- properties: {
1334
- cardId: { type: "string" },
1335
- featureId: { type: "string", description: "Feature ID or slug" },
1336
- featureSlug: { type: "string", description: "Feature slug (UPPERCASE), alternative to featureId" }
1337
- },
1338
- required: ["cardId"]
1339
- }
1340
- },
1341
- {
1342
- name: "remove_card_from_feature",
1343
- description: "Remove a card from a feature. Accepts featureId or featureSlug.",
1344
- inputSchema: {
1345
- type: "object",
1346
- properties: {
1347
- cardId: { type: "string" },
1348
- featureId: { type: "string", description: "Feature ID or slug" },
1349
- featureSlug: { type: "string", description: "Feature slug (UPPERCASE), alternative to featureId" }
1350
- },
1351
- required: ["cardId"]
1352
- }
1353
- },
1354
- {
1355
- name: "get_feature_cards",
1356
- description: "Get all cards in a feature. Accepts featureId or featureSlug.",
1357
- inputSchema: {
1358
- type: "object",
1359
- properties: {
1360
- featureId: { type: "string", description: "Feature ID or slug" },
1361
- featureSlug: { type: "string", description: "Feature slug (UPPERCASE), alternative to featureId" }
1362
- }
1363
- }
1364
- },
1365
- // CARD LINKS
1366
- {
1367
- name: "link_cards",
1368
- description: "Link two cards",
1369
- inputSchema: {
1370
- type: "object",
1371
- properties: {
1372
- cardId1: { type: "string" },
1373
- cardId2: { type: "string" },
1374
- label: { type: "string" }
1375
- },
1376
- required: ["cardId1", "cardId2"]
1377
- }
1378
- },
1379
- {
1380
- name: "unlink_cards",
1381
- description: "Unlink two cards by link ID",
1382
- inputSchema: {
1383
- type: "object",
1384
- properties: {
1385
- linkId: { type: "string" }
1386
- },
1387
- required: ["linkId"]
1388
- }
1389
- },
1390
- {
1391
- name: "get_linked_cards",
1392
- description: "Get linked cards",
1393
- inputSchema: {
1394
- type: "object",
1395
- properties: { cardId: { type: "string" } },
1396
- required: ["cardId"]
1397
- }
1398
- },
1399
- // GITHUB INTEGRATION
1400
- {
1401
- name: "setup_github_integration",
1402
- description: "Setup GitHub integration for a project (auto-creates webhook)",
1403
- inputSchema: {
1404
- type: "object",
1405
- properties: {
1406
- projectId: { type: "string" },
1407
- repoOwner: { type: "string" },
1408
- repoName: { type: "string" },
1409
- inProgressColumnName: { type: "string" },
1410
- doneColumnName: { type: "string" },
1411
- autoMoveOnPush: { type: "boolean" },
1412
- autoMoveOnPrMerge: { type: "boolean" },
1413
- autoLinkPr: { type: "boolean" }
1414
- },
1415
- required: ["projectId", "repoOwner", "repoName"]
1416
- }
1417
- },
1418
- {
1419
- name: "get_github_integration",
1420
- description: "Get GitHub integration settings",
1421
- inputSchema: {
1422
- type: "object",
1423
- properties: { projectId: { type: "string" } },
1424
- required: ["projectId"]
1425
- }
1426
- },
1427
- {
1428
- name: "update_github_integration",
1429
- description: "Update GitHub integration settings",
1430
- inputSchema: {
1431
- type: "object",
1432
- properties: {
1433
- projectId: { type: "string" },
1434
- repoOwner: { type: "string" },
1435
- repoName: { type: "string" },
1436
- autoMoveOnPush: { type: "boolean" },
1437
- autoMoveOnPrMerge: { type: "boolean" },
1438
- autoLinkPr: { type: "boolean" },
1439
- inProgressColumnName: { type: "string" },
1440
- doneColumnName: { type: "string" }
1441
- },
1442
- required: ["projectId"]
1443
- }
1444
- },
1445
- {
1446
- name: "remove_github_integration",
1447
- description: "Remove GitHub integration",
1448
- inputSchema: {
1449
- type: "object",
1450
- properties: { projectId: { type: "string" } },
1451
- required: ["projectId"]
1452
- }
1453
- },
1454
- {
1455
- name: "link_card_to_branch",
1456
- description: "Link card to branch",
1457
- inputSchema: {
1458
- type: "object",
1459
- properties: { cardId: { type: "string" }, branch: { type: "string" } },
1460
- required: ["cardId", "branch"]
1461
- }
1462
- },
1463
- {
1464
- name: "link_card_to_pr",
1465
- description: "Link card to PR",
1466
- inputSchema: {
1467
- type: "object",
1468
- properties: { cardId: { type: "string" }, prUrl: { type: "string" } },
1469
- required: ["cardId", "prUrl"]
1470
- }
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"]
898
+ required: ["action"]
1658
899
  }
1659
900
  }
1660
901
  ]
1661
902
  }));
1662
903
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
1663
904
  const { name, arguments: args = {} } = request.params;
905
+ const a = args;
1664
906
  try {
1665
907
  let result;
1666
908
  switch (name) {
1667
- // FOLDERS
1668
- case "list_folders":
1669
- result = await kanbanApi.listFolders();
1670
- break;
1671
- case "create_folder":
1672
- result = await kanbanApi.createFolder(args);
1673
- break;
1674
- case "update_folder":
1675
- result = await kanbanApi.updateFolder(args.folderId, args);
1676
- break;
1677
- case "delete_folder":
1678
- result = await kanbanApi.deleteFolder(args.folderId);
1679
- break;
1680
- case "move_project_to_folder":
1681
- result = await kanbanApi.moveProjectToFolder(
1682
- args.projectId,
1683
- args.folderId
1684
- );
1685
- break;
1686
- case "reorder_folders":
1687
- result = await kanbanApi.reorderFolders(
1688
- args.folderId,
1689
- args.targetFolderId
1690
- );
1691
- break;
1692
- // PROJECTS
1693
- case "list_projects":
1694
- result = await kanbanApi.listProjects(args);
1695
- break;
1696
- case "create_project":
1697
- result = await kanbanApi.createProject(args);
1698
- break;
1699
- case "get_project":
1700
- result = await kanbanApi.getProject(args.projectId, args);
1701
- break;
1702
- case "update_project":
1703
- result = await kanbanApi.updateProject(args.projectId, args);
1704
- break;
1705
- case "delete_project":
1706
- result = await kanbanApi.deleteProject(args.projectId);
1707
- break;
1708
- case "reorder_projects":
1709
- result = await kanbanApi.reorderProjects(
1710
- args.projectId,
1711
- args.targetProjectId,
1712
- args.folderId
1713
- );
1714
- break;
1715
- // BOARDS
1716
- case "list_boards":
1717
- result = await kanbanApi.listBoards(args);
1718
- break;
1719
- case "create_board":
1720
- result = await kanbanApi.createBoard(args);
1721
- break;
1722
- case "get_board":
1723
- result = await kanbanApi.getBoard(args.boardId, args);
1724
- break;
1725
- case "update_board":
1726
- result = await kanbanApi.updateBoard(args.boardId, { name: args.name });
1727
- break;
1728
- case "delete_board":
1729
- result = await kanbanApi.deleteBoard(args.boardId);
1730
- break;
1731
- // COLUMNS
1732
- case "create_column":
1733
- result = await kanbanApi.createColumn(args);
1734
- break;
1735
- case "update_column":
1736
- result = await kanbanApi.updateColumn(args.columnId, args);
1737
- break;
1738
- case "delete_column":
1739
- result = await kanbanApi.deleteColumn(args.columnId);
1740
- break;
1741
- case "reorder_columns":
1742
- result = await kanbanApi.reorderColumns(args.columns);
1743
- break;
1744
- // CARDS
1745
- case "get_card":
1746
- result = await kanbanApi.getCard(args.cardId);
1747
- break;
1748
- case "create_card":
1749
- result = await kanbanApi.createCard(args);
1750
- break;
1751
- case "update_card":
1752
- result = await kanbanApi.updateCard(args.cardId, args);
1753
- break;
1754
- case "delete_card":
1755
- result = await kanbanApi.deleteCard(args.cardId);
1756
- break;
1757
- case "move_card":
1758
- result = await kanbanApi.moveCard(args.cardId, args.targetColumnId, args.newOrder);
1759
- break;
1760
- case "archive_card":
1761
- result = await kanbanApi.archiveCard(args.cardId);
1762
- break;
1763
- case "unarchive_card":
1764
- result = await kanbanApi.unarchiveCard(args.cardId);
1765
- break;
1766
- case "list_archived_cards":
1767
- result = await kanbanApi.listArchivedCards(args.boardId);
1768
- break;
1769
- case "add_comment":
1770
- result = await kanbanApi.addComment(args.cardId, args.content);
1771
- break;
1772
- case "delete_comment":
1773
- result = await kanbanApi.deleteComment(args.commentId);
1774
- break;
1775
- // CHECKLISTS
1776
- case "create_checklist":
1777
- result = await kanbanApi.createChecklist({
1778
- cardId: args.cardId,
1779
- title: args.title
1780
- });
1781
- break;
1782
- case "update_checklist":
1783
- result = await kanbanApi.updateChecklist(args.checklistId, {
1784
- title: args.title
1785
- });
1786
- break;
1787
- case "delete_checklist":
1788
- result = await kanbanApi.deleteChecklist(args.checklistId);
1789
- break;
1790
- case "create_checklist_item":
1791
- result = await kanbanApi.createChecklistItem({
1792
- checklistId: args.checklistId,
1793
- content: args.content
1794
- });
1795
- break;
1796
- case "update_checklist_item":
1797
- result = await kanbanApi.updateChecklistItem(args.itemId, {
1798
- content: args.content,
1799
- completed: args.completed
1800
- });
1801
- break;
1802
- case "delete_checklist_item":
1803
- result = await kanbanApi.deleteChecklistItem(args.itemId);
1804
- break;
1805
- case "get_branch_name":
1806
- result = await kanbanApi.getBranchName(
1807
- args.cardId,
1808
- args.type || "feature"
1809
- );
1810
- break;
1811
- case "search_cards":
1812
- result = await kanbanApi.searchCards(args);
1813
- break;
1814
- // BULK OPERATIONS
1815
- case "bulk_create_cards":
1816
- result = await kanbanApi.bulkCreateCards(args);
1817
- break;
1818
- case "bulk_create_epic_with_cards":
1819
- result = await kanbanApi.bulkCreateEpicWithCards(args);
1820
- break;
1821
- case "bulk_create_epic_with_features":
1822
- result = await kanbanApi.bulkCreateEpicWithFeatures(args);
1823
- break;
1824
- case "bulk_move_cards":
1825
- result = await kanbanApi.bulkMoveCards(args);
1826
- break;
1827
- case "quick_add_cards":
1828
- result = await kanbanApi.quickAddCards(args);
1829
- break;
1830
- case "move_cards_by_column":
1831
- result = await kanbanApi.moveCardsByColumn(args);
1832
- break;
1833
- // AGGREGATED VIEWS
1834
- case "get_workspace":
1835
- result = await kanbanApi.getWorkspace(args.projectId);
1836
- break;
1837
- case "get_board_summary":
1838
- result = await kanbanApi.getBoardSummary(args.boardId);
1839
- break;
1840
- case "get_epic_summary":
1841
- result = await kanbanApi.getEpicSummary(args.epicId);
1842
- break;
1843
- // TAGS
1844
- case "list_tags":
1845
- result = await kanbanApi.listTags();
1846
- break;
1847
- case "create_tag":
1848
- result = await kanbanApi.createTag(args);
1849
- break;
1850
- case "delete_tag":
1851
- result = await kanbanApi.deleteTag(args.tagId);
1852
- break;
1853
- case "add_tag_to_card":
1854
- result = await kanbanApi.addTagToCard(args.cardId, args.tagId);
1855
- break;
1856
- case "remove_tag_from_card":
1857
- result = await kanbanApi.removeTagFromCard(args.cardId, args.tagId);
1858
- break;
1859
- // EPICS
1860
- case "list_epics":
1861
- result = await kanbanApi.listEpics(args);
1862
- break;
1863
- case "create_epic":
1864
- result = await kanbanApi.createEpic(args);
1865
- break;
1866
- case "get_epic":
1867
- result = await kanbanApi.getEpic(args.epicId);
1868
- break;
1869
- case "update_epic":
1870
- result = await kanbanApi.updateEpic(args.epicId, args);
1871
- break;
1872
- case "delete_epic":
1873
- result = await kanbanApi.deleteEpic(args.epicId);
1874
- break;
1875
- case "add_card_to_epic":
1876
- result = await kanbanApi.addCardToEpic(args.epicId, args.cardId);
1877
- break;
1878
- case "remove_card_from_epic":
1879
- result = await kanbanApi.removeCardFromEpic(args.epicId, args.cardId);
1880
- break;
1881
- // FEATURES
1882
- case "list_features": {
1883
- const features = await kanbanApi.listFeatures(args.epicId);
1884
- const slugFilter = args.slug;
1885
- result = slugFilter ? (Array.isArray(features) ? features : []).filter((f) => f.slug === slugFilter.toUpperCase()) : features;
1886
- break;
1887
- }
1888
- case "get_feature": {
1889
- const fId = args.featureId || args.featureSlug;
1890
- if (!fId) throw new Error("Either featureId or featureSlug is required");
1891
- result = await kanbanApi.getFeature(fId);
1892
- break;
1893
- }
1894
- case "get_active_features":
1895
- result = await kanbanApi.getActiveFeatures();
1896
- break;
1897
- case "create_feature":
1898
- result = await kanbanApi.createFeature(args);
1899
- break;
1900
- case "update_feature":
1901
- result = await kanbanApi.updateFeature(args.featureId, args);
1902
- break;
1903
- case "delete_feature":
1904
- result = await kanbanApi.deleteFeature(args.featureId);
1905
- break;
1906
- case "add_card_to_feature": {
1907
- let addFeatureId = args.featureId || args.featureSlug;
1908
- if (!addFeatureId) throw new Error("Either featureId or featureSlug is required");
1909
- if (args.featureSlug && !args.featureId) {
1910
- const resolved = await kanbanApi.getFeature(addFeatureId);
1911
- addFeatureId = resolved.id;
909
+ // 1. FOLDERS
910
+ case "manage_folders":
911
+ switch (a.action) {
912
+ case "list":
913
+ result = await kanbanApi.listFolders();
914
+ break;
915
+ case "create":
916
+ result = await kanbanApi.createFolder(a);
917
+ break;
918
+ case "update":
919
+ result = await kanbanApi.updateFolder(a.folderId, a);
920
+ break;
921
+ case "delete":
922
+ result = await kanbanApi.deleteFolder(a.folderId);
923
+ break;
924
+ case "reorder":
925
+ result = await kanbanApi.reorderFolders(
926
+ a.folderId,
927
+ a.targetFolderId
928
+ );
929
+ break;
930
+ case "move_project":
931
+ result = await kanbanApi.moveProjectToFolder(
932
+ a.projectId,
933
+ a.folderId
934
+ );
935
+ break;
936
+ default:
937
+ throw new Error(`Unknown action: ${a.action}`);
1912
938
  }
1913
- result = await kanbanApi.addCardToFeature(addFeatureId, args.cardId);
1914
939
  break;
1915
- }
1916
- case "remove_card_from_feature": {
1917
- let removeFeatureId = args.featureId || args.featureSlug;
1918
- if (!removeFeatureId) throw new Error("Either featureId or featureSlug is required");
1919
- if (args.featureSlug && !args.featureId) {
1920
- const resolved = await kanbanApi.getFeature(removeFeatureId);
1921
- removeFeatureId = resolved.id;
940
+ // 2. PROJECTS
941
+ case "manage_projects":
942
+ switch (a.action) {
943
+ case "list":
944
+ result = await kanbanApi.listProjects(a);
945
+ break;
946
+ case "create":
947
+ result = await kanbanApi.createProject(a);
948
+ break;
949
+ case "get":
950
+ result = await kanbanApi.getProject(a.projectId);
951
+ break;
952
+ case "update":
953
+ result = await kanbanApi.updateProject(a.projectId, a);
954
+ break;
955
+ case "delete":
956
+ result = await kanbanApi.deleteProject(a.projectId);
957
+ break;
958
+ case "reorder":
959
+ result = await kanbanApi.reorderProjects(
960
+ a.projectId,
961
+ a.targetProjectId,
962
+ a.folderId
963
+ );
964
+ break;
965
+ case "get_summary":
966
+ result = await kanbanApi.getProjectSummary(a.projectId);
967
+ break;
968
+ case "get_workspace":
969
+ result = await kanbanApi.getWorkspace(a.projectId);
970
+ break;
971
+ default:
972
+ throw new Error(`Unknown action: ${a.action}`);
1922
973
  }
1923
- result = await kanbanApi.removeCardFromFeature(removeFeatureId, args.cardId);
1924
974
  break;
1925
- }
1926
- case "get_feature_cards": {
1927
- let cardsFeatureId = args.featureId || args.featureSlug;
1928
- if (!cardsFeatureId) throw new Error("Either featureId or featureSlug is required");
1929
- if (args.featureSlug && !args.featureId) {
1930
- const resolved = await kanbanApi.getFeature(cardsFeatureId);
1931
- cardsFeatureId = resolved.id;
975
+ // 3. COLUMNS
976
+ case "manage_columns":
977
+ switch (a.action) {
978
+ case "create":
979
+ result = await kanbanApi.createColumn(a);
980
+ break;
981
+ case "update":
982
+ result = await kanbanApi.updateColumn(a.columnId, a);
983
+ break;
984
+ case "delete":
985
+ result = await kanbanApi.deleteColumn(a.columnId);
986
+ break;
987
+ case "reorder":
988
+ result = await kanbanApi.reorderColumns(a.columns);
989
+ break;
990
+ default:
991
+ throw new Error(`Unknown action: ${a.action}`);
1932
992
  }
1933
- result = await kanbanApi.getFeatureCards(cardsFeatureId);
1934
- break;
1935
- }
1936
- // CARD LINKS
1937
- case "link_cards":
1938
- result = await kanbanApi.linkCards(
1939
- args.cardId1,
1940
- args.cardId2,
1941
- args.label
1942
- );
1943
993
  break;
1944
- case "unlink_cards":
1945
- result = await kanbanApi.unlinkCards(args.linkId);
1946
- break;
1947
- case "get_linked_cards":
1948
- result = await kanbanApi.getLinkedCards(args.cardId);
1949
- break;
1950
- // GITHUB INTEGRATION
1951
- case "setup_github_integration":
1952
- result = await kanbanApi.setupGithubIntegration(args);
1953
- break;
1954
- case "get_github_integration":
1955
- result = await kanbanApi.getGithubIntegration(args.projectId);
1956
- break;
1957
- case "update_github_integration":
1958
- result = await kanbanApi.updateGithubIntegration(args.projectId, args);
1959
- break;
1960
- case "remove_github_integration":
1961
- result = await kanbanApi.removeGithubIntegration(args.projectId);
1962
- break;
1963
- case "link_card_to_branch":
1964
- result = await kanbanApi.linkCardToBranch(args.cardId, args.branch);
1965
- break;
1966
- case "link_card_to_pr":
1967
- result = await kanbanApi.linkCardToPr(args.cardId, args.prUrl);
1968
- break;
1969
- // GITHUB API
1970
- case "github_list_repos":
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
- });
994
+ // 4. CARDS
995
+ case "manage_cards":
996
+ switch (a.action) {
997
+ case "get":
998
+ result = await kanbanApi.getCard(a.cardId);
999
+ break;
1000
+ case "create":
1001
+ result = await kanbanApi.createCard(a);
1002
+ break;
1003
+ case "update":
1004
+ result = await kanbanApi.updateCard(a.cardId, a);
1005
+ break;
1006
+ case "delete":
1007
+ result = await kanbanApi.deleteCard(a.cardId);
1008
+ break;
1009
+ case "move":
1010
+ result = await kanbanApi.moveCard(
1011
+ a.cardId,
1012
+ a.targetColumnId,
1013
+ a.newOrder
1014
+ );
1015
+ break;
1016
+ case "archive":
1017
+ result = await kanbanApi.archiveCard(a.cardId);
1018
+ break;
1019
+ case "unarchive":
1020
+ result = await kanbanApi.unarchiveCard(a.cardId);
1021
+ break;
1022
+ case "list_archived":
1023
+ result = await kanbanApi.listArchivedCards(a.projectId);
1024
+ break;
1025
+ case "search":
1026
+ result = await kanbanApi.searchCards(a);
1027
+ break;
1028
+ case "get_branch_name":
1029
+ result = await kanbanApi.getBranchName(
1030
+ a.cardId,
1031
+ a.type || "feature"
1032
+ );
1033
+ break;
1034
+ case "bulk_create":
1035
+ result = await kanbanApi.bulkCreateCards(a);
1036
+ break;
1037
+ case "quick_add":
1038
+ result = await kanbanApi.quickAddCards(a);
1039
+ break;
1040
+ case "bulk_move":
1041
+ result = await kanbanApi.bulkMoveCards(a);
1042
+ break;
1043
+ case "move_by_column":
1044
+ result = await kanbanApi.moveCardsByColumn(a);
1045
+ break;
1046
+ default:
1047
+ throw new Error(`Unknown action: ${a.action}`);
1048
+ }
2000
1049
  break;
2001
- // TIME TRACKING
2002
- case "get_time_tracking":
2003
- result = await kanbanApi.getTimeTracking(args);
1050
+ // 5. COMMENTS
1051
+ case "manage_comments":
1052
+ switch (a.action) {
1053
+ case "add":
1054
+ result = await kanbanApi.addComment(a.cardId, a.content);
1055
+ break;
1056
+ case "delete":
1057
+ result = await kanbanApi.deleteComment(a.commentId);
1058
+ break;
1059
+ default:
1060
+ throw new Error(`Unknown action: ${a.action}`);
1061
+ }
2004
1062
  break;
2005
- case "log_activity":
2006
- result = await kanbanApi.logActivity(args);
1063
+ // 6. CHECKLISTS
1064
+ case "manage_checklists":
1065
+ switch (a.action) {
1066
+ case "create":
1067
+ result = await kanbanApi.createChecklist({
1068
+ cardId: a.cardId,
1069
+ title: a.title
1070
+ });
1071
+ break;
1072
+ case "update":
1073
+ result = await kanbanApi.updateChecklist(a.checklistId, {
1074
+ title: a.title
1075
+ });
1076
+ break;
1077
+ case "delete":
1078
+ result = await kanbanApi.deleteChecklist(a.checklistId);
1079
+ break;
1080
+ case "create_item":
1081
+ result = await kanbanApi.createChecklistItem({
1082
+ checklistId: a.checklistId,
1083
+ content: a.content
1084
+ });
1085
+ break;
1086
+ case "update_item":
1087
+ result = await kanbanApi.updateChecklistItem(a.itemId, {
1088
+ content: a.content,
1089
+ completed: a.completed
1090
+ });
1091
+ break;
1092
+ case "delete_item":
1093
+ result = await kanbanApi.deleteChecklistItem(a.itemId);
1094
+ break;
1095
+ default:
1096
+ throw new Error(`Unknown action: ${a.action}`);
1097
+ }
2007
1098
  break;
2008
- case "end_time_session":
2009
- result = await kanbanApi.endTimeSession();
1099
+ // 7. TAGS
1100
+ case "manage_tags":
1101
+ switch (a.action) {
1102
+ case "list":
1103
+ result = await kanbanApi.listTags();
1104
+ break;
1105
+ case "create":
1106
+ result = await kanbanApi.createTag(a);
1107
+ break;
1108
+ case "delete":
1109
+ result = await kanbanApi.deleteTag(a.tagId);
1110
+ break;
1111
+ case "add_to_card":
1112
+ result = await kanbanApi.addTagToCard(a.cardId, a.tagId);
1113
+ break;
1114
+ case "remove_from_card":
1115
+ result = await kanbanApi.removeTagFromCard(a.cardId, a.tagId);
1116
+ break;
1117
+ default:
1118
+ throw new Error(`Unknown action: ${a.action}`);
1119
+ }
2010
1120
  break;
2011
- // DAILY SUMMARY
2012
- case "get_daily_summary":
2013
- result = await kanbanApi.getDailySummary();
1121
+ // 8. EPICS
1122
+ case "manage_epics":
1123
+ switch (a.action) {
1124
+ case "list":
1125
+ result = await kanbanApi.listEpics(a);
1126
+ break;
1127
+ case "create":
1128
+ result = await kanbanApi.createEpic(a);
1129
+ break;
1130
+ case "get":
1131
+ result = await kanbanApi.getEpic(a.epicId);
1132
+ break;
1133
+ case "update":
1134
+ result = await kanbanApi.updateEpic(a.epicId, a);
1135
+ break;
1136
+ case "delete":
1137
+ result = await kanbanApi.deleteEpic(a.epicId);
1138
+ break;
1139
+ case "add_card":
1140
+ result = await kanbanApi.addCardToEpic(a.epicId, a.cardId);
1141
+ break;
1142
+ case "remove_card":
1143
+ result = await kanbanApi.removeCardFromEpic(a.epicId, a.cardId);
1144
+ break;
1145
+ case "get_summary":
1146
+ result = await kanbanApi.getEpicSummary(a.epicId);
1147
+ break;
1148
+ case "bulk_create_with_cards":
1149
+ result = await kanbanApi.bulkCreateEpicWithCards(a);
1150
+ break;
1151
+ case "bulk_create_with_features":
1152
+ result = await kanbanApi.bulkCreateEpicWithFeatures(a);
1153
+ break;
1154
+ default:
1155
+ throw new Error(`Unknown action: ${a.action}`);
1156
+ }
2014
1157
  break;
2015
- // RETROSPECTIVE
2016
- case "get_retrospective":
2017
- result = await kanbanApi.getRetrospective(args.days);
1158
+ // 9. FEATURES
1159
+ case "manage_features":
1160
+ switch (a.action) {
1161
+ case "list": {
1162
+ const features = await kanbanApi.listFeatures(a.epicId);
1163
+ const slugFilter = a.slug;
1164
+ result = slugFilter ? (Array.isArray(features) ? features : []).filter(
1165
+ (f) => f.slug === slugFilter.toUpperCase()
1166
+ ) : features;
1167
+ break;
1168
+ }
1169
+ case "get": {
1170
+ const fId = a.featureId || a.featureSlug;
1171
+ if (!fId)
1172
+ throw new Error("Either featureId or featureSlug is required");
1173
+ result = await kanbanApi.getFeature(fId);
1174
+ break;
1175
+ }
1176
+ case "get_active":
1177
+ result = await kanbanApi.getActiveFeatures();
1178
+ break;
1179
+ case "create":
1180
+ result = await kanbanApi.createFeature(a);
1181
+ break;
1182
+ case "update":
1183
+ result = await kanbanApi.updateFeature(a.featureId, a);
1184
+ break;
1185
+ case "delete":
1186
+ result = await kanbanApi.deleteFeature(a.featureId);
1187
+ break;
1188
+ case "add_card": {
1189
+ let addFId = a.featureId || a.featureSlug;
1190
+ if (!addFId)
1191
+ throw new Error("Either featureId or featureSlug is required");
1192
+ if (a.featureSlug && !a.featureId) {
1193
+ const resolved = await kanbanApi.getFeature(addFId);
1194
+ addFId = resolved.id;
1195
+ }
1196
+ result = await kanbanApi.addCardToFeature(addFId, a.cardId);
1197
+ break;
1198
+ }
1199
+ case "remove_card": {
1200
+ let rmFId = a.featureId || a.featureSlug;
1201
+ if (!rmFId)
1202
+ throw new Error("Either featureId or featureSlug is required");
1203
+ if (a.featureSlug && !a.featureId) {
1204
+ const resolved = await kanbanApi.getFeature(rmFId);
1205
+ rmFId = resolved.id;
1206
+ }
1207
+ result = await kanbanApi.removeCardFromFeature(rmFId, a.cardId);
1208
+ break;
1209
+ }
1210
+ case "get_cards": {
1211
+ let cardsFId = a.featureId || a.featureSlug;
1212
+ if (!cardsFId)
1213
+ throw new Error("Either featureId or featureSlug is required");
1214
+ if (a.featureSlug && !a.featureId) {
1215
+ const resolved = await kanbanApi.getFeature(cardsFId);
1216
+ cardsFId = resolved.id;
1217
+ }
1218
+ result = await kanbanApi.getFeatureCards(cardsFId);
1219
+ break;
1220
+ }
1221
+ default:
1222
+ throw new Error(`Unknown action: ${a.action}`);
1223
+ }
2018
1224
  break;
2019
- // EXPORT
2020
- case "export_board":
2021
- result = await kanbanApi.exportBoard(args.boardId);
1225
+ // 10. CARD LINKS
1226
+ case "manage_card_links":
1227
+ switch (a.action) {
1228
+ case "link":
1229
+ result = await kanbanApi.linkCards(a.cardId1, a.cardId2, a.label);
1230
+ break;
1231
+ case "unlink":
1232
+ result = await kanbanApi.unlinkCards(a.linkId);
1233
+ break;
1234
+ case "get":
1235
+ result = await kanbanApi.getLinkedCards(a.cardId);
1236
+ break;
1237
+ default:
1238
+ throw new Error(`Unknown action: ${a.action}`);
1239
+ }
2022
1240
  break;
2023
- case "export_project":
2024
- result = await kanbanApi.exportProject(args.projectId);
1241
+ // 11. GITHUB
1242
+ case "manage_github":
1243
+ switch (a.action) {
1244
+ case "setup":
1245
+ result = await kanbanApi.setupGithubIntegration(a);
1246
+ break;
1247
+ case "get":
1248
+ result = await kanbanApi.getGithubIntegration(a.projectId);
1249
+ break;
1250
+ case "update":
1251
+ result = await kanbanApi.updateGithubIntegration(a.projectId, a);
1252
+ break;
1253
+ case "remove":
1254
+ result = await kanbanApi.removeGithubIntegration(a.projectId);
1255
+ break;
1256
+ case "link_branch":
1257
+ result = await kanbanApi.linkCardToBranch(a.cardId, a.branch);
1258
+ break;
1259
+ case "link_pr":
1260
+ result = await kanbanApi.linkCardToPr(a.cardId, a.prUrl);
1261
+ break;
1262
+ default:
1263
+ throw new Error(`Unknown action: ${a.action}`);
1264
+ }
2025
1265
  break;
2026
1266
  default:
2027
1267
  throw new Error(`Unknown tool: ${name}`);