wolfpack-mcp 1.0.63 → 1.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1229 -1173
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -655,10 +655,13 @@ function stripUuids(obj) {
|
|
|
655
655
|
}
|
|
656
656
|
return result;
|
|
657
657
|
}
|
|
658
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
658
659
|
class WolfpackMCPServer {
|
|
659
660
|
server;
|
|
660
661
|
client;
|
|
661
662
|
capabilities = [];
|
|
663
|
+
capabilitiesLoaded = false;
|
|
664
|
+
capabilitiesFetch = null;
|
|
662
665
|
constructor() {
|
|
663
666
|
this.client = new WolfpackClient();
|
|
664
667
|
this.server = new Server({
|
|
@@ -666,1325 +669,1338 @@ class WolfpackMCPServer {
|
|
|
666
669
|
version: CURRENT_VERSION,
|
|
667
670
|
}, {
|
|
668
671
|
capabilities: {
|
|
669
|
-
tools: {},
|
|
672
|
+
tools: { listChanged: true },
|
|
670
673
|
logging: {},
|
|
671
674
|
},
|
|
672
675
|
});
|
|
673
676
|
this.setupHandlers();
|
|
674
677
|
}
|
|
675
678
|
setupHandlers() {
|
|
676
|
-
this.server.setRequestHandler(ListToolsRequestSchema, async () =>
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
'
|
|
687
|
-
'
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
679
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
680
|
+
// Heal a startup capabilities failure (#1488) so a tool listing is
|
|
681
|
+
// never permanently reduced by a transient gateway outage.
|
|
682
|
+
if (!this.capabilitiesLoaded) {
|
|
683
|
+
await this.fetchCapabilities();
|
|
684
|
+
}
|
|
685
|
+
return {
|
|
686
|
+
tools: [
|
|
687
|
+
// Project tools
|
|
688
|
+
{
|
|
689
|
+
name: 'list_projects',
|
|
690
|
+
description: 'List all projects you have access to. Projects can be "personal" (single user) or "team" (multi-member). ' +
|
|
691
|
+
'IMPORTANT - PROJECT FOCUS RULES: ' +
|
|
692
|
+
'1) Call this FIRST to identify which project you are working in. ' +
|
|
693
|
+
'2) Once you identify a project, STAY WITHIN that project for all operations unless the user explicitly asks to switch. ' +
|
|
694
|
+
'3) NEVER perform bulk actions across multiple projects - always work in one project at a time. ' +
|
|
695
|
+
'4) If the user mentions a specific project, use that for all subsequent operations. ' +
|
|
696
|
+
'5) If unclear which project to use, ASK the user before proceeding. ' +
|
|
697
|
+
'Returns project slugs, names, and types. Single-project users have their project auto-selected; multi-project users must specify project_slug in other tool calls. ' +
|
|
698
|
+
'ID CONVENTION: A bare number like #1 or #42 ALWAYS refers to a WORK ITEM refId — use get_work_item. ' +
|
|
699
|
+
'Other document types REQUIRE a prefix and are never bare numbers: ' +
|
|
700
|
+
'#i1 or #issue-1 for issues, #r1 or #roadmap-1 for roadmap/radar, ' +
|
|
701
|
+
'#j1 or #journal-1 for journal, #c1 or #case-1 for cases, #p1 or #proc-1 for procedures. ' +
|
|
702
|
+
'Wiki pages are referenced by path (e.g. /docs/setup). There is no ambiguity: bare #N = work item.',
|
|
703
|
+
inputSchema: {
|
|
704
|
+
type: 'object',
|
|
705
|
+
properties: {},
|
|
706
|
+
},
|
|
697
707
|
},
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
708
|
+
// Search tool
|
|
709
|
+
{
|
|
710
|
+
name: 'search',
|
|
711
|
+
description: 'Ranked full-text search across project content: wiki pages, work items, cases, journal entries, issues and the Wolfpack user manual. ' +
|
|
712
|
+
'Title matches outrank body matches; results include a snippet, entity type, and refId/slug for follow-up calls ' +
|
|
713
|
+
'(get_work_item, get_issue, get_wiki_page, ...). Results with entityType "manual" are user manual sections — platform documentation on how Wolfpack features work. ' +
|
|
714
|
+
'Use this to find existing content before creating new items, or when the user asks to "find" or "look up" something without saying where it lives.',
|
|
715
|
+
inputSchema: {
|
|
716
|
+
type: 'object',
|
|
717
|
+
properties: {
|
|
718
|
+
query: {
|
|
719
|
+
type: 'string',
|
|
720
|
+
description: 'Search query (websearch syntax: quoted phrases, -exclusions)',
|
|
721
|
+
},
|
|
722
|
+
project_slug: {
|
|
723
|
+
type: 'string',
|
|
724
|
+
description: 'Project slug; omit to search all accessible projects',
|
|
725
|
+
},
|
|
726
|
+
include_inactive: {
|
|
727
|
+
type: 'boolean',
|
|
728
|
+
description: 'Include finished/archived items (default false)',
|
|
729
|
+
},
|
|
730
|
+
exact_only: {
|
|
731
|
+
type: 'boolean',
|
|
732
|
+
description: 'Only exact full-text matches, skipping semantic results (default false)',
|
|
733
|
+
},
|
|
724
734
|
},
|
|
735
|
+
required: ['query'],
|
|
725
736
|
},
|
|
726
|
-
required: ['query'],
|
|
727
737
|
},
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
738
|
+
// Work Item tools
|
|
739
|
+
{
|
|
740
|
+
name: 'list_work_items',
|
|
741
|
+
description: 'List work items (tasks/tickets) on the Kanban board or backlog. Work items are the PRIMARY entity — bare #N references (e.g. "work on #1") always mean work items. ' +
|
|
742
|
+
'By default lists ALL items in the team, sorted by most recently updated. ' +
|
|
743
|
+
'Use assigned_to_id="me" to filter to only your assigned items. ' +
|
|
744
|
+
'TERMINOLOGY: "board" and "kanban" are synonymous - both refer to the Kanban board of work items. ' +
|
|
745
|
+
'The board has columns: "new" (to do), "doing" (in progress), "review" (pending review), "ready" (code done, awaiting deployment), "blocked", "completed" (deployed). ' +
|
|
746
|
+
'The "backlog" or "pending" status represents items not yet on the board. ' +
|
|
747
|
+
'By default, completed/closed items are excluded - use status="all" to include them. ' +
|
|
748
|
+
'IMPORTANT: Work items are NOT the same as issues. Work items live on the Kanban board/backlog. ' +
|
|
749
|
+
'If a user mentions "bugs" in the context of the board/kanban/backlog, they mean work items categorised as bug fixes - use this tool, not list_issues. ' +
|
|
750
|
+
'Use when user asks about "the board", "kanban", "work items", "tasks", "my work" (with assigned_to_id="me"), or "backlog".',
|
|
751
|
+
inputSchema: {
|
|
752
|
+
type: 'object',
|
|
753
|
+
properties: {
|
|
754
|
+
project_slug: {
|
|
755
|
+
type: 'string',
|
|
756
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
757
|
+
},
|
|
758
|
+
status: {
|
|
759
|
+
type: 'string',
|
|
760
|
+
description: 'Filter by status. Board columns: "new", "doing", "review", "ready", "blocked", "completed". ' +
|
|
761
|
+
'Use "pending" or "backlog" for backlog items not on board. ' +
|
|
762
|
+
'Use "all" to include completed/closed items. Default excludes completed/closed.',
|
|
763
|
+
},
|
|
764
|
+
assigned_to_id: {
|
|
765
|
+
type: 'string',
|
|
766
|
+
description: 'Filter by assignee: "all" (default, shows all team items), "me" (your assigned items), "unassigned", or a specific user ID',
|
|
767
|
+
},
|
|
768
|
+
search: {
|
|
769
|
+
type: 'string',
|
|
770
|
+
description: 'Text search in title and description',
|
|
771
|
+
},
|
|
772
|
+
category_id: {
|
|
773
|
+
type: 'string',
|
|
774
|
+
description: 'Filter by category ID, or "none" for uncategorized items',
|
|
775
|
+
},
|
|
776
|
+
priority: {
|
|
777
|
+
type: 'string',
|
|
778
|
+
description: 'Filter by priority level (0-4, higher is more important)',
|
|
779
|
+
},
|
|
780
|
+
radar_item_id: {
|
|
781
|
+
type: 'string',
|
|
782
|
+
description: 'Filter by linked radar/initiative item. Accepts refId (e.g. "5" or "#r5"), UUID, ' +
|
|
783
|
+
'or one of "none" (no link), "any" (has any link), "all" (no filter).',
|
|
784
|
+
},
|
|
785
|
+
sort_by: {
|
|
786
|
+
type: 'string',
|
|
787
|
+
description: 'Sort field: "dateUpdated" (default, newest activity first), "dateCreated", "priority", "title"',
|
|
788
|
+
},
|
|
789
|
+
sort_order: {
|
|
790
|
+
type: 'string',
|
|
791
|
+
description: 'Sort direction: "desc" (default), "asc"',
|
|
792
|
+
},
|
|
793
|
+
date_from: {
|
|
794
|
+
type: 'string',
|
|
795
|
+
description: 'Filter items created on or after this date (ISO format, e.g. "2025-01-01")',
|
|
796
|
+
},
|
|
797
|
+
date_to: {
|
|
798
|
+
type: 'string',
|
|
799
|
+
description: 'Filter items created on or before this date (ISO format, e.g. "2025-12-31")',
|
|
800
|
+
},
|
|
801
|
+
limit: { type: 'number', description: 'Maximum number of items to return' },
|
|
802
|
+
offset: { type: 'number', description: 'Number of items to skip' },
|
|
791
803
|
},
|
|
792
|
-
limit: { type: 'number', description: 'Maximum number of items to return' },
|
|
793
|
-
offset: { type: 'number', description: 'Number of items to skip' },
|
|
794
804
|
},
|
|
795
805
|
},
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
806
|
+
{
|
|
807
|
+
name: 'get_work_item',
|
|
808
|
+
description: 'Get a specific work item/task by reference number. This is the DEFAULT lookup when a user says "#1" or "work on #42" — bare #N always means a work item. ' +
|
|
809
|
+
'Returns full details including description (markdown notes). ' +
|
|
810
|
+
'Call this before updating to see current content. ' +
|
|
811
|
+
'WORKFLOW: When asked to work on an item, check its status and follow the required state transitions ' +
|
|
812
|
+
'(pending→pull first, new→doing, blocked/ready/completed/closed→new→doing, then review when done). ' +
|
|
813
|
+
'PLANNING: Check if the description contains a plan (markdown checklist). If not, APPEND one using update_work_progress - preserve all original description text and add your plan below a "---" separator. ' +
|
|
814
|
+
'FORMS: Procedure-created work items may include formDefinition (field definitions with name, label, type, required, options) and formValues (current values). Use submit_work_item_form to fill in form values. ' +
|
|
815
|
+
'IMAGES: Image references in the description (e.g. ``) can be viewed using the download_image tool.',
|
|
816
|
+
inputSchema: {
|
|
817
|
+
type: 'object',
|
|
818
|
+
properties: {
|
|
819
|
+
work_item_id: {
|
|
820
|
+
type: 'string',
|
|
821
|
+
description: 'The refId (number) of the work item',
|
|
822
|
+
},
|
|
823
|
+
project_slug: {
|
|
824
|
+
type: 'string',
|
|
825
|
+
description: 'Project slug (required for refId lookup)',
|
|
826
|
+
},
|
|
817
827
|
},
|
|
828
|
+
required: ['work_item_id'],
|
|
818
829
|
},
|
|
819
|
-
required: ['work_item_id'],
|
|
820
830
|
},
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
831
|
+
{
|
|
832
|
+
name: 'update_work_progress',
|
|
833
|
+
description: 'Update work item description/notes with your progress. WORKFLOW: 1) get_work_item to read current notes 2) Modify the markdown description with new findings/progress 3) Call this with the complete updated description. The full description replaces the existing one. ' +
|
|
834
|
+
'STATUS: Items in "new" are auto-advanced to "doing" (updating progress means work has started). Completing the work is NOT auto-detected: when done, set status to "review" via update_work_item and add a completion comment. ' +
|
|
835
|
+
'CRITICAL: NEVER overwrite or remove the original description text. Preserve all existing content exactly as-is. Append your plan below a "---" separator. You may only modify content you previously added (your plan section). ' +
|
|
836
|
+
'BEST PRACTICE: Append a plan with markdown checkboxes (- [ ] task). Check off completed tasks (- [x] task) as you progress. Include sections for: Plan (checklist), Approach (strategy), and Notes (discoveries/decisions). ' +
|
|
837
|
+
CONTENT_LINKING_HELP,
|
|
838
|
+
inputSchema: {
|
|
839
|
+
type: 'object',
|
|
840
|
+
properties: {
|
|
841
|
+
work_item_id: { type: 'string', description: 'The ID of the work item' },
|
|
842
|
+
description: {
|
|
843
|
+
type: 'string',
|
|
844
|
+
description: 'Updated description/notes for the work item',
|
|
845
|
+
},
|
|
846
|
+
project_slug: {
|
|
847
|
+
type: 'string',
|
|
848
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
849
|
+
},
|
|
840
850
|
},
|
|
851
|
+
required: ['work_item_id', 'description'],
|
|
841
852
|
},
|
|
842
|
-
required: ['work_item_id', 'description'],
|
|
843
853
|
},
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
854
|
+
{
|
|
855
|
+
name: 'update_work_item',
|
|
856
|
+
description: 'Update one or more fields on a work item. Only provide the fields you want to change. ' +
|
|
857
|
+
'Supports: title, description, status, leading_user_id (assignee), assisting_user1/2/3_id, ' +
|
|
858
|
+
'radar_item_id (initiative), category_id, priority (0-4), size (S/M/L), tags, and closing_comment. ' +
|
|
859
|
+
'STATUS WORKFLOW: "pending" (backlog) → "new" (to do) → "doing" (in progress) → "review" (work done) → "ready" (awaiting deployment) → "completed" (deployed). ' +
|
|
860
|
+
'Use "blocked" when work cannot proceed. For "pending" items use pull_work_item first. ' +
|
|
861
|
+
'When moving to "review", add a completion comment. When moving to "blocked", add a comment explaining the blocker.',
|
|
862
|
+
inputSchema: {
|
|
863
|
+
type: 'object',
|
|
864
|
+
properties: {
|
|
865
|
+
work_item_id: {
|
|
866
|
+
type: 'string',
|
|
867
|
+
description: 'The ID of the work item',
|
|
868
|
+
},
|
|
869
|
+
title: {
|
|
870
|
+
type: 'string',
|
|
871
|
+
description: 'New title for the work item',
|
|
872
|
+
},
|
|
873
|
+
description: {
|
|
874
|
+
type: 'string',
|
|
875
|
+
description: 'Updated description (supports Markdown and @mentions)',
|
|
876
|
+
},
|
|
877
|
+
status: {
|
|
878
|
+
type: 'string',
|
|
879
|
+
enum: [
|
|
880
|
+
'pending',
|
|
881
|
+
'new',
|
|
882
|
+
'doing',
|
|
883
|
+
'blocked',
|
|
884
|
+
'review',
|
|
885
|
+
'ready',
|
|
886
|
+
'completed',
|
|
887
|
+
'closed',
|
|
888
|
+
'archived',
|
|
889
|
+
],
|
|
890
|
+
description: 'New status',
|
|
891
|
+
},
|
|
892
|
+
leading_user_id: {
|
|
893
|
+
type: ['string', 'null'],
|
|
894
|
+
description: 'User ID to assign as leading user, or null to unassign',
|
|
895
|
+
},
|
|
896
|
+
radar_item_id: {
|
|
897
|
+
type: ['string', 'null'],
|
|
898
|
+
description: 'Link to a radar/initiative item. Accepts refId (e.g. "5" or "#r5") or UUID. Use null to unlink.',
|
|
899
|
+
},
|
|
900
|
+
category_id: {
|
|
901
|
+
type: ['string', 'null'],
|
|
902
|
+
description: 'Category ID to set, or null to remove the category',
|
|
903
|
+
},
|
|
904
|
+
priority: {
|
|
905
|
+
type: 'number',
|
|
906
|
+
description: 'Priority level: 0 (None), 1 (Low), 2 (Medium), 3 (High), 4 (Urgent)',
|
|
907
|
+
},
|
|
908
|
+
size: {
|
|
909
|
+
type: ['string', 'null'],
|
|
910
|
+
enum: ['S', 'M', 'L', null],
|
|
911
|
+
description: 'Size estimate: "S" (small), "M" (medium), "L" (large), or null to remove',
|
|
912
|
+
},
|
|
913
|
+
assisting_user1_id: {
|
|
914
|
+
type: ['string', 'null'],
|
|
915
|
+
description: 'User ID for first assisting user, or null to remove',
|
|
916
|
+
},
|
|
917
|
+
assisting_user2_id: {
|
|
918
|
+
type: ['string', 'null'],
|
|
919
|
+
description: 'User ID for second assisting user, or null to remove',
|
|
920
|
+
},
|
|
921
|
+
assisting_user3_id: {
|
|
922
|
+
type: ['string', 'null'],
|
|
923
|
+
description: 'User ID for third assisting user, or null to remove',
|
|
924
|
+
},
|
|
925
|
+
tags: {
|
|
926
|
+
type: 'array',
|
|
927
|
+
items: { type: 'string' },
|
|
928
|
+
description: 'Tag names to apply (replaces existing tags). Use list_tags to see available tags.',
|
|
929
|
+
},
|
|
930
|
+
closing_comment: {
|
|
931
|
+
type: ['string', 'null'],
|
|
932
|
+
description: 'Comment explaining closure/completion',
|
|
933
|
+
},
|
|
934
|
+
project_slug: {
|
|
935
|
+
type: 'string',
|
|
936
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
937
|
+
},
|
|
928
938
|
},
|
|
939
|
+
required: ['work_item_id'],
|
|
929
940
|
},
|
|
930
|
-
required: ['work_item_id'],
|
|
931
941
|
},
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
942
|
+
{
|
|
943
|
+
name: 'pull_work_item',
|
|
944
|
+
description: 'Pull a specific work item from the backlog to the board. ' +
|
|
945
|
+
'REQUIRED: Use this when starting work on a "pending" (backlog) item. ' +
|
|
946
|
+
'This claims the item (assigns to you) and sets status to "new". ' +
|
|
947
|
+
'After pulling, move to "doing" to indicate active work, then "review" when done. ' +
|
|
948
|
+
'If no assignee is specified, assigns to the API key owner. ' +
|
|
949
|
+
'In personal projects, items are always assigned to the owner.',
|
|
950
|
+
inputSchema: {
|
|
951
|
+
type: 'object',
|
|
952
|
+
properties: {
|
|
953
|
+
work_item_id: {
|
|
954
|
+
type: 'string',
|
|
955
|
+
description: 'The ID of the work item to pull from backlog',
|
|
956
|
+
},
|
|
957
|
+
leading_user_id: {
|
|
958
|
+
type: 'string',
|
|
959
|
+
description: 'User ID to assign as leading user (optional, defaults to API key owner)',
|
|
960
|
+
},
|
|
961
|
+
project_slug: {
|
|
962
|
+
type: 'string',
|
|
963
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
964
|
+
},
|
|
955
965
|
},
|
|
966
|
+
required: ['work_item_id'],
|
|
956
967
|
},
|
|
957
|
-
required: ['work_item_id'],
|
|
958
968
|
},
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
969
|
+
{
|
|
970
|
+
name: 'submit_work_item_form',
|
|
971
|
+
description: 'Submit form values for a procedure-created work item. ' +
|
|
972
|
+
'Use get_work_item first to see formDefinition (field names, types, required) and current formValues. ' +
|
|
973
|
+
'Then call this with form_values mapping field names to values.',
|
|
974
|
+
inputSchema: {
|
|
975
|
+
type: 'object',
|
|
976
|
+
properties: {
|
|
977
|
+
work_item_id: {
|
|
978
|
+
type: 'string',
|
|
979
|
+
description: 'The ID of the work item',
|
|
980
|
+
},
|
|
981
|
+
form_values: {
|
|
982
|
+
type: 'object',
|
|
983
|
+
description: 'Key-value pairs matching formDefinition field names',
|
|
984
|
+
},
|
|
985
|
+
project_slug: {
|
|
986
|
+
type: 'string',
|
|
987
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
988
|
+
},
|
|
979
989
|
},
|
|
990
|
+
required: ['work_item_id', 'form_values'],
|
|
980
991
|
},
|
|
981
|
-
required: ['work_item_id', 'form_values'],
|
|
982
992
|
},
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
993
|
+
// Radar Item (Initiative/Roadmap) tools
|
|
994
|
+
{
|
|
995
|
+
name: 'list_radar_items',
|
|
996
|
+
description: 'List radar items - these are initiatives, epics, or roadmap items that group related work items. Use when user asks about "roadmap", "initiatives", "epics", "projects", "what\'s planned", or "upcoming work". Stage: "now" (current sprint), "next" (upcoming), "later" (future), "pending" (not started), "completed".',
|
|
997
|
+
inputSchema: {
|
|
998
|
+
type: 'object',
|
|
999
|
+
properties: {
|
|
1000
|
+
project_slug: {
|
|
1001
|
+
type: 'string',
|
|
1002
|
+
description: 'Project slug (use list_projects to get slugs)',
|
|
1003
|
+
},
|
|
1004
|
+
stage: {
|
|
1005
|
+
type: 'string',
|
|
1006
|
+
enum: ['pending', 'now', 'next', 'later', 'completed'],
|
|
1007
|
+
description: 'Filter: "now" (current), "next" (upcoming), "later" (future), "pending", "completed"',
|
|
1008
|
+
},
|
|
1009
|
+
search: {
|
|
1010
|
+
type: 'string',
|
|
1011
|
+
description: 'Text search in title and description',
|
|
1012
|
+
},
|
|
1013
|
+
limit: { type: 'number', description: 'Maximum number of items to return' },
|
|
1014
|
+
offset: { type: 'number', description: 'Number of items to skip' },
|
|
1003
1015
|
},
|
|
1004
|
-
limit: { type: 'number', description: 'Maximum number of items to return' },
|
|
1005
|
-
offset: { type: 'number', description: 'Number of items to skip' },
|
|
1006
1016
|
},
|
|
1007
1017
|
},
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1018
|
+
{
|
|
1019
|
+
name: 'get_radar_item',
|
|
1020
|
+
description: 'Get a specific radar item (initiative) by reference number, including its work items and participants. ' +
|
|
1021
|
+
'IMAGES: Image references in the description (e.g. ``) can be viewed using the download_image tool.',
|
|
1022
|
+
inputSchema: {
|
|
1023
|
+
type: 'object',
|
|
1024
|
+
properties: {
|
|
1025
|
+
item_id: {
|
|
1026
|
+
type: 'string',
|
|
1027
|
+
description: 'The refId (number) of the radar item',
|
|
1028
|
+
},
|
|
1029
|
+
project_slug: {
|
|
1030
|
+
type: 'string',
|
|
1031
|
+
description: 'Project slug (required for refId lookup)',
|
|
1032
|
+
},
|
|
1023
1033
|
},
|
|
1034
|
+
required: ['item_id'],
|
|
1024
1035
|
},
|
|
1025
|
-
required: ['item_id'],
|
|
1026
1036
|
},
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1037
|
+
{
|
|
1038
|
+
name: 'create_radar_item',
|
|
1039
|
+
description: 'Create a new radar/initiative item in your current project. Requires mcp:radar:create permission. ' +
|
|
1040
|
+
'Keep "description" to a short summary; put extended detail in "notes". ' +
|
|
1041
|
+
CONTENT_LINKING_HELP,
|
|
1042
|
+
inputSchema: {
|
|
1043
|
+
type: 'object',
|
|
1044
|
+
properties: {
|
|
1045
|
+
project_slug: {
|
|
1046
|
+
type: 'string',
|
|
1047
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1048
|
+
},
|
|
1049
|
+
title: { type: 'string', description: 'Title of the radar/initiative item' },
|
|
1050
|
+
description: {
|
|
1051
|
+
type: 'string',
|
|
1052
|
+
description: 'Short summary shown on the roadmap card (1-2 sentences). Put extended detail in notes, not here.',
|
|
1053
|
+
},
|
|
1054
|
+
notes: {
|
|
1055
|
+
type: 'string',
|
|
1056
|
+
description: "Extended details shown on the initiative's Notes page (markdown). Use this for long-form content.",
|
|
1057
|
+
},
|
|
1058
|
+
stage: {
|
|
1059
|
+
type: 'string',
|
|
1060
|
+
enum: ['pending', 'now', 'next', 'later', 'completed'],
|
|
1061
|
+
description: 'Stage: "pending" (not started), "now" (current sprint), "next" (upcoming), "later" (future), "completed"',
|
|
1062
|
+
},
|
|
1053
1063
|
},
|
|
1064
|
+
required: ['title', 'stage'],
|
|
1054
1065
|
},
|
|
1055
|
-
required: ['title', 'stage'],
|
|
1056
1066
|
},
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1067
|
+
{
|
|
1068
|
+
name: 'update_radar_item',
|
|
1069
|
+
description: 'Update an existing radar/initiative item. Requires mcp:radar:update permission. ' +
|
|
1070
|
+
CONTENT_LINKING_HELP,
|
|
1071
|
+
inputSchema: {
|
|
1072
|
+
type: 'object',
|
|
1073
|
+
properties: {
|
|
1074
|
+
item_id: {
|
|
1075
|
+
type: 'string',
|
|
1076
|
+
description: 'The refId (number) of the radar item to update',
|
|
1077
|
+
},
|
|
1078
|
+
title: { type: 'string', description: 'Updated title' },
|
|
1079
|
+
description: {
|
|
1080
|
+
type: 'string',
|
|
1081
|
+
description: 'Updated short summary (1-2 sentences; extended detail belongs in notes)',
|
|
1082
|
+
},
|
|
1083
|
+
notes: { type: 'string', description: 'Updated Notes page content (markdown)' },
|
|
1084
|
+
stage: {
|
|
1085
|
+
type: 'string',
|
|
1086
|
+
enum: ['pending', 'now', 'next', 'later', 'completed'],
|
|
1087
|
+
description: 'Updated stage',
|
|
1088
|
+
},
|
|
1089
|
+
project_slug: {
|
|
1090
|
+
type: 'string',
|
|
1091
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1092
|
+
},
|
|
1083
1093
|
},
|
|
1094
|
+
required: ['item_id'],
|
|
1084
1095
|
},
|
|
1085
|
-
required: ['item_id'],
|
|
1086
1096
|
},
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1097
|
+
// Issue tools
|
|
1098
|
+
{
|
|
1099
|
+
name: 'list_issues',
|
|
1100
|
+
description: 'List issues from the Issue Tracker. Issues are a SEPARATE system from work items on the Kanban board. ' +
|
|
1101
|
+
'Issues track bugs, feature requests, and other reports that may or may not have associated work items. ' +
|
|
1102
|
+
'Issues are referenced with the #i prefix (e.g. #i5). A bare #N (without prefix) is ALWAYS a work item, NOT an issue. ' +
|
|
1103
|
+
'IMPORTANT: If the user asks about "bugs" or "tasks" in the context of the "board", "kanban", or "backlog", use list_work_items instead - those are work items, not issues. ' +
|
|
1104
|
+
'Only use this tool when the user specifically asks about "issues", the "issue tracker", uses the #i prefix, or is clearly referring to the issue tracking system. ' +
|
|
1105
|
+
'Can filter by status, severity, and type.',
|
|
1106
|
+
inputSchema: {
|
|
1107
|
+
type: 'object',
|
|
1108
|
+
properties: {
|
|
1109
|
+
project_slug: {
|
|
1110
|
+
type: 'string',
|
|
1111
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1112
|
+
},
|
|
1113
|
+
status: {
|
|
1114
|
+
type: 'string',
|
|
1115
|
+
enum: ['open', 'in-progress', 'resolved', 'closed'],
|
|
1116
|
+
description: 'Filter: "open" (new/active), "in-progress", "resolved" (fixed), "closed"',
|
|
1117
|
+
},
|
|
1118
|
+
severity: {
|
|
1119
|
+
type: 'string',
|
|
1120
|
+
enum: ['low', 'medium', 'high', 'critical'],
|
|
1121
|
+
description: 'Filter by severity/priority: "critical", "high", "medium", "low"',
|
|
1122
|
+
},
|
|
1123
|
+
type: {
|
|
1124
|
+
type: 'string',
|
|
1125
|
+
enum: ['bug', 'feature-request', 'task', 'improvement', 'question'],
|
|
1126
|
+
description: 'Filter: "bug" (defect), "feature-request", "task", "improvement", "question"',
|
|
1127
|
+
},
|
|
1128
|
+
assigned_to_id: {
|
|
1129
|
+
type: 'string',
|
|
1130
|
+
description: 'Filter by assignee: "me" (default), "unassigned", "all", or a specific user ID',
|
|
1131
|
+
},
|
|
1132
|
+
search: {
|
|
1133
|
+
type: 'string',
|
|
1134
|
+
description: 'Text search in title and description',
|
|
1135
|
+
},
|
|
1136
|
+
date_from: {
|
|
1137
|
+
type: 'string',
|
|
1138
|
+
description: 'Filter issues created on or after this date (ISO format, e.g. "2025-01-01")',
|
|
1139
|
+
},
|
|
1140
|
+
date_to: {
|
|
1141
|
+
type: 'string',
|
|
1142
|
+
description: 'Filter issues created on or before this date (ISO format, e.g. "2025-12-31")',
|
|
1143
|
+
},
|
|
1144
|
+
sort_by: {
|
|
1145
|
+
type: 'string',
|
|
1146
|
+
description: 'Sort field: "dateCreated" (default), "dateUpdated", "severity", "title"',
|
|
1147
|
+
},
|
|
1148
|
+
sort_order: {
|
|
1149
|
+
type: 'string',
|
|
1150
|
+
description: 'Sort direction: "desc" (default), "asc"',
|
|
1151
|
+
},
|
|
1152
|
+
limit: { type: 'number', description: 'Maximum number of items to return' },
|
|
1153
|
+
offset: { type: 'number', description: 'Number of items to skip' },
|
|
1142
1154
|
},
|
|
1143
|
-
limit: { type: 'number', description: 'Maximum number of items to return' },
|
|
1144
|
-
offset: { type: 'number', description: 'Number of items to skip' },
|
|
1145
1155
|
},
|
|
1146
1156
|
},
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1157
|
+
{
|
|
1158
|
+
name: 'get_issue',
|
|
1159
|
+
description: 'Get a specific issue by its PREFIXED reference #iN (e.g. #i5). ' +
|
|
1160
|
+
'IMPORTANT: A bare #N (without prefix) is ALWAYS a work item, NOT an issue. Only use this tool when the user explicitly says "issue" or uses the #i prefix. ' +
|
|
1161
|
+
'Returns full details including comment and attachment counts. ' +
|
|
1162
|
+
'IMAGES: Image references in the description (e.g. ``) can be viewed using the download_image tool.',
|
|
1163
|
+
inputSchema: {
|
|
1164
|
+
type: 'object',
|
|
1165
|
+
properties: {
|
|
1166
|
+
issue_id: {
|
|
1167
|
+
type: 'string',
|
|
1168
|
+
description: 'The refId (number) of the issue',
|
|
1169
|
+
},
|
|
1170
|
+
project_slug: {
|
|
1171
|
+
type: 'string',
|
|
1172
|
+
description: 'Project slug (required for refId lookup)',
|
|
1173
|
+
},
|
|
1164
1174
|
},
|
|
1175
|
+
required: ['issue_id'],
|
|
1165
1176
|
},
|
|
1166
|
-
required: ['issue_id'],
|
|
1167
1177
|
},
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1178
|
+
// Create/Update tools
|
|
1179
|
+
{
|
|
1180
|
+
name: 'create_work_item',
|
|
1181
|
+
description: 'Create a new work item in your current project (auto-selected for single-project users, or use list_projects first for multi-project). Requires mcp:work_items:create permission. ' +
|
|
1182
|
+
CONTENT_LINKING_HELP,
|
|
1183
|
+
inputSchema: {
|
|
1184
|
+
type: 'object',
|
|
1185
|
+
properties: {
|
|
1186
|
+
project_slug: {
|
|
1187
|
+
type: 'string',
|
|
1188
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1189
|
+
},
|
|
1190
|
+
title: { type: 'string', description: 'Title of the work item' },
|
|
1191
|
+
description: {
|
|
1192
|
+
type: 'string',
|
|
1193
|
+
description: 'Description/notes for the work item (markdown)',
|
|
1194
|
+
},
|
|
1195
|
+
status: {
|
|
1196
|
+
type: 'string',
|
|
1197
|
+
enum: [
|
|
1198
|
+
'pending',
|
|
1199
|
+
'new',
|
|
1200
|
+
'doing',
|
|
1201
|
+
'blocked',
|
|
1202
|
+
'review',
|
|
1203
|
+
'ready',
|
|
1204
|
+
'completed',
|
|
1205
|
+
'closed',
|
|
1206
|
+
'archived',
|
|
1207
|
+
],
|
|
1208
|
+
description: 'Initial status: "pending" (backlog), "new" (to do), "doing", "review", "ready", "blocked", "completed", "closed", "archived". Defaults to "new".',
|
|
1209
|
+
},
|
|
1210
|
+
priority: {
|
|
1211
|
+
type: 'number',
|
|
1212
|
+
description: 'Priority level (0-4, higher is more important)',
|
|
1213
|
+
},
|
|
1214
|
+
size: {
|
|
1215
|
+
type: 'string',
|
|
1216
|
+
enum: ['S', 'M', 'L'],
|
|
1217
|
+
description: 'Size estimate: "S" (small), "M" (medium), "L" (large)',
|
|
1218
|
+
},
|
|
1219
|
+
leading_user_id: {
|
|
1220
|
+
type: 'string',
|
|
1221
|
+
description: 'User ID to assign as leading user',
|
|
1222
|
+
},
|
|
1223
|
+
category_id: {
|
|
1224
|
+
type: 'string',
|
|
1225
|
+
description: 'Category ID to organize the work item',
|
|
1226
|
+
},
|
|
1227
|
+
radar_item_id: {
|
|
1228
|
+
type: 'string',
|
|
1229
|
+
description: 'Link to a radar/initiative item. Accepts refId (e.g. "5" or "#r5") or UUID.',
|
|
1230
|
+
},
|
|
1221
1231
|
},
|
|
1232
|
+
required: ['title'],
|
|
1222
1233
|
},
|
|
1223
|
-
required: ['title'],
|
|
1224
1234
|
},
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1235
|
+
{
|
|
1236
|
+
name: 'create_issue',
|
|
1237
|
+
description: 'Create a new issue in your current project (auto-selected for single-project users, or use list_projects first for multi-project). Requires mcp:issues:create permission. ' +
|
|
1238
|
+
CONTENT_LINKING_HELP,
|
|
1239
|
+
inputSchema: {
|
|
1240
|
+
type: 'object',
|
|
1241
|
+
properties: {
|
|
1242
|
+
project_slug: {
|
|
1243
|
+
type: 'string',
|
|
1244
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1245
|
+
},
|
|
1246
|
+
title: { type: 'string', description: 'Title of the issue' },
|
|
1247
|
+
description: { type: 'string', description: 'Description of the issue' },
|
|
1248
|
+
severity: {
|
|
1249
|
+
type: 'string',
|
|
1250
|
+
enum: ['low', 'medium', 'high', 'critical'],
|
|
1251
|
+
description: 'Severity level',
|
|
1252
|
+
},
|
|
1253
|
+
type: {
|
|
1254
|
+
type: 'string',
|
|
1255
|
+
enum: ['bug', 'feature-request', 'task', 'improvement', 'question'],
|
|
1256
|
+
description: 'Issue type',
|
|
1257
|
+
},
|
|
1258
|
+
assigned_to_id: { type: 'string', description: 'User ID to assign the issue to' },
|
|
1259
|
+
environment: {
|
|
1260
|
+
type: 'string',
|
|
1261
|
+
description: 'Environment where the issue occurred',
|
|
1262
|
+
},
|
|
1263
|
+
affected_version: { type: 'string', description: 'Version affected by the issue' },
|
|
1264
|
+
reproducible: { type: 'boolean', description: 'Whether the issue is reproducible' },
|
|
1265
|
+
steps_to_reproduce: { type: 'string', description: 'Steps to reproduce the issue' },
|
|
1266
|
+
expected_behavior: { type: 'string', description: 'Expected behavior' },
|
|
1267
|
+
actual_behavior: { type: 'string', description: 'Actual behavior observed' },
|
|
1248
1268
|
},
|
|
1249
|
-
|
|
1250
|
-
environment: { type: 'string', description: 'Environment where the issue occurred' },
|
|
1251
|
-
affected_version: { type: 'string', description: 'Version affected by the issue' },
|
|
1252
|
-
reproducible: { type: 'boolean', description: 'Whether the issue is reproducible' },
|
|
1253
|
-
steps_to_reproduce: { type: 'string', description: 'Steps to reproduce the issue' },
|
|
1254
|
-
expected_behavior: { type: 'string', description: 'Expected behavior' },
|
|
1255
|
-
actual_behavior: { type: 'string', description: 'Actual behavior observed' },
|
|
1269
|
+
required: ['title'],
|
|
1256
1270
|
},
|
|
1257
|
-
required: ['title'],
|
|
1258
1271
|
},
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
type: 'string',
|
|
1301
|
-
|
|
1272
|
+
{
|
|
1273
|
+
name: 'update_issue',
|
|
1274
|
+
description: 'Update an existing issue. Requires mcp:issues:update permission. ' +
|
|
1275
|
+
CONTENT_LINKING_HELP,
|
|
1276
|
+
inputSchema: {
|
|
1277
|
+
type: 'object',
|
|
1278
|
+
properties: {
|
|
1279
|
+
issue_id: {
|
|
1280
|
+
type: 'string',
|
|
1281
|
+
description: 'The refId (number) of the issue to update',
|
|
1282
|
+
},
|
|
1283
|
+
title: { type: 'string', description: 'Updated title' },
|
|
1284
|
+
description: { type: 'string', description: 'Updated description' },
|
|
1285
|
+
status: {
|
|
1286
|
+
type: 'string',
|
|
1287
|
+
enum: ['open', 'in-progress', 'resolved', 'closed'],
|
|
1288
|
+
description: 'Updated status',
|
|
1289
|
+
},
|
|
1290
|
+
severity: {
|
|
1291
|
+
type: 'string',
|
|
1292
|
+
enum: ['low', 'medium', 'high', 'critical'],
|
|
1293
|
+
description: 'Updated severity',
|
|
1294
|
+
},
|
|
1295
|
+
type: {
|
|
1296
|
+
type: 'string',
|
|
1297
|
+
enum: ['bug', 'feature-request', 'task', 'improvement', 'question'],
|
|
1298
|
+
description: 'Updated type',
|
|
1299
|
+
},
|
|
1300
|
+
assigned_to_id: { type: 'string', description: 'Updated assignee' },
|
|
1301
|
+
closing_note: {
|
|
1302
|
+
type: 'string',
|
|
1303
|
+
description: 'Closing note (when closing the issue)',
|
|
1304
|
+
},
|
|
1305
|
+
environment: {
|
|
1306
|
+
type: 'string',
|
|
1307
|
+
description: 'Environment where the issue occurred',
|
|
1308
|
+
},
|
|
1309
|
+
affected_version: { type: 'string', description: 'Affected version' },
|
|
1310
|
+
reproducible: { type: 'boolean', description: 'Whether reproducible' },
|
|
1311
|
+
steps_to_reproduce: { type: 'string', description: 'Steps to reproduce' },
|
|
1312
|
+
expected_behavior: { type: 'string', description: 'Expected behavior' },
|
|
1313
|
+
actual_behavior: { type: 'string', description: 'Actual behavior' },
|
|
1314
|
+
project_slug: {
|
|
1315
|
+
type: 'string',
|
|
1316
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1317
|
+
},
|
|
1302
1318
|
},
|
|
1319
|
+
required: ['issue_id'],
|
|
1303
1320
|
},
|
|
1304
|
-
required: ['issue_id'],
|
|
1305
1321
|
},
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1322
|
+
// Wiki Page tools
|
|
1323
|
+
{
|
|
1324
|
+
name: 'list_wiki_pages',
|
|
1325
|
+
description: 'List wiki pages (documentation, docs, knowledge base). Use when user asks about "docs", "documentation", "wiki", "knowledge base", or "how-to guides".',
|
|
1326
|
+
inputSchema: {
|
|
1327
|
+
type: 'object',
|
|
1328
|
+
properties: {
|
|
1329
|
+
project_slug: {
|
|
1330
|
+
type: 'string',
|
|
1331
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1332
|
+
},
|
|
1333
|
+
search: {
|
|
1334
|
+
type: 'string',
|
|
1335
|
+
description: 'Text search in title and content',
|
|
1336
|
+
},
|
|
1337
|
+
date_from: {
|
|
1338
|
+
type: 'string',
|
|
1339
|
+
description: 'Filter pages updated on or after this date (ISO format, e.g. "2025-01-01")',
|
|
1340
|
+
},
|
|
1341
|
+
date_to: {
|
|
1342
|
+
type: 'string',
|
|
1343
|
+
description: 'Filter pages updated on or before this date (ISO format, e.g. "2025-12-31")',
|
|
1344
|
+
},
|
|
1345
|
+
limit: { type: 'number', description: 'Maximum number of pages to return' },
|
|
1346
|
+
offset: { type: 'number', description: 'Number of pages to skip' },
|
|
1329
1347
|
},
|
|
1330
|
-
limit: { type: 'number', description: 'Maximum number of pages to return' },
|
|
1331
|
-
offset: { type: 'number', description: 'Number of pages to skip' },
|
|
1332
1348
|
},
|
|
1333
1349
|
},
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1350
|
+
{
|
|
1351
|
+
name: 'get_wiki_page',
|
|
1352
|
+
description: 'Get a specific wiki/documentation page by slug (URL path). Returns full content in markdown. ' +
|
|
1353
|
+
'IMAGES: Image references in the content (e.g. ``) can be viewed using the download_image tool.',
|
|
1354
|
+
inputSchema: {
|
|
1355
|
+
type: 'object',
|
|
1356
|
+
properties: {
|
|
1357
|
+
page_id: {
|
|
1358
|
+
type: 'string',
|
|
1359
|
+
description: 'The page slug (URL path like "getting-started")',
|
|
1360
|
+
},
|
|
1345
1361
|
},
|
|
1362
|
+
required: ['page_id'],
|
|
1346
1363
|
},
|
|
1347
|
-
required: ['page_id'],
|
|
1348
1364
|
},
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1365
|
+
{
|
|
1366
|
+
name: 'create_wiki_page',
|
|
1367
|
+
description: 'Create a new wiki/documentation page. Use when user wants to "add docs", "create documentation", or "write a guide". ' +
|
|
1368
|
+
CONTENT_LINKING_HELP,
|
|
1369
|
+
inputSchema: {
|
|
1370
|
+
type: 'object',
|
|
1371
|
+
properties: {
|
|
1372
|
+
project_slug: {
|
|
1373
|
+
type: 'string',
|
|
1374
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1375
|
+
},
|
|
1376
|
+
slug: {
|
|
1377
|
+
type: 'string',
|
|
1378
|
+
description: 'URL slug for the page (without team prefix). The system automatically prepends the team and wiki path. For example, to create a page at "myteam/wiki/guides/onboarding", pass just "guides/onboarding". Do NOT include the team slug or "wiki/" prefix.',
|
|
1379
|
+
},
|
|
1380
|
+
title: { type: 'string', description: 'Page title' },
|
|
1381
|
+
content: {
|
|
1382
|
+
type: 'string',
|
|
1383
|
+
description: 'Page content (markdown)',
|
|
1384
|
+
},
|
|
1369
1385
|
},
|
|
1386
|
+
required: ['slug', 'title', 'content'],
|
|
1370
1387
|
},
|
|
1371
|
-
required: ['slug', 'title', 'content'],
|
|
1372
1388
|
},
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1389
|
+
{
|
|
1390
|
+
name: 'update_wiki_page',
|
|
1391
|
+
description: 'Update an existing wiki page. Requires mcp:wiki:update permission. ' +
|
|
1392
|
+
CONTENT_LINKING_HELP,
|
|
1393
|
+
inputSchema: {
|
|
1394
|
+
type: 'object',
|
|
1395
|
+
properties: {
|
|
1396
|
+
page_id: { type: 'string', description: 'The page slug' },
|
|
1397
|
+
title: { type: 'string', description: 'Updated title' },
|
|
1398
|
+
content: {
|
|
1399
|
+
type: 'string',
|
|
1400
|
+
description: 'Updated content (markdown)',
|
|
1401
|
+
},
|
|
1402
|
+
tag_ids: {
|
|
1403
|
+
type: 'array',
|
|
1404
|
+
items: { type: 'string' },
|
|
1405
|
+
description: 'Tag IDs to apply to the page (replaces existing tags)',
|
|
1406
|
+
},
|
|
1407
|
+
project_slug: {
|
|
1408
|
+
type: 'string',
|
|
1409
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1410
|
+
},
|
|
1395
1411
|
},
|
|
1412
|
+
required: ['page_id'],
|
|
1396
1413
|
},
|
|
1397
|
-
required: ['page_id'],
|
|
1398
1414
|
},
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1415
|
+
// Journal Entry tools
|
|
1416
|
+
{
|
|
1417
|
+
name: 'list_journal_entries',
|
|
1418
|
+
description: 'List journal entries (daily logs, standup notes, progress updates). Use when user asks about "journal", "daily log", "standup notes", "progress updates", or "what did I work on".',
|
|
1419
|
+
inputSchema: {
|
|
1420
|
+
type: 'object',
|
|
1421
|
+
properties: {
|
|
1422
|
+
project_slug: {
|
|
1423
|
+
type: 'string',
|
|
1424
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1425
|
+
},
|
|
1426
|
+
search: {
|
|
1427
|
+
type: 'string',
|
|
1428
|
+
description: 'Text search in title and content',
|
|
1429
|
+
},
|
|
1430
|
+
date_from: {
|
|
1431
|
+
type: 'string',
|
|
1432
|
+
description: 'Filter entries dated on or after this date (ISO format, e.g. "2025-01-01")',
|
|
1433
|
+
},
|
|
1434
|
+
date_to: {
|
|
1435
|
+
type: 'string',
|
|
1436
|
+
description: 'Filter entries dated on or before this date (ISO format, e.g. "2025-12-31")',
|
|
1437
|
+
},
|
|
1438
|
+
limit: { type: 'number', description: 'Maximum number of entries to return' },
|
|
1439
|
+
offset: { type: 'number', description: 'Number of entries to skip' },
|
|
1422
1440
|
},
|
|
1423
|
-
limit: { type: 'number', description: 'Maximum number of entries to return' },
|
|
1424
|
-
offset: { type: 'number', description: 'Number of entries to skip' },
|
|
1425
1441
|
},
|
|
1426
1442
|
},
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1443
|
+
{
|
|
1444
|
+
name: 'get_journal_entry',
|
|
1445
|
+
description: 'Get a specific journal/log entry by reference number. Returns full content. ' +
|
|
1446
|
+
'IMAGES: Image references in the content (e.g. ``) can be viewed using the download_image tool.',
|
|
1447
|
+
inputSchema: {
|
|
1448
|
+
type: 'object',
|
|
1449
|
+
properties: {
|
|
1450
|
+
entry_id: { type: 'string', description: 'The entry refId (number)' },
|
|
1451
|
+
project_slug: {
|
|
1452
|
+
type: 'string',
|
|
1453
|
+
description: 'Project slug (required for refId lookup)',
|
|
1454
|
+
},
|
|
1439
1455
|
},
|
|
1456
|
+
required: ['entry_id'],
|
|
1440
1457
|
},
|
|
1441
|
-
required: ['entry_id'],
|
|
1442
1458
|
},
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
+
{
|
|
1460
|
+
name: 'create_journal_entry',
|
|
1461
|
+
description: 'Create a new journal entry (daily log, standup note, progress update). Use when user wants to "log progress", "write a standup", "add a journal entry", or "record what I did". ' +
|
|
1462
|
+
CONTENT_LINKING_HELP,
|
|
1463
|
+
inputSchema: {
|
|
1464
|
+
type: 'object',
|
|
1465
|
+
properties: {
|
|
1466
|
+
project_slug: {
|
|
1467
|
+
type: 'string',
|
|
1468
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1469
|
+
},
|
|
1470
|
+
title: { type: 'string', description: 'Entry title' },
|
|
1471
|
+
content: {
|
|
1472
|
+
type: 'string',
|
|
1473
|
+
description: 'Entry content (markdown)',
|
|
1474
|
+
},
|
|
1459
1475
|
},
|
|
1476
|
+
required: ['title', 'content'],
|
|
1460
1477
|
},
|
|
1461
|
-
required: ['title', 'content'],
|
|
1462
1478
|
},
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1479
|
+
{
|
|
1480
|
+
name: 'update_journal_entry',
|
|
1481
|
+
description: 'Update an existing journal entry. Requires mcp:journal:update permission. ' +
|
|
1482
|
+
CONTENT_LINKING_HELP,
|
|
1483
|
+
inputSchema: {
|
|
1484
|
+
type: 'object',
|
|
1485
|
+
properties: {
|
|
1486
|
+
entry_id: { type: 'string', description: 'The entry refId (number)' },
|
|
1487
|
+
title: { type: 'string', description: 'Updated title' },
|
|
1488
|
+
content: {
|
|
1489
|
+
type: 'string',
|
|
1490
|
+
description: 'Updated content (markdown)',
|
|
1491
|
+
},
|
|
1492
|
+
tag_ids: {
|
|
1493
|
+
type: 'array',
|
|
1494
|
+
items: { type: 'string' },
|
|
1495
|
+
description: 'Tag IDs to apply (replaces existing tags)',
|
|
1496
|
+
},
|
|
1497
|
+
project_slug: {
|
|
1498
|
+
type: 'string',
|
|
1499
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1500
|
+
},
|
|
1485
1501
|
},
|
|
1502
|
+
required: ['entry_id'],
|
|
1486
1503
|
},
|
|
1487
|
-
required: ['entry_id'],
|
|
1488
1504
|
},
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1505
|
+
// Comment tools
|
|
1506
|
+
{
|
|
1507
|
+
name: 'list_work_item_comments',
|
|
1508
|
+
description: 'List all comments on a work item. Returns comments in chronological order. Requires mcp:comments:read permission. ' +
|
|
1509
|
+
'IMAGES: Image references in comments (e.g. ``) can be viewed using the download_image tool.',
|
|
1510
|
+
inputSchema: {
|
|
1511
|
+
type: 'object',
|
|
1512
|
+
properties: {
|
|
1513
|
+
work_item_id: { type: 'string', description: 'The work item refId (number)' },
|
|
1514
|
+
project_slug: {
|
|
1515
|
+
type: 'string',
|
|
1516
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1517
|
+
},
|
|
1502
1518
|
},
|
|
1519
|
+
required: ['work_item_id'],
|
|
1503
1520
|
},
|
|
1504
|
-
required: ['work_item_id'],
|
|
1505
1521
|
},
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1522
|
+
{
|
|
1523
|
+
name: 'list_issue_comments',
|
|
1524
|
+
description: 'List all comments on an issue. Returns comments in chronological order. Requires mcp:comments:read permission. ' +
|
|
1525
|
+
'IMAGES: Image references in comments (e.g. ``) can be viewed using the download_image tool.',
|
|
1526
|
+
inputSchema: {
|
|
1527
|
+
type: 'object',
|
|
1528
|
+
properties: {
|
|
1529
|
+
issue_id: { type: 'string', description: 'The issue refId (number)' },
|
|
1530
|
+
project_slug: {
|
|
1531
|
+
type: 'string',
|
|
1532
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1533
|
+
},
|
|
1518
1534
|
},
|
|
1535
|
+
required: ['issue_id'],
|
|
1519
1536
|
},
|
|
1520
|
-
required: ['issue_id'],
|
|
1521
1537
|
},
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1538
|
+
{
|
|
1539
|
+
name: 'create_work_item_comment',
|
|
1540
|
+
description: 'Add a comment to a work item. Requires mcp:comments:create permission. ' +
|
|
1541
|
+
'USE COMMENTS FOR: 1) Blocking reasons when moving to "blocked" (what failed, what was tried, what is needed). ' +
|
|
1542
|
+
'2) Completion summaries when moving to "review" (what was done, files changed, testing notes). ' +
|
|
1543
|
+
'3) Important observations or decisions that should be visible in the activity history. ' +
|
|
1544
|
+
'USE DESCRIPTION (update_work_progress) FOR: Plans, checklists, and progress tracking that need to be updated over time. ' +
|
|
1545
|
+
'Comments are typically not used in personal projects. ' +
|
|
1546
|
+
CONTENT_LINKING_HELP,
|
|
1547
|
+
inputSchema: {
|
|
1548
|
+
type: 'object',
|
|
1549
|
+
properties: {
|
|
1550
|
+
work_item_id: { type: 'string', description: 'The work item refId (number)' },
|
|
1551
|
+
content: {
|
|
1552
|
+
type: 'string',
|
|
1553
|
+
description: 'Comment content (markdown)',
|
|
1554
|
+
},
|
|
1555
|
+
project_slug: {
|
|
1556
|
+
type: 'string',
|
|
1557
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1558
|
+
},
|
|
1543
1559
|
},
|
|
1560
|
+
required: ['work_item_id', 'content'],
|
|
1544
1561
|
},
|
|
1545
|
-
required: ['work_item_id', 'content'],
|
|
1546
1562
|
},
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
+
{
|
|
1564
|
+
name: 'create_issue_comment',
|
|
1565
|
+
description: 'Add a comment to an issue. Requires mcp:comments:create permission. ' +
|
|
1566
|
+
CONTENT_LINKING_HELP,
|
|
1567
|
+
inputSchema: {
|
|
1568
|
+
type: 'object',
|
|
1569
|
+
properties: {
|
|
1570
|
+
issue_id: { type: 'string', description: 'The issue refId (number)' },
|
|
1571
|
+
content: {
|
|
1572
|
+
type: 'string',
|
|
1573
|
+
description: 'Comment content (markdown)',
|
|
1574
|
+
},
|
|
1575
|
+
project_slug: {
|
|
1576
|
+
type: 'string',
|
|
1577
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1578
|
+
},
|
|
1563
1579
|
},
|
|
1580
|
+
required: ['issue_id', 'content'],
|
|
1564
1581
|
},
|
|
1565
|
-
required: ['issue_id', 'content'],
|
|
1566
1582
|
},
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1583
|
+
{
|
|
1584
|
+
name: 'delete_work_item_comment',
|
|
1585
|
+
description: 'Delete a comment from a work item. Only the comment author can delete their own comments. ' +
|
|
1586
|
+
'Requires mcp:comments:delete permission. Use list_work_item_comments to get comment IDs.',
|
|
1587
|
+
inputSchema: {
|
|
1588
|
+
type: 'object',
|
|
1589
|
+
properties: {
|
|
1590
|
+
work_item_id: { type: 'string', description: 'The work item refId (number)' },
|
|
1591
|
+
comment_id: { type: 'string', description: 'The comment ID to delete' },
|
|
1592
|
+
project_slug: {
|
|
1593
|
+
type: 'string',
|
|
1594
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1595
|
+
},
|
|
1580
1596
|
},
|
|
1597
|
+
required: ['work_item_id', 'comment_id'],
|
|
1581
1598
|
},
|
|
1582
|
-
required: ['work_item_id', 'comment_id'],
|
|
1583
1599
|
},
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1600
|
+
{
|
|
1601
|
+
name: 'delete_issue_comment',
|
|
1602
|
+
description: 'Delete a comment from an issue. Only the comment author can delete their own comments. ' +
|
|
1603
|
+
'Requires mcp:comments:delete permission. Use list_issue_comments to get comment IDs.',
|
|
1604
|
+
inputSchema: {
|
|
1605
|
+
type: 'object',
|
|
1606
|
+
properties: {
|
|
1607
|
+
issue_id: { type: 'string', description: 'The issue refId (number)' },
|
|
1608
|
+
comment_id: { type: 'string', description: 'The comment ID to delete' },
|
|
1609
|
+
project_slug: {
|
|
1610
|
+
type: 'string',
|
|
1611
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1612
|
+
},
|
|
1597
1613
|
},
|
|
1614
|
+
required: ['issue_id', 'comment_id'],
|
|
1598
1615
|
},
|
|
1599
|
-
required: ['issue_id', 'comment_id'],
|
|
1600
1616
|
},
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1617
|
+
// Image tools
|
|
1618
|
+
{
|
|
1619
|
+
name: 'upload_image',
|
|
1620
|
+
description: 'Upload an image file from disk and get back a permanent URL. ' +
|
|
1621
|
+
'Reads the file directly from disk. ' +
|
|
1622
|
+
'Returns a markdown image URL you can include in any content field. ' +
|
|
1623
|
+
'IMPORTANT: This tool requires direct filesystem access and may not work in sandboxed environments (e.g. Claude.ai, Claude Desktop). ' +
|
|
1624
|
+
'If the MCP server cannot access the file path, inform the user that image uploads are not supported in their environment. ' +
|
|
1625
|
+
'Requires mcp:images:upload permission.',
|
|
1626
|
+
inputSchema: {
|
|
1627
|
+
type: 'object',
|
|
1628
|
+
properties: {
|
|
1629
|
+
file_path: {
|
|
1630
|
+
type: 'string',
|
|
1631
|
+
description: 'Absolute path to an image file on disk (e.g., "/tmp/screenshot.png"). ' +
|
|
1632
|
+
'Supported formats: JPEG, PNG, GIF, WebP. Max 5MB.',
|
|
1633
|
+
},
|
|
1634
|
+
project_slug: {
|
|
1635
|
+
type: 'string',
|
|
1636
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1637
|
+
},
|
|
1622
1638
|
},
|
|
1639
|
+
required: ['file_path'],
|
|
1623
1640
|
},
|
|
1624
|
-
required: ['file_path'],
|
|
1625
1641
|
},
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1642
|
+
{
|
|
1643
|
+
name: 'download_image',
|
|
1644
|
+
description: 'Download and view an image referenced in content fields. ' +
|
|
1645
|
+
'Content from work items, issues, wiki pages, journal entries, and comments may contain image references like `` or the legacy ``. ' +
|
|
1646
|
+
'Issues may also have attachment images with URLs like `/api/teams/{team}/issues/{refId}/attachments/{id}`. ' +
|
|
1647
|
+
'Use this tool with that URL path to download and view the image. ' +
|
|
1648
|
+
'Requires mcp:images:read permission.',
|
|
1649
|
+
inputSchema: {
|
|
1650
|
+
type: 'object',
|
|
1651
|
+
properties: {
|
|
1652
|
+
image_url: {
|
|
1653
|
+
type: 'string',
|
|
1654
|
+
description: 'The image URL path found in content fields (e.g. "/api/files/{fileId}/{filename}", legacy "/api/files/images/{team}/{filename}", or "/api/teams/{team}/issues/{refId}/attachments/{id}").',
|
|
1655
|
+
},
|
|
1640
1656
|
},
|
|
1657
|
+
required: ['image_url'],
|
|
1641
1658
|
},
|
|
1642
|
-
required: ['image_url'],
|
|
1643
1659
|
},
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1660
|
+
// Category tools
|
|
1661
|
+
{
|
|
1662
|
+
name: 'list_categories',
|
|
1663
|
+
description: 'List all categories available in a project. Returns category IDs, names, and descriptions. ' +
|
|
1664
|
+
'Use this to look up category IDs by name when creating or updating work items.',
|
|
1665
|
+
inputSchema: {
|
|
1666
|
+
type: 'object',
|
|
1667
|
+
properties: {
|
|
1668
|
+
project_slug: {
|
|
1669
|
+
type: 'string',
|
|
1670
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1671
|
+
},
|
|
1656
1672
|
},
|
|
1657
1673
|
},
|
|
1658
1674
|
},
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1675
|
+
// Tag tools
|
|
1676
|
+
{
|
|
1677
|
+
name: 'list_tags',
|
|
1678
|
+
description: 'List all tags available in a project. Returns tag names and colours. ' +
|
|
1679
|
+
'Work items are tagged by name via update_work_item.',
|
|
1680
|
+
inputSchema: {
|
|
1681
|
+
type: 'object',
|
|
1682
|
+
properties: {
|
|
1683
|
+
project_slug: {
|
|
1684
|
+
type: 'string',
|
|
1685
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1686
|
+
},
|
|
1671
1687
|
},
|
|
1672
1688
|
},
|
|
1673
1689
|
},
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1690
|
+
// Team member tools
|
|
1691
|
+
{
|
|
1692
|
+
name: 'list_team_members',
|
|
1693
|
+
description: 'List all members in a project/team. Returns user IDs, names, usernames, roles, and whether the member is an agent. ' +
|
|
1694
|
+
'Use this to look up user IDs when assigning work items or issues.',
|
|
1695
|
+
inputSchema: {
|
|
1696
|
+
type: 'object',
|
|
1697
|
+
properties: {
|
|
1698
|
+
project_slug: {
|
|
1699
|
+
type: 'string',
|
|
1700
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1701
|
+
},
|
|
1686
1702
|
},
|
|
1687
1703
|
},
|
|
1688
1704
|
},
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1705
|
+
// Skill tools (progressive disclosure)
|
|
1706
|
+
{
|
|
1707
|
+
name: 'list_skills',
|
|
1708
|
+
description: 'List all skills available to the current agent. Returns lean metadata (name + description) for each skill. ' +
|
|
1709
|
+
'Use get_skill to load the full instructions for a specific skill when needed.',
|
|
1710
|
+
inputSchema: {
|
|
1711
|
+
type: 'object',
|
|
1712
|
+
properties: {},
|
|
1713
|
+
},
|
|
1698
1714
|
},
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1715
|
+
{
|
|
1716
|
+
name: 'get_skill',
|
|
1717
|
+
description: 'Load the full instruction content for a specific skill by name. ' +
|
|
1718
|
+
"Call this when a task matches a skill's description to get detailed instructions before proceeding. " +
|
|
1719
|
+
'Also returns a list of available resources (scripts, references, assets).',
|
|
1720
|
+
inputSchema: {
|
|
1721
|
+
type: 'object',
|
|
1722
|
+
properties: {
|
|
1723
|
+
skill_name: {
|
|
1724
|
+
type: 'string',
|
|
1725
|
+
description: 'The name of the skill to load (e.g. "deploy-app")',
|
|
1726
|
+
},
|
|
1711
1727
|
},
|
|
1728
|
+
required: ['skill_name'],
|
|
1712
1729
|
},
|
|
1713
|
-
required: ['skill_name'],
|
|
1714
1730
|
},
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1731
|
+
{
|
|
1732
|
+
name: 'get_skill_resource',
|
|
1733
|
+
description: 'Get a specific resource file attached to a skill. ' +
|
|
1734
|
+
'Resources can be scripts, reference documents, or assets that supplement the skill instructions.',
|
|
1735
|
+
inputSchema: {
|
|
1736
|
+
type: 'object',
|
|
1737
|
+
properties: {
|
|
1738
|
+
skill_name: {
|
|
1739
|
+
type: 'string',
|
|
1740
|
+
description: 'The name of the skill',
|
|
1741
|
+
},
|
|
1742
|
+
resource_name: {
|
|
1743
|
+
type: 'string',
|
|
1744
|
+
description: 'The name of the resource file',
|
|
1745
|
+
},
|
|
1730
1746
|
},
|
|
1747
|
+
required: ['skill_name', 'resource_name'],
|
|
1731
1748
|
},
|
|
1732
|
-
required: ['skill_name', 'resource_name'],
|
|
1733
1749
|
},
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1750
|
+
// Notification tools
|
|
1751
|
+
{
|
|
1752
|
+
name: 'list_notifications',
|
|
1753
|
+
description: 'List your notifications. Returns notifications with type, title, message, read status, and linked items (work items, issues). ' +
|
|
1754
|
+
'Notification types include: mention, assignment, comment, status_change, team_invite, page_update, nomination, reaction. ' +
|
|
1755
|
+
'Use unread_only=true to see only unread notifications. Supports pagination with limit/offset.',
|
|
1756
|
+
inputSchema: {
|
|
1757
|
+
type: 'object',
|
|
1758
|
+
properties: {
|
|
1759
|
+
unread_only: {
|
|
1760
|
+
type: 'boolean',
|
|
1761
|
+
description: 'If true, only return unread notifications',
|
|
1762
|
+
},
|
|
1763
|
+
limit: {
|
|
1764
|
+
type: 'number',
|
|
1765
|
+
description: 'Maximum number of notifications to return (default 20)',
|
|
1766
|
+
},
|
|
1767
|
+
offset: {
|
|
1768
|
+
type: 'number',
|
|
1769
|
+
description: 'Number of notifications to skip for pagination',
|
|
1770
|
+
},
|
|
1755
1771
|
},
|
|
1756
1772
|
},
|
|
1757
1773
|
},
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1774
|
+
{
|
|
1775
|
+
name: 'mark_notification_read',
|
|
1776
|
+
description: 'Mark a specific notification as read. Use this after processing a notification to prevent re-processing.',
|
|
1777
|
+
inputSchema: {
|
|
1778
|
+
type: 'object',
|
|
1779
|
+
properties: {
|
|
1780
|
+
notification_id: {
|
|
1781
|
+
type: 'string',
|
|
1782
|
+
description: 'The ID of the notification to mark as read',
|
|
1783
|
+
},
|
|
1768
1784
|
},
|
|
1785
|
+
required: ['notification_id'],
|
|
1769
1786
|
},
|
|
1770
|
-
required: ['notification_id'],
|
|
1771
1787
|
},
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1788
|
+
{
|
|
1789
|
+
name: 'mark_all_notifications_read',
|
|
1790
|
+
description: 'Mark all of your unread notifications as read.',
|
|
1791
|
+
inputSchema: {
|
|
1792
|
+
type: 'object',
|
|
1793
|
+
properties: {},
|
|
1794
|
+
},
|
|
1779
1795
|
},
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1796
|
+
{
|
|
1797
|
+
name: 'delete_notification',
|
|
1798
|
+
description: 'Delete a specific notification permanently.',
|
|
1799
|
+
inputSchema: {
|
|
1800
|
+
type: 'object',
|
|
1801
|
+
properties: {
|
|
1802
|
+
notification_id: {
|
|
1803
|
+
type: 'string',
|
|
1804
|
+
description: 'The ID of the notification to delete',
|
|
1805
|
+
},
|
|
1790
1806
|
},
|
|
1807
|
+
required: ['notification_id'],
|
|
1791
1808
|
},
|
|
1792
|
-
required: ['notification_id'],
|
|
1793
1809
|
},
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1810
|
+
// Subscription tools
|
|
1811
|
+
{
|
|
1812
|
+
name: 'list_subscriptions',
|
|
1813
|
+
description: 'List your document subscriptions. Subscriptions control which documents you receive notifications for. ' +
|
|
1814
|
+
'Each subscription shows the document type, notification preferences (mentions, edits, comments, status), mute status, and reason for subscribing. ' +
|
|
1815
|
+
'Filter by document_type to see subscriptions for a specific type (e.g. "work_item", "issue", "wiki_page").',
|
|
1816
|
+
inputSchema: {
|
|
1817
|
+
type: 'object',
|
|
1818
|
+
properties: {
|
|
1819
|
+
document_type: {
|
|
1820
|
+
type: 'string',
|
|
1821
|
+
enum: ['wiki_page', 'work_item', 'radar_item', 'issue', 'journal', 'discussion'],
|
|
1822
|
+
description: 'Filter by document type',
|
|
1823
|
+
},
|
|
1824
|
+
is_active: {
|
|
1825
|
+
type: 'boolean',
|
|
1826
|
+
description: 'Filter by active status',
|
|
1827
|
+
},
|
|
1812
1828
|
},
|
|
1813
1829
|
},
|
|
1814
1830
|
},
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1831
|
+
{
|
|
1832
|
+
name: 'subscribe',
|
|
1833
|
+
description: 'Subscribe to a document to receive notifications about it. ' +
|
|
1834
|
+
'You can configure which notification types to receive: mentions, edits, comments, and status changes. ' +
|
|
1835
|
+
'Supported document types: wiki_page, work_item, radar_item, issue, journal, discussion.',
|
|
1836
|
+
inputSchema: {
|
|
1837
|
+
type: 'object',
|
|
1838
|
+
properties: {
|
|
1839
|
+
document_type: {
|
|
1840
|
+
type: 'string',
|
|
1841
|
+
enum: ['wiki_page', 'work_item', 'radar_item', 'issue', 'journal', 'discussion'],
|
|
1842
|
+
description: 'Type of document to subscribe to',
|
|
1843
|
+
},
|
|
1844
|
+
document_id: {
|
|
1845
|
+
type: 'string',
|
|
1846
|
+
description: 'The ID of the document to subscribe to',
|
|
1847
|
+
},
|
|
1848
|
+
reason: {
|
|
1849
|
+
type: 'string',
|
|
1850
|
+
description: 'Reason for subscribing (default: "watched")',
|
|
1851
|
+
},
|
|
1852
|
+
notify_on_mentions: {
|
|
1853
|
+
type: 'boolean',
|
|
1854
|
+
description: 'Notify when mentioned in this document',
|
|
1855
|
+
},
|
|
1856
|
+
notify_on_edits: {
|
|
1857
|
+
type: 'boolean',
|
|
1858
|
+
description: 'Notify when the document is edited',
|
|
1859
|
+
},
|
|
1860
|
+
notify_on_comments: {
|
|
1861
|
+
type: 'boolean',
|
|
1862
|
+
description: 'Notify on new comments',
|
|
1863
|
+
},
|
|
1864
|
+
notify_on_status: {
|
|
1865
|
+
type: 'boolean',
|
|
1866
|
+
description: 'Notify on status changes',
|
|
1867
|
+
},
|
|
1868
|
+
cooldown_minutes: {
|
|
1869
|
+
type: 'number',
|
|
1870
|
+
description: 'Minimum minutes between notifications',
|
|
1871
|
+
},
|
|
1856
1872
|
},
|
|
1873
|
+
required: ['document_type', 'document_id'],
|
|
1857
1874
|
},
|
|
1858
|
-
required: ['document_type', 'document_id'],
|
|
1859
1875
|
},
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
+
{
|
|
1877
|
+
name: 'unsubscribe',
|
|
1878
|
+
description: 'Unsubscribe from a document (soft delete). Stops notifications but keeps the subscription record. ' +
|
|
1879
|
+
'The subscription can be reactivated by subscribing again.',
|
|
1880
|
+
inputSchema: {
|
|
1881
|
+
type: 'object',
|
|
1882
|
+
properties: {
|
|
1883
|
+
document_type: {
|
|
1884
|
+
type: 'string',
|
|
1885
|
+
enum: ['wiki_page', 'work_item', 'radar_item', 'issue', 'journal', 'discussion'],
|
|
1886
|
+
description: 'Type of document to unsubscribe from',
|
|
1887
|
+
},
|
|
1888
|
+
document_id: {
|
|
1889
|
+
type: 'string',
|
|
1890
|
+
description: 'The ID of the document to unsubscribe from',
|
|
1891
|
+
},
|
|
1876
1892
|
},
|
|
1893
|
+
required: ['document_type', 'document_id'],
|
|
1877
1894
|
},
|
|
1878
|
-
required: ['document_type', 'document_id'],
|
|
1879
1895
|
},
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1896
|
+
{
|
|
1897
|
+
name: 'mute_subscription',
|
|
1898
|
+
description: 'Temporarily mute notifications from a subscription. The subscription remains active but notifications are silenced. ' +
|
|
1899
|
+
'Specify duration in minutes, or omit for indefinite mute. Use unmute_subscription to resume.',
|
|
1900
|
+
inputSchema: {
|
|
1901
|
+
type: 'object',
|
|
1902
|
+
properties: {
|
|
1903
|
+
document_type: {
|
|
1904
|
+
type: 'string',
|
|
1905
|
+
enum: ['wiki_page', 'work_item', 'radar_item', 'issue', 'journal', 'discussion'],
|
|
1906
|
+
description: 'Type of document',
|
|
1907
|
+
},
|
|
1908
|
+
document_id: {
|
|
1909
|
+
type: 'string',
|
|
1910
|
+
description: 'The ID of the document',
|
|
1911
|
+
},
|
|
1912
|
+
duration: {
|
|
1913
|
+
type: 'number',
|
|
1914
|
+
description: 'Duration in minutes to mute (omit for indefinite)',
|
|
1915
|
+
},
|
|
1900
1916
|
},
|
|
1917
|
+
required: ['document_type', 'document_id'],
|
|
1901
1918
|
},
|
|
1902
|
-
required: ['document_type', 'document_id'],
|
|
1903
1919
|
},
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1920
|
+
{
|
|
1921
|
+
name: 'unmute_subscription',
|
|
1922
|
+
description: 'Unmute a subscription to resume receiving notifications.',
|
|
1923
|
+
inputSchema: {
|
|
1924
|
+
type: 'object',
|
|
1925
|
+
properties: {
|
|
1926
|
+
document_type: {
|
|
1927
|
+
type: 'string',
|
|
1928
|
+
enum: ['wiki_page', 'work_item', 'radar_item', 'issue', 'journal', 'discussion'],
|
|
1929
|
+
description: 'Type of document',
|
|
1930
|
+
},
|
|
1931
|
+
document_id: {
|
|
1932
|
+
type: 'string',
|
|
1933
|
+
description: 'The ID of the document',
|
|
1934
|
+
},
|
|
1919
1935
|
},
|
|
1936
|
+
required: ['document_type', 'document_id'],
|
|
1920
1937
|
},
|
|
1921
|
-
required: ['document_type', 'document_id'],
|
|
1922
1938
|
},
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
+
// Discussion tools
|
|
1940
|
+
{
|
|
1941
|
+
name: 'get_discussions',
|
|
1942
|
+
description: 'Get all discussion threads on a document (wiki page, work item, issue, etc.). ' +
|
|
1943
|
+
'Returns discussions with their full comment threads including replies.',
|
|
1944
|
+
inputSchema: {
|
|
1945
|
+
type: 'object',
|
|
1946
|
+
properties: {
|
|
1947
|
+
document_type: {
|
|
1948
|
+
type: 'string',
|
|
1949
|
+
description: 'Document type (e.g. "wiki", "work_item", "issue")',
|
|
1950
|
+
},
|
|
1951
|
+
document_id: {
|
|
1952
|
+
type: 'string',
|
|
1953
|
+
description: 'The ID of the document',
|
|
1954
|
+
},
|
|
1939
1955
|
},
|
|
1956
|
+
required: ['document_type', 'document_id'],
|
|
1940
1957
|
},
|
|
1941
|
-
required: ['document_type', 'document_id'],
|
|
1942
1958
|
},
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1959
|
+
{
|
|
1960
|
+
name: 'get_discussion_by_comment',
|
|
1961
|
+
description: 'Find the full discussion thread containing a specific comment. ' +
|
|
1962
|
+
'Use this when you have a comment ID from a notification (sourceDocumentType: "discussion_comment") ' +
|
|
1963
|
+
'and need to see the full discussion context.',
|
|
1964
|
+
inputSchema: {
|
|
1965
|
+
type: 'object',
|
|
1966
|
+
properties: {
|
|
1967
|
+
comment_id: {
|
|
1968
|
+
type: 'string',
|
|
1969
|
+
description: 'The comment ID (e.g. from a notification sourceDocumentId)',
|
|
1970
|
+
},
|
|
1955
1971
|
},
|
|
1972
|
+
required: ['comment_id'],
|
|
1956
1973
|
},
|
|
1957
|
-
required: ['comment_id'],
|
|
1958
1974
|
},
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1975
|
+
{
|
|
1976
|
+
name: 'create_discussion_comment',
|
|
1977
|
+
description: 'Add a comment to a discussion thread. Supports threaded replies via parent_comment_id. ' +
|
|
1978
|
+
'Use this to respond to wiki page discussions, work item discussions, or any document discussion.',
|
|
1979
|
+
inputSchema: {
|
|
1980
|
+
type: 'object',
|
|
1981
|
+
properties: {
|
|
1982
|
+
discussion_id: {
|
|
1983
|
+
type: 'string',
|
|
1984
|
+
description: 'The ID of the discussion to comment on',
|
|
1985
|
+
},
|
|
1986
|
+
content: {
|
|
1987
|
+
type: 'string',
|
|
1988
|
+
description: 'Comment content (supports markdown and @mentions)',
|
|
1989
|
+
},
|
|
1990
|
+
parent_comment_id: {
|
|
1991
|
+
type: 'string',
|
|
1992
|
+
description: 'Parent comment ID for threaded replies (omit for top-level)',
|
|
1993
|
+
},
|
|
1978
1994
|
},
|
|
1995
|
+
required: ['discussion_id', 'content'],
|
|
1979
1996
|
},
|
|
1980
|
-
required: ['discussion_id', 'content'],
|
|
1981
1997
|
},
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
})
|
|
1998
|
+
...(this.capabilities.includes('procedures') ? PROCEDURE_TOOLS : []),
|
|
1999
|
+
...(this.capabilities.includes('agent_self') ? AGENT_SELF_TOOLS : []),
|
|
2000
|
+
...(this.capabilities.includes('agent_builder') ? AGENT_BUILDER_TOOLS : []),
|
|
2001
|
+
],
|
|
2002
|
+
};
|
|
2003
|
+
});
|
|
1988
2004
|
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
1989
2005
|
const { name, arguments: args } = request.params;
|
|
1990
2006
|
try {
|
|
@@ -2873,6 +2889,11 @@ class WolfpackMCPServer {
|
|
|
2873
2889
|
};
|
|
2874
2890
|
}
|
|
2875
2891
|
default: {
|
|
2892
|
+
// A gated tool may be called while capabilities are still unknown
|
|
2893
|
+
// (e.g. the client cached the full tool list from a previous process).
|
|
2894
|
+
if (!this.capabilitiesLoaded) {
|
|
2895
|
+
await this.fetchCapabilities();
|
|
2896
|
+
}
|
|
2876
2897
|
// Check procedure tools
|
|
2877
2898
|
if (this.capabilities.includes('procedures')) {
|
|
2878
2899
|
const procedureToolNames = PROCEDURE_TOOLS.map((t) => t.name);
|
|
@@ -2929,23 +2950,58 @@ class WolfpackMCPServer {
|
|
|
2929
2950
|
return true;
|
|
2930
2951
|
return false;
|
|
2931
2952
|
}
|
|
2932
|
-
|
|
2933
|
-
|
|
2934
|
-
|
|
2935
|
-
|
|
2953
|
+
/**
|
|
2954
|
+
* Fetch capabilities from the backend, sharing a single in-flight request.
|
|
2955
|
+
* Returns true on success. A failure is logged and leaves the current
|
|
2956
|
+
* (possibly empty) capability set untouched so a later attempt can heal it.
|
|
2957
|
+
*/
|
|
2958
|
+
fetchCapabilities() {
|
|
2959
|
+
this.capabilitiesFetch ??= this.client
|
|
2960
|
+
.getCapabilities()
|
|
2961
|
+
.then((caps) => {
|
|
2936
2962
|
this.capabilities = caps.capabilities;
|
|
2963
|
+
this.capabilitiesLoaded = true;
|
|
2937
2964
|
if (this.capabilities.length > 0) {
|
|
2938
2965
|
console.error(`Capabilities: ${this.capabilities.join(', ')}`);
|
|
2939
2966
|
}
|
|
2940
|
-
|
|
2941
|
-
|
|
2967
|
+
return true;
|
|
2968
|
+
})
|
|
2969
|
+
.catch((error) => {
|
|
2942
2970
|
console.error(`Warning: Could not fetch capabilities: ${error instanceof Error ? error.message : String(error)}`);
|
|
2943
|
-
|
|
2971
|
+
return false;
|
|
2972
|
+
})
|
|
2973
|
+
.finally(() => {
|
|
2974
|
+
this.capabilitiesFetch = null;
|
|
2975
|
+
});
|
|
2976
|
+
return this.capabilitiesFetch;
|
|
2977
|
+
}
|
|
2978
|
+
/** Keep retrying the capability fetch until it succeeds, then tell the client to re-list tools. */
|
|
2979
|
+
async recoverCapabilities() {
|
|
2980
|
+
let delayMs = 15_000;
|
|
2981
|
+
while (!this.capabilitiesLoaded) {
|
|
2982
|
+
await sleep(delayMs);
|
|
2983
|
+
delayMs = Math.min(delayMs * 2, 300_000);
|
|
2984
|
+
if (await this.fetchCapabilities()) {
|
|
2985
|
+
// Best effort — the refreshed set is also served on the next ListTools
|
|
2986
|
+
await this.server.sendToolListChanged().catch(() => { });
|
|
2987
|
+
}
|
|
2988
|
+
}
|
|
2989
|
+
}
|
|
2990
|
+
async start() {
|
|
2991
|
+
// Fetch capabilities to determine which tools to register. A transient
|
|
2992
|
+
// failure here (e.g. a gateway 503) must not permanently reduce the tool
|
|
2993
|
+
// set (#1488), so retry briefly now and keep retrying in the background.
|
|
2994
|
+
for (let attempt = 1; !(await this.fetchCapabilities()) && attempt < 3; attempt++) {
|
|
2995
|
+
await sleep(1000 * attempt);
|
|
2944
2996
|
}
|
|
2945
2997
|
// Connect stdio transport FIRST so MCP clients don't deadlock waiting for initialize
|
|
2946
2998
|
const transport = new StdioServerTransport();
|
|
2947
2999
|
await this.server.connect(transport);
|
|
2948
3000
|
console.error(`Wolfpack MCP Server v${CURRENT_VERSION} started`);
|
|
3001
|
+
if (!this.capabilitiesLoaded) {
|
|
3002
|
+
console.error('Starting with base tools only; retrying capabilities fetch in background');
|
|
3003
|
+
void this.recoverCapabilities();
|
|
3004
|
+
}
|
|
2949
3005
|
// Resolve project for project-capable keys
|
|
2950
3006
|
if (this.capabilities.includes('project') || this.capabilities.length === 0) {
|
|
2951
3007
|
if (config.projectSlug) {
|