@vibescope/mcp-server 0.2.2 → 0.2.4

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 (80) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/README.md +35 -20
  3. package/dist/api-client.d.ts +276 -8
  4. package/dist/api-client.js +128 -9
  5. package/dist/handlers/blockers.d.ts +11 -0
  6. package/dist/handlers/blockers.js +37 -2
  7. package/dist/handlers/bodies-of-work.d.ts +2 -0
  8. package/dist/handlers/bodies-of-work.js +30 -1
  9. package/dist/handlers/connectors.js +2 -2
  10. package/dist/handlers/decisions.d.ts +11 -0
  11. package/dist/handlers/decisions.js +37 -2
  12. package/dist/handlers/deployment.d.ts +6 -0
  13. package/dist/handlers/deployment.js +33 -5
  14. package/dist/handlers/discovery.js +27 -11
  15. package/dist/handlers/fallback.js +12 -6
  16. package/dist/handlers/file-checkouts.d.ts +1 -0
  17. package/dist/handlers/file-checkouts.js +17 -2
  18. package/dist/handlers/findings.d.ts +5 -0
  19. package/dist/handlers/findings.js +19 -2
  20. package/dist/handlers/git-issues.js +4 -2
  21. package/dist/handlers/ideas.d.ts +5 -0
  22. package/dist/handlers/ideas.js +19 -2
  23. package/dist/handlers/progress.js +2 -2
  24. package/dist/handlers/project.d.ts +1 -0
  25. package/dist/handlers/project.js +35 -2
  26. package/dist/handlers/requests.js +6 -3
  27. package/dist/handlers/roles.js +13 -2
  28. package/dist/handlers/session.d.ts +12 -0
  29. package/dist/handlers/session.js +288 -25
  30. package/dist/handlers/sprints.d.ts +2 -0
  31. package/dist/handlers/sprints.js +30 -1
  32. package/dist/handlers/tasks.d.ts +25 -2
  33. package/dist/handlers/tasks.js +228 -35
  34. package/dist/handlers/tool-docs.js +72 -5
  35. package/dist/templates/agent-guidelines.d.ts +18 -0
  36. package/dist/templates/agent-guidelines.js +207 -0
  37. package/dist/tools.js +478 -125
  38. package/dist/utils.d.ts +5 -2
  39. package/dist/utils.js +90 -51
  40. package/package.json +51 -46
  41. package/scripts/version-bump.ts +203 -0
  42. package/src/api-client.test.ts +8 -3
  43. package/src/api-client.ts +376 -13
  44. package/src/handlers/__test-setup__.ts +5 -0
  45. package/src/handlers/blockers.test.ts +76 -0
  46. package/src/handlers/blockers.ts +56 -2
  47. package/src/handlers/bodies-of-work.ts +59 -1
  48. package/src/handlers/connectors.ts +2 -2
  49. package/src/handlers/decisions.test.ts +71 -2
  50. package/src/handlers/decisions.ts +56 -2
  51. package/src/handlers/deployment.test.ts +81 -0
  52. package/src/handlers/deployment.ts +38 -5
  53. package/src/handlers/discovery.ts +27 -11
  54. package/src/handlers/fallback.test.ts +11 -10
  55. package/src/handlers/fallback.ts +14 -8
  56. package/src/handlers/file-checkouts.test.ts +83 -3
  57. package/src/handlers/file-checkouts.ts +22 -2
  58. package/src/handlers/findings.test.ts +2 -2
  59. package/src/handlers/findings.ts +38 -2
  60. package/src/handlers/git-issues.test.ts +2 -2
  61. package/src/handlers/git-issues.ts +4 -2
  62. package/src/handlers/ideas.test.ts +1 -1
  63. package/src/handlers/ideas.ts +34 -2
  64. package/src/handlers/progress.ts +2 -2
  65. package/src/handlers/project.ts +47 -2
  66. package/src/handlers/requests.test.ts +38 -7
  67. package/src/handlers/requests.ts +6 -3
  68. package/src/handlers/roles.test.ts +1 -1
  69. package/src/handlers/roles.ts +20 -2
  70. package/src/handlers/session.test.ts +303 -4
  71. package/src/handlers/session.ts +335 -28
  72. package/src/handlers/sprints.ts +61 -1
  73. package/src/handlers/tasks.test.ts +0 -73
  74. package/src/handlers/tasks.ts +269 -40
  75. package/src/handlers/tool-docs.ts +77 -5
  76. package/src/handlers/types.test.ts +259 -0
  77. package/src/templates/agent-guidelines.ts +210 -0
  78. package/src/tools.ts +479 -125
  79. package/src/utils.test.ts +7 -5
  80. package/src/utils.ts +95 -51
