wolfpack-mcp 1.0.62 → 1.0.64
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 +1250 -1196
- package/dist/workItemReminders.js +41 -0
- package/dist/workItemReminders.test.js +52 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -7,6 +7,7 @@ import { createRequire } from 'module';
|
|
|
7
7
|
import { readFile, stat } from 'fs/promises';
|
|
8
8
|
import { basename, extname, resolve } from 'path';
|
|
9
9
|
import { WolfpackClient } from './client.js';
|
|
10
|
+
import { allTasksChecked, getWorkItemReminders } from './workItemReminders.js';
|
|
10
11
|
import { validateConfig, config } from './config.js';
|
|
11
12
|
import { AGENT_BUILDER_TOOLS, handleAgentBuilderTool } from './agentBuilderTools.js';
|
|
12
13
|
import { PROCEDURE_TOOLS, handleProcedureTool } from './procedureTools.js';
|
|
@@ -654,22 +655,13 @@ function stripUuids(obj) {
|
|
|
654
655
|
}
|
|
655
656
|
return result;
|
|
656
657
|
}
|
|
657
|
-
|
|
658
|
-
function hasPlan(description) {
|
|
659
|
-
if (!description)
|
|
660
|
-
return false;
|
|
661
|
-
// Check for markdown checklist items (plan indicators)
|
|
662
|
-
if (/- \[[ x]\]/.test(description))
|
|
663
|
-
return true;
|
|
664
|
-
// Check for --- separator with content after (agent-added section)
|
|
665
|
-
if (/\n---\n/.test(description))
|
|
666
|
-
return true;
|
|
667
|
-
return false;
|
|
668
|
-
}
|
|
658
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
669
659
|
class WolfpackMCPServer {
|
|
670
660
|
server;
|
|
671
661
|
client;
|
|
672
662
|
capabilities = [];
|
|
663
|
+
capabilitiesLoaded = false;
|
|
664
|
+
capabilitiesFetch = null;
|
|
673
665
|
constructor() {
|
|
674
666
|
this.client = new WolfpackClient();
|
|
675
667
|
this.server = new Server({
|
|
@@ -677,1324 +669,1338 @@ class WolfpackMCPServer {
|
|
|
677
669
|
version: CURRENT_VERSION,
|
|
678
670
|
}, {
|
|
679
671
|
capabilities: {
|
|
680
|
-
tools: {},
|
|
672
|
+
tools: { listChanged: true },
|
|
681
673
|
logging: {},
|
|
682
674
|
},
|
|
683
675
|
});
|
|
684
676
|
this.setupHandlers();
|
|
685
677
|
}
|
|
686
678
|
setupHandlers() {
|
|
687
|
-
this.server.setRequestHandler(ListToolsRequestSchema, async () =>
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
'
|
|
698
|
-
'
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
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
|
+
},
|
|
708
707
|
},
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
708
|
+
// Search tool
|
|
709
|
+
{
|
|
710
|
+
name: 'search',
|
|
711
|
+
description: 'Ranked full-text search across project content: wiki pages, work items, cases, journal entries and issues. ' +
|
|
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, ...). ' +
|
|
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
|
+
},
|
|
735
734
|
},
|
|
735
|
+
required: ['query'],
|
|
736
736
|
},
|
|
737
|
-
required: ['query'],
|
|
738
737
|
},
|
|
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
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
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' },
|
|
802
803
|
},
|
|
803
|
-
limit: { type: 'number', description: 'Maximum number of items to return' },
|
|
804
|
-
offset: { type: 'number', description: 'Number of items to skip' },
|
|
805
804
|
},
|
|
806
805
|
},
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
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
|
+
},
|
|
828
827
|
},
|
|
828
|
+
required: ['work_item_id'],
|
|
829
829
|
},
|
|
830
|
-
required: ['work_item_id'],
|
|
831
830
|
},
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
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
|
+
},
|
|
850
850
|
},
|
|
851
|
+
required: ['work_item_id', 'description'],
|
|
851
852
|
},
|
|
852
|
-
required: ['work_item_id', 'description'],
|
|
853
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
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
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
|
+
},
|
|
938
938
|
},
|
|
939
|
+
required: ['work_item_id'],
|
|
939
940
|
},
|
|
940
|
-
required: ['work_item_id'],
|
|
941
941
|
},
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
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
|
+
},
|
|
965
965
|
},
|
|
966
|
+
required: ['work_item_id'],
|
|
966
967
|
},
|
|
967
|
-
required: ['work_item_id'],
|
|
968
968
|
},
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
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
|
+
},
|
|
989
989
|
},
|
|
990
|
+
required: ['work_item_id', 'form_values'],
|
|
990
991
|
},
|
|
991
|
-
required: ['work_item_id', 'form_values'],
|
|
992
992
|
},
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
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' },
|
|
1013
1015
|
},
|
|
1014
|
-
limit: { type: 'number', description: 'Maximum number of items to return' },
|
|
1015
|
-
offset: { type: 'number', description: 'Number of items to skip' },
|
|
1016
1016
|
},
|
|
1017
1017
|
},
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
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
|
+
},
|
|
1033
1033
|
},
|
|
1034
|
+
required: ['item_id'],
|
|
1034
1035
|
},
|
|
1035
|
-
required: ['item_id'],
|
|
1036
1036
|
},
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
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
|
+
},
|
|
1063
1063
|
},
|
|
1064
|
+
required: ['title', 'stage'],
|
|
1064
1065
|
},
|
|
1065
|
-
required: ['title', 'stage'],
|
|
1066
1066
|
},
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
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
|
+
},
|
|
1093
1093
|
},
|
|
1094
|
+
required: ['item_id'],
|
|
1094
1095
|
},
|
|
1095
|
-
required: ['item_id'],
|
|
1096
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
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
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' },
|
|
1152
1154
|
},
|
|
1153
|
-
limit: { type: 'number', description: 'Maximum number of items to return' },
|
|
1154
|
-
offset: { type: 'number', description: 'Number of items to skip' },
|
|
1155
1155
|
},
|
|
1156
1156
|
},
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
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
|
+
},
|
|
1174
1174
|
},
|
|
1175
|
+
required: ['issue_id'],
|
|
1175
1176
|
},
|
|
1176
|
-
required: ['issue_id'],
|
|
1177
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
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
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
|
+
},
|
|
1231
1231
|
},
|
|
1232
|
+
required: ['title'],
|
|
1232
1233
|
},
|
|
1233
|
-
required: ['title'],
|
|
1234
1234
|
},
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
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' },
|
|
1258
1268
|
},
|
|
1259
|
-
|
|
1260
|
-
environment: { type: 'string', description: 'Environment where the issue occurred' },
|
|
1261
|
-
affected_version: { type: 'string', description: 'Version affected by the issue' },
|
|
1262
|
-
reproducible: { type: 'boolean', description: 'Whether the issue is reproducible' },
|
|
1263
|
-
steps_to_reproduce: { type: 'string', description: 'Steps to reproduce the issue' },
|
|
1264
|
-
expected_behavior: { type: 'string', description: 'Expected behavior' },
|
|
1265
|
-
actual_behavior: { type: 'string', description: 'Actual behavior observed' },
|
|
1269
|
+
required: ['title'],
|
|
1266
1270
|
},
|
|
1267
|
-
required: ['title'],
|
|
1268
1271
|
},
|
|
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
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
type: 'string',
|
|
1311
|
-
|
|
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
|
+
},
|
|
1312
1318
|
},
|
|
1319
|
+
required: ['issue_id'],
|
|
1313
1320
|
},
|
|
1314
|
-
required: ['issue_id'],
|
|
1315
1321
|
},
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
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' },
|
|
1339
1347
|
},
|
|
1340
|
-
limit: { type: 'number', description: 'Maximum number of pages to return' },
|
|
1341
|
-
offset: { type: 'number', description: 'Number of pages to skip' },
|
|
1342
1348
|
},
|
|
1343
1349
|
},
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
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
|
+
},
|
|
1355
1361
|
},
|
|
1362
|
+
required: ['page_id'],
|
|
1356
1363
|
},
|
|
1357
|
-
required: ['page_id'],
|
|
1358
1364
|
},
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
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
|
+
},
|
|
1379
1385
|
},
|
|
1386
|
+
required: ['slug', 'title', 'content'],
|
|
1380
1387
|
},
|
|
1381
|
-
required: ['slug', 'title', 'content'],
|
|
1382
1388
|
},
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
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
|
+
},
|
|
1405
1411
|
},
|
|
1412
|
+
required: ['page_id'],
|
|
1406
1413
|
},
|
|
1407
|
-
required: ['page_id'],
|
|
1408
1414
|
},
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
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' },
|
|
1432
1440
|
},
|
|
1433
|
-
limit: { type: 'number', description: 'Maximum number of entries to return' },
|
|
1434
|
-
offset: { type: 'number', description: 'Number of entries to skip' },
|
|
1435
1441
|
},
|
|
1436
1442
|
},
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
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
|
+
},
|
|
1449
1455
|
},
|
|
1456
|
+
required: ['entry_id'],
|
|
1450
1457
|
},
|
|
1451
|
-
required: ['entry_id'],
|
|
1452
1458
|
},
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
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
|
+
},
|
|
1469
1475
|
},
|
|
1476
|
+
required: ['title', 'content'],
|
|
1470
1477
|
},
|
|
1471
|
-
required: ['title', 'content'],
|
|
1472
1478
|
},
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
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
|
+
},
|
|
1495
1501
|
},
|
|
1502
|
+
required: ['entry_id'],
|
|
1496
1503
|
},
|
|
1497
|
-
required: ['entry_id'],
|
|
1498
1504
|
},
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
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
|
+
},
|
|
1512
1518
|
},
|
|
1519
|
+
required: ['work_item_id'],
|
|
1513
1520
|
},
|
|
1514
|
-
required: ['work_item_id'],
|
|
1515
1521
|
},
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
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
|
+
},
|
|
1528
1534
|
},
|
|
1535
|
+
required: ['issue_id'],
|
|
1529
1536
|
},
|
|
1530
|
-
required: ['issue_id'],
|
|
1531
1537
|
},
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
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
|
+
},
|
|
1553
1559
|
},
|
|
1560
|
+
required: ['work_item_id', 'content'],
|
|
1554
1561
|
},
|
|
1555
|
-
required: ['work_item_id', 'content'],
|
|
1556
1562
|
},
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
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
|
+
},
|
|
1573
1579
|
},
|
|
1580
|
+
required: ['issue_id', 'content'],
|
|
1574
1581
|
},
|
|
1575
|
-
required: ['issue_id', 'content'],
|
|
1576
1582
|
},
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
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
|
+
},
|
|
1590
1596
|
},
|
|
1597
|
+
required: ['work_item_id', 'comment_id'],
|
|
1591
1598
|
},
|
|
1592
|
-
required: ['work_item_id', 'comment_id'],
|
|
1593
1599
|
},
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
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
|
+
},
|
|
1607
1613
|
},
|
|
1614
|
+
required: ['issue_id', 'comment_id'],
|
|
1608
1615
|
},
|
|
1609
|
-
required: ['issue_id', 'comment_id'],
|
|
1610
1616
|
},
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
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
|
+
},
|
|
1632
1638
|
},
|
|
1639
|
+
required: ['file_path'],
|
|
1633
1640
|
},
|
|
1634
|
-
required: ['file_path'],
|
|
1635
1641
|
},
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
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
|
+
},
|
|
1650
1656
|
},
|
|
1657
|
+
required: ['image_url'],
|
|
1651
1658
|
},
|
|
1652
|
-
required: ['image_url'],
|
|
1653
1659
|
},
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
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
|
+
},
|
|
1666
1672
|
},
|
|
1667
1673
|
},
|
|
1668
1674
|
},
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
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
|
+
},
|
|
1681
1687
|
},
|
|
1682
1688
|
},
|
|
1683
1689
|
},
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
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
|
+
},
|
|
1696
1702
|
},
|
|
1697
1703
|
},
|
|
1698
1704
|
},
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
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
|
+
},
|
|
1708
1714
|
},
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
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
|
+
},
|
|
1721
1727
|
},
|
|
1728
|
+
required: ['skill_name'],
|
|
1722
1729
|
},
|
|
1723
|
-
required: ['skill_name'],
|
|
1724
1730
|
},
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
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
|
+
},
|
|
1740
1746
|
},
|
|
1747
|
+
required: ['skill_name', 'resource_name'],
|
|
1741
1748
|
},
|
|
1742
|
-
required: ['skill_name', 'resource_name'],
|
|
1743
1749
|
},
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
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
|
+
},
|
|
1765
1771
|
},
|
|
1766
1772
|
},
|
|
1767
1773
|
},
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
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
|
+
},
|
|
1778
1784
|
},
|
|
1785
|
+
required: ['notification_id'],
|
|
1779
1786
|
},
|
|
1780
|
-
required: ['notification_id'],
|
|
1781
1787
|
},
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
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
|
+
},
|
|
1789
1795
|
},
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
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
|
+
},
|
|
1800
1806
|
},
|
|
1807
|
+
required: ['notification_id'],
|
|
1801
1808
|
},
|
|
1802
|
-
required: ['notification_id'],
|
|
1803
1809
|
},
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
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
|
+
},
|
|
1822
1828
|
},
|
|
1823
1829
|
},
|
|
1824
1830
|
},
|
|
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
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
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
|
+
},
|
|
1866
1872
|
},
|
|
1873
|
+
required: ['document_type', 'document_id'],
|
|
1867
1874
|
},
|
|
1868
|
-
required: ['document_type', 'document_id'],
|
|
1869
1875
|
},
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
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
|
+
},
|
|
1886
1892
|
},
|
|
1893
|
+
required: ['document_type', 'document_id'],
|
|
1887
1894
|
},
|
|
1888
|
-
required: ['document_type', 'document_id'],
|
|
1889
1895
|
},
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
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
|
+
},
|
|
1910
1916
|
},
|
|
1917
|
+
required: ['document_type', 'document_id'],
|
|
1911
1918
|
},
|
|
1912
|
-
required: ['document_type', 'document_id'],
|
|
1913
1919
|
},
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
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
|
+
},
|
|
1929
1935
|
},
|
|
1936
|
+
required: ['document_type', 'document_id'],
|
|
1930
1937
|
},
|
|
1931
|
-
required: ['document_type', 'document_id'],
|
|
1932
1938
|
},
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
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
|
+
},
|
|
1949
1955
|
},
|
|
1956
|
+
required: ['document_type', 'document_id'],
|
|
1950
1957
|
},
|
|
1951
|
-
required: ['document_type', 'document_id'],
|
|
1952
1958
|
},
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
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
|
+
},
|
|
1965
1971
|
},
|
|
1972
|
+
required: ['comment_id'],
|
|
1966
1973
|
},
|
|
1967
|
-
required: ['comment_id'],
|
|
1968
1974
|
},
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
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
|
+
},
|
|
1988
1994
|
},
|
|
1995
|
+
required: ['discussion_id', 'content'],
|
|
1989
1996
|
},
|
|
1990
|
-
required: ['discussion_id', 'content'],
|
|
1991
1997
|
},
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
})
|
|
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
|
+
});
|
|
1998
2004
|
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
1999
2005
|
const { name, arguments: args } = request.params;
|
|
2000
2006
|
try {
|
|
@@ -2072,11 +2078,9 @@ class WolfpackMCPServer {
|
|
|
2072
2078
|
const workItem = await this.client.getWorkItem(parsed.work_item_id, parsed.project_slug || this.client.getProjectSlug() || undefined);
|
|
2073
2079
|
if (workItem) {
|
|
2074
2080
|
let text = JSON.stringify(stripUuids(workItem), null, 2);
|
|
2075
|
-
|
|
2076
|
-
if (
|
|
2077
|
-
text =
|
|
2078
|
-
'REMINDER: This work item has no plan. Before starting work, use update_work_progress to add a plan below a "---" separator. Preserve the original description and append your plan with markdown checkboxes (- [ ] task).\n\n' +
|
|
2079
|
-
text;
|
|
2081
|
+
const reminders = getWorkItemReminders(workItem.status, workItem.description);
|
|
2082
|
+
if (reminders.length > 0) {
|
|
2083
|
+
text = `${reminders.join('\n\n')}\n\n${text}`;
|
|
2080
2084
|
}
|
|
2081
2085
|
return {
|
|
2082
2086
|
content: [{ type: 'text', text }],
|
|
@@ -2089,15 +2093,25 @@ class WolfpackMCPServer {
|
|
|
2089
2093
|
case 'update_work_progress': {
|
|
2090
2094
|
const parsed = UpdateWorkProgressSchema.parse(args);
|
|
2091
2095
|
const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
|
|
2092
|
-
|
|
2096
|
+
let workItem = await this.client.updateWorkProgress(parsed.work_item_id, parsed.description, teamSlug);
|
|
2093
2097
|
if (workItem) {
|
|
2098
|
+
let summary = `Updated description on: ${workItem.title}`;
|
|
2099
|
+
// Progress on a "new" item means work has started — advance it to "doing"
|
|
2100
|
+
if (workItem.status === 'new') {
|
|
2101
|
+
const advanced = await this.client.updateWorkItem(parsed.work_item_id, { status: 'doing' }, teamSlug);
|
|
2102
|
+
if (advanced) {
|
|
2103
|
+
workItem = advanced;
|
|
2104
|
+
summary += ' (status auto-advanced new → doing)';
|
|
2105
|
+
}
|
|
2106
|
+
}
|
|
2107
|
+
let text = `${summary}\n\n${JSON.stringify(stripUuids(workItem), null, 2)}`;
|
|
2108
|
+
if (workItem.status === 'doing' && allTasksChecked(workItem.description)) {
|
|
2109
|
+
text =
|
|
2110
|
+
'REMINDER: All plan tasks are checked off. If the work is complete, set status to "review" NOW (update_work_item) and add a completion comment.\n\n' +
|
|
2111
|
+
text;
|
|
2112
|
+
}
|
|
2094
2113
|
return {
|
|
2095
|
-
content: [
|
|
2096
|
-
{
|
|
2097
|
-
type: 'text',
|
|
2098
|
-
text: `Updated description on: ${workItem.title}\n\n${JSON.stringify(stripUuids(workItem), null, 2)}`,
|
|
2099
|
-
},
|
|
2100
|
-
],
|
|
2114
|
+
content: [{ type: 'text', text }],
|
|
2101
2115
|
};
|
|
2102
2116
|
}
|
|
2103
2117
|
return {
|
|
@@ -2875,6 +2889,11 @@ class WolfpackMCPServer {
|
|
|
2875
2889
|
};
|
|
2876
2890
|
}
|
|
2877
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
|
+
}
|
|
2878
2897
|
// Check procedure tools
|
|
2879
2898
|
if (this.capabilities.includes('procedures')) {
|
|
2880
2899
|
const procedureToolNames = PROCEDURE_TOOLS.map((t) => t.name);
|
|
@@ -2931,23 +2950,58 @@ class WolfpackMCPServer {
|
|
|
2931
2950
|
return true;
|
|
2932
2951
|
return false;
|
|
2933
2952
|
}
|
|
2934
|
-
|
|
2935
|
-
|
|
2936
|
-
|
|
2937
|
-
|
|
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) => {
|
|
2938
2962
|
this.capabilities = caps.capabilities;
|
|
2963
|
+
this.capabilitiesLoaded = true;
|
|
2939
2964
|
if (this.capabilities.length > 0) {
|
|
2940
2965
|
console.error(`Capabilities: ${this.capabilities.join(', ')}`);
|
|
2941
2966
|
}
|
|
2942
|
-
|
|
2943
|
-
|
|
2967
|
+
return true;
|
|
2968
|
+
})
|
|
2969
|
+
.catch((error) => {
|
|
2944
2970
|
console.error(`Warning: Could not fetch capabilities: ${error instanceof Error ? error.message : String(error)}`);
|
|
2945
|
-
|
|
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);
|
|
2946
2996
|
}
|
|
2947
2997
|
// Connect stdio transport FIRST so MCP clients don't deadlock waiting for initialize
|
|
2948
2998
|
const transport = new StdioServerTransport();
|
|
2949
2999
|
await this.server.connect(transport);
|
|
2950
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
|
+
}
|
|
2951
3005
|
// Resolve project for project-capable keys
|
|
2952
3006
|
if (this.capabilities.includes('project') || this.capabilities.length === 0) {
|
|
2953
3007
|
if (config.projectSlug) {
|