@gitscrum-studio/mcp-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +250 -0
  3. package/dist/auth/DeviceAuthenticator.d.ts +51 -0
  4. package/dist/auth/DeviceAuthenticator.d.ts.map +1 -0
  5. package/dist/auth/DeviceAuthenticator.js +89 -0
  6. package/dist/auth/DeviceAuthenticator.js.map +1 -0
  7. package/dist/auth/RateLimiter.d.ts +58 -0
  8. package/dist/auth/RateLimiter.d.ts.map +1 -0
  9. package/dist/auth/RateLimiter.js +181 -0
  10. package/dist/auth/RateLimiter.js.map +1 -0
  11. package/dist/auth/TokenManager.d.ts +62 -0
  12. package/dist/auth/TokenManager.d.ts.map +1 -0
  13. package/dist/auth/TokenManager.js +164 -0
  14. package/dist/auth/TokenManager.js.map +1 -0
  15. package/dist/client/GitScrumClient.d.ts +1002 -0
  16. package/dist/client/GitScrumClient.d.ts.map +1 -0
  17. package/dist/client/GitScrumClient.js +1835 -0
  18. package/dist/client/GitScrumClient.js.map +1 -0
  19. package/dist/context/ActiveContext.d.ts +79 -0
  20. package/dist/context/ActiveContext.d.ts.map +1 -0
  21. package/dist/context/ActiveContext.js +151 -0
  22. package/dist/context/ActiveContext.js.map +1 -0
  23. package/dist/index.d.ts +15 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +152 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/tools/activity.d.ts +12 -0
  28. package/dist/tools/activity.d.ts.map +1 -0
  29. package/dist/tools/activity.js +106 -0
  30. package/dist/tools/activity.js.map +1 -0
  31. package/dist/tools/analytics.d.ts +11 -0
  32. package/dist/tools/analytics.d.ts.map +1 -0
  33. package/dist/tools/analytics.js +117 -0
  34. package/dist/tools/analytics.js.map +1 -0
  35. package/dist/tools/auth.d.ts +17 -0
  36. package/dist/tools/auth.d.ts.map +1 -0
  37. package/dist/tools/auth.js +173 -0
  38. package/dist/tools/auth.js.map +1 -0
  39. package/dist/tools/budget.d.ts +12 -0
  40. package/dist/tools/budget.d.ts.map +1 -0
  41. package/dist/tools/budget.js +109 -0
  42. package/dist/tools/budget.js.map +1 -0
  43. package/dist/tools/clientflow.d.ts +12 -0
  44. package/dist/tools/clientflow.d.ts.map +1 -0
  45. package/dist/tools/clientflow.js +476 -0
  46. package/dist/tools/clientflow.js.map +1 -0
  47. package/dist/tools/comments.d.ts +11 -0
  48. package/dist/tools/comments.d.ts.map +1 -0
  49. package/dist/tools/comments.js +99 -0
  50. package/dist/tools/comments.js.map +1 -0
  51. package/dist/tools/discussions.d.ts +12 -0
  52. package/dist/tools/discussions.d.ts.map +1 -0
  53. package/dist/tools/discussions.js +200 -0
  54. package/dist/tools/discussions.js.map +1 -0
  55. package/dist/tools/epics.d.ts +11 -0
  56. package/dist/tools/epics.d.ts.map +1 -0
  57. package/dist/tools/epics.js +122 -0
  58. package/dist/tools/epics.js.map +1 -0
  59. package/dist/tools/labels.d.ts +11 -0
  60. package/dist/tools/labels.d.ts.map +1 -0
  61. package/dist/tools/labels.js +138 -0
  62. package/dist/tools/labels.js.map +1 -0
  63. package/dist/tools/notes.d.ts +11 -0
  64. package/dist/tools/notes.d.ts.map +1 -0
  65. package/dist/tools/notes.js +201 -0
  66. package/dist/tools/notes.js.map +1 -0
  67. package/dist/tools/projects.d.ts +12 -0
  68. package/dist/tools/projects.d.ts.map +1 -0
  69. package/dist/tools/projects.js +272 -0
  70. package/dist/tools/projects.js.map +1 -0
  71. package/dist/tools/search.d.ts +17 -0
  72. package/dist/tools/search.d.ts.map +1 -0
  73. package/dist/tools/search.js +56 -0
  74. package/dist/tools/search.js.map +1 -0
  75. package/dist/tools/shared/actionHandler.d.ts +67 -0
  76. package/dist/tools/shared/actionHandler.d.ts.map +1 -0
  77. package/dist/tools/shared/actionHandler.js +98 -0
  78. package/dist/tools/shared/actionHandler.js.map +1 -0
  79. package/dist/tools/shared/initModules.d.ts +6 -0
  80. package/dist/tools/shared/initModules.d.ts.map +1 -0
  81. package/dist/tools/shared/initModules.js +166 -0
  82. package/dist/tools/shared/initModules.js.map +1 -0
  83. package/dist/tools/shared/toolRegistry.d.ts +45 -0
  84. package/dist/tools/shared/toolRegistry.d.ts.map +1 -0
  85. package/dist/tools/shared/toolRegistry.js +59 -0
  86. package/dist/tools/shared/toolRegistry.js.map +1 -0
  87. package/dist/tools/sprints.d.ts +11 -0
  88. package/dist/tools/sprints.d.ts.map +1 -0
  89. package/dist/tools/sprints.js +271 -0
  90. package/dist/tools/sprints.js.map +1 -0
  91. package/dist/tools/standup.d.ts +11 -0
  92. package/dist/tools/standup.d.ts.map +1 -0
  93. package/dist/tools/standup.js +89 -0
  94. package/dist/tools/standup.js.map +1 -0
  95. package/dist/tools/taskTypes.d.ts +11 -0
  96. package/dist/tools/taskTypes.d.ts.map +1 -0
  97. package/dist/tools/taskTypes.js +132 -0
  98. package/dist/tools/taskTypes.js.map +1 -0
  99. package/dist/tools/tasks.d.ts +12 -0
  100. package/dist/tools/tasks.d.ts.map +1 -0
  101. package/dist/tools/tasks.js +470 -0
  102. package/dist/tools/tasks.js.map +1 -0
  103. package/dist/tools/timeTracking.d.ts +11 -0
  104. package/dist/tools/timeTracking.d.ts.map +1 -0
  105. package/dist/tools/timeTracking.js +174 -0
  106. package/dist/tools/timeTracking.js.map +1 -0
  107. package/dist/tools/userStories.d.ts +11 -0
  108. package/dist/tools/userStories.d.ts.map +1 -0
  109. package/dist/tools/userStories.js +166 -0
  110. package/dist/tools/userStories.js.map +1 -0
  111. package/dist/tools/wiki.d.ts +11 -0
  112. package/dist/tools/wiki.d.ts.map +1 -0
  113. package/dist/tools/wiki.js +154 -0
  114. package/dist/tools/wiki.js.map +1 -0
  115. package/dist/tools/workflows.d.ts +11 -0
  116. package/dist/tools/workflows.d.ts.map +1 -0
  117. package/dist/tools/workflows.js +144 -0
  118. package/dist/tools/workflows.js.map +1 -0
  119. package/package.json +89 -0