package/dist/tools.js CHANGED
@@ -34,9 +34,39 @@ Use mode:'full' for complete context, mode:'lite' (default) for minimal tokens.`
34
34
  enum: ['developer', 'validator', 'deployer', 'reviewer', 'maintainer'],
35
35
  description: 'Agent role: developer (general work, default), validator (task validation), deployer (deployments), reviewer (code review), maintainer (housekeeping)',
36
36
  },
37
+ hostname: {
38
+ type: 'string',
39
+ description: 'Machine hostname for worktree tracking. Pass os.hostname() to filter stale worktrees to only those created on this machine.',
40
+ },
41
+ agent_type: {
42
+ type: 'string',
43
+ enum: ['claude', 'gemini', 'cursor', 'windsurf', 'other'],
44
+ description: 'Agent type for onboarding. When a new agent type connects to an existing project, setup instructions are returned.',
45
+ },
37
46
  },
38
47
  },
39
48
  },
49
+ {
50
+ name: 'confirm_agent_setup',
51
+ description: `Confirm that agent setup is complete for this project. Call this after creating your agent's configuration file (e.g., .claude/CLAUDE.md, .gemini/GEMINI.md).
52
+
53
+ This marks your agent type as fully onboarded to the project, so you won't receive setup instructions again.`,
54
+ inputSchema: {
55
+ type: 'object',
56
+ properties: {
57
+ project_id: {
58
+ type: 'string',
59
+ description: 'Project UUID',
60
+ },
61
+ agent_type: {
62
+ type: 'string',
63
+ enum: ['claude', 'gemini', 'cursor', 'windsurf', 'other'],
64
+ description: 'Agent type that completed setup',
65
+ },
66
+ },
67
+ required: ['project_id', 'agent_type'],
68
+ },
69
+ },
40
70
  {
41
71
  name: 'get_help',
42
72
  description: 'Get guidance on a specific topic. Use when unsure about workflows.',
@@ -60,6 +90,33 @@ Use mode:'full' for complete context, mode:'lite' (default) for minimal tokens.`
60
90
  properties: {},
61
91
  },
62
92
  },
93
+ {
94
+ name: 'report_token_usage',
95
+ description: `Report actual Claude API token usage for accurate cost tracking.
96
+
97
+ IMPORTANT: MCP can only estimate tokens from tool I/O (~1-5% of actual usage). Call this tool after each API response to report actual usage from the Claude API response headers.
98
+
99
+ The Claude API response includes 'usage.input_tokens' and 'usage.output_tokens' - pass those values here for accurate cost attribution.`,
100
+ inputSchema: {
101
+ type: 'object',
102
+ properties: {
103
+ input_tokens: {
104
+ type: 'number',
105
+ description: 'Input tokens from Claude API response (usage.input_tokens)',
106
+ },
107
+ output_tokens: {
108
+ type: 'number',
109
+ description: 'Output tokens from Claude API response (usage.output_tokens)',
110
+ },
111
+ model: {
112
+ type: 'string',
113
+ enum: ['opus', 'sonnet', 'haiku'],
114
+ description: 'Model used for this API call (optional, uses session model if not provided)',
115
+ },
116
+ },
117
+ required: ['input_tokens', 'output_tokens'],
118
+ },
119
+ },
63
120
  // Cost monitoring tools
64
121
  {
65
122
  name: 'get_cost_summary',
@@ -84,19 +141,7 @@ Use mode:'full' for complete context, mode:'lite' (default) for minimal tokens.`
84
141
  required: ['project_id'],
85
142
  },
86
143
  },
87
- {
88
- name: 'get_cost_alerts',
89
- description: 'Get cost alerts for the current user.',
90
- inputSchema: {
91
- type: 'object',
92
- properties: {
93
- project_id: {
94
- type: 'string',
95
- description: 'Filter by project (optional)',
96
- },
97
- },
98
- },
99
- },
144
+ // REMOVED: get_cost_alerts - unbounded collection, use dashboard to view alerts
100
145
  {
101
146
  name: 'add_cost_alert',
102
147
  description: 'Add a cost alert threshold.',
@@ -171,58 +216,9 @@ Use mode:'full' for complete context, mode:'lite' (default) for minimal tokens.`
171
216
  required: ['alert_id'],
172
217
  },
173
218
  },
174
- {
175
- name: 'get_task_costs',
176
- description: 'Get cost breakdown by task for a project.',
177
- inputSchema: {
178
- type: 'object',
179
- properties: {
180
- project_id: {
181
- type: 'string',
182
- description: 'Project UUID',
183
- },
184
- limit: {
185
- type: 'number',
186
- description: 'Max tasks to return (default: 20)',
187
- },
188
- },
189
- required: ['project_id'],
190
- },
191
- },
192
- {
193
- name: 'get_body_of_work_costs',
194
- description: 'Get cost breakdown by body of work with phase-level details. Returns costs for pre/core/post phases and model breakdown.',
195
- inputSchema: {
196
- type: 'object',
197
- properties: {
198
- body_of_work_id: {
199
- type: 'string',
200
- description: 'Body of work UUID (optional if project_id provided)',
201
- },
202
- project_id: {
203
- type: 'string',
204
- description: 'Project UUID to get all body of work costs (optional if body_of_work_id provided)',
205
- },
206
- },
207
- },
208
- },
209
- {
210
- name: 'get_sprint_costs',
211
- description: 'Get cost breakdown by sprint with velocity metrics. Returns cost per story point and phase breakdown.',
212
- inputSchema: {
213
- type: 'object',
214
- properties: {
215
- sprint_id: {
216
- type: 'string',
217
- description: 'Sprint UUID (optional if project_id provided)',
218
- },
219
- project_id: {
220
- type: 'string',
221
- description: 'Project UUID to get all sprint costs (optional if sprint_id provided)',
222
- },
223
- },
224
- },
225
- },
219
+ // REMOVED: get_task_costs - unbounded collection, use get_cost_summary for aggregated data
220
+ // REMOVED: get_body_of_work_costs - unbounded collection, use get_cost_summary for aggregated data
221
+ // REMOVED: get_sprint_costs - unbounded collection, use get_cost_summary for aggregated data
226
222
  // Knowledge Base Query Tool
227
223
  {
228
224
  name: 'query_knowledge_base',
@@ -396,17 +392,47 @@ Use mode:'full' for complete context, mode:'lite' (default) for minimal tokens.`
396
392
  type: 'boolean',
397
393
  description: 'Automatically tag deployments on main branch',
398
394
  },
