snboard-mcp 1.1.1 → 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 +748 -1362
  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) }),
@@ -110,7 +78,7 @@ var kanbanApi = {
110
78
  method: "PUT",
111
79
  body: JSON.stringify({ isArchived: false })
112
80
  }),
113
- listArchivedCards: (boardId) => api(`/api/archived?boardId=${boardId}`),
81
+ listArchivedCards: (projectId) => api(`/api/archived?projectId=${projectId}`),
114
82
  moveCard: (id, targetColumnId, newOrder) => api("/api/cards/move", {
115
83
  method: "POST",
116
84
  body: JSON.stringify({
@@ -124,7 +92,6 @@ var kanbanApi = {
124
92
  const searchParams = new URLSearchParams();
125
93
  searchParams.set("query", params.query);
126
94
  if (params.projectId) searchParams.set("projectId", params.projectId);
127
- if (params.boardId) searchParams.set("boardId", params.boardId);
128
95
  if (params.columnId) searchParams.set("columnId", params.columnId);
129
96
  if (params.epicId) searchParams.set("epicId", params.epicId);
130
97
  if (params.featureId) searchParams.set("featureId", params.featureId);
@@ -254,26 +221,18 @@ var kanbanApi = {
254
221
  },
255
222
  // Aggregated views
256
223
  getWorkspace: async (projectId) => {
257
- const project = await api(
258
- `/api/projects/${projectId}?includeBoards=true&boardsCompact=true`
259
- );
260
- if (!project.boards?.length) return { project, boards: [] };
261
- const boardsWithColumns = await Promise.all(
262
- project.boards.map((b) => api(`/api/boards/${b.id}`))
263
- );
224
+ const project = await api(`/api/projects/${projectId}`);
264
225
  return {
265
226
  project: { id: project.id, name: project.name },
266
- boards: boardsWithColumns
227
+ columns: project.columns || []
267
228
  };
268
229
  },
269
- getBoardSummary: async (boardId) => {
270
- const board = await api(
271
- `/api/boards/${boardId}?includeCards=true&compact=true`
272
- );
230
+ getProjectSummary: async (projectId) => {
231
+ const project = await api(`/api/projects/${projectId}`);
273
232
  const summary = {
274
- id: board.id,
275
- name: board.name,
276
- columns: board.columns.map((col) => ({
233
+ id: project.id,
234
+ name: project.name,
235
+ columns: (project.columns || []).map((col) => ({
277
236
  id: col.id,
278
237
  name: col.name,
279
238
  cardCount: col.cards?.length || 0,
@@ -281,7 +240,7 @@ var kanbanApi = {
281
240
  p2Count: col.cards?.filter((c) => c.priority === "P2").length || 0,
282
241
  p3Count: col.cards?.filter((c) => c.priority === "P3").length || 0
283
242
  })),
284
- totalCards: board.columns.reduce(
243
+ totalCards: (project.columns || []).reduce(
285
244
  (sum, col) => sum + (col.cards?.length || 0),
286
245
  0
287
246
  )
@@ -453,1429 +412,856 @@ var server = new Server(
453
412
  );
454
413
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
455
414
  tools: [
456
- // FOLDERS
457
- {
458
- name: "list_folders",
459
- description: "List all folders with their projects",
460
- inputSchema: { type: "object", properties: {} }
461
- },
462
- {
463
- name: "create_folder",
464
- description: "Create a new folder to organize projects",
465
- inputSchema: {
466
- type: "object",
467
- properties: {
468
- name: { type: "string" },
469
- icon: { type: "string" },
470
- color: { type: "string" }
471
- },
472
- required: ["name"]
473
- }
474
- },
475
- {
476
- name: "update_folder",
477
- description: "Update a folder (name, icon, color)",
478
- inputSchema: {
479
- type: "object",
480
- properties: {
481
- folderId: { type: "string" },
482
- name: { type: "string" },
483
- icon: { type: "string" },
484
- color: { type: "string" }
485
- },
486
- required: ["folderId"]
487
- }
488
- },
489
- {
490
- name: "delete_folder",
491
- description: "Delete a folder (projects become orphans)",
492
- inputSchema: {
493
- type: "object",
494
- properties: { folderId: { type: "string" } },
495
- required: ["folderId"]
496
- }
497
- },
498
- {
499
- name: "move_project_to_folder",
500
- description: "Move project to folder (null to remove)",
501
- inputSchema: {
502
- type: "object",
503
- properties: {
504
- projectId: { type: "string" },
505
- folderId: { type: "string" }
506
- },
507
- required: ["projectId"]
508
- }
509
- },
415
+ // 1. FOLDERS
510
416
  {
511
- name: "reorder_folders",
512
- description: "Reorder folders by moving one before/after another",
417
+ name: "manage_folders",
418
+ description: "Folder operations. Actions: list, create, update, delete, reorder, move_project",
513
419
  inputSchema: {
514
420
  type: "object",
515
421
  properties: {
516
- folderId: { type: "string" },
517
- targetFolderId: { 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" }
518
439
  },
519
- required: ["folderId", "targetFolderId"]
440
+ required: ["action"]
520
441
  }
521
442
  },
522
- // PROJECTS
443
+ // 2. PROJECTS
523
444
  {
524
- name: "list_projects",
525
- description: "List projects (default limit:20). Use compact:true for minimal fields",
445
+ name: "manage_projects",
446
+ description: "Project operations. Actions: list, create, get, update, delete, reorder, get_summary, get_workspace",
526
447
  inputSchema: {
527
448
  type: "object",
528
449
  properties: {
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" },
529
471
  folderId: {
530
472
  type: "string",
531
- description: 'Filter by folder. Use "none" for orphan projects'
473
+ description: 'list: filter by folder ("none" for orphans). create/update: assign to folder. reorder: folder context'
532
474
  },
533
- limit: { type: "number" },
534
- compact: { type: "boolean" }
535
- }
536
- }
537
- },
538
- {
539
- name: "create_project",
540
- description: "Create a new project",
541
- inputSchema: {
542
- type: "object",
543
- properties: {
544
- name: { type: "string" },
545
- description: { type: "string" },
546
- emoji: { type: "string" },
547
- color: { type: "string" },
548
- folderId: { type: "string" }
475
+ limit: { type: "number", description: "list (default:20)" },
476
+ compact: { type: "boolean", description: "list" },
477
+ targetProjectId: { type: "string", description: "reorder" }
549
478
  },
550
- required: ["name"]
479
+ required: ["action"]
551
480
  }
552
481
  },
482
+ // 3. COLUMNS
553
483
  {
554
- name: "get_project",
555
- description: "Get project. Use includeBoards:true to get boards in 1 call",
484
+ name: "manage_columns",
485
+ description: "Column operations. Actions: create, update, delete, reorder",
556
486
  inputSchema: {
557
487
  type: "object",
558
488
  properties: {
559
- projectId: { type: "string" },
560
- includeBoards: { type: "boolean" },
561
- boardsCompact: { type: "boolean" }
562
- },
563
- required: ["projectId"]
564
- }
565
- },
566
- {
567
- name: "update_project",
568
- description: "Update project",
569
- inputSchema: {
570
- type: "object",
571
- properties: {
572
- projectId: { type: "string" },
573
- name: { type: "string" },
574
- description: { type: "string" },
575
- emoji: { type: "string" },
576
- color: { type: "string" },
577
- folderId: {
489
+ action: {
578
490
  type: "string",
579
- description: "Move to folder (null to remove)"
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}"
580
508
  }
581
509
  },
582
- required: ["projectId"]
583
- }
584
- },
585
- {
586
- name: "delete_project",
587
- description: "Delete project and all its content",
588
- inputSchema: {
589
- type: "object",
590
- properties: { projectId: { type: "string" } },
591
- required: ["projectId"]
510
+ required: ["action"]
592
511
  }
593
512
  },
513
+ // 4. CARDS
594
514
  {
595
- name: "reorder_projects",
596
- description: "Reorder projects within a folder",
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",
597
517
  inputSchema: {
598
518
  type: "object",
599
519
  properties: {
600
- projectId: { type: "string" },
601
- targetProjectId: { type: "string" },
602
- folderId: {
520
+ action: {
603
521
  type: "string",
604
- description: "Folder context (null for orphans)"
605
- }
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" }
606
619
  },
607
- required: ["projectId", "targetProjectId"]
620
+ required: ["action"]
608
621
  }
609
622
  },
610
- // BOARDS
623
+ // 5. COMMENTS
611
624
  {
612
- name: "list_boards",
613
- description: "List boards for a project",
625
+ name: "manage_comments",
626
+ description: "Comment operations. Actions: add, delete",
614
627
  inputSchema: {
615
628
  type: "object",
616
629
  properties: {
617
- projectId: { type: "string" },
618
- limit: { type: "number" },
619
- compact: { type: "boolean" }
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" }
620
634
  },
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"]
635
+ required: ["action"]
631
636
  }
632
637
  },
638
+ // 6. CHECKLISTS
633
639
  {
634
- name: "get_board",
635
- description: "Get board with columns. Cards NOT included by default. Use includeCards:true + cardLimit + columnId to get specific cards.",
640
+ name: "manage_checklists",
641
+ description: "Checklist operations. Actions: create, update, delete, create_item, update_item, delete_item",
636
642
  inputSchema: {
637
643
  type: "object",
638
644
  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)"
645
+ action: {
646
+ type: "string",
647
+ enum: [
648
+ "create",
649
+ "update",
650
+ "delete",
651
+ "create_item",
652
+ "update_item",
653
+ "delete_item"
654
+ ]
644
655
  },
645
- cardLimit: {
646
- type: "number",
647
- description: "Max cards per column (e.g. 5)"
656
+ cardId: { type: "string", description: "create" },
657
+ checklistId: {
658
+ type: "string",
659
+ description: "update/delete/create_item"
648
660
  },
649
- priority: { type: "string", enum: ["P1", "P2", "P3"] },
650
- compact: {
651
- type: "boolean",
652
- description: "Minimal fields (id, title, priority)"
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"
653
666
  },
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" }
667
+ completed: { type: "boolean", description: "update_item" }
691
668
  },
692
- required: ["boardId", "name"]
669
+ required: ["action"]
693
670
  }
694
671
  },
672
+ // 7. TAGS
695
673
  {
696
- name: "update_column",
697
- description: "Update column",
674
+ name: "manage_tags",
675
+ description: "Tag operations. Actions: list, create, delete, add_to_card, remove_from_card",
698
676
  inputSchema: {
699
677
  type: "object",
700
678
  properties: {
701
- columnId: { type: "string" },
702
- name: { type: "string" },
703
- emoji: { type: "string" }
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
+ }
704
699
  },
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"]
700
+ required: ["action"]
715
701
  }
716
702
  },
703
+ // 8. EPICS
717
704
  {
718
- name: "reorder_columns",
719
- description: "Reorder columns in a board",
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",
720
707
  inputSchema: {
721
708
  type: "object",
722
709
  properties: {
723
- columns: {
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
+ ]
724
+ },
725
+ epicId: {
726
+ type: "string",
727
+ description: "get/update/delete/add_card/remove_card/get_summary"
728
+ },
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: {
738
+ type: "boolean",
739
+ description: "update: sync targetDate to all card due dates"
740
+ },
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"]
736
- }
737
- },
738
- // CARDS
739
- {
740
- name: "get_card",
741
- description: "Get a card with all details (tags, comments, checklists, epics, features)",
742
- inputSchema: {
743
- type: "object",
744
- properties: { cardId: { type: "string" } },
745
- required: ["cardId"]
801
+ required: ["action"]
746
802
  }
747
803
  },
804
+ // 9. FEATURES
748
805
  {
749
- name: "create_card",
750
- description: "Create card. Auto-assign to epic if epicId provided.",
806
+ name: "manage_features",
807
+ description: "Feature operations. Actions: list, get, get_active, create, update, delete, add_card, remove_card, get_cards",
751
808
  inputSchema: {
752
809
  type: "object",
753
810
  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: {
762
- type: "number",
763
- description: "Estimated time in minutes"
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
+ ]
764
824
  },
765
- cognitiveLoad: {
825
+ featureId: {
766
826
  type: "string",
767
- description: "Cognitive load level"
768
- }
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" }
769
847
  },
770
- required: ["columnId", "title"]
848
+ required: ["action"]
771
849
  }
772
850
  },
851
+ // 10. CARD LINKS
773
852
  {
774
- name: "update_card",
775
- description: "Update card fields",
853
+ name: "manage_card_links",
854
+ description: "Card link operations. Actions: link, unlink, get",
776
855
  inputSchema: {
777
856
  type: "object",
778
857
  properties: {
779
- cardId: { type: "string" },
780
- title: { type: "string" },
781
- description: { type: "string" },
782
- priority: { type: "string", enum: ["P1", "P2", "P3"] },
783
- dueDate: { type: "string" },
784
- tagIds: {
785
- type: "array",
786
- items: { type: "string" },
787
- description: "Replace all tags with these IDs"
788
- },
789
- cognitiveLoad: { type: "string" },
790
- estimatedMinutes: { type: "number" },
791
- githubBranch: { type: "string" },
792
- githubPrUrl: { type: "string" },
793
- isArchived: { type: "boolean" }
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" }
794
864
  },
795
- required: ["cardId"]
796
- }
797
- },
798
- {
799
- name: "delete_card",
800
- description: "Delete a card",
801
- inputSchema: {
802
- type: "object",
803
- properties: { cardId: { type: "string" } },
804
- required: ["cardId"]
865
+ required: ["action"]
805
866
  }
806
867
  },
868
+ // 11. GITHUB
807
869
  {
808
- name: "archive_card",
809
- description: "Archive a card",
870
+ name: "manage_github",
871
+ description: "GitHub integration. Actions: setup, get, update, remove, link_branch, link_pr",
810
872
  inputSchema: {
811
873
  type: "object",
812
- properties: { cardId: { type: "string" } },
813
- required: ["cardId"]
814
- }
815
- },
816
- {
817
- name: "unarchive_card",
818
- description: "Unarchive a card (restore from archive)",
819
- inputSchema: {
820
- type: "object",
821
- properties: { cardId: { type: "string" } },
822
- required: ["cardId"]
823
- }
824
- },
825
- {
826
- name: "list_archived_cards",
827
- description: "List archived cards for a board",
828
- inputSchema: {
829
- type: "object",
830
- properties: { boardId: { type: "string" } },
831
- required: ["boardId"]
832
- }
833
- },
834
- {
835
- name: "move_card",
836
- description: "Move card to column. Use newOrder for specific positioning.",
837
- inputSchema: {
838
- type: "object",
839
- properties: {
840
- cardId: { type: "string" },
841
- targetColumnId: { type: "string" },
842
- newOrder: {
843
- type: "number",
844
- description: "Position in target column (0-indexed, default: end)"
845
- }
846
- },
847
- required: ["cardId", "targetColumnId"]
848
- }
849
- },
850
- {
851
- name: "add_comment",
852
- description: "Add comment to card",
853
- inputSchema: {
854
- type: "object",
855
- properties: { cardId: { type: "string" }, content: { type: "string" } },
856
- required: ["cardId", "content"]
857
- }
858
- },
859
- {
860
- name: "delete_comment",
861
- description: "Delete a comment",
862
- inputSchema: {
863
- type: "object",
864
- properties: { commentId: { type: "string" } },
865
- required: ["commentId"]
866
- }
867
- },
868
- // CHECKLISTS
869
- {
870
- name: "create_checklist",
871
- description: "Create checklist on card",
872
- inputSchema: {
873
- type: "object",
874
- properties: { cardId: { type: "string" }, title: { type: "string" } },
875
- required: ["cardId", "title"]
876
- }
877
- },
878
- {
879
- name: "update_checklist",
880
- description: "Update checklist title",
881
- inputSchema: {
882
- type: "object",
883
- properties: {
884
- checklistId: { type: "string" },
885
- title: { type: "string" }
886
- },
887
- required: ["checklistId", "title"]
888
- }
889
- },
890
- {
891
- name: "delete_checklist",
892
- description: "Delete checklist",
893
- inputSchema: {
894
- type: "object",
895
- properties: { checklistId: { type: "string" } },
896
- required: ["checklistId"]
897
- }
898
- },
899
- {
900
- name: "create_checklist_item",
901
- description: "Add checklist item",
902
- inputSchema: {
903
- type: "object",
904
- properties: {
905
- checklistId: { type: "string" },
906
- content: { type: "string" }
907
- },
908
- required: ["checklistId", "content"]
909
- }
910
- },
911
- {
912
- name: "update_checklist_item",
913
- description: "Update checklist item",
914
- inputSchema: {
915
- type: "object",
916
- properties: {
917
- itemId: { type: "string" },
918
- content: { type: "string" },
919
- completed: { type: "boolean" }
920
- },
921
- required: ["itemId"]
922
- }
923
- },
924
- {
925
- name: "delete_checklist_item",
926
- description: "Delete checklist item",
927
- inputSchema: {
928
- type: "object",
929
- properties: { itemId: { type: "string" } },
930
- required: ["itemId"]
931
- }
932
- },
933
- {
934
- name: "get_branch_name",
935
- description: "Generate GitHub branch name",
936
- inputSchema: {
937
- type: "object",
938
- properties: {
939
- cardId: { type: "string" },
940
- type: {
941
- type: "string",
942
- enum: ["feature", "fix", "chore", "refactor", "docs"]
943
- }
944
- },
945
- required: ["cardId"]
946
- }
947
- },
948
- {
949
- name: "search_cards",
950
- description: "Search cards, projects and boards (default limit:20). Use compact:true for minimal fields",
951
- inputSchema: {
952
- type: "object",
953
- properties: {
954
- query: { type: "string" },
955
- projectId: { type: "string" },
956
- boardId: { type: "string" },
957
- columnId: { type: "string" },
958
- epicId: { type: "string" },
959
- featureId: { type: "string" },
960
- hasEpic: { type: "boolean" },
961
- status: { type: "string", enum: ["todo", "in_progress", "done"] },
962
- tagIds: { type: "array", items: { type: "string" } },
963
- limit: { type: "number" },
964
- compact: { type: "boolean" }
965
- },
966
- required: ["query"]
967
- }
968
- },
969
- // BULK OPERATIONS
970
- {
971
- name: "bulk_create_cards",
972
- description: "Create multiple cards in 1 call",
973
- inputSchema: {
974
- type: "object",
975
- properties: {
976
- columnId: { type: "string" },
977
- cards: {
978
- type: "array",
979
- items: {
980
- type: "object",
981
- properties: {
982
- title: { type: "string" },
983
- description: { type: "string" },
984
- priority: { type: "string", enum: ["P1", "P2", "P3"] },
985
- epicId: { type: "string" }
986
- },
987
- required: ["title"]
988
- }
989
- }
990
- },
991
- required: ["columnId", "cards"]
992
- }
993
- },
994
- {
995
- name: "bulk_create_epic_with_cards",
996
- description: "Create epic + all its cards in 1 call",
997
- inputSchema: {
998
- type: "object",
999
- properties: {
1000
- epic: {
1001
- type: "object",
1002
- properties: {
1003
- slug: { type: "string" },
1004
- name: { type: "string" },
1005
- description: { type: "string" },
1006
- emoji: { type: "string" },
1007
- color: { type: "string" }
1008
- },
1009
- required: ["slug", "name"]
1010
- },
1011
- columnId: { type: "string" },
1012
- cards: {
1013
- type: "array",
1014
- items: {
1015
- type: "object",
1016
- properties: {
1017
- title: { type: "string" },
1018
- description: { type: "string" },
1019
- priority: { type: "string", enum: ["P1", "P2", "P3"] }
1020
- },
1021
- required: ["title"]
1022
- }
1023
- }
1024
- },
1025
- required: ["epic", "columnId", "cards"]
1026
- }
1027
- },
1028
- {
1029
- name: "bulk_create_epic_with_features",
1030
- description: "Create epic + features + cards across projects in 1 call. Cards auto-prefixed with SLUG{N}-.",
1031
- inputSchema: {
1032
- type: "object",
1033
- properties: {
1034
- epic: {
1035
- type: "object",
1036
- properties: {
1037
- slug: { type: "string" },
1038
- name: { type: "string" },
1039
- description: { type: "string" },
1040
- emoji: { type: "string" },
1041
- color: { type: "string" }
1042
- },
1043
- required: ["slug", "name"]
1044
- },
1045
- features: {
1046
- type: "array",
1047
- items: {
1048
- type: "object",
1049
- properties: {
1050
- title: { type: "string" },
1051
- slug: {
1052
- type: "string",
1053
- description: "UPPERCASE slug (auto-generated from title if omitted)"
1054
- },
1055
- description: { type: "string" },
1056
- cards: {
1057
- type: "array",
1058
- items: {
1059
- type: "object",
1060
- properties: {
1061
- columnId: { type: "string" },
1062
- title: { type: "string" },
1063
- description: { type: "string" },
1064
- priority: { type: "string", enum: ["P1", "P2", "P3"] }
1065
- },
1066
- required: ["columnId", "title"]
1067
- }
1068
- }
1069
- },
1070
- required: ["title", "cards"]
1071
- }
1072
- }
1073
- },
1074
- required: ["epic", "features"]
1075
- }
1076
- },
1077
- {
1078
- name: "bulk_move_cards",
1079
- description: "Move multiple cards to column in 1 call",
1080
- inputSchema: {
1081
- type: "object",
1082
- properties: {
1083
- cardIds: { type: "array", items: { type: "string" } },
1084
- targetColumnId: { type: "string" }
1085
- },
1086
- required: ["cardIds", "targetColumnId"]
1087
- }
1088
- },
1089
- {
1090
- name: "quick_add_cards",
1091
- description: 'Create cards from multiline text. Format: "- P1: task title" per line',
1092
- inputSchema: {
1093
- type: "object",
1094
- properties: {
1095
- columnId: { type: "string" },
1096
- text: {
1097
- type: "string",
1098
- description: "Multiline text, 1 card per line"
1099
- },
1100
- defaultPriority: { type: "string", enum: ["P1", "P2", "P3"] }
1101
- },
1102
- required: ["columnId", "text"]
1103
- }
1104
- },
1105
- {
1106
- name: "move_cards_by_column",
1107
- description: "Move ALL cards from one column to another",
1108
- inputSchema: {
1109
- type: "object",
1110
- properties: {
1111
- sourceColumnId: { type: "string" },
1112
- targetColumnId: { type: "string" },
1113
- limit: { type: "number" }
1114
- },
1115
- required: ["sourceColumnId", "targetColumnId"]
1116
- }
1117
- },
1118
- // AGGREGATED VIEWS
1119
- {
1120
- name: "get_workspace",
1121
- description: "Get project + all boards + columns in 1 call (no cards)",
1122
- inputSchema: {
1123
- type: "object",
1124
- properties: { projectId: { type: "string" } },
1125
- required: ["projectId"]
1126
- }
1127
- },
1128
- {
1129
- name: "get_board_summary",
1130
- description: "Get board stats only: card counts per column + priority breakdown",
1131
- inputSchema: {
1132
- type: "object",
1133
- properties: { boardId: { type: "string" } },
1134
- required: ["boardId"]
1135
- }
1136
- },
1137
- {
1138
- name: "get_epic_summary",
1139
- description: "Get epic with minimal card info: {id,title,priority,status} + progress stats",
1140
- inputSchema: {
1141
- type: "object",
1142
- properties: { epicId: { type: "string" } },
1143
- required: ["epicId"]
1144
- }
1145
- },
1146
- // TAGS
1147
- {
1148
- name: "list_tags",
1149
- description: "List all tags",
1150
- inputSchema: { type: "object", properties: {} }
1151
- },
1152
- {
1153
- name: "create_tag",
1154
- description: "Create tag",
1155
- inputSchema: {
1156
- type: "object",
1157
- properties: { name: { type: "string" }, color: { type: "string" } },
1158
- required: ["name", "color"]
1159
- }
1160
- },
1161
- {
1162
- name: "delete_tag",
1163
- description: "Delete tag",
1164
- inputSchema: {
1165
- type: "object",
1166
- properties: { tagId: { type: "string" } },
1167
- required: ["tagId"]
1168
- }
1169
- },
1170
- {
1171
- name: "add_tag_to_card",
1172
- description: "Add tag to card",
1173
- inputSchema: {
1174
- type: "object",
1175
- properties: { cardId: { type: "string" }, tagId: { type: "string" } },
1176
- required: ["cardId", "tagId"]
1177
- }
1178
- },
1179
- {
1180
- name: "remove_tag_from_card",
1181
- description: "Remove tag from card",
1182
- inputSchema: {
1183
- type: "object",
1184
- properties: { cardId: { type: "string" }, tagId: { type: "string" } },
1185
- required: ["cardId", "tagId"]
1186
- }
1187
- },
1188
- // EPICS
1189
- {
1190
- name: "list_epics",
1191
- description: "List epics (default limit:15)",
1192
- inputSchema: {
1193
- type: "object",
1194
- properties: {
1195
- status: { type: "string" },
1196
- includeProgress: { type: "boolean" },
1197
- limit: { type: "number" },
1198
- compact: { type: "boolean" }
1199
- }
1200
- }
1201
- },
1202
- {
1203
- name: "create_epic",
1204
- description: "Create epic",
1205
- inputSchema: {
1206
- type: "object",
1207
- properties: {
1208
- slug: { type: "string" },
1209
- name: { type: "string" },
1210
- description: { type: "string" },
1211
- emoji: { type: "string" },
1212
- color: { type: "string" },
1213
- startDate: { type: "string" },
1214
- targetDate: { type: "string" }
1215
- },
1216
- required: ["slug", "name"]
1217
- }
1218
- },
1219
- {
1220
- name: "get_epic",
1221
- description: "Get an epic with all its cards, features and progress",
1222
- inputSchema: {
1223
- type: "object",
1224
- properties: { epicId: { type: "string" } },
1225
- required: ["epicId"]
1226
- }
1227
- },
1228
- {
1229
- name: "update_epic",
1230
- description: "Update epic. Use syncDates:true to sync targetDate to all card due dates.",
1231
- inputSchema: {
1232
- type: "object",
1233
- properties: {
1234
- epicId: { type: "string" },
1235
- slug: { type: "string" },
1236
- name: { type: "string" },
1237
- description: { type: "string" },
1238
- emoji: { type: "string" },
1239
- color: { type: "string" },
1240
- status: { type: "string" },
1241
- startDate: { type: "string" },
1242
- targetDate: { type: "string" },
1243
- syncDates: {
1244
- type: "boolean",
1245
- description: "Sync targetDate to all card due dates"
1246
- }
1247
- },
1248
- required: ["epicId"]
1249
- }
1250
- },
1251
- {
1252
- name: "delete_epic",
1253
- description: "Delete epic (cards unlinked)",
1254
- inputSchema: {
1255
- type: "object",
1256
- properties: { epicId: { type: "string" } },
1257
- required: ["epicId"]
1258
- }
1259
- },
1260
- {
1261
- name: "add_card_to_epic",
1262
- description: "Add card to epic",
1263
- inputSchema: {
1264
- type: "object",
1265
- properties: { epicId: { type: "string" }, cardId: { type: "string" } },
1266
- required: ["epicId", "cardId"]
1267
- }
1268
- },
1269
- {
1270
- name: "remove_card_from_epic",
1271
- description: "Remove card from epic",
1272
- inputSchema: {
1273
- type: "object",
1274
- properties: { epicId: { type: "string" }, cardId: { type: "string" } },
1275
- required: ["epicId", "cardId"]
1276
- }
1277
- },
1278
- // FEATURES
1279
- {
1280
- name: "list_features",
1281
- description: "List features. Filter by epicId or slug.",
1282
- inputSchema: {
1283
- type: "object",
1284
- properties: {
1285
- epicId: { type: "string" },
1286
- slug: {
1287
- type: "string",
1288
- description: "Filter by feature slug (UPPERCASE)"
1289
- }
1290
- }
1291
- }
1292
- },
1293
- {
1294
- name: "get_feature",
1295
- description: "Get a feature with cards and progress. Accepts featureId or featureSlug (UPPERCASE).",
1296
- inputSchema: {
1297
- type: "object",
1298
- properties: {
1299
- featureId: { type: "string", description: "Feature ID or slug" },
1300
- featureSlug: {
1301
- type: "string",
1302
- description: "Feature slug (UPPERCASE), alternative to featureId"
1303
- }
1304
- }
1305
- }
1306
- },
1307
- {
1308
- name: "get_active_features",
1309
- description: "Get features with cards in progress, organized by epic",
1310
- inputSchema: { type: "object", properties: {} }
1311
- },
1312
- {
1313
- name: "create_feature",
1314
- description: "Create a new feature (optionally in an epic)",
1315
- inputSchema: {
1316
- type: "object",
1317
- properties: {
1318
- epicId: { type: "string" },
1319
- title: { type: "string" },
1320
- slug: { type: "string" },
1321
- description: { type: "string" },
1322
- status: {
1323
- type: "string",
1324
- enum: ["planning", "in_progress", "completed", "on_hold"]
1325
- }
1326
- },
1327
- required: ["title"]
1328
- }
1329
- },
1330
- {
1331
- name: "update_feature",
1332
- description: "Update a feature",
1333
- inputSchema: {
1334
- type: "object",
1335
- properties: {
1336
- featureId: { type: "string" },
1337
- title: { type: "string" },
1338
- slug: { type: "string" },
1339
- description: { type: "string" },
1340
- status: {
1341
- type: "string",
1342
- enum: ["planning", "in_progress", "completed", "on_hold"]
1343
- },
1344
- order: { type: "number" },
1345
- epicId: { type: "string", description: "Move to another epic" }
1346
- },
1347
- required: ["featureId"]
1348
- }
1349
- },
1350
- {
1351
- name: "delete_feature",
1352
- description: "Delete a feature (cards unlinked)",
1353
- inputSchema: {
1354
- type: "object",
1355
- properties: { featureId: { type: "string" } },
1356
- required: ["featureId"]
1357
- }
1358
- },
1359
- {
1360
- name: "add_card_to_feature",
1361
- description: "Add a card to a feature. Accepts featureId or featureSlug.",
1362
- inputSchema: {
1363
- type: "object",
1364
- properties: {
1365
- cardId: { type: "string" },
1366
- featureId: { type: "string", description: "Feature ID or slug" },
1367
- featureSlug: {
1368
- type: "string",
1369
- description: "Feature slug (UPPERCASE), alternative to featureId"
1370
- }
1371
- },
1372
- required: ["cardId"]
1373
- }
1374
- },
1375
- {
1376
- name: "remove_card_from_feature",
1377
- description: "Remove a card from a feature. Accepts featureId or featureSlug.",
1378
- inputSchema: {
1379
- type: "object",
1380
- properties: {
1381
- cardId: { type: "string" },
1382
- featureId: { type: "string", description: "Feature ID or slug" },
1383
- featureSlug: {
1384
- type: "string",
1385
- description: "Feature slug (UPPERCASE), alternative to featureId"
1386
- }
1387
- },
1388
- required: ["cardId"]
1389
- }
1390
- },
1391
- {
1392
- name: "get_feature_cards",
1393
- description: "Get all cards in a feature. Accepts featureId or featureSlug.",
1394
- inputSchema: {
1395
- type: "object",
1396
- properties: {
1397
- featureId: { type: "string", description: "Feature ID or slug" },
1398
- featureSlug: {
1399
- type: "string",
1400
- description: "Feature slug (UPPERCASE), alternative to featureId"
1401
- }
1402
- }
1403
- }
1404
- },
1405
- // CARD LINKS
1406
- {
1407
- name: "link_cards",
1408
- description: "Link two cards",
1409
- inputSchema: {
1410
- type: "object",
1411
- properties: {
1412
- cardId1: { type: "string" },
1413
- cardId2: { type: "string" },
1414
- label: { type: "string" }
1415
- },
1416
- required: ["cardId1", "cardId2"]
1417
- }
1418
- },
1419
- {
1420
- name: "unlink_cards",
1421
- description: "Unlink two cards by link ID",
1422
- inputSchema: {
1423
- type: "object",
1424
- properties: {
1425
- linkId: { type: "string" }
1426
- },
1427
- required: ["linkId"]
1428
- }
1429
- },
1430
- {
1431
- name: "get_linked_cards",
1432
- description: "Get linked cards",
1433
- inputSchema: {
1434
- type: "object",
1435
- properties: { cardId: { type: "string" } },
1436
- required: ["cardId"]
1437
- }
1438
- },
1439
- // GITHUB INTEGRATION
1440
- {
1441
- name: "setup_github_integration",
1442
- description: "Setup GitHub integration for a project (auto-creates webhook)",
1443
- inputSchema: {
1444
- type: "object",
1445
- properties: {
1446
- projectId: { type: "string" },
1447
- repoOwner: { type: "string" },
1448
- repoName: { type: "string" },
1449
- inProgressColumnName: { type: "string" },
1450
- doneColumnName: { type: "string" },
1451
- autoMoveOnPush: { type: "boolean" },
1452
- autoMoveOnPrMerge: { type: "boolean" },
1453
- autoLinkPr: { type: "boolean" }
1454
- },
1455
- required: ["projectId", "repoOwner", "repoName"]
1456
- }
1457
- },
1458
- {
1459
- name: "get_github_integration",
1460
- description: "Get GitHub integration settings",
1461
- inputSchema: {
1462
- type: "object",
1463
- properties: { projectId: { type: "string" } },
1464
- required: ["projectId"]
1465
- }
1466
- },
1467
- {
1468
- name: "update_github_integration",
1469
- description: "Update GitHub integration settings",
1470
- inputSchema: {
1471
- type: "object",
1472
- properties: {
1473
- projectId: { type: "string" },
1474
- repoOwner: { type: "string" },
1475
- repoName: { type: "string" },
1476
- autoMoveOnPush: { type: "boolean" },
1477
- autoMoveOnPrMerge: { type: "boolean" },
1478
- autoLinkPr: { type: "boolean" },
1479
- inProgressColumnName: { type: "string" },
1480
- doneColumnName: { type: "string" }
1481
- },
1482
- required: ["projectId"]
1483
- }
1484
- },
1485
- {
1486
- name: "remove_github_integration",
1487
- description: "Remove GitHub integration",
1488
- inputSchema: {
1489
- type: "object",
1490
- properties: { projectId: { type: "string" } },
1491
- required: ["projectId"]
1492
- }
1493
- },
1494
- {
1495
- name: "link_card_to_branch",
1496
- description: "Link card to branch",
1497
- inputSchema: {
1498
- type: "object",
1499
- properties: { cardId: { type: "string" }, branch: { type: "string" } },
1500
- required: ["cardId", "branch"]
1501
- }
1502
- },
1503
- {
1504
- name: "link_card_to_pr",
1505
- description: "Link card to PR",
1506
- inputSchema: {
1507
- type: "object",
1508
- properties: { cardId: { type: "string" }, prUrl: { type: "string" } },
1509
- required: ["cardId", "prUrl"]
874
+ properties: {
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" }
897
+ },
898
+ required: ["action"]
1510
899
  }
1511
900
  }
1512
901
  ]
1513
902
  }));
1514
903
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
1515
904
  const { name, arguments: args = {} } = request.params;
905
+ const a = args;
1516
906
  try {
1517
907
  let result;
1518
908
  switch (name) {
1519
- // FOLDERS
1520
- case "list_folders":
1521
- result = await kanbanApi.listFolders();
1522
- break;
1523
- case "create_folder":
1524
- result = await kanbanApi.createFolder(args);
1525
- break;
1526
- case "update_folder":
1527
- result = await kanbanApi.updateFolder(
1528
- args.folderId,
1529
- args
1530
- );
1531
- break;
1532
- case "delete_folder":
1533
- result = await kanbanApi.deleteFolder(args.folderId);
1534
- break;
1535
- case "move_project_to_folder":
1536
- result = await kanbanApi.moveProjectToFolder(
1537
- args.projectId,
1538
- args.folderId
1539
- );
1540
- break;
1541
- case "reorder_folders":
1542
- result = await kanbanApi.reorderFolders(
1543
- args.folderId,
1544
- args.targetFolderId
1545
- );
1546
- break;
1547
- // PROJECTS
1548
- case "list_projects":
1549
- result = await kanbanApi.listProjects(args);
1550
- break;
1551
- case "create_project":
1552
- result = await kanbanApi.createProject(args);
1553
- break;
1554
- case "get_project":
1555
- result = await kanbanApi.getProject(
1556
- args.projectId,
1557
- args
1558
- );
1559
- break;
1560
- case "update_project":
1561
- result = await kanbanApi.updateProject(
1562
- args.projectId,
1563
- args
1564
- );
1565
- break;
1566
- case "delete_project":
1567
- result = await kanbanApi.deleteProject(args.projectId);
1568
- break;
1569
- case "reorder_projects":
1570
- result = await kanbanApi.reorderProjects(
1571
- args.projectId,
1572
- args.targetProjectId,
1573
- args.folderId
1574
- );
1575
- break;
1576
- // BOARDS
1577
- case "list_boards":
1578
- result = await kanbanApi.listBoards(args);
1579
- break;
1580
- case "create_board":
1581
- result = await kanbanApi.createBoard(args);
1582
- break;
1583
- case "get_board":
1584
- result = await kanbanApi.getBoard(args.boardId, args);
1585
- break;
1586
- case "update_board":
1587
- result = await kanbanApi.updateBoard(args.boardId, {
1588
- name: args.name
1589
- });
1590
- break;
1591
- case "delete_board":
1592
- result = await kanbanApi.deleteBoard(args.boardId);
1593
- break;
1594
- // COLUMNS
1595
- case "create_column":
1596
- result = await kanbanApi.createColumn(args);
1597
- break;
1598
- case "update_column":
1599
- result = await kanbanApi.updateColumn(
1600
- args.columnId,
1601
- args
1602
- );
1603
- break;
1604
- case "delete_column":
1605
- result = await kanbanApi.deleteColumn(args.columnId);
1606
- break;
1607
- case "reorder_columns":
1608
- result = await kanbanApi.reorderColumns(args.columns);
1609
- break;
1610
- // CARDS
1611
- case "get_card":
1612
- result = await kanbanApi.getCard(args.cardId);
1613
- break;
1614
- case "create_card":
1615
- result = await kanbanApi.createCard(args);
1616
- break;
1617
- case "update_card":
1618
- result = await kanbanApi.updateCard(args.cardId, args);
1619
- break;
1620
- case "delete_card":
1621
- result = await kanbanApi.deleteCard(args.cardId);
1622
- break;
1623
- case "move_card":
1624
- result = await kanbanApi.moveCard(
1625
- args.cardId,
1626
- args.targetColumnId,
1627
- args.newOrder
1628
- );
1629
- break;
1630
- case "archive_card":
1631
- result = await kanbanApi.archiveCard(args.cardId);
1632
- break;
1633
- case "unarchive_card":
1634
- result = await kanbanApi.unarchiveCard(args.cardId);
1635
- break;
1636
- case "list_archived_cards":
1637
- result = await kanbanApi.listArchivedCards(args.boardId);
1638
- break;
1639
- case "add_comment":
1640
- result = await kanbanApi.addComment(
1641
- args.cardId,
1642
- args.content
1643
- );
1644
- break;
1645
- case "delete_comment":
1646
- result = await kanbanApi.deleteComment(args.commentId);
1647
- break;
1648
- // CHECKLISTS
1649
- case "create_checklist":
1650
- result = await kanbanApi.createChecklist({
1651
- cardId: args.cardId,
1652
- title: args.title
1653
- });
1654
- break;
1655
- case "update_checklist":
1656
- result = await kanbanApi.updateChecklist(args.checklistId, {
1657
- title: args.title
1658
- });
1659
- break;
1660
- case "delete_checklist":
1661
- result = await kanbanApi.deleteChecklist(args.checklistId);
1662
- break;
1663
- case "create_checklist_item":
1664
- result = await kanbanApi.createChecklistItem({
1665
- checklistId: args.checklistId,
1666
- content: args.content
1667
- });
1668
- break;
1669
- case "update_checklist_item":
1670
- result = await kanbanApi.updateChecklistItem(args.itemId, {
1671
- content: args.content,
1672
- completed: args.completed
1673
- });
1674
- break;
1675
- case "delete_checklist_item":
1676
- result = await kanbanApi.deleteChecklistItem(args.itemId);
1677
- break;
1678
- case "get_branch_name":
1679
- result = await kanbanApi.getBranchName(
1680
- args.cardId,
1681
- args.type || "feature"
1682
- );
1683
- break;
1684
- case "search_cards":
1685
- result = await kanbanApi.searchCards(args);
1686
- break;
1687
- // BULK OPERATIONS
1688
- case "bulk_create_cards":
1689
- result = await kanbanApi.bulkCreateCards(args);
1690
- break;
1691
- case "bulk_create_epic_with_cards":
1692
- result = await kanbanApi.bulkCreateEpicWithCards(args);
1693
- break;
1694
- case "bulk_create_epic_with_features":
1695
- result = await kanbanApi.bulkCreateEpicWithFeatures(args);
1696
- break;
1697
- case "bulk_move_cards":
1698
- result = await kanbanApi.bulkMoveCards(args);
1699
- break;
1700
- case "quick_add_cards":
1701
- result = await kanbanApi.quickAddCards(args);
1702
- break;
1703
- case "move_cards_by_column":
1704
- result = await kanbanApi.moveCardsByColumn(args);
1705
- break;
1706
- // AGGREGATED VIEWS
1707
- case "get_workspace":
1708
- result = await kanbanApi.getWorkspace(args.projectId);
1709
- break;
1710
- case "get_board_summary":
1711
- result = await kanbanApi.getBoardSummary(args.boardId);
1712
- break;
1713
- case "get_epic_summary":
1714
- result = await kanbanApi.getEpicSummary(args.epicId);
1715
- break;
1716
- // TAGS
1717
- case "list_tags":
1718
- result = await kanbanApi.listTags();
1719
- break;
1720
- case "create_tag":
1721
- result = await kanbanApi.createTag(args);
1722
- break;
1723
- case "delete_tag":
1724
- result = await kanbanApi.deleteTag(args.tagId);
1725
- break;
1726
- case "add_tag_to_card":
1727
- result = await kanbanApi.addTagToCard(
1728
- args.cardId,
1729
- args.tagId
1730
- );
1731
- break;
1732
- case "remove_tag_from_card":
1733
- result = await kanbanApi.removeTagFromCard(
1734
- args.cardId,
1735
- args.tagId
1736
- );
1737
- break;
1738
- // EPICS
1739
- case "list_epics":
1740
- result = await kanbanApi.listEpics(args);
1741
- break;
1742
- case "create_epic":
1743
- result = await kanbanApi.createEpic(args);
1744
- break;
1745
- case "get_epic":
1746
- result = await kanbanApi.getEpic(args.epicId);
1747
- break;
1748
- case "update_epic":
1749
- result = await kanbanApi.updateEpic(args.epicId, args);
1750
- break;
1751
- case "delete_epic":
1752
- result = await kanbanApi.deleteEpic(args.epicId);
1753
- break;
1754
- case "add_card_to_epic":
1755
- result = await kanbanApi.addCardToEpic(
1756
- args.epicId,
1757
- args.cardId
1758
- );
1759
- break;
1760
- case "remove_card_from_epic":
1761
- result = await kanbanApi.removeCardFromEpic(
1762
- args.epicId,
1763
- args.cardId
1764
- );
1765
- break;
1766
- // FEATURES
1767
- case "list_features": {
1768
- const features = await kanbanApi.listFeatures(args.epicId);
1769
- const slugFilter = args.slug;
1770
- result = slugFilter ? (Array.isArray(features) ? features : []).filter(
1771
- (f) => f.slug === slugFilter.toUpperCase()
1772
- ) : features;
1773
- break;
1774
- }
1775
- case "get_feature": {
1776
- const fId = args.featureId || args.featureSlug;
1777
- if (!fId)
1778
- throw new Error("Either featureId or featureSlug is required");
1779
- result = await kanbanApi.getFeature(fId);
1780
- break;
1781
- }
1782
- case "get_active_features":
1783
- result = await kanbanApi.getActiveFeatures();
1784
- break;
1785
- case "create_feature":
1786
- result = await kanbanApi.createFeature(args);
1787
- break;
1788
- case "update_feature":
1789
- result = await kanbanApi.updateFeature(
1790
- args.featureId,
1791
- args
1792
- );
1793
- break;
1794
- case "delete_feature":
1795
- result = await kanbanApi.deleteFeature(args.featureId);
1796
- break;
1797
- case "add_card_to_feature": {
1798
- let addFeatureId = args.featureId || args.featureSlug;
1799
- if (!addFeatureId)
1800
- throw new Error("Either featureId or featureSlug is required");
1801
- if (args.featureSlug && !args.featureId) {
1802
- const resolved = await kanbanApi.getFeature(addFeatureId);
1803
- 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}`);
1804
938
  }
1805
- result = await kanbanApi.addCardToFeature(
1806
- addFeatureId,
1807
- args.cardId
1808
- );
1809
939
  break;
1810
- }
1811
- case "remove_card_from_feature": {
1812
- let removeFeatureId = args.featureId || args.featureSlug;
1813
- if (!removeFeatureId)
1814
- throw new Error("Either featureId or featureSlug is required");
1815
- if (args.featureSlug && !args.featureId) {
1816
- const resolved = await kanbanApi.getFeature(removeFeatureId);
1817
- 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}`);
1818
973
  }
1819
- result = await kanbanApi.removeCardFromFeature(
1820
- removeFeatureId,
1821
- args.cardId
1822
- );
1823
974
  break;
1824
- }
1825
- case "get_feature_cards": {
1826
- let cardsFeatureId = args.featureId || args.featureSlug;
1827
- if (!cardsFeatureId)
1828
- throw new Error("Either featureId or featureSlug is required");
1829
- if (args.featureSlug && !args.featureId) {
1830
- const resolved = await kanbanApi.getFeature(cardsFeatureId);
1831
- 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}`);
1832
992
  }
1833
- result = await kanbanApi.getFeatureCards(cardsFeatureId);
1834
- break;
1835
- }
1836
- // CARD LINKS
1837
- case "link_cards":
1838
- result = await kanbanApi.linkCards(
1839
- args.cardId1,
1840
- args.cardId2,
1841
- args.label
1842
- );
1843
993
  break;
1844
- case "unlink_cards":
1845
- result = await kanbanApi.unlinkCards(args.linkId);
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
+ }
1846
1049
  break;
1847
- case "get_linked_cards":
1848
- result = await kanbanApi.getLinkedCards(args.cardId);
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
+ }
1849
1062
  break;
1850
- // GITHUB INTEGRATION
1851
- case "setup_github_integration":
1852
- result = await kanbanApi.setupGithubIntegration(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
+ }
1853
1098
  break;
1854
- case "get_github_integration":
1855
- result = await kanbanApi.getGithubIntegration(args.projectId);
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
+ }
1856
1120
  break;
1857
- case "update_github_integration":
1858
- result = await kanbanApi.updateGithubIntegration(
1859
- args.projectId,
1860
- args
1861
- );
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
+ }
1862
1157
  break;
1863
- case "remove_github_integration":
1864
- result = await kanbanApi.removeGithubIntegration(
1865
- args.projectId
1866
- );
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
+ }
1867
1224
  break;
1868
- case "link_card_to_branch":
1869
- result = await kanbanApi.linkCardToBranch(
1870
- args.cardId,
1871
- args.branch
1872
- );
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
+ }
1873
1240
  break;
1874
- case "link_card_to_pr":
1875
- result = await kanbanApi.linkCardToPr(
1876
- args.cardId,
1877
- args.prUrl
1878
- );
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
+ }
1879
1265
  break;
1880
1266
  default:
1881
1267
  throw new Error(`Unknown tool: ${name}`);