@@ -0,0 +1,200 @@
1
+ import { executeAction, success, required, resolveProjectContext } from "./shared/actionHandler.js";
2
+ // ============================================================================
3
+ // Tool Registration
4
+ // ============================================================================
5
+ export function registerDiscussionTools() {
6
+ return [
7
+ {
8
+ name: "discussion",
9
+ description: [
10
+ "Discussions & channels. Actions: all, channels, channel, messages, send, search, unread, mark_read, create_channel, update_channel.",
11
+ "",
12
+ "Workflow:",
13
+ "- 'all': no params needed (returns all discussions across workspaces)",
14
+ "- 'channels': requires company_slug + project_slug (list channels in a project)",
15
+ "- 'channel': requires channel_uuid (get single channel details)",
16
+ "- 'messages': requires channel_uuid (get messages, supports cursor pagination)",
17
+ "- 'send': requires channel_uuid + content (send a message)",
18
+ "- 'search': requires channel_uuid + q (search messages in channel)",
19
+ "- 'unread': requires company_slug + project_slug (unread count)",
20
+ "- 'mark_read': requires channel_uuid (mark channel as read)",
21
+ "- 'create_channel': requires name + company_slug + project_slug",
22
+ "- 'update_channel': requires channel_uuid + name or description",
23
+ ].join("\n"),
24
+ inputSchema: {
25
+ type: "object",
26
+ properties: {
27
+ action: {
28
+ type: "string",
29
+ enum: ["all", "channels", "channel", "messages", "send", "search", "unread", "mark_read", "create_channel", "update_channel"],
30
+ description: "Which operation to perform"
31
+ },
32
+ company_slug: {
33
+ type: "string",
34
+ description: "Workspace identifier"
35
+ },
36
+ project_slug: {
37
+ type: "string",
38
+ description: "Project identifier"
39
+ },
40
+ channel_uuid: {
41
+ type: "string",
42
+ description: "Channel UUID for: channel, messages, send, search, mark_read, update_channel"
43
+ },
44
+ content: {
45
+ type: "string",
46
+ description: "Message text for send action"
47
+ },
48
+ parent_id: {
49
+ type: "string",
50
+ description: "Parent message ID for thread replies (optional for send)"
51
+ },
52
+ q: {
53
+ type: "string",
54
+ description: "Search query for search action"
55
+ },
56
+ name: {
57
+ type: "string",
58
+ description: "Channel name for create_channel/update_channel"
59
+ },
60
+ description: {
61
+ type: "string",
62
+ description: "Channel description (optional)"
63
+ },
64
+ is_private: {
65
+ type: "boolean",
66
+ description: "Channel visibility (optional for create_channel)"
67
+ },
68
+ include_archived: {
69
+ type: "boolean",
70
+ description: "Include archived channels (optional for channels)"
71
+ },
72
+ before_id: {
73
+ type: "string",
74
+ description: "Cursor for older messages (optional for messages)"
75
+ },
76
+ after_id: {
77
+ type: "string",
78
+ description: "Cursor for newer messages (optional for messages)"
79
+ },
80
+ limit: {
81
+ type: "number",
82
+ description: "Max results (optional)"
83
+ },
84
+ },
85
+ required: ["action"],
86
+ },
87
+ annotations: { title: "Discussions", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
88
+ },
89
+ ];
90
+ }
91
+ // ============================================================================
92
+ // Action Handlers
93
+ // ============================================================================
94
+ const discussionHandlers = {
95
+ all: async (client) => {
96
+ const data = await client.getAllDiscussions();
97
+ return success(JSON.stringify(data, null, 2));
98
+ },
99
+ channels: async (client, args) => {
100
+ const resolved = await resolveProjectContext(client, {
101
+ company_slug: args.company_slug,
102
+ project_slug: args.project_slug
103
+ });
104
+ if (!resolved)
105
+ return required("company_slug + project_slug");
106
+ const channels = await client.getDiscussionChannels(resolved.project_slug, resolved.company_slug, args.include_archived);
107
+ const ctx = { company_slug: resolved.company_slug, project_slug: resolved.project_slug };
108
+ return success(JSON.stringify(channels, null, 2), ctx);
109
+ },
110
+ channel: async (client, args) => {
111
+ if (!args.channel_uuid)
112
+ return required("channel_uuid");
113
+ const channel = await client.getDiscussionChannel(args.channel_uuid);
114
+ return success(JSON.stringify(channel, null, 2));
115
+ },
116
+ messages: async (client, args) => {
117
+ if (!args.channel_uuid)
118
+ return required("channel_uuid");
119
+ const messages = await client.getDiscussionMessages(args.channel_uuid, {
120
+ before_id: args.before_id,
121
+ after_id: args.after_id,
122
+ limit: args.limit,
123
+ });
124
+ return success(JSON.stringify(messages, null, 2));
125
+ },
126
+ send: async (client, args) => {
127
+ if (!args.channel_uuid)
128
+ return required("channel_uuid");
129
+ if (!args.content)
130
+ return required("content");
131
+ const message = await client.sendDiscussionMessage(args.channel_uuid, {
132
+ content: args.content,
133
+ parent_id: args.parent_id,
134
+ });
135
+ return success(JSON.stringify({ sent: true, message }, null, 2));
136
+ },
137
+ search: async (client, args) => {
138
+ if (!args.channel_uuid)
139
+ return required("channel_uuid");
140
+ if (!args.q)
141
+ return required("q (search query)");
142
+ const results = await client.searchDiscussionMessages(args.channel_uuid, args.q, args.limit);
143
+ return success(JSON.stringify(results, null, 2));
144
+ },
145
+ unread: async (client, args) => {
146
+ const resolved = await resolveProjectContext(client, {
147
+ company_slug: args.company_slug,
148
+ project_slug: args.project_slug
149
+ });
150
+ if (!resolved)
151
+ return required("company_slug + project_slug");
152
+ const count = await client.getDiscussionUnreadCount(resolved.project_slug, resolved.company_slug);
153
+ const ctx = { company_slug: resolved.company_slug, project_slug: resolved.project_slug };
154
+ return success(JSON.stringify(count, null, 2), ctx);
155
+ },
156
+ mark_read: async (client, args) => {
157
+ if (!args.channel_uuid)
158
+ return required("channel_uuid");
159
+ await client.markDiscussionChannelRead(args.channel_uuid);
160
+ return success(JSON.stringify({ marked_read: true, channel_uuid: args.channel_uuid }, null, 2));
161
+ },
162
+ create_channel: async (client, args) => {
163
+ if (!args.name)
164
+ return required("name");
165
+ const resolved = await resolveProjectContext(client, {
166
+ company_slug: args.company_slug,
167
+ project_slug: args.project_slug
168
+ });
169
+ if (!resolved)
170
+ return required("company_slug + project_slug");
171
+ const channel = await client.createDiscussionChannel({
172
+ name: args.name,
173
+ project_slug: resolved.project_slug,
174
+ company_slug: resolved.company_slug,
175
+ description: args.description,
176
+ is_private: args.is_private,
177
+ });
178
+ const ctx = { company_slug: resolved.company_slug, project_slug: resolved.project_slug };
179
+ return success(JSON.stringify({ created: true, channel }, null, 2), ctx);
180
+ },
181
+ update_channel: async (client, args) => {
182
+ if (!args.channel_uuid)
183
+ return required("channel_uuid");
184
+ const data = {};
185
+ if (args.name)
186
+ data.name = args.name;
187
+ if (args.description)
188
+ data.description = args.description;
189
+ const channel = await client.updateDiscussionChannel(args.channel_uuid, data);
190
+ return success(JSON.stringify({ updated: true, channel }, null, 2));
191
+ },
192
+ };
193
+ // ============================================================================
194
+ // Main Handler
195
+ // ============================================================================
196
+ export async function handleDiscussionTool(client, _name, args = {}) {
197
+ const action = args.action;
198
+ return executeAction(discussionHandlers, action, client, args);
199
+ }
200
+ //# sourceMappingURL=discussions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discussions.js","sourceRoot":"","sources":["../../src/tools/discussions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Epics MCP Tool (Consolidated)
3
+ *
4
+ * Uses Action Handler pattern for clean, extensible code.
5
+ */
6
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
7
+ import type { GitScrumClient } from "../client/GitScrumClient.js";
8
+ import { type ToolResponse } from "./shared/actionHandler.js";
9
+ export declare function registerEpicTools(): Tool[];
10
+ export declare function handleEpicTool(client: GitScrumClient, _name: string, args: Record<string, unknown>): Promise<ToolResponse>;
11
+ //# sourceMappingURL=epics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epics.d.ts","sourceRoot":"","sources":["../../src/tools/epics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAOL,KAAK,YAAY,EAElB,MAAM,2BAA2B,CAAC;AAMnC,wBAAgB,iBAAiB,IAAI,IAAI,EAAE,CAwD1C;AA0ED,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,YAAY,CAAC,CAGvB"}
@@ -0,0 +1,122 @@
1
+ import { executeAction, success, required, normalizeColor, resolveProjectContext } from "./shared/actionHandler.js";
2
+ // ============================================================================
3
+ // Tool Registration
4
+ // ============================================================================
5
+ export function registerEpicTools() {
6
+ return [
7
+ {
8
+ name: "epic",
9
+ description: [
10
+ "Epics. Actions: list, create, update.",
11
+ "",
12
+ "Workflow:",
13
+ "- 'list': requires company_slug + project_slug (returns epics with their uuid)",
14
+ "- 'create': requires title + company_slug + project_slug",
15
+ "- 'update': requires epic_uuid (from 'list' response) + company_slug + project_slug",
16
+ ].join("\n"),
17
+ inputSchema: {
18
+ type: "object",
19
+ properties: {
20
+ action: {
21
+ type: "string",
22
+ enum: ["list", "create", "update"],
23
+ description: "Which operation to perform",
24
+ },
25
+ project_slug: {
26
+ type: "string",
27
+ description: "Project identifier (always required)"
28
+ },
29
+ company_slug: {
30
+ type: "string",
31
+ description: "Workspace identifier (always required)"
32
+ },
33
+ title: {
34
+ type: "string",
35
+ description: "Epic title/name text. Required when creating a new epic."
36
+ },
37
+ description: {
38
+ type: "string",
39
+ description: "Epic description in markdown (optional)"
40
+ },
41
+ color: {
42
+ type: "string",
43
+ description: "Color hex code without # e.g. 'FF5733' (optional)"
44
+ },
45
+ epic_uuid: {
46
+ type: "string",
47
+ description: "Existing epic's unique ID. Only for: update. NOT for create."
48
+ },
49
+ },
50
+ required: ["action", "project_slug", "company_slug"],
51
+ },
52
+ annotations: {
53
+ title: "Epics",
54
+ readOnlyHint: false,
55
+ destructiveHint: false,
56
+ idempotentHint: false,
57
+ openWorldHint: false,
58
+ },
59
+ },
60
+ ];
61
+ }
62
+ // ============================================================================
63
+ // Action Handlers
64
+ // ============================================================================
65
+ const epicHandlers = {
66
+ list: async (client, args) => {
67
+ const resolved = await resolveProjectContext(client, {
68
+ company_slug: args.company_slug,
69
+ project_slug: args.project_slug
70
+ });
71
+ if (!resolved)
72
+ return required("project_slug (or company_slug + project_slug)");
73
+ const epics = await client.getEpics(resolved.project_slug, resolved.company_slug);
74
+ const ctx = { company_slug: resolved.company_slug, project_slug: resolved.project_slug };
75
+ return success(JSON.stringify(epics, null, 2), ctx);
76
+ },
77
+ create: async (client, args) => {
78
+ if (!args.title)
79
+ return required("title");
80
+ const resolved = await resolveProjectContext(client, {
81
+ company_slug: args.company_slug,
82
+ project_slug: args.project_slug
83
+ });
84
+ if (!resolved)
85
+ return required("project_slug (or company_slug + project_slug)");
86
+ const data = { title: args.title };
87
+ if (args.description)
88
+ data.description = args.description;
89
+ if (args.color)
90
+ data.color = normalizeColor(args.color);
91
+ const epic = await client.createEpic(resolved.project_slug, resolved.company_slug, data);
92
+ const ctx = { company_slug: resolved.company_slug, project_slug: resolved.project_slug };
93
+ return success(JSON.stringify({ created: true, epic }, null, 2), ctx);
94
+ },
95
+ update: async (client, args) => {
96
+ if (!args.epic_uuid)
97
+ return required("epic_uuid");
98
+ const resolved = await resolveProjectContext(client, {
99
+ company_slug: args.company_slug,
100
+ project_slug: args.project_slug
101
+ });
102
+ if (!resolved)
103
+ return required("project_slug (or company_slug + project_slug)");
104
+ const data = {};
105
+ if (args.title)
106
+ data.title = args.title;
107
+ if (args.description)
108
+ data.description = args.description;
109
+ if (args.color)
110
+ data.color = normalizeColor(args.color);
111
+ await client.updateEpic(args.epic_uuid, resolved.project_slug, resolved.company_slug, data);
112
+ return success(JSON.stringify({ updated: true, epic_uuid: args.epic_uuid }, null, 2));
113
+ },
114
+ };
115
+ // ============================================================================
116
+ // Main Handler
117
+ // ============================================================================
118
+ export async function handleEpicTool(client, _name, args) {
119
+ const action = args.action;
120
+ return executeAction(epicHandlers, action, client, args);
121
+ }
122
+ //# sourceMappingURL=epics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epics.js","sourceRoot":"","sources":["../../src/tools/epics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Label MCP Tool (Consolidated)
3
+ *
4
+ * Uses Action Handler pattern for clean, extensible code.
5
+ */
6
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
7
+ import type { GitScrumClient } from "../client/GitScrumClient.js";
8
+ import { type ToolResponse } from "./shared/actionHandler.js";
9
+ export declare function registerLabelTools(): Tool[];
10
+ export declare function handleLabelTool(client: GitScrumClient, _name: string, args: Record<string, unknown>): Promise<ToolResponse>;
11
+ //# sourceMappingURL=labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../src/tools/labels.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAOL,KAAK,YAAY,EAClB,MAAM,2BAA2B,CAAC;AAMnC,wBAAgB,kBAAkB,IAAI,IAAI,EAAE,CAmD3C;AA+FD,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,YAAY,CAAC,CAKvB"}
@@ -0,0 +1,138 @@
1
+ import { executeAction, success, required, resolveProjectContext, normalizeColor } from "./shared/actionHandler.js";
2
+ // ============================================================================
3
+ // Tool Registration
4
+ // ============================================================================
5
+ export function registerLabelTools() {
6
+ return [
7
+ {
8
+ name: "label",
9
+ description: [
10
+ "Labels. Actions: list, create, update, attach, detach, toggle.",
11
+ "",
12
+ "Workflow:",
13
+ "- 'list': requires company_slug (returns all workspace labels with their slug/ID)",
14
+ "- 'create': requires company_slug + title + color",
15
+ "- 'toggle'/'attach'/'detach': requires label_slug (from 'list') + task_uuid (from 'task' tool) + project_slug",
16
+ "- 'update': requires label_slug (from 'list') + company_slug",
17
+ ].join("\n"),
18
+ inputSchema: {
19
+ type: "object",
20
+ properties: {
21
+ action: {
22
+ type: "string",
23
+ enum: ["list", "create", "update", "attach", "detach", "toggle"],
24
+ description: "Which operation to perform"
25
+ },
26
+ company_slug: {
27
+ type: "string",
28
+ description: "Workspace identifier (always required)"
29
+ },
30
+ project_slug: {
31
+ type: "string",
32
+ description: "Project identifier. Required for: attach, detach, toggle"
33
+ },
34
+ label_slug: {
35
+ type: "string",
36
+ description: "Existing label's identifier. Required for: update, attach, detach, toggle"
37
+ },
38
+ task_uuid: {
39
+ type: "string",
40
+ description: "Task's unique ID. Required for: toggle"
41
+ },
42
+ title: {
43
+ type: "string",
44
+ description: "Label name text. Required when creating a new label."
45
+ },
46
+ color: {
47
+ type: "string",
48
+ description: "Hex color code without # e.g. 'FF5733'. Required for: create"
49
+ },
50
+ },
51
+ required: ["action", "company_slug"],
52
+ },
53
+ annotations: { title: "Labels", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
54
+ },
55
+ ];
56
+ }
57
+ // ============================================================================
58
+ // Action Handlers
59
+ // ============================================================================
60
+ const labelHandlers = {
61
+ list: async (client, args) => {
62
+ let labels;
63
+ if (args.project_slug) {
64
+ labels = await client.getProjectLabels(args.project_slug, args.company_slug);
65
+ }
66
+ else {
67
+ labels = await client.getWorkspaceLabels(args.company_slug);
68
+ }
69
+ return success(JSON.stringify(labels, null, 2));
70
+ },
71
+ create: async (client, args) => {
72
+ if (!args.title || !args.color)
73
+ return required("title and color");
74
+ const label = await client.createLabel(args.company_slug, { title: args.title, color: normalizeColor(args.color) });
75
+ return success(JSON.stringify({ created: true, label }, null, 2));
76
+ },
77
+ update: async (client, args) => {
78
+ if (!args.label_slug)
79
+ return required("label_slug");
80
+ const updateData = {};
81
+ if (args.title)
82
+ updateData.title = args.title;
83
+ if (args.color)
84
+ updateData.color = normalizeColor(args.color);
85
+ await client.updateLabel(args.label_slug, args.company_slug, updateData);
86
+ return success(JSON.stringify({ updated: true, label_slug: args.label_slug }, null, 2));
87
+ },
88
+ attach: async (client, args) => {
89
+ if (!args.label_slug)
90
+ return required("label_slug");
91
+ // Auto-resolve project context
92
+ const resolved = await resolveProjectContext(client, {
93
+ company_slug: args.company_slug,
94
+ project_slug: args.project_slug
95
+ });
96
+ if (!resolved)
97
+ return required("project_slug (or project name to search)");
98
+ await client.attachLabelToProject(args.label_slug, resolved.project_slug, resolved.company_slug);
99
+ return success(JSON.stringify({ attached: true, label_slug: args.label_slug }, null, 2));
100
+ },
101
+ detach: async (client, args) => {
102
+ if (!args.label_slug)
103
+ return required("label_slug");
104
+ // Auto-resolve project context
105
+ const resolved = await resolveProjectContext(client, {
106
+ company_slug: args.company_slug,
107
+ project_slug: args.project_slug
108
+ });
109
+ if (!resolved)
110
+ return required("project_slug (or project name to search)");
111
+ await client.detachLabelFromProject(args.label_slug, resolved.project_slug, resolved.company_slug);
112
+ return success(JSON.stringify({ detached: true, label_slug: args.label_slug }, null, 2));
113
+ },
114
+ toggle: async (client, args) => {
115
+ if (!args.task_uuid || !args.label_slug) {
116
+ return required("task_uuid and label_slug");
117
+ }
118
+ // Auto-resolve project context
119
+ const resolved = await resolveProjectContext(client, {
120
+ company_slug: args.company_slug,
121
+ project_slug: args.project_slug
122
+ });
123
+ if (!resolved)
124
+ return required("project_slug (or project name to search)");
125
+ await client.toggleLabelOnTask(args.task_uuid, args.label_slug, resolved.project_slug, resolved.company_slug);
126
+ return success(JSON.stringify({ toggled: true, label_slug: args.label_slug, task_uuid: args.task_uuid }, null, 2));
127
+ },
128
+ };
129
+ // ============================================================================
130
+ // Main Handler
131
+ // ============================================================================
132
+ export async function handleLabelTool(client, _name, args) {
133
+ if (!args.company_slug)
134
+ return required("company_slug");
135
+ const action = args.action;
136
+ return executeAction(labelHandlers, action, client, args);
137
+ }
138
+ //# sourceMappingURL=labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.js","sourceRoot":"","sources":["../../src/tools/labels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * NoteVault MCP Tools (Consolidated)
3
+ *
4
+ * Uses Action Handler pattern for clean, extensible code.
5
+ */
6
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
7
+ import type { GitScrumClient } from "../client/GitScrumClient.js";
8
+ import { type ToolResponse } from "./shared/actionHandler.js";
9
+ export declare function registerNoteTools(): Tool[];
10
+ export declare function handleNoteTool(client: GitScrumClient, name: string, args?: Record<string, unknown>): Promise<ToolResponse>;
11
+ //# sourceMappingURL=notes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../../src/tools/notes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,2BAA2B,CAAC;AAMnC,wBAAgB,iBAAiB,IAAI,IAAI,EAAE,CA4F1C;AAqHD,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,YAAY,CAAC,CAWvB"}