399
- git_auto_commit_on_complete: {
395
+ deployment_instructions: {
396
+ type: 'string',
397
+ description: 'Instructions for how to deploy (e.g., "Push to main for Vercel auto-deploy", "Run fly deploy")',
398
+ },
399
+ // Git and validation settings
400
+ git_delete_branch_on_merge: {
400
401
  type: 'boolean',
401
- description: 'Agents must commit changes after completing tasks',
402
+ description: 'Delete feature branch after PR merge (default: true)',
402
403
  },
403
- git_auto_pr_on_complete: {
404
+ require_pr_for_validation: {
404
405
  type: 'boolean',
405
- description: 'Agents must create PR after completing tasks',
406
+ description: 'Require PR exists before task validation can be approved (default: true for github-flow/git-flow)',
406
407
  },
407
- deployment_instructions: {
408
- type: 'string',
409
- description: 'Instructions for how to deploy (e.g., "Push to main for Vercel auto-deploy", "Run fly deploy")',
408
+ auto_merge_on_approval: {
409
+ type: 'boolean',
410
+ description: 'Automatically merge PR when validator approves (default: true)',
411
+ },
412
+ validation_required: {
413
+ type: 'boolean',
414
+ description: 'Completed tasks require validation before being considered done (default: true)',
415
+ },
416
+ // Task default settings
417
+ default_task_priority: {
418
+ type: 'integer',
419
+ minimum: 1,
420
+ maximum: 5,
421
+ description: 'Default priority for new tasks when not specified (1=highest, 5=lowest, default: 3)',
422
+ },
423
+ require_time_estimates: {
424
+ type: 'boolean',
425
+ description: 'Require estimated_minutes when creating tasks (default: false)',
426
+ },
427
+ // Agent behavior settings
428
+ fallback_activities_enabled: {
429
+ type: 'boolean',
430
+ description: 'Allow agents to perform background activities when no tasks available (default: true)',
431
+ },
432
+ preferred_fallback_activities: {
433
+ type: 'array',
434
+ items: { type: 'string' },
435
+ description: 'Array of preferred fallback activities (e.g., ["code_review", "security_review"]). Null means all allowed.',
410
436
  },
411
437
  },
412
438
  required: ['project_id'],
@@ -431,8 +457,76 @@ Use mode:'full' for complete context, mode:'lite' (default) for minimal tokens.`
431
457
  },
432
458
  },
433
459
  {
434
- name: 'get_tasks',
435
- description: 'Get tasks for a project, optionally filtered by status. By default returns only root tasks (not subtasks).',
460
+ name: 'get_project_summary',
461
+ description: 'Get a unified project overview with aggregated stats. Token-efficient way to get task counts, blockers, findings, active agents, and more in a single call.',
462
+ inputSchema: {
463
+ type: 'object',
464
+ properties: {
465
+ project_id: {
466
+ type: 'string',
467
+ description: 'Project UUID',
468
+ },
469
+ },
470
+ required: ['project_id'],
471
+ },
472
+ },
473
+ // Targeted task endpoints (token-efficient)
474
+ {
475
+ name: 'get_task',
476
+ description: `Get a single task by ID with optional subtasks and milestones.`,
477
+ inputSchema: {
478
+ type: 'object',
479
+ properties: {
480
+ task_id: {
481
+ type: 'string',
482
+ description: 'Task UUID',
483
+ },
484
+ include_subtasks: {
485
+ type: 'boolean',
486
+ description: 'Include subtasks array (default: false)',
487
+ },
488
+ include_milestones: {
489
+ type: 'boolean',
490
+ description: 'Include milestones array (default: false)',
491
+ },
492
+ },
493
+ required: ['task_id'],
494
+ },
495
+ },
496
+ {
497
+ name: 'search_tasks',
498
+ description: `Search tasks by text query. Supports pagination with offset. Use for finding specific tasks by title or description.`,
499
+ inputSchema: {
500
+ type: 'object',
501
+ properties: {
502
+ project_id: {
503
+ type: 'string',
504
+ description: 'Project UUID',
505
+ },
506
+ query: {
507
+ type: 'string',
508
+ description: 'Search query (min 2 chars). Searches title and description.',
509
+ },
510
+ status: {
511
+ type: 'array',
512
+ items: { type: 'string', enum: ['backlog', 'pending', 'in_progress', 'completed', 'cancelled'] },
513
+ description: 'Filter by status (optional, array)',
514
+ },
515
+ limit: {
516
+ type: 'number',
517
+ description: 'Max results per page (1-20, default: 10)',
518
+ },
519
+ offset: {
520
+ type: 'number',
521
+ description: 'Number of results to skip for pagination (default: 0)',
522
+ },
523
+ },
524
+ required: ['project_id', 'query'],
525
+ },
526
+ },
527
+ {
528
+ name: 'get_tasks_by_priority',
529
+ description: `Get tasks filtered by priority. Supports pagination with offset. Use for finding high-priority or low-priority tasks.`,
436
530
  inputSchema: {
437
531
  type: 'object',
438
532
  properties: {
@@ -440,6 +534,50 @@ Use mode:'full' for complete context, mode:'lite' (default) for minimal tokens.`
440
534
  type: 'string',
441
535
  description: 'Project UUID',
442
536
  },
537
+ priority: {
538
+ type: 'number',
539
+ minimum: 1,
540
+ maximum: 5,
541
+ description: 'Exact priority to match (1=highest, 5=lowest)',
542
+ },
543
+ priority_max: {
544
+ type: 'number',
545
+ minimum: 1,
546
+ maximum: 5,
547
+ description: 'Max priority (for range, e.g., priority=1, priority_max=2 gets P1 and P2)',
548
+ },
549
+ status: {
550
+ type: 'string',
551
+ enum: ['backlog', 'pending', 'in_progress', 'completed', 'cancelled'],
552
+ description: 'Filter by status (default: pending)',
553
+ },
554
+ limit: {
555
+ type: 'number',
556
+ description: 'Max results per page (1-20, default: 10)',
557
+ },
558
+ offset: {
559
+ type: 'number',
560
+ description: 'Number of results to skip for pagination (default: 0)',
561
+ },
562
+ },
563
+ required: ['project_id'],
564
+ },
565
+ },
566
+ {
567
+ name: 'get_recent_tasks',
568
+ description: `Get tasks ordered by creation date. Supports pagination with offset. Use to find oldest pending tasks or newest additions.`,
569
+ inputSchema: {
570
+ type: 'object',
571
+ properties: {
572
+ project_id: {
573
+ type: 'string',
574
+ description: 'Project UUID',
575
+ },
576
+ order: {
577
+ type: 'string',
578
+ enum: ['newest', 'oldest'],
579
+ description: 'Sort order (default: newest)',
580
+ },
443
581
  status: {
444
582
  type: 'string',
445
583
  enum: ['backlog', 'pending', 'in_progress', 'completed', 'cancelled'],
@@ -447,15 +585,25 @@ Use mode:'full' for complete context, mode:'lite' (default) for minimal tokens.`
447
585
  },
448
586
  limit: {
449
587
  type: 'number',
450
- description: 'Max number of tasks to return (default 50)',
588
+ description: 'Max results per page (1-20, default: 10)',
451
589
  },
452
- include_subtasks: {
453
- type: 'boolean',
454
- description: 'Include subtasks in results (default false). Use get_subtasks for subtasks of a specific task.',
590
+ offset: {
591
+ type: 'number',
592
+ description: 'Number of results to skip for pagination (default: 0)',
455
593
  },
456
- include_metadata: {
457
- type: 'boolean',
458
- description: 'When true, returns all task fields (description, progress, timestamps, etc.). When false (default), returns only id/title/priority/status to save tokens.',
594
+ },
595
+ required: ['project_id'],
596
+ },
597
+ },
598
+ {
599
+ name: 'get_task_stats',
600
+ description: `Get aggregate task statistics for a project. Returns counts by status and priority, no task data. Most token-efficient way to understand project state.`,
601
+ inputSchema: {
602
+ type: 'object',
603
+ properties: {
604
+ project_id: {
605
+ type: 'string',
606
+ description: 'Project UUID',
459
607
  },
460
608
  },
461
609
  required: ['project_id'],
@@ -569,6 +717,10 @@ For projects without git branching (trunk-based or none), use skip_worktree_requ
569
717
  type: 'string',
570
718
  description: 'Git worktree path for this task (e.g., "../project-task-abc123"). Store this for cleanup tracking across sessions.',
571
719
  },
720
+ worktree_hostname: {
721
+ type: 'string',
722
+ description: 'Machine hostname where worktree was created (os.hostname()). Required with worktree_path to enable machine-aware cleanup.',
723
+ },
572
724
  model_capability: {
573
725
  type: 'string',
574
726
  enum: ['haiku', 'sonnet', 'opus'],
@@ -586,6 +738,11 @@ For projects without git branching (trunk-based or none), use skip_worktree_requ
586
738
  name: 'complete_task',
587
739
  description: `Mark task done. Returns next_task which you MUST start immediately without asking the user.
588
740
 
741
+ CRITICAL: Before calling complete_task on branching workflows (github-flow, git-flow):
742
+ 1. Create your PR targeting the correct branch (develop for git-flow, main for github-flow)
743
+ 2. Call add_task_reference(task_id, pr_url) to link the PR to your task
744
+ 3. THEN call complete_task - validators CANNOT approve tasks without a PR reference
745
+
589
746
  CRITICAL: After calling this tool, you must:
590
747
  1. If next_task is returned → Start it immediately by calling update_task(task_id, status: "in_progress")
591
748
  2. If no next_task → Call get_next_task() or start a fallback_activity
@@ -669,6 +826,20 @@ The auto_continue: true flag in the response means you are expected to continue
669
826
  required: ['blocker_id'],
670
827
  },
671
828
  },
829
+ {
830
+ name: 'get_blocker',
831
+ description: `Get a single blocker by ID. More token-efficient than get_blockers when you need details for a specific blocker.`,
832
+ inputSchema: {
833
+ type: 'object',
834
+ properties: {
835
+ blocker_id: {
836
+ type: 'string',
837
+ description: 'Blocker UUID',
838
+ },
839
+ },
840
+ required: ['blocker_id'],
841
+ },
842
+ },
672
843
  {
673
844
  name: 'get_blockers',
674
845
  description: `Get blockers for a project, optionally filtered by status.`,
@@ -684,6 +855,29 @@ The auto_continue: true flag in the response means you are expected to continue
684
855
  enum: ['open', 'resolved'],
685
856
  description: 'Filter by status (default: open)',
686
857
  },
858
+ limit: {
859
+ type: 'number',
860
+ description: 'Max number of blockers to return (default 10, max 200)',
861
+ },
862
+ offset: {
863
+ type: 'number',
864
+ description: 'Number of blockers to skip for pagination (default 0)',
865
+ },
866
+ search_query: {
867
+ type: 'string',
868
+ description: 'Search blockers by description',
869
+ },
870
+ },
871
+ required: ['project_id'],
872
+ },
873
+ },
874
+ {
875
+ name: 'get_blockers_stats',
876
+ description: `Get aggregate statistics about blockers for a project. Returns total count and breakdown by status. Much more token-efficient than get_blockers when you just need to understand the overall state.`,
877
+ inputSchema: {
878
+ type: 'object',
879
+ properties: {
880
+ project_id: { type: 'string', description: 'Project UUID' },
687
881
  },
688
882
  required: ['project_id'],
689
883
  },
@@ -719,6 +913,20 @@ The auto_continue: true flag in the response means you are expected to continue
719
913
  required: ['project_id', 'title', 'description'],
720
914
  },
721
915
  },
916
+ {
917
+ name: 'get_decision',
918
+ description: `Get a single decision by ID. More token-efficient than get_decisions when you need details for a specific decision.`,
919
+ inputSchema: {
920
+ type: 'object',
921
+ properties: {
922
+ decision_id: {
923
+ type: 'string',
924
+ description: 'Decision UUID',
925
+ },
926
+ },
927
+ required: ['decision_id'],
928
+ },
929
+ },
722
930
  {
723
931
  name: 'get_decisions',
724
932
  description: `Get recorded decisions for a project.`,
@@ -729,6 +937,29 @@ The auto_continue: true flag in the response means you are expected to continue
729
937
  type: 'string',
730
938
  description: 'Project UUID',
731
939
  },
940
+ limit: {
941
+ type: 'number',
942
+ description: 'Max number of decisions to return (default 10, max 200)',
943
+ },
944
+ offset: {
945
+ type: 'number',
946
+ description: 'Number of decisions to skip for pagination (default 0)',
947
+ },
948
+ search_query: {
949
+ type: 'string',
950
+ description: 'Search decisions by title',
951
+ },
952
+ },
953
+ required: ['project_id'],
954
+ },
955
+ },
956
+ {
957
+ name: 'get_decisions_stats',
958
+ description: `Get aggregate statistics about decisions for a project. Returns total count. More token-efficient than get_decisions when you just need to know how many decisions exist.`,
959
+ inputSchema: {
960
+ type: 'object',
961
+ properties: {
962
+ project_id: { type: 'string', description: 'Project UUID' },
732
963
  },
733
964
  required: ['project_id'],
734
965
  },
@@ -791,6 +1022,20 @@ The auto_continue: true flag in the response means you are expected to continue
791
1022
  required: ['idea_id'],
792
1023
  },
793
1024
  },
1025
+ {
1026
+ name: 'get_idea',
1027
+ description: `Get a single idea by ID. More token-efficient than get_ideas when you need details for a specific idea.`,
1028
+ inputSchema: {
1029
+ type: 'object',
1030
+ properties: {
1031
+ idea_id: {
1032
+ type: 'string',
1033
+ description: 'Idea UUID',
1034
+ },
1035
+ },
1036
+ required: ['idea_id'],
1037
+ },
1038
+ },
794
1039
  {
795
1040
  name: 'get_ideas',
796
1041
  description: `Get recorded ideas for a project, optionally filtered by status.`,
@@ -808,7 +1053,7 @@ The auto_continue: true flag in the response means you are expected to continue
808
1053
  },
809
1054
  limit: {
810
1055
  type: 'number',
811
- description: 'Max number of ideas to return (default 50, max 100)',
1056
+ description: 'Max number of ideas to return (default 10, max 100)',
812
1057
  },
813
1058
  offset: {
814
1059
  type: 'number',
@@ -836,6 +1081,29 @@ The auto_continue: true flag in the response means you are expected to continue
836
1081
  required: ['task_id'],
837
1082
  },
838
1083
  },
1084
+ {
1085
+ name: 'cancel_task',
1086
+ description: `Cancel a task with an optional reason. Use this when a task should be marked as cancelled rather than deleted (e.g., PR was closed, work was superseded). The task remains visible with a cancelled status for historical tracking.`,
1087
+ inputSchema: {
1088
+ type: 'object',
1089
+ properties: {
1090
+ task_id: {
1091
+ type: 'string',
1092
+ description: 'Task UUID',
1093
+ },
1094
+ cancelled_reason: {
1095
+ type: 'string',
1096
+ description: 'Reason for cancellation',
1097
+ enum: ['pr_closed', 'superseded', 'user_cancelled', 'validation_failed', 'obsolete', 'blocked'],
1098
+ },
1099
+ cancellation_note: {
1100
+ type: 'string',
1101
+ description: 'Optional note explaining the cancellation (logged to progress)',
1102
+ },
1103
+ },
1104
+ required: ['task_id'],
1105
+ },
1106
+ },
839
1107
  {
840
1108
  name: 'add_task_reference',
841
1109
  description: 'Add a reference URL to a task (docs, PRs, issues).',
@@ -938,9 +1206,20 @@ The auto_continue: true flag in the response means you are expected to continue
938
1206
  required: ['project_id', 'title'],
939
1207
  },
940
1208
  },
1209
+ {
1210
+ name: 'get_finding',
1211
+ description: `Get a single finding by ID. More token-efficient than get_findings when you need details for a specific finding.`,
1212
+ inputSchema: {
1213
+ type: 'object',
1214
+ properties: {
1215
+ finding_id: { type: 'string', description: 'Finding UUID' },
1216
+ },
1217
+ required: ['finding_id'],
1218
+ },
1219
+ },
941
1220
  {
942
1221
  name: 'get_findings',
943
- description: `Get findings for a project, optionally filtered by category, severity, or status. Use summary_only=true to reduce token usage by returning only essential fields (id, title, category, severity, status). For just counts, use get_findings_stats instead.`,
1222
+ description: `Get findings for a project, optionally filtered by category, severity, or status. Returns summary fields by default (id, title, category, severity, status). Set summary_only=false for full details. For just counts, use get_findings_stats instead.`,
944
1223
  inputSchema: {
945
1224
  type: 'object',
946
1225
  properties: {
@@ -948,10 +1227,10 @@ The auto_continue: true flag in the response means you are expected to continue
948
1227
  category: { type: 'string', enum: ['performance', 'security', 'code_quality', 'accessibility', 'documentation', 'architecture', 'testing', 'other'], description: 'Filter by category (optional)' },
949
1228
  severity: { type: 'string', enum: ['info', 'low', 'medium', 'high', 'critical'], description: 'Filter by severity (optional)' },
950
1229
  status: { type: 'string', enum: ['open', 'addressed', 'dismissed', 'wontfix'], description: 'Filter by status (default: open)' },
951
- limit: { type: 'number', description: 'Max number of findings to return (default 50, max 200)' },
1230
+ limit: { type: 'number', description: 'Max number of findings to return (default 10, max 200)' },
952
1231
  offset: { type: 'number', description: 'Number of findings to skip for pagination (default 0)' },
953
1232
  search_query: { type: 'string', description: 'Search findings by title' },
954
- summary_only: { type: 'boolean', description: 'When true, returns only id, title, category, severity, status (reduces tokens by ~80%). Default: false' },
1233
+ summary_only: { type: 'boolean', description: 'When true (default), returns only id, title, category, severity, status. Set to false for full details.' },
955
1234
  },
956
1235
  required: ['project_id'],
957
1236
  },
@@ -1051,7 +1330,7 @@ The auto_continue: true flag in the response means you are expected to continue
1051
1330
  },
1052
1331
  limit: {
1053
1332
  type: 'number',
1054
- description: 'Max number of items to return (default 50, max 200)',
1333
+ description: 'Max number of items to return (default 10, max 200)',
1055
1334
  },
1056
1335
  },
1057
1336
  required: ['project_id'],
@@ -1145,7 +1424,7 @@ Max depth is 1 (subtasks cannot have their own subtasks).`,
1145
1424
  },
1146
1425
  {
1147
1426
  name: 'get_subtasks',
1148
- description: `Get subtasks for a parent task.
1427
+ description: `Get subtasks for a parent task with pagination.
1149
1428
  Returns subtasks with aggregate completion stats.`,
1150
1429
  inputSchema: {
1151
1430
  type: 'object',
@@ -1159,6 +1438,14 @@ Returns subtasks with aggregate completion stats.`,
1159
1438
  enum: ['backlog', 'pending', 'in_progress', 'completed', 'cancelled'],
1160
1439
  description: 'Filter by status (optional)',
1161
1440
  },
1441
+ limit: {
1442
+ type: 'number',
1443
+ description: 'Max subtasks to return (default: 20, max: 50)',
1444
+ },
1445
+ offset: {
1446
+ type: 'number',
1447
+ description: 'Number of subtasks to skip (default: 0)',
1448
+ },
1162
1449
  },
1163
1450
  required: ['parent_task_id'],
1164
1451
  },
@@ -1171,7 +1458,9 @@ Returns tasks with worktree_path set where:
1171
1458
  - Task is completed or cancelled (worktree should have been cleaned up)
1172
1459
  - Task has been abandoned (no activity for 24+ hours while in_progress)
1173
1460
 
1174
- IMPORTANT: Call this on session start to clean up orphaned worktrees from previous sessions.
1461
+ IMPORTANT: Pass hostname (os.hostname()) to only see worktrees created on THIS machine.
1462
+ Worktrees created on other machines cannot be removed locally.
1463
+
1175
1464
  For each stale worktree:
1176
1465
  1. Run: git worktree remove <worktree_path>
1177
1466
  2. Call: clear_worktree_path(task_id)`,
@@ -1182,6 +1471,18 @@ For each stale worktree:
1182
1471
  type: 'string',
1183
1472
  description: 'Project UUID',
1184
1473
  },
1474
+ hostname: {
1475
+ type: 'string',
1476
+ description: 'Machine hostname (os.hostname()). Only returns worktrees created on this machine, preventing attempts to clean up worktrees on other machines.',
1477
+ },
1478
+ limit: {
1479
+ type: 'number',
1480
+ description: 'Max worktrees to return (default: 50)',
1481
+ },
1482
+ offset: {
1483
+ type: 'number',
1484
+ description: 'Number of worktrees to skip for pagination (default: 0)',
1485
+ },
1185
1486
  },
1186
1487
  required: ['project_id'],
1187
1488
  },
@@ -1217,6 +1518,10 @@ This marks the task as cleaned up so it won't appear in get_stale_worktrees.`,
1217
1518
  type: ['string', 'null'],
1218
1519
  description: 'Report your current git worktree path (e.g., "../project-task-abc123"). Set to null to clear.',
1219
1520
  },
1521
+ hostname: {
1522
+ type: 'string',
1523
+ description: 'Machine hostname (os.hostname()). Updates session hostname for worktree tracking.',
1524
+ },
1220
1525
  },
1221
1526
  },
1222
1527
  },
@@ -1511,6 +1816,25 @@ This marks the task as cleaned up so it won't appear in get_stale_worktrees.`,
1511
1816
  description: 'Filter by stage (optional)',
1512
1817
  enum: ['preparation', 'deployment', 'verification', 'all'],
1513
1818
  },
1819
+ limit: {
1820
+ type: 'number',
1821
+ description: 'Max number of requirements to return (default 50, max 200)',
1822
+ },
1823
+ offset: {
1824
+ type: 'number',
1825
+ description: 'Number of requirements to skip for pagination (default 0)',
1826
+ },
1827
+ },
1828
+ required: ['project_id'],
1829
+ },
1830
+ },
1831
+ {
1832
+ name: 'get_deployment_requirements_stats',
1833
+ description: `Get aggregate statistics about deployment requirements for a project. Returns total count and breakdowns by status, stage, and type. More token-efficient than get_deployment_requirements when you just need to understand the overall state.`,
1834
+ inputSchema: {
1835
+ type: 'object',
1836
+ properties: {
1837
+ project_id: { type: 'string', description: 'Project UUID' },
1514
1838
  },
1515
1839
  required: ['project_id'],
1516
1840
  },
@@ -1580,6 +1904,14 @@ This marks the task as cleaned up so it won't appear in get_stale_worktrees.`,
1580
1904
  type: 'boolean',
1581
1905
  description: 'Include disabled schedules (default: false)',
1582
1906
  },
1907
+ limit: {
1908
+ type: 'number',
1909
+ description: 'Max schedules to return (default: 50)',
1910
+ },
1911
+ offset: {
1912
+ type: 'number',
1913
+ description: 'Number of schedules to skip for pagination (default: 0)',
1914
+ },
1583
1915
  },
1584
1916
  required: ['project_id'],
1585
1917
  },
@@ -1748,6 +2080,10 @@ This marks the task as cleaned up so it won't appear in get_stale_worktrees.`,
1748
2080
  type: 'number',
1749
2081
  description: 'Max number of history entries to return (default 50)',
1750
2082
  },
2083
+ offset: {
2084
+ type: 'number',
2085
+ description: 'Number of entries to skip for pagination (default 0)',
2086
+ },
1751
2087
  },
1752
2088
  required: ['project_id'],
1753
2089
  },
@@ -1762,6 +2098,14 @@ This marks the task as cleaned up so it won't appear in get_stale_worktrees.`,
1762
2098
  type: 'string',
1763
2099
  description: 'Project UUID',
1764
2100
  },
2101
+ limit: {
2102
+ type: 'number',
2103
+ description: 'Max schedules to return (default: 50)',
2104
+ },
2105
+ offset: {
2106
+ type: 'number',
2107
+ description: 'Number of schedules to skip for pagination (default: 0)',
2108
+ },
1765
2109
  },
1766
2110
  required: ['project_id'],
1767
2111
  },
@@ -1779,6 +2123,14 @@ This marks the task as cleaned up so it won't appear in get_stale_worktrees.`,
1779
2123
  type: 'string',
1780
2124
  description: 'Project UUID',
1781
2125
  },
2126
+ limit: {
2127
+ type: 'number',
2128
+ description: 'Max number of requests to return (default 50, max 200)',
2129
+ },
2130
+ offset: {
2131
+ type: 'number',
2132
+ description: 'Number of requests to skip for pagination (default 0)',
2133
+ },
1782
2134
  },
1783
2135
  required: ['project_id'],
1784
2136
  },
@@ -2189,14 +2541,7 @@ Only returns tasks where all dependencies are completed.`,
2189
2541
  // ============================================================================
2190
2542
  // Organization Tools
2191
2543
  // ============================================================================
2192
- {
2193
- name: 'list_organizations',
2194
- description: 'List organizations the current user belongs to.',
2195
- inputSchema: {
2196
- type: 'object',
2197
- properties: {},
2198
- },
2199
- },
2544
+ // REMOVED: list_organizations - unbounded collection, use dashboard to view organizations
2200
2545
  {
2201
2546
  name: 'create_organization',
2202
2547
  description: 'Create a new organization. You become the owner.',
@@ -2259,20 +2604,7 @@ Only returns tasks where all dependencies are completed.`,
2259
2604
  required: ['organization_id'],
2260
2605
  },
2261
2606
  },
2262
- {
2263
- name: 'list_org_members',
2264
- description: 'List members of an organization.',
2265
- inputSchema: {
2266
- type: 'object',
2267
- properties: {
2268
- organization_id: {
2269
- type: 'string',
2270
- description: 'Organization UUID',
2271
- },
2272
- },
2273
- required: ['organization_id'],
2274
- },
2275
- },
2607
+ // REMOVED: list_org_members - unbounded collection, use dashboard to view members
2276
2608
  {
2277
2609
  name: 'invite_member',
2278
2610
  description: 'Invite a user to an organization by email. Requires admin role.',
@@ -2415,20 +2747,7 @@ Only returns tasks where all dependencies are completed.`,
2415
2747
  required: ['project_id', 'organization_id'],
2416
2748
  },
2417
2749
  },
2418
- {
2419
- name: 'list_project_shares',
2420
- description: 'List all organizations a project is shared with.',
2421
- inputSchema: {
2422
- type: 'object',
2423
- properties: {
2424
- project_id: {
2425
- type: 'string',
2426
- description: 'Project UUID',
2427
- },
2428
- },
2429
- required: ['project_id'],
2430
- },
2431
- },
2750
+ // REMOVED: list_project_shares - unbounded collection, use dashboard to view shares
2432
2751
  // File checkout/checkin tools for multi-agent coordination
2433
2752
  {
2434
2753
  name: 'checkout_file',
@@ -2500,6 +2819,10 @@ Only returns tasks where all dependencies are completed.`,
2500
2819
  type: 'number',
2501
2820
  description: 'Max checkouts to return (default: 50)',
2502
2821
  },
2822
+ offset: {
2823
+ type: 'number',
2824
+ description: 'Number of checkouts to skip for pagination (default 0)',
2825
+ },
2503
2826
  },
2504
2827
  required: ['project_id'],
2505
2828
  },
@@ -2540,6 +2863,20 @@ Only returns tasks where all dependencies are completed.`,
2540
2863
  required: ['project_id', 'file_path'],
2541
2864
  },
2542
2865
  },
2866
+ {
2867
+ name: 'get_file_checkouts_stats',
2868
+ description: 'Get aggregate statistics about file checkouts for a project. Returns counts by status without the actual checkout data. This is much more token-efficient than get_file_checkouts for understanding the overall state.',
2869
+ inputSchema: {
2870
+ type: 'object',
2871
+ properties: {
2872
+ project_id: {
2873
+ type: 'string',
2874
+ description: 'Project UUID',
2875
+ },
2876
+ },
2877
+ required: ['project_id'],
2878
+ },
2879
+ },
2543
2880
  // Role management tools
2544
2881
  {
2545
2882
  name: 'get_role_settings',
@@ -2633,6 +2970,10 @@ Only returns tasks where all dependencies are completed.`,
2633
2970
  type: 'string',
2634
2971
  description: 'Project UUID',
2635
2972
  },
2973
+ counts_only: {
2974
+ type: 'boolean',
2975
+ description: 'When true (default), returns only counts per role to save tokens. Set to false for full agent details.',
2976
+ },
2636
2977
  },
2637
2978
  required: ['project_id'],
2638
2979
  },
@@ -2873,7 +3214,7 @@ Tasks can be added during 'planning' status. Story points contribute to committe
2873
3214
  },
2874
3215
  {
2875
3216
  name: 'get_sprint_backlog',
2876
- description: `Get tasks from backlog/pending that can be added to a sprint.
3217
+ description: `Get tasks from backlog/pending that can be added to a sprint with pagination.
2877
3218
  Returns tasks not already assigned to any body of work or sprint.`,
2878
3219
  inputSchema: {
2879
3220
  type: 'object',
@@ -2886,6 +3227,14 @@ Returns tasks not already assigned to any body of work or sprint.`,
2886
3227
  type: 'string',
2887
3228
  description: 'Sprint UUID to exclude already-added tasks (optional)',
2888
3229
  },
3230
+ limit: {
3231
+ type: 'number',
3232
+ description: 'Max tasks to return (default: 20, max: 50)',
3233
+ },
3234
+ offset: {
3235
+ type: 'number',
3236
+ description: 'Number of tasks to skip (default: 0)',
3237
+ },
2889
3238
  },
2890
3239
  required: ['project_id'],
2891
3240
  },
@@ -3006,6 +3355,10 @@ Returns committed vs completed points and average velocity.`,
3006
3355
  type: 'number',
3007
3356
  description: 'Max issues to return (default: 50)',
3008
3357
  },
3358
+ offset: {
3359
+ type: 'number',
3360
+ description: 'Number of issues to skip for pagination (default 0)',
3361
+ },
3009
3362
  },
3010
3363
  required: ['project_id'],
3011
3364
